@@ -2244,22 +2244,35 @@ static void initGenericClassObjCName(ClassMetadata *theClass) {
2244
2244
getROData (theMetaclass)->Name = name;
2245
2245
}
2246
2246
2247
- static bool installLazyClassNameHandler () {
2248
- auto _objc_setLazyClassNamer =
2249
- (void (*)(char * (*)(Class)))
2250
- dlsym (RTLD_NEXT, " _objc_setLazyClassNamer" );
2251
- if (_objc_setLazyClassNamer == nullptr )
2252
- return false ;
2247
+ static bool installLazyClassNameHook () {
2248
+ #if !OBJC_SETHOOK_LAZYCLASSNAMER_DEFINED
2249
+ using objc_hook_lazyClassNamer =
2250
+ const char * _Nullable (*)(_Nonnull Class cls);
2251
+ auto objc_setHook_lazyClassNamer =
2252
+ (void (*)(objc_hook_lazyClassNamer, objc_hook_lazyClassNamer *))
2253
+ dlsym (RTLD_NEXT, " objc_setHook_lazyClassNamer" );
2254
+ #endif
2253
2255
2254
- _objc_setLazyClassNamer ([](Class theClass) {
2256
+ static objc_hook_lazyClassNamer oldHook;
2257
+ auto myHook = [](Class theClass) -> const char * {
2255
2258
ClassMetadata *metadata = (ClassMetadata *)theClass;
2256
- return copyGenericClassObjCName (metadata);
2257
- });
2259
+ if (metadata->isTypeMetadata ())
2260
+ return copyGenericClassObjCName (metadata);
2261
+ return oldHook (theClass);
2262
+ };
2263
+
2264
+ #pragma clang diagnostic push
2265
+ #pragma clang diagnostic ignored "-Wunguarded-availability"
2266
+ if (objc_setHook_lazyClassNamer == nullptr )
2267
+ return false ;
2268
+ objc_setHook_lazyClassNamer (myHook, &oldHook);
2269
+ #pragma clang diagnostic pop
2270
+
2258
2271
return true ;
2259
2272
}
2260
2273
2261
2274
static void setUpGenericClassObjCName (ClassMetadata *theClass) {
2262
- bool supportsLazyNames = SWIFT_LAZY_CONSTANT (installLazyClassNameHandler ());
2275
+ bool supportsLazyNames = SWIFT_LAZY_CONSTANT (installLazyClassNameHook ());
2263
2276
if (supportsLazyNames) {
2264
2277
getROData (theClass)->Name = nullptr ;
2265
2278
auto theMetaclass = (ClassMetadata *)object_getClass ((id)theClass);
0 commit comments