Skip to content

Commit acee7c2

Browse files
authored
Merge pull request #25856 from jckarter/demangler-reentrance
Demangler: Save state to allow reentrant demangling.
2 parents 119b25f + df46a14 commit acee7c2

File tree

5 files changed

+60
-15
lines changed

5 files changed

+60
-15
lines changed

include/swift/Demangling/Demangler.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,21 @@ class Demangler : public NodeFactory {
447447
return popNode();
448448
}
449449

450-
void init(StringRef MangledName);
450+
/// This class handles preparing the initial state for a demangle job in a reentrant way, pushing the
451+
/// existing state back when a demangle job is completed.
452+
class DemangleInitRAII {
453+
Demangler &Dem;
454+
Vector<NodePointer> NodeStack;
455+
Vector<NodePointer> Substitutions;
456+
int NumWords;
457+
StringRef Text;
458+
size_t Pos;
459+
460+
public:
461+
DemangleInitRAII(Demangler &Dem, StringRef MangledName);
462+
~DemangleInitRAII();
463+
};
464+
friend DemangleInitRAII;
451465

452466
void addSubstitution(NodePointer Nd) {
453467
if (Nd)

lib/Demangling/Demangler.cpp

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -492,16 +492,32 @@ void Demangler::clear() {
492492
NodeFactory::clear();
493493
}
494494

495-
void Demangler::init(StringRef MangledName) {
496-
NodeStack.init(*this, 16);
497-
Substitutions.init(*this, 16);
498-
NumWords = 0;
499-
Text = MangledName;
500-
Pos = 0;
495+
Demangler::DemangleInitRAII::DemangleInitRAII(Demangler &Dem,
496+
StringRef MangledName)
497+
// Save the current demangler state so we can restore it.
498+
: Dem(Dem),
499+
NodeStack(Dem.NodeStack), Substitutions(Dem.Substitutions),
500+
NumWords(Dem.NumWords), Text(Dem.Text), Pos(Dem.Pos)
501+
{
502+
// Reset the demangler state for a nested job.
503+
Dem.NodeStack.init(Dem, 16);
504+
Dem.Substitutions.init(Dem, 16);
505+
Dem.NumWords = 0;
506+
Dem.Text = MangledName;
507+
Dem.Pos = 0;
508+
}
509+
510+
Demangler::DemangleInitRAII::~DemangleInitRAII() {
511+
// Restore the saved state.
512+
Dem.NodeStack = NodeStack;
513+
Dem.Substitutions = Substitutions;
514+
Dem.NumWords = NumWords;
515+
Dem.Text = Text;
516+
Dem.Pos = Pos;
501517
}
502-
518+
503519
NodePointer Demangler::demangleSymbol(StringRef MangledName) {
504-
init(MangledName);
520+
DemangleInitRAII state(*this, MangledName);
505521

506522
// Demangle old-style class and protocol names, which are still used in the
507523
// ObjC metadata.
@@ -546,7 +562,7 @@ NodePointer Demangler::demangleSymbol(StringRef MangledName) {
546562
}
547563

548564
NodePointer Demangler::demangleType(StringRef MangledName) {
549-
init(MangledName);
565+
DemangleInitRAII state(*this, MangledName);
550566

551567
parseAndPushNodes();
552568

lib/SILOptimizer/Utils/SpecializationMangler.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class AttributeDemangler : public Demangle::Demangler {
3333
public:
3434
void demangleAndAddAsChildren(StringRef MangledSpecialization,
3535
NodePointer Parent) {
36-
init(MangledSpecialization);
36+
DemangleInitRAII state(*this, MangledSpecialization);
3737
if (!parseAndPushNodes()) {
3838
llvm::errs() << "Can't demangle: " << MangledSpecialization << '\n';
3939
abort();

test/Reflection/Inputs/ConcreteTypes.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,11 @@ public struct References {
6363
public unowned var unownedRef: C
6464
public unowned(unsafe) var unownedUnsafeRef: C
6565
}
66+
67+
private struct PrivateStructField {
68+
var x: Int16
69+
}
70+
71+
public struct HasArrayOfPrivateStructField {
72+
private var x: [PrivateStructField]
73+
}

test/Reflection/typeref_decoding.swift

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// REQUIRES: no_asan
22
// RUN: %empty-directory(%t)
3-
// RUN: %target-build-swift %S/Inputs/ConcreteTypes.swift %S/Inputs/GenericTypes.swift %S/Inputs/Protocols.swift %S/Inputs/Extensions.swift %S/Inputs/Closures.swift -parse-as-library -emit-module -emit-library -module-name TypesToReflect -o %t/%target-library-name(TypesToReflect)
3+
// RUN: %target-build-swift -Xfrontend -enable-anonymous-context-mangled-names %S/Inputs/ConcreteTypes.swift %S/Inputs/GenericTypes.swift %S/Inputs/Protocols.swift %S/Inputs/Extensions.swift %S/Inputs/Closures.swift -parse-as-library -emit-module -emit-library -module-name TypesToReflect -o %t/%target-library-name(TypesToReflect)
44
// RUN: %target-swift-reflection-dump -binary-filename %t/%target-library-name(TypesToReflect) | %FileCheck %s
55

66
// CHECK: FIELDS:
@@ -201,6 +201,13 @@
201201
// CHECK: (unmanaged_storage
202202
// CHECK: (class TypesToReflect.C))
203203

204+
// CHECK: TypesToReflect.(PrivateStructField
205+
// CHECK: ----------------------------------
206+
207+
// CHECK: TypesToReflect.HasArrayOfPrivateStructField
208+
// CHECK: -------------------------------------------
209+
// CHECK: x: Swift.Array<TypesToReflect.(PrivateStructField{{.*}})>
210+
204211
// CHECK: TypesToReflect.C1
205212
// CHECK: -----------------
206213
// CHECK: aClass: TypesToReflect.C1<A>
@@ -652,14 +659,14 @@
652659
// CHECK: TypesToReflect.ClassBoundP
653660
// CHECK: --------------------------
654661

655-
// CHECK: TypesToReflect.(FileprivateProtocol in _{{[0-9a-fA-F]+}})
662+
// CHECK: TypesToReflect.(FileprivateProtocol in {{.*}})
656663
// CHECK: -------------------------------------------------------------------------
657664

658665
// CHECK: TypesToReflect.HasFileprivateProtocol
659666
// CHECK: -------------------------------------
660-
// CHECK: x: TypesToReflect.(FileprivateProtocol in ${{[0-9a-fA-F]+}})
667+
// CHECK: x: TypesToReflect.(FileprivateProtocol in {{.*}})
661668
// CHECK: (protocol_composition
662-
// CHECK-NEXT: (protocol TypesToReflect.(FileprivateProtocol in ${{[0-9a-fA-F]+}})))
669+
// CHECK-NEXT: (protocol TypesToReflect.(FileprivateProtocol in {{.*}})))
663670

664671
// CHECK: ASSOCIATED TYPES:
665672
// CHECK: =================

0 commit comments

Comments
 (0)