Skip to content

Commit f32af9b

Browse files
committed
[Runtime] Adjust lazy name API to a hook-based call that can have multiple hooks. Use the API from the headers if present.
rdar://problem/57674583
1 parent fbcef9a commit f32af9b

File tree

1 file changed

+23
-10
lines changed

1 file changed

+23
-10
lines changed

stdlib/public/runtime/Metadata.cpp

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2244,22 +2244,35 @@ static void initGenericClassObjCName(ClassMetadata *theClass) {
22442244
getROData(theMetaclass)->Name = name;
22452245
}
22462246

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
22532255

2254-
_objc_setLazyClassNamer([](Class theClass) {
2256+
static objc_hook_lazyClassNamer oldHook;
2257+
auto myHook = [](Class theClass) -> const char * {
22552258
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+
22582271
return true;
22592272
}
22602273

22612274
static void setUpGenericClassObjCName(ClassMetadata *theClass) {
2262-
bool supportsLazyNames = SWIFT_LAZY_CONSTANT(installLazyClassNameHandler());
2275+
bool supportsLazyNames = SWIFT_LAZY_CONSTANT(installLazyClassNameHook());
22632276
if (supportsLazyNames) {
22642277
getROData(theClass)->Name = nullptr;
22652278
auto theMetaclass = (ClassMetadata *)object_getClass((id)theClass);

0 commit comments

Comments
 (0)