Skip to content

Commit dbe5ee7

Browse files
author
Davide Italiano
committed
[Demangler] Implement isObjCSymbol().
This function can be queried to find out whether the passed mangled name is an Objective-C symbol. This will be used in the debugger to replace an hardcoded check that would break if the mangling prefix changed. <rdar://problem/44467875>
1 parent 86e11c5 commit dbe5ee7

File tree

3 files changed

+16
-0
lines changed

3 files changed

+16
-0
lines changed

include/swift/Demangling/Demangle.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,11 @@ bool isProtocol(llvm::StringRef mangledName);
274274
/// \param mangledName A null-terminated string containing a mangled name.
275275
bool isStruct(llvm::StringRef mangledName);
276276

277+
/// Returns true if the mangled name is an Objective-C symbol.
278+
///
279+
/// \param mangledName A null-terminated string containing a mangled name.
280+
bool isObjCSymbol(llvm::StringRef mangledName);
281+
277282
/// Returns true if the mangled name has the old scheme of function type
278283
/// mangling where labels are part of the type.
279284
///

lib/Demangling/Demangler.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,10 @@ bool swift::Demangle::isSwiftSymbol(const char *mangledName) {
168168
return isSwiftSymbol(mangledNameRef);
169169
}
170170

171+
bool swift::Demangle::isObjCSymbol(llvm::StringRef mangledName) {
172+
return dropSwiftManglingPrefix(mangledName).startswith("So");
173+
}
174+
171175
bool swift::Demangle::isOldFunctionTypeMangling(llvm::StringRef mangledName) {
172176
return mangledName.startswith("_T");
173177
}

unittests/Basic/DemangleTest.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,10 @@ TEST(Demangle, DemangleWrappers) {
2323
demangleSymbolAsString(MangledName));
2424
}
2525

26+
TEST(Demangle, IsObjCSymbol) {
27+
EXPECT_EQ("type metadata accessor for __C.NSNumber",
28+
demangleSymbolAsString(llvm::StringRef("_$SSo8NSNumberCMa")));
29+
EXPECT_EQ(true, isObjCSymbol(llvm::StringRef("_$SSo8NSNumberCMa")));
30+
EXPECT_EQ(false,
31+
isObjCSymbol(llvm::StringRef("_$S3pat7inlinedSo8NSNumberCvp")));
32+
}

0 commit comments

Comments
 (0)