Skip to content

Commit 76eb96e

Browse files
committed
Runtime: Reinstate _stdlib_demangleName hook.
This is needed for Xcode support, even though it appeared dead within the Swift repo itself.
1 parent 40584f8 commit 76eb96e

File tree

3 files changed

+48
-0
lines changed

3 files changed

+48
-0
lines changed

stdlib/public/core/Misc.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,30 @@ func _typeName(type: Any.Type, qualified: Bool = true) -> String {
8383
input: UnsafeBufferPointer(start: stringPtr, count: count))
8484
}
8585

86+
@warn_unused_result
87+
@_silgen_name("swift_stdlib_demangleName")
88+
func _stdlib_demangleNameImpl(
89+
mangledName: UnsafePointer<UInt8>,
90+
_ mangledNameLength: UInt,
91+
_ demangledName: UnsafeMutablePointer<String>)
92+
93+
// NB: This function is not used directly in the Swift codebase, but is
94+
// exported for Xcode support. Please coordinate before changing.
95+
@warn_unused_result
96+
public // @testable
97+
func _stdlib_demangleName(mangledName: String) -> String {
98+
let mangledNameUTF8 = Array(mangledName.utf8)
99+
return mangledNameUTF8.withUnsafeBufferPointer {
100+
(mangledNameUTF8) in
101+
let (_, demangledName) = _withUninitializedString {
102+
_stdlib_demangleNameImpl(
103+
mangledNameUTF8.baseAddress, UInt(mangledNameUTF8.endIndex),
104+
$0)
105+
}
106+
return demangledName
107+
}
108+
}
109+
86110
/// Returns `floor(log(x))`. This equals to the position of the most
87111
/// significant non-zero bit, or 63 - number-of-zeros before it.
88112
///

stdlib/public/runtime/Reflection.mm

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1264,3 +1264,17 @@ static Mirror ObjC_getMirrorForSuperclass(Class sup,
12641264
T->vw_destroy(value);
12651265
return MirrorReturn(result);
12661266
}
1267+
1268+
// NB: This function is not used directly in the Swift codebase, but is
1269+
// exported for Xcode support. Please coordinate before changing.
1270+
extern "C" void swift_stdlib_demangleName(const char *mangledName,
1271+
size_t mangledNameLength,
1272+
String *demangledName) {
1273+
auto options = Demangle::DemangleOptions();
1274+
options.DisplayDebuggerGeneratedModule = false;
1275+
auto result =
1276+
Demangle::demangleSymbolAsString(mangledName,
1277+
mangledNameLength,
1278+
options);
1279+
new (demangledName) String(result.data(), result.size());
1280+
}

test/1_stdlib/Runtime.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -665,6 +665,16 @@ Runtime.test("typeName") {
665665
expectEqual("protocol<>.Protocol", _typeName(a.dynamicType))
666666
}
667667

668+
Runtime.test("demangleName") {
669+
expectEqual("", _stdlib_demangleName(""))
670+
expectEqual("abc", _stdlib_demangleName("abc"))
671+
expectEqual("\0", _stdlib_demangleName("\0"))
672+
expectEqual("Swift.Double", _stdlib_demangleName("_TtSd"))
673+
expectEqual("x.a : x.Foo<x.Foo<x.Foo<Swift.Int, Swift.Int>, x.Foo<Swift.Int, Swift.Int>>, x.Foo<x.Foo<Swift.Int, Swift.Int>, x.Foo<Swift.Int, Swift.Int>>>",
674+
_stdlib_demangleName("_Tv1x1aGCS_3FooGS0_GS0_SiSi_GS0_SiSi__GS0_GS0_SiSi_GS0_SiSi___"))
675+
expectEqual("Foobar", _stdlib_demangleName("_TtC13__lldb_expr_46Foobar"))
676+
}
677+
668678
Runtime.test("_stdlib_atomicCompareExchangeStrongPtr") {
669679
typealias IntPtr = UnsafeMutablePointer<Int>
670680
var origP1 = IntPtr(bitPattern: 0x10101010)

0 commit comments

Comments
 (0)