@@ -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
+ ScopedNodeFactoryCheckpoint checkpoint (this );
96
97
// Remangle the reflection name to resolve symbolic references.
97
98
if (auto node = demangleTypeRef (reflectionName,
98
99
/* useOpaqueTypeSymbolicReferences*/ false )) {
@@ -104,7 +105,6 @@ TypeRefBuilder::normalizeReflectionName(RemoteRef<char> reflectionName) {
104
105
return {};
105
106
default :
106
107
auto mangling = mangleNode (node);
107
- clearNodeFactory ();
108
108
if (!mangling.isSuccess ()) {
109
109
return {};
110
110
}
@@ -159,11 +159,11 @@ lookupTypeWitness(const std::string &MangledTypeName,
159
159
0 )
160
160
continue ;
161
161
162
+ ScopedNodeFactoryCheckpoint checkpoint (this );
162
163
auto SubstitutedTypeName = readTypeRef (AssocTy,
163
164
AssocTy->SubstitutedTypeName );
164
165
auto Demangled = demangleTypeRef (SubstitutedTypeName);
165
166
auto *TypeWitness = decodeMangledType (Demangled);
166
- clearNodeFactory ();
167
167
168
168
AssociatedTypeCache.insert (std::make_pair (key, TypeWitness));
169
169
return TypeWitness;
@@ -181,9 +181,9 @@ const TypeRef *TypeRefBuilder::lookupSuperclass(const TypeRef *TR) {
181
181
if (!FD->hasSuperclass ())
182
182
return nullptr ;
183
183
184
+ ScopedNodeFactoryCheckpoint checkpoint (this );
184
185
auto Demangled = demangleTypeRef (readTypeRef (FD, FD->Superclass ));
185
186
auto Unsubstituted = decodeMangledType (Demangled);
186
- clearNodeFactory ();
187
187
if (!Unsubstituted)
188
188
return nullptr ;
189
189
@@ -367,9 +367,9 @@ bool TypeRefBuilder::getFieldTypeRefs(
367
367
continue ;
368
368
}
369
369
370
+ ScopedNodeFactoryCheckpoint checkpoint (this );
370
371
auto Demangled = demangleTypeRef (readTypeRef (Field,Field->MangledTypeName ));
371
372
auto Unsubstituted = decodeMangledType (Demangled);
372
- clearNodeFactory ();
373
373
if (!Unsubstituted)
374
374
return false ;
375
375
@@ -486,10 +486,10 @@ TypeRefBuilder::getClosureContextInfo(RemoteRef<CaptureDescriptor> CD) {
486
486
auto CR = CD.getField (*i);
487
487
488
488
if (CR->hasMangledTypeName ()) {
489
+ ScopedNodeFactoryCheckpoint checkpoint (this );
489
490
auto MangledName = readTypeRef (CR, CR->MangledTypeName );
490
491
auto DemangleTree = demangleTypeRef (MangledName);
491
492
TR = decodeMangledType (DemangleTree);
492
- clearNodeFactory ();
493
493
}
494
494
Info.CaptureTypes .push_back (TR);
495
495
}
@@ -499,10 +499,10 @@ TypeRefBuilder::getClosureContextInfo(RemoteRef<CaptureDescriptor> CD) {
499
499
auto MSR = CD.getField (*i);
500
500
501
501
if (MSR->hasMangledTypeName ()) {
502
+ ScopedNodeFactoryCheckpoint checkpoint (this );
502
503
auto MangledName = readTypeRef (MSR, MSR->MangledTypeName );
503
504
auto DemangleTree = demangleTypeRef (MangledName);
504
505
TR = decodeMangledType (DemangleTree);
505
- clearNodeFactory ();
506
506
}
507
507
508
508
const MetadataSource *MS = nullptr ;
@@ -526,11 +526,11 @@ TypeRefBuilder::getClosureContextInfo(RemoteRef<CaptureDescriptor> CD) {
526
526
527
527
void TypeRefBuilder::dumpTypeRef (RemoteRef<char > MangledName,
528
528
std::ostream &stream, bool printTypeName) {
529
+ ScopedNodeFactoryCheckpoint checkpoint (this );
529
530
auto DemangleTree = demangleTypeRef (MangledName);
530
531
auto TypeName = nodeToString (DemangleTree);
531
532
stream << TypeName << " \n " ;
532
533
auto Result = swift::Demangle::decodeMangledType (*this , DemangleTree);
533
- clearNodeFactory ();
534
534
if (Result.isError ()) {
535
535
auto *Error = Result.getError ();
536
536
char *ErrorStr = Error->copyErrorString ();
@@ -549,10 +549,14 @@ FieldTypeCollectionResult TypeRefBuilder::collectFieldTypes(
549
549
FieldTypeCollectionResult result;
550
550
for (const auto §ions : ReflectionInfos) {
551
551
for (auto descriptor : sections.Field ) {
552
- auto typeRef = readTypeRef (descriptor, descriptor->MangledTypeName );
553
- auto typeName = nodeToString (demangleTypeRef (typeRef));
554
- auto optionalMangledTypeName = normalizeReflectionName (typeRef);
555
- clearNodeFactory ();
552
+ llvm::Optional<std::string> optionalMangledTypeName;
553
+ std::string typeName;
554
+ {
555
+ ScopedNodeFactoryCheckpoint checkpoint (this );
556
+ auto typeRef = readTypeRef (descriptor, descriptor->MangledTypeName );
557
+ typeName = nodeToString (demangleTypeRef (typeRef));
558
+ optionalMangledTypeName = normalizeReflectionName (typeRef);
559
+ }
556
560
if (optionalMangledTypeName.has_value ()) {
557
561
auto mangledTypeName =
558
562
optionalMangledTypeName.value ();
@@ -618,10 +622,10 @@ void TypeRefBuilder::dumpFieldSection(std::ostream &stream) {
618
622
void TypeRefBuilder::dumpBuiltinTypeSection (std::ostream &stream) {
619
623
for (const auto §ions : ReflectionInfos) {
620
624
for (auto descriptor : sections.Builtin ) {
625
+ ScopedNodeFactoryCheckpoint checkpoint (this );
621
626
auto typeNode =
622
627
demangleTypeRef (readTypeRef (descriptor, descriptor->TypeName ));
623
628
auto typeName = nodeToString (typeNode);
624
- clearNodeFactory ();
625
629
626
630
stream << " \n - " << typeName << " :\n " ;
627
631
stream << " Size: " << descriptor->Size << " \n " ;
@@ -670,10 +674,10 @@ void TypeRefBuilder::dumpCaptureSection(std::ostream &stream) {
670
674
void TypeRefBuilder::dumpMultiPayloadEnumSection (std::ostream &stream) {
671
675
for (const auto §ions : ReflectionInfos) {
672
676
for (const auto descriptor : sections.MultiPayloadEnum ) {
677
+ ScopedNodeFactoryCheckpoint checkpoint (this );
673
678
auto typeNode =
674
679
demangleTypeRef (readTypeRef (descriptor, descriptor->TypeName ));
675
680
auto typeName = nodeToString (typeNode);
676
- clearNodeFactory ();
677
681
678
682
stream << " \n - " << typeName << " :\n " ;
679
683
stream << " Descriptor Size: " << descriptor->getSizeInBytes () << " \n " ;
0 commit comments