Skip to content

Commit acfd2b7

Browse files
authored
Merge pull request #65150 from al45tair/eng/PR-107718586-5.9
[Runtime] Ensure we *always* generate names for ObjC classes.
2 parents f3a8287 + ed44e65 commit acfd2b7

File tree

1 file changed

+17
-2
lines changed

1 file changed

+17
-2
lines changed

stdlib/public/runtime/Metadata.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3037,11 +3037,26 @@ static inline ClassROData *getROData(ClassMetadata *theClass) {
30373037
return (ClassROData*)(theClass->Data & ~uintptr_t(SWIFT_CLASS_IS_SWIFT_MASK));
30383038
}
30393039

3040+
// This gets called if we fail during copyGenericClassObjcName(). Its job is
3041+
// to generate a unique name, even though the name won't be very helpful if
3042+
// we end up looking at it in a debugger.
3043+
#define EMERGENCY_PREFIX "$SwiftEmergencyPlaceholderClassName"
3044+
static char *copyEmergencyName(ClassMetadata *theClass) {
3045+
char *nameBuf = nullptr;
3046+
asprintf(&nameBuf,
3047+
EMERGENCY_PREFIX "%016" PRIxPTR,
3048+
(uintptr_t)theClass);
3049+
return nameBuf;
3050+
}
3051+
30403052
static char *copyGenericClassObjCName(ClassMetadata *theClass) {
30413053
// Use the remangler to generate a mangled name from the type metadata.
30423054
Demangle::StackAllocatedDemangler<4096> Dem;
30433055

30443056
auto demangling = _swift_buildDemanglingForMetadata(theClass, Dem);
3057+
if (!demangling) {
3058+
return copyEmergencyName(theClass);
3059+
}
30453060

30463061
// Remangle that into a new type mangling string.
30473062
auto typeNode = Dem.createNode(Demangle::Node::Kind::TypeMangling);
@@ -3051,7 +3066,7 @@ static char *copyGenericClassObjCName(ClassMetadata *theClass) {
30513066

30523067
auto mangling = Demangle::mangleNodeOld(globalNode, Dem);
30533068
if (!mangling.isSuccess()) {
3054-
return nullptr;
3069+
return copyEmergencyName(theClass);
30553070
}
30563071
llvm::StringRef string = mangling.result();
30573072

@@ -3064,7 +3079,7 @@ static char *copyGenericClassObjCName(ClassMetadata *theClass) {
30643079
size_t allocationSize = string.size() + 1;
30653080
if (addSuffix)
30663081
allocationSize += 1;
3067-
3082+
30683083
auto fullNameBuf = (char*)swift_slowAlloc(allocationSize, 0);
30693084
memcpy(fullNameBuf, string.data(), string.size());
30703085

0 commit comments

Comments
 (0)