@@ -93,6 +93,7 @@ RemoteRef<char> TypeRefBuilder::readTypeRef(uint64_t remoteAddr) {
93
93
// / Load and normalize a mangled name so it can be matched with string equality.
94
94
llvm::Optional<std::string>
95
95
TypeRefBuilder::normalizeReflectionName (RemoteRef<char > reflectionName) {
96
+ auto checkpoint = pushNodeFactoryCheckpoint ();
96
97
// Remangle the reflection name to resolve symbolic references.
97
98
if (auto node = demangleTypeRef (reflectionName,
98
99
/* useOpaqueTypeSymbolicReferences*/ false )) {
@@ -101,16 +102,18 @@ TypeRefBuilder::normalizeReflectionName(RemoteRef<char> reflectionName) {
101
102
case Node::Kind::ProtocolSymbolicReference:
102
103
case Node::Kind::OpaqueTypeDescriptorSymbolicReference:
103
104
// Symbolic references cannot be mangled, return a failure.
105
+ popNodeFactoryCheckpoint (checkpoint);
104
106
return {};
105
107
default :
106
108
auto mangling = mangleNode (node);
107
- clearNodeFactory ( );
109
+ popNodeFactoryCheckpoint (checkpoint );
108
110
if (!mangling.isSuccess ()) {
109
111
return {};
110
112
}
111
113
return std::move (mangling.result ());
112
114
}
113
115
}
116
+ popNodeFactoryCheckpoint (checkpoint);
114
117
115
118
// Fall back to the raw string.
116
119
return getTypeRefString (reflectionName).str ();
@@ -159,11 +162,12 @@ lookupTypeWitness(const std::string &MangledTypeName,
159
162
0 )
160
163
continue ;
161
164
165
+ auto checkpoint = pushNodeFactoryCheckpoint ();
162
166
auto SubstitutedTypeName = readTypeRef (AssocTy,
163
167
AssocTy->SubstitutedTypeName );
164
168
auto Demangled = demangleTypeRef (SubstitutedTypeName);
165
169
auto *TypeWitness = decodeMangledType (Demangled);
166
- clearNodeFactory ( );
170
+ popNodeFactoryCheckpoint (checkpoint );
167
171
168
172
AssociatedTypeCache.insert (std::make_pair (key, TypeWitness));
169
173
return TypeWitness;
@@ -181,9 +185,10 @@ const TypeRef *TypeRefBuilder::lookupSuperclass(const TypeRef *TR) {
181
185
if (!FD->hasSuperclass ())
182
186
return nullptr ;
183
187
188
+ auto checkpoint = pushNodeFactoryCheckpoint ();
184
189
auto Demangled = demangleTypeRef (readTypeRef (FD, FD->Superclass ));
185
190
auto Unsubstituted = decodeMangledType (Demangled);
186
- clearNodeFactory ( );
191
+ popNodeFactoryCheckpoint (checkpoint );
187
192
if (!Unsubstituted)
188
193
return nullptr ;
189
194
@@ -367,9 +372,10 @@ bool TypeRefBuilder::getFieldTypeRefs(
367
372
continue ;
368
373
}
369
374
375
+ auto checkpoint = pushNodeFactoryCheckpoint ();
370
376
auto Demangled = demangleTypeRef (readTypeRef (Field,Field->MangledTypeName ));
371
377
auto Unsubstituted = decodeMangledType (Demangled);
372
- clearNodeFactory ( );
378
+ popNodeFactoryCheckpoint (checkpoint );
373
379
if (!Unsubstituted)
374
380
return false ;
375
381
@@ -486,10 +492,11 @@ TypeRefBuilder::getClosureContextInfo(RemoteRef<CaptureDescriptor> CD) {
486
492
auto CR = CD.getField (*i);
487
493
488
494
if (CR->hasMangledTypeName ()) {
495
+ auto checkpoint = pushNodeFactoryCheckpoint ();
489
496
auto MangledName = readTypeRef (CR, CR->MangledTypeName );
490
497
auto DemangleTree = demangleTypeRef (MangledName);
491
498
TR = decodeMangledType (DemangleTree);
492
- clearNodeFactory ( );
499
+ popNodeFactoryCheckpoint (checkpoint );
493
500
}
494
501
Info.CaptureTypes .push_back (TR);
495
502
}
@@ -499,10 +506,11 @@ TypeRefBuilder::getClosureContextInfo(RemoteRef<CaptureDescriptor> CD) {
499
506
auto MSR = CD.getField (*i);
500
507
501
508
if (MSR->hasMangledTypeName ()) {
509
+ auto checkpoint = pushNodeFactoryCheckpoint ();
502
510
auto MangledName = readTypeRef (MSR, MSR->MangledTypeName );
503
511
auto DemangleTree = demangleTypeRef (MangledName);
504
512
TR = decodeMangledType (DemangleTree);
505
- clearNodeFactory ( );
513
+ popNodeFactoryCheckpoint (checkpoint );
506
514
}
507
515
508
516
const MetadataSource *MS = nullptr ;
@@ -526,11 +534,12 @@ TypeRefBuilder::getClosureContextInfo(RemoteRef<CaptureDescriptor> CD) {
526
534
527
535
void TypeRefBuilder::dumpTypeRef (RemoteRef<char > MangledName,
528
536
std::ostream &stream, bool printTypeName) {
537
+ auto checkpoint = pushNodeFactoryCheckpoint ();
529
538
auto DemangleTree = demangleTypeRef (MangledName);
530
539
auto TypeName = nodeToString (DemangleTree);
531
540
stream << TypeName << " \n " ;
532
541
auto Result = swift::Demangle::decodeMangledType (*this , DemangleTree);
533
- clearNodeFactory ( );
542
+ popNodeFactoryCheckpoint (checkpoint );
534
543
if (Result.isError ()) {
535
544
auto *Error = Result.getError ();
536
545
char *ErrorStr = Error->copyErrorString ();
@@ -549,10 +558,11 @@ FieldTypeCollectionResult TypeRefBuilder::collectFieldTypes(
549
558
FieldTypeCollectionResult result;
550
559
for (const auto §ions : ReflectionInfos) {
551
560
for (auto descriptor : sections.Field ) {
561
+ auto checkpoint = pushNodeFactoryCheckpoint ();
552
562
auto typeRef = readTypeRef (descriptor, descriptor->MangledTypeName );
553
563
auto typeName = nodeToString (demangleTypeRef (typeRef));
554
564
auto optionalMangledTypeName = normalizeReflectionName (typeRef);
555
- clearNodeFactory ( );
565
+ popNodeFactoryCheckpoint (checkpoint );
556
566
if (optionalMangledTypeName.has_value ()) {
557
567
auto mangledTypeName =
558
568
optionalMangledTypeName.value ();
@@ -618,10 +628,11 @@ void TypeRefBuilder::dumpFieldSection(std::ostream &stream) {
618
628
void TypeRefBuilder::dumpBuiltinTypeSection (std::ostream &stream) {
619
629
for (const auto §ions : ReflectionInfos) {
620
630
for (auto descriptor : sections.Builtin ) {
631
+ auto checkpoint = pushNodeFactoryCheckpoint ();
621
632
auto typeNode =
622
633
demangleTypeRef (readTypeRef (descriptor, descriptor->TypeName ));
623
634
auto typeName = nodeToString (typeNode);
624
- clearNodeFactory ( );
635
+ popNodeFactoryCheckpoint (checkpoint );
625
636
626
637
stream << " \n - " << typeName << " :\n " ;
627
638
stream << " Size: " << descriptor->Size << " \n " ;
@@ -670,10 +681,11 @@ void TypeRefBuilder::dumpCaptureSection(std::ostream &stream) {
670
681
void TypeRefBuilder::dumpMultiPayloadEnumSection (std::ostream &stream) {
671
682
for (const auto §ions : ReflectionInfos) {
672
683
for (const auto descriptor : sections.MultiPayloadEnum ) {
684
+ auto checkpoint = pushNodeFactoryCheckpoint ();
673
685
auto typeNode =
674
686
demangleTypeRef (readTypeRef (descriptor, descriptor->TypeName ));
675
687
auto typeName = nodeToString (typeNode);
676
- clearNodeFactory ( );
688
+ popNodeFactoryCheckpoint (checkpoint );
677
689
678
690
stream << " \n - " << typeName << " :\n " ;
679
691
stream << " Descriptor Size: " << descriptor->getSizeInBytes () << " \n " ;
0 commit comments