Skip to content

Commit b0d5454

Browse files
authored
Merge pull request #13872 from DougGregor/mangling-to-metadata-fixes
2 parents fe44024 + 759f4c3 commit b0d5454

File tree

4 files changed

+36
-6
lines changed

4 files changed

+36
-6
lines changed

stdlib/public/runtime/MetadataLookup.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,18 @@ _searchTypeMetadataRecords(const TypeMetadataState &T,
138138
for (; sectionIdx < endSectionIdx; ++sectionIdx) {
139139
auto &section = T.SectionsToScan[sectionIdx];
140140
for (const auto &record : section) {
141-
if (auto ntd = record.getNominalTypeDescriptor()) {
142-
if (ntd->Name.get() == typeName)
143-
return ntd;
141+
switch (record.getTypeKind()) {
142+
case TypeMetadataRecordKind::DirectNominalTypeDescriptor:
143+
case TypeMetadataRecordKind::IndirectNominalTypeDescriptor:
144+
if (auto ntd = record.getNominalTypeDescriptor()) {
145+
if (ntd->Name.get() == typeName)
146+
return ntd;
147+
}
148+
break;
149+
150+
case TypeMetadataRecordKind::IndirectObjCClass:
151+
case TypeMetadataRecordKind::Reserved:
152+
break;
144153
}
145154
}
146155
}

stdlib/public/runtime/ProtocolConformance.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -608,9 +608,18 @@ swift::_searchConformancesByMangledTypeName(const llvm::StringRef typeName) {
608608
for (; sectionIdx < endSectionIdx; ++sectionIdx) {
609609
auto &section = C.SectionsToScan[sectionIdx];
610610
for (const auto &record : section) {
611-
if (auto ntd = record.getNominalTypeDescriptor()) {
612-
if (ntd->Name.get() == typeName)
613-
return ntd;
611+
switch (record.getTypeKind()) {
612+
case TypeMetadataRecordKind::DirectNominalTypeDescriptor:
613+
case TypeMetadataRecordKind::IndirectNominalTypeDescriptor:
614+
if (auto ntd = record.getNominalTypeDescriptor()) {
615+
if (ntd->Name.get() == typeName)
616+
return ntd;
617+
}
618+
break;
619+
620+
case TypeMetadataRecordKind::IndirectObjCClass:
621+
case TypeMetadataRecordKind::Reserved:
622+
break;
614623
}
615624
}
616625
}

test/Runtime/demangleToMetadata.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ DemangleToMetadataTests.test("function types") {
6969

7070
// Mix-and-match.
7171
expectEqual(type(of: f2_variadic_inout), _typeByMangledName("yyytd_ytztc")!)
72+
73+
// A function type that hasn't been built before.
74+
expectEqual("(Int, Float, Double, String, Character, UInt, Bool) -> ()",
75+
String(describing: _typeByMangledName("yySi_SfSdSSs9CharacterVSuSbtc")!))
7276
}
7377

7478
DemangleToMetadataTests.test("metatype types") {
@@ -82,6 +86,7 @@ class C { }
8286

8387
protocol P1 { }
8488
protocol P2 { }
89+
protocol P3 { }
8590

8691
func f1_composition(_: P1 & P2) { }
8792
func f1_composition_anyobject(_: AnyObject & P1) { }
@@ -99,6 +104,9 @@ DemangleToMetadataTests.test("existential types") {
99104

100105
// References to superclass.
101106
expectEqual(type(of: f1_composition_superclass), _typeByMangledName("yy4main2P1_4main2P2AA1CCXcc")!)
107+
108+
// Demangle an existential type that hasn't been seen before.
109+
expectEqual("P1 & P2 & P3", String(describing: _typeByMangledName("4main2P1_4main2P24main2P3p")!))
102110
}
103111

104112
DemangleToMetadataTests.test("existential metatype types") {

test/Runtime/demangleToMetadataObjC.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,9 @@ DemangleToMetadataTests.test("Objective-C protocols") {
3636
expectEqual(type(of: f1_composition_NSCoding), _typeByMangledName("yySo8NSCoding_pc")!)
3737
}
3838

39+
DemangleToMetadataTests.test("Classes that don't exist") {
40+
expectNil(_typeByMangledName("4main4BoomC"))
41+
}
42+
3943
runAllTests()
4044

0 commit comments

Comments
 (0)