Skip to content

Commit e427ded

Browse files
committed
Mangling: refactoring: clean up tuple nodes
Replace VariadicTuple and NonVariadicTuple with a single Tuple node. The variadic property is now part of the tuple element and not of the whole tuple.
1 parent 327017a commit e427ded

File tree

9 files changed

+35
-37
lines changed

9 files changed

+35
-37
lines changed

include/swift/Demangling/DemangleNodes.def

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ CONTEXT_NODE(NativePinningAddressor)
109109
CONTEXT_NODE(NativePinningMutableAddressor)
110110
NODE(NominalTypeDescriptor)
111111
NODE(NonObjCAttribute)
112-
NODE(NonVariadicTuple)
113112
NODE(Number)
114113
NODE(ObjCAttribute)
115114
NODE(ObjCBlock)
@@ -144,6 +143,7 @@ CONTEXT_NODE(Structure)
144143
CONTEXT_NODE(Subscript)
145144
NODE(Suffix)
146145
NODE(ThinFunctionType)
146+
NODE(Tuple)
147147
NODE(TupleElement)
148148
NODE(TupleElementName)
149149
NODE(Type)
@@ -161,7 +161,6 @@ CONTEXT_NODE(UnsafeMutableAddressor)
161161
NODE(ValueWitness)
162162
NODE(ValueWitnessTable)
163163
CONTEXT_NODE(Variable)
164-
NODE(VariadicTuple)
165164
NODE(VTableThunk)
166165
NODE(VTableAttribute) // note: old mangling only
167166
NODE(Weak)

include/swift/Remote/MetadataReader.h

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -233,25 +233,31 @@ class TypeDecoder {
233233
return decodeMangledType(Node->getChild(0));
234234
case NodeKind::ReturnType:
235235
return decodeMangledType(Node->getChild(0));
236-
case NodeKind::NonVariadicTuple:
237-
case NodeKind::VariadicTuple: {
236+
case NodeKind::Tuple: {
238237
std::vector<BuiltType> elements;
239238
std::string labels;
239+
bool variadic = false;
240240
for (auto &element : *Node) {
241241
if (element->getKind() != NodeKind::TupleElement)
242242
return BuiltType();
243243

244244
// If the tuple element is labeled, add its label to 'labels'.
245245
unsigned typeChildIndex = 0;
246-
if (element->getChild(0)->getKind() == NodeKind::TupleElementName) {
246+
unsigned nameIdx = 0;
247+
if (element->getChild(nameIdx)->getKind() == NodeKind::VariadicMarker) {
248+
variadic = true;
249+
nameIdx = 1;
250+
typeChildIndex = 1;
251+
}
252+
if (element->getChild(nameIdx)->getKind() == NodeKind::TupleElementName) {
247253
// Add spaces to terminate all the previous labels if this
248254
// is the first we've seen.
249255
if (labels.empty()) labels.append(elements.size(), ' ');
250256

251257
// Add the label and its terminator.
252258
labels += element->getChild(0)->getText();
253259
labels += ' ';
254-
typeChildIndex = 1;
260+
typeChildIndex++;
255261

256262
// Otherwise, add a space if a previous element had a label.
257263
} else if (!labels.empty()) {
@@ -266,7 +272,6 @@ class TypeDecoder {
266272

267273
elements.push_back(elementType);
268274
}
269-
bool variadic = (Node->getKind() == NodeKind::VariadicTuple);
270275
return Builder.createTupleType(elements, std::move(labels), variadic);
271276
}
272277
case NodeKind::TupleElement:
@@ -378,8 +383,7 @@ class TypeDecoder {
378383
};
379384

380385
// Expand a single level of tuple.
381-
if (node->getKind() == NodeKind::VariadicTuple ||
382-
node->getKind() == NodeKind::NonVariadicTuple) {
386+
if (node->getKind() == NodeKind::Tuple) {
383387
// TODO: preserve variadic somewhere?
384388

385389
// Decode all the elements as separate arguments.

lib/Demangling/Demangler.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -805,17 +805,15 @@ NodePointer Demangler::popFunctionType(Node::Kind kind) {
805805
NodePointer Demangler::popFunctionParams(Node::Kind kind) {
806806
NodePointer ParamsType = nullptr;
807807
if (popNode(Node::Kind::EmptyList)) {
808-
ParamsType = createType(createNode(Node::Kind::NonVariadicTuple));
808+
ParamsType = createType(createNode(Node::Kind::Tuple));
809809
} else {
810810
ParamsType = popNode(Node::Kind::Type);
811811
}
812812
return createWithChild(kind, ParamsType);
813813
}
814814

815815
NodePointer Demangler::popTuple() {
816-
NodePointer Root = createNode(popNode(Node::Kind::VariadicMarker) ?
817-
Node::Kind::VariadicTuple :
818-
Node::Kind::NonVariadicTuple);
816+
NodePointer Root = createNode(Node::Kind::Tuple);
819817

820818
if (!popNode(Node::Kind::EmptyList)) {
821819
bool firstElem = false;

lib/Demangling/NodePrinter.cpp

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ class NodePrinter {
249249
case Node::Kind::Metatype:
250250
case Node::Kind::MetatypeRepresentation:
251251
case Node::Kind::Module:
252-
case Node::Kind::NonVariadicTuple:
252+
case Node::Kind::Tuple:
253253
case Node::Kind::Protocol:
254254
case Node::Kind::QualifiedArchetype:
255255
case Node::Kind::ReturnType:
@@ -260,7 +260,6 @@ class NodePrinter {
260260
case Node::Kind::Type:
261261
case Node::Kind::TypeAlias:
262262
case Node::Kind::TypeList:
263-
case Node::Kind::VariadicTuple:
264263
return true;
265264

266265
case Node::Kind::ProtocolList:
@@ -944,8 +943,7 @@ void NodePrinter::print(NodePointer pointer, bool asContext, bool suppressType)
944943
if (child0_kind == Node::Kind::Type)
945944
child0_kind = pointer->getChild(0)->getChild(0)->getKind();
946945

947-
if (child0_kind != Node::Kind::VariadicTuple &&
948-
child0_kind != Node::Kind::NonVariadicTuple)
946+
if (child0_kind != Node::Kind::Tuple)
949947
need_parens = true;
950948
}
951949
}
@@ -956,12 +954,9 @@ void NodePrinter::print(NodePointer pointer, bool asContext, bool suppressType)
956954
Printer << ")";
957955
return;
958956
}
959-
case Node::Kind::NonVariadicTuple:
960-
case Node::Kind::VariadicTuple: {
957+
case Node::Kind::Tuple: {
961958
Printer << "(";
962959
printChildren(pointer, ", ");
963-
if (pointer->getKind() == Node::Kind::VariadicTuple)
964-
Printer << "...";
965960
Printer << ")";
966961
return;
967962
}

lib/Demangling/OldDemangler.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1654,13 +1654,12 @@ class OldDemangler {
16541654
}
16551655

16561656
NodePointer demangleTuple(IsVariadic isV) {
1657-
NodePointer tuple = Factory.createNode(
1658-
isV == IsVariadic::yes ? Node::Kind::VariadicTuple
1659-
: Node::Kind::NonVariadicTuple);
1657+
NodePointer tuple = Factory.createNode(Node::Kind::Tuple);
1658+
NodePointer elt = nullptr;
16601659
while (!Mangled.nextIf('_')) {
16611660
if (!Mangled)
16621661
return nullptr;
1663-
NodePointer elt = Factory.createNode(Node::Kind::TupleElement);
1662+
elt = Factory.createNode(Node::Kind::TupleElement);
16641663

16651664
if (isStartOfIdentifier(Mangled.peek())) {
16661665
NodePointer label = demangleIdentifier(Node::Kind::TupleElementName);
@@ -1676,6 +1675,12 @@ class OldDemangler {
16761675

16771676
tuple->addChild(elt, Factory);
16781677
}
1678+
if (isV == IsVariadic::yes && elt) {
1679+
elt->reverseChildren();
1680+
NodePointer marker = Factory.createNode(Node::Kind::VariadicMarker);
1681+
elt->addChild(marker, Factory);
1682+
elt->reverseChildren();
1683+
}
16791684
return tuple;
16801685
}
16811686

lib/Demangling/Remangler.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ void Remangler::mangleAllocator(Node *node) {
485485

486486
void Remangler::mangleArgumentTuple(Node *node) {
487487
Node *Child = skipType(getSingleChild(node));
488-
if (Child->getKind() == Node::Kind::NonVariadicTuple &&
488+
if (Child->getKind() == Node::Kind::Tuple &&
489489
Child->getNumChildren() == 0) {
490490
Buffer << 'y';
491491
return;
@@ -1327,7 +1327,7 @@ void Remangler::mangleNonObjCAttribute(Node *node) {
13271327
Buffer << "TO";
13281328
}
13291329

1330-
void Remangler::mangleNonVariadicTuple(Node *node) {
1330+
void Remangler::mangleTuple(Node *node) {
13311331
mangleTypeList(node);
13321332
Buffer << 't';
13331333
}
@@ -1599,11 +1599,6 @@ void Remangler::mangleVariable(Node *node) {
15991599
Buffer << 'v';
16001600
}
16011601

1602-
void Remangler::mangleVariadicTuple(Node *node) {
1603-
mangleTypeList(node);
1604-
Buffer << "dt";
1605-
}
1606-
16071602
void Remangler::mangleVTableAttribute(Node *node) {
16081603
unreachable("Old-fashioned vtable thunk in new mangling format");
16091604
}

lib/IDE/TypeReconstruction.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1716,7 +1716,7 @@ static void VisitNodeModule(
17161716
}
17171717
}
17181718

1719-
static void VisitNodeNonVariadicTuple(
1719+
static void VisitNodeTuple(
17201720
ASTContext *ast, std::vector<Demangle::NodePointer> &nodes,
17211721
Demangle::NodePointer &cur_node, VisitNodeResult &result,
17221722
const VisitNodeResult &generic_context) { // set by GenericType case
@@ -2060,8 +2060,8 @@ static void visitNodeImpl(
20602060
VisitNodeModule(ast, nodes, node, result, genericContext);
20612061
break;
20622062

2063-
case Demangle::Node::Kind::NonVariadicTuple:
2064-
VisitNodeNonVariadicTuple(ast, nodes, node, result, genericContext);
2063+
case Demangle::Node::Kind::Tuple:
2064+
VisitNodeTuple(ast, nodes, node, result, genericContext);
20652065
break;
20662066

20672067
case Demangle::Node::Kind::PrivateDeclName:

stdlib/public/runtime/Demangle.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ swift::_swift_buildDemanglingForMetadata(const Metadata *type,
244244

245245
NodePointer totalInput = nullptr;
246246
if (inputs.size() > 1) {
247-
auto tuple = Dem.createNode(Node::Kind::NonVariadicTuple);
247+
auto tuple = Dem.createNode(Node::Kind::Tuple);
248248
for (auto &input : inputs)
249249
tuple->addChild(input, Dem);
250250
totalInput = tuple;
@@ -280,7 +280,7 @@ swift::_swift_buildDemanglingForMetadata(const Metadata *type,
280280
case MetadataKind::Tuple: {
281281
auto tuple = static_cast<const TupleTypeMetadata *>(type);
282282
const char *labels = tuple->Labels;
283-
auto tupleNode = Dem.createNode(Node::Kind::NonVariadicTuple);
283+
auto tupleNode = Dem.createNode(Node::Kind::Tuple);
284284
for (unsigned i = 0, e = tuple->NumElements; i < e; ++i) {
285285
auto elt = Dem.createNode(Node::Kind::TupleElement);
286286

test/Demangle/Inputs/manglings.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,3 +247,5 @@ _T03foo6testityyyc_yyctF1a1bTf3pfpf_n ---> function signature specialization <Ar
247247
_SocketJoinOrLeaveMulticast ---> _SocketJoinOrLeaveMulticast
248248
_T0s10DictionaryV3t17E6Index2V1loiSbAEyxq__G_AGtFZ ---> static (extension in t17):Swift.Dictionary.Index2.< infix ((extension in t17):[A : B].Index2, (extension in t17):[A : B].Index2) -> Swift.Bool
249249
_T08mangling14varargsVsArrayySaySiG3arrd_SS1ntF ---> mangling.varargsVsArray (arr : [Swift.Int]..., n : Swift.String) -> ()
250+
_T08mangling14varargsVsArrayySaySiG3arrd_tF ---> mangling.varargsVsArray (arr : [Swift.Int]...) -> ()
251+

0 commit comments

Comments
 (0)