Skip to content

Commit eb31681

Browse files
jckarterxedin
authored andcommitted
Demangler: Fill in places we need to handle symbolic references and OtherNominalTypes when demangling bound generic types.
1 parent 194c84e commit eb31681

File tree

7 files changed

+58
-9
lines changed

7 files changed

+58
-9
lines changed

include/swift/Demangling/TypeDecoder.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,8 @@ class TypeDecoder {
124124
}
125125
case NodeKind::BoundGenericClass:
126126
case NodeKind::BoundGenericEnum:
127-
case NodeKind::BoundGenericStructure: {
127+
case NodeKind::BoundGenericStructure:
128+
case NodeKind::BoundGenericOtherNominalType: {
128129
if (Node->getNumChildren() != 2)
129130
return BuiltType();
130131

lib/Demangling/Demangler.cpp

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,10 @@ static bool isAnyGeneric(Node::Kind kind) {
6565
case Node::Kind::Class:
6666
case Node::Kind::Enum:
6767
case Node::Kind::Protocol:
68+
case Node::Kind::OtherNominalType:
6869
case Node::Kind::TypeAlias:
70+
case Node::Kind::SymbolicReference:
71+
case Node::Kind::UnresolvedSymbolicReference:
6972
return true;
7073
default:
7174
return false;
@@ -1237,11 +1240,35 @@ NodePointer Demangler::demangleBoundGenericType() {
12371240
NodePointer Demangler::demangleBoundGenericArgs(NodePointer Nominal,
12381241
const Vector<NodePointer> &TypeLists,
12391242
size_t TypeListIdx) {
1240-
if (!Nominal || Nominal->getNumChildren() < 2)
1243+
// TODO: This would be a lot easier if we represented bound generic args
1244+
// flatly in the demangling tree, since that's how they're mangled and also
1245+
// how the runtime generally wants to consume them.
1246+
1247+
if (!Nominal)
12411248
return nullptr;
12421249

12431250
if (TypeListIdx >= TypeLists.size())
12441251
return nullptr;
1252+
1253+
// Associate a symbolic reference with all remaining generic arguments.
1254+
if (Nominal->getKind() == Node::Kind::SymbolicReference
1255+
|| Nominal->getKind() == Node::Kind::UnresolvedSymbolicReference) {
1256+
auto remainingTypeList = createNode(Node::Kind::TypeList);
1257+
for (unsigned i = TypeLists.size() - 1;
1258+
i >= TypeListIdx && i < TypeLists.size();
1259+
--i) {
1260+
auto list = TypeLists[i];
1261+
for (auto child : *list) {
1262+
remainingTypeList->addChild(child, *this);
1263+
}
1264+
}
1265+
return createWithChildren(Node::Kind::BoundGenericOtherNominalType,
1266+
createType(Nominal), remainingTypeList);
1267+
}
1268+
1269+
if (Nominal->getNumChildren() < 2)
1270+
return nullptr;
1271+
12451272
NodePointer args = TypeLists[TypeListIdx++];
12461273

12471274
// Generic arguments for the outermost type come first.
@@ -1286,6 +1313,9 @@ NodePointer Demangler::demangleBoundGenericArgs(NodePointer Nominal,
12861313
case Node::Kind::Enum:
12871314
kind = Node::Kind::BoundGenericEnum;
12881315
break;
1316+
case Node::Kind::OtherNominalType:
1317+
kind = Node::Kind::BoundGenericOtherNominalType;
1318+
break;
12891319
default:
12901320
return nullptr;
12911321
}

lib/Demangling/Remangler.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,7 @@ void Remangler::mangleGenericArgs(Node *node, char &Separator) {
470470
Separator = '_';
471471
break;
472472

473+
case Node::Kind::BoundGenericOtherNominalType:
473474
case Node::Kind::BoundGenericStructure:
474475
case Node::Kind::BoundGenericEnum:
475476
case Node::Kind::BoundGenericClass: {
@@ -1983,11 +1984,13 @@ bool Demangle::isSpecialized(Node *node) {
19831984
case Node::Kind::BoundGenericStructure:
19841985
case Node::Kind::BoundGenericEnum:
19851986
case Node::Kind::BoundGenericClass:
1987+
case Node::Kind::BoundGenericOtherNominalType:
19861988
return true;
19871989

19881990
case Node::Kind::Structure:
19891991
case Node::Kind::Enum:
19901992
case Node::Kind::Class:
1993+
case Node::Kind::OtherNominalType:
19911994
return isSpecialized(node->getChild(0));
19921995

19931996
case Node::Kind::Extension:
@@ -2002,7 +2005,8 @@ NodePointer Demangle::getUnspecialized(Node *node, NodeFactory &Factory) {
20022005
switch (node->getKind()) {
20032006
case Node::Kind::Structure:
20042007
case Node::Kind::Enum:
2005-
case Node::Kind::Class: {
2008+
case Node::Kind::Class:
2009+
case Node::Kind::OtherNominalType: {
20062010
NodePointer result = Factory.createNode(node->getKind());
20072011
NodePointer parentOrModule = node->getChild(0);
20082012
if (isSpecialized(parentOrModule))
@@ -2015,7 +2019,8 @@ NodePointer Demangle::getUnspecialized(Node *node, NodeFactory &Factory) {
20152019

20162020
case Node::Kind::BoundGenericStructure:
20172021
case Node::Kind::BoundGenericEnum:
2018-
case Node::Kind::BoundGenericClass: {
2022+
case Node::Kind::BoundGenericClass:
2023+
case Node::Kind::BoundGenericOtherNominalType: {
20192024
NodePointer unboundType = node->getChild(0);
20202025
assert(unboundType->getKind() == Node::Kind::Type);
20212026
NodePointer nominalType = unboundType->getChild(0);

lib/Demangling/TypeDecoder.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ NodePointer Demangle::stripGenericArgsFromContextNode(const NodePointer &node,
2424
case Demangle::Node::Kind::BoundGenericClass:
2525
case Demangle::Node::Kind::BoundGenericEnum:
2626
case Demangle::Node::Kind::BoundGenericStructure:
27+
case Demangle::Node::Kind::BoundGenericOtherNominalType:
2728
// Bound generic types have a 'Type' node under them, whose child is
2829
// the non-generic reference. If we don't see that structure, do nothing.
2930
if (node->getNumChildren() < 2 ||
@@ -37,7 +38,8 @@ NodePointer Demangle::stripGenericArgsFromContextNode(const NodePointer &node,
3738

3839
case Demangle::Node::Kind::Class:
3940
case Demangle::Node::Kind::Enum:
40-
case Demangle::Node::Kind::Structure: {
41+
case Demangle::Node::Kind::Structure:
42+
case Demangle::Node::Kind::OtherNominalType: {
4143
if (node->getNumChildren() < 2)
4244
return node;
4345

lib/IDE/TypeReconstruction.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2105,6 +2105,7 @@ static void VisitNode(
21052105
case Demangle::Node::Kind::BoundGenericClass:
21062106
case Demangle::Node::Kind::BoundGenericStructure:
21072107
case Demangle::Node::Kind::BoundGenericEnum:
2108+
case Demangle::Node::Kind::BoundGenericOtherNominalType:
21082109
VisitNodeBoundGeneric(ast, node, result);
21092110
break;
21102111

@@ -2115,6 +2116,7 @@ static void VisitNode(
21152116
case Demangle::Node::Kind::Structure:
21162117
case Demangle::Node::Kind::Class:
21172118
case Demangle::Node::Kind::Enum:
2119+
case Demangle::Node::Kind::OtherNominalType:
21182120
case Demangle::Node::Kind::Protocol:
21192121
VisitNodeNominal(ast, node, result);
21202122
break;

stdlib/public/runtime/MetadataLookup.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,10 @@ static Demangler getDemanglerForRuntimeTypeResolution() {
5656
dem.setSymbolicReferenceResolver([&](int32_t offset,
5757
const void *base) -> NodePointer {
5858
auto absolute_addr = (uintptr_t)detail::applyRelativeOffset(base, offset);
59-
return dem.createNode(Node::Kind::SymbolicReference, absolute_addr);
59+
auto reference = dem.createNode(Node::Kind::SymbolicReference, absolute_addr);
60+
auto type = dem.createNode(Node::Kind::Type);
61+
type->addChild(reference, dem);
62+
return type;
6063
});
6164
return dem;
6265
}
@@ -286,9 +289,12 @@ _findNominalTypeDescriptor(Demangle::NodePointer node) {
286289
auto &T = TypeMetadataRecords.get();
287290

288291
// If we have a symbolic reference to a context, resolve it immediately.
289-
if (node->getKind() == Node::Kind::SymbolicReference)
292+
NodePointer symbolicNode = node;
293+
if (symbolicNode->getKind() == Node::Kind::Type)
294+
symbolicNode = symbolicNode->getChild(0);
295+
if (symbolicNode->getKind() == Node::Kind::SymbolicReference)
290296
return cast<TypeContextDescriptor>(
291-
(const ContextDescriptor *)node->getIndex());
297+
(const ContextDescriptor *)symbolicNode->getIndex());
292298

293299
auto mangledName = Demangle::mangleNode(node);
294300

tools/swift-ide-test/swift-ide-test.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1611,18 +1611,21 @@ static int doPrintLocalTypes(const CompilerInvocation &InitInvok,
16111611
case NodeKind::Structure:
16121612
case NodeKind::Class:
16131613
case NodeKind::Enum:
1614+
case NodeKind::OtherNominalType:
16141615
break;
16151616

16161617
case NodeKind::BoundGenericStructure:
16171618
case NodeKind::BoundGenericClass:
16181619
case NodeKind::BoundGenericEnum:
1620+
case NodeKind::BoundGenericOtherNominalType:
16191621
// Base type
16201622
typeNode = node->getFirstChild();
16211623
// Nominal type
16221624
node = typeNode->getFirstChild();
16231625
assert(node->getKind() == NodeKind::Structure ||
16241626
node->getKind() == NodeKind::Class ||
1625-
node->getKind() == NodeKind::Enum);
1627+
node->getKind() == NodeKind::Enum ||
1628+
node->getKind() == NodeKind::OtherNominalType);
16261629
break;
16271630

16281631
default:

0 commit comments

Comments
 (0)