@@ -172,15 +172,39 @@ class TypeDecoder {
172
172
return decodeMangledType (Node->getChild (0 ));
173
173
case NodeKind::NonVariadicTuple:
174
174
case NodeKind::VariadicTuple: {
175
- std::vector<BuiltType> Elements;
176
- for (auto element : *Node) {
177
- auto elementType = decodeMangledType (element);
175
+ std::vector<BuiltType> elements;
176
+ std::string labels;
177
+ for (auto &element : *Node) {
178
+ if (element->getKind () != NodeKind::TupleElement)
179
+ return BuiltType ();
180
+
181
+ // If the tuple element is labelled, add its label to 'labels'.
182
+ unsigned typeChildIndex = 0 ;
183
+ if (element->getChild (0 )->getKind () == NodeKind::TupleElementName) {
184
+ // Add spaces to terminate all the previous labels if this
185
+ // is the first we've seen.
186
+ if (labels.empty ()) labels.append (elements.size (), ' ' );
187
+
188
+ // Add the label and its terminator.
189
+ labels += element->getChild (0 )->getText ();
190
+ labels += ' ' ;
191
+ typeChildIndex = 1 ;
192
+
193
+ // Otherwise, add a space if a previous element had a label.
194
+ } else if (!labels.empty ()) {
195
+ labels += ' ' ;
196
+ }
197
+
198
+ // Decode the element type.
199
+ BuiltType elementType =
200
+ decodeMangledType (element->getChild (typeChildIndex));
178
201
if (!elementType)
179
202
return BuiltType ();
180
- Elements.push_back (elementType);
203
+
204
+ elements.push_back (elementType);
181
205
}
182
- bool Variadic = (Node->getKind () == NodeKind::VariadicTuple);
183
- return Builder.createTupleType (Elements, Variadic );
206
+ bool variadic = (Node->getKind () == NodeKind::VariadicTuple);
207
+ return Builder.createTupleType (elements, std::move (labels), variadic );
184
208
}
185
209
case NodeKind::TupleElement:
186
210
if (Node->getChild (0 )->getKind () == NodeKind::TupleElementName)
@@ -459,24 +483,35 @@ class MetadataReader {
459
483
case MetadataKind::Optional:
460
484
return readNominalTypeFromMetadata (Meta);
461
485
case MetadataKind::Tuple: {
462
- auto TupleMeta = cast<TargetTupleTypeMetadata<Runtime>>(Meta);
463
- std::vector<BuiltType> Elements;
464
- StoredPointer ElementAddress = MetadataAddress +
486
+ auto tupleMeta = cast<TargetTupleTypeMetadata<Runtime>>(Meta);
487
+
488
+ std::vector<BuiltType> elementTypes;
489
+ elementTypes.reserve (tupleMeta->NumElements );
490
+
491
+ StoredPointer elementAddress = MetadataAddress +
465
492
sizeof (TargetTupleTypeMetadata<Runtime>);
466
493
using Element = typename TargetTupleTypeMetadata<Runtime>::Element;
467
- for (StoredPointer i = 0 ; i < TupleMeta ->NumElements ; ++i,
468
- ElementAddress += sizeof (Element)) {
469
- Element E ;
470
- if (!Reader->readBytes (RemoteAddress (ElementAddress ),
471
- (uint8_t *)&E , sizeof (Element)))
494
+ for (StoredPointer i = 0 ; i < tupleMeta ->NumElements ; ++i,
495
+ elementAddress += sizeof (Element)) {
496
+ Element element ;
497
+ if (!Reader->readBytes (RemoteAddress (elementAddress ),
498
+ (uint8_t *)&element , sizeof (Element)))
472
499
return BuiltType ();
473
500
474
- if (auto ElementTypeRef = readTypeFromMetadata (E .Type ))
475
- Elements .push_back (ElementTypeRef );
501
+ if (auto elementType = readTypeFromMetadata (element .Type ))
502
+ elementTypes .push_back (elementType );
476
503
else
477
504
return BuiltType ();
478
505
}
479
- return Builder.createTupleType (Elements, /* variadic*/ false );
506
+
507
+ // Read the labels string.
508
+ std::string labels;
509
+ if (tupleMeta->Labels &&
510
+ !Reader->readString (RemoteAddress (tupleMeta->Labels ), labels))
511
+ return BuiltType ();
512
+
513
+ return Builder.createTupleType (elementTypes, std::move (labels),
514
+ /* variadic*/ false );
480
515
}
481
516
case MetadataKind::Function: {
482
517
auto Function = cast<TargetFunctionTypeMetadata<Runtime>>(Meta);
0 commit comments