@@ -146,15 +146,55 @@ bool SubstitutionEntry::deepEquals(Node *lhs, Node *rhs) const {
146146 return true ;
147147}
148148
149+ // / The output string of the Demangler.
150+ // /
151+ // / It's allocating the string with the provided Factory.
152+ struct RemanglerBuffer {
153+ CharVector Stream;
154+ NodeFactory &Factory;
155+
156+ RemanglerBuffer (NodeFactory &Factory) : Factory(Factory) {
157+ Stream.init (Factory, 32 );
158+ }
159+
160+ RemanglerBuffer &operator <<(char c) & {
161+ Stream.push_back (c, Factory);
162+ return *this ;
163+ }
164+
165+ RemanglerBuffer &operator <<(llvm::StringRef Value) & {
166+ Stream.append (Value, Factory);
167+ return *this ;
168+ }
169+
170+ RemanglerBuffer &operator <<(int n) & {
171+ Stream.append (n, Factory);
172+ return *this ;
173+ }
174+
175+ RemanglerBuffer &operator <<(unsigned n) & {
176+ Stream.append ((unsigned long long )n, Factory);
177+ return *this ;
178+ }
179+
180+ RemanglerBuffer &operator <<(unsigned long n) & {
181+ Stream.append ((unsigned long long )n, Factory);
182+ return *this ;
183+ }
184+
185+ RemanglerBuffer &operator <<(unsigned long long n) & {
186+ Stream.append (n, Factory);
187+ return *this ;
188+ }
189+ };
190+
149191class Remangler {
150192 template <typename Mangler>
151193 friend void Mangle::mangleIdentifier (Mangler &M, StringRef ident);
152194 friend class Mangle ::SubstitutionMerging;
153195
154196 const bool UsePunycode = true ;
155197
156- DemanglerPrinter &Buffer;
157-
158198 Vector<SubstitutionWord> Words;
159199 Vector<WordReplacement> SubstWordsInIdent;
160200
@@ -178,7 +218,9 @@ class Remangler {
178218
179219 // We have to cons up temporary nodes sometimes when remangling
180220 // nested generics. This factory owns them.
181- NodeFactory Factory;
221+ NodeFactory &Factory;
222+
223+ RemanglerBuffer Buffer;
182224
183225 // A callback for resolving symbolic references.
184226 SymbolicResolver Resolver;
@@ -209,9 +251,9 @@ class Remangler {
209251 return it->second ;
210252 }
211253
212- StringRef getBufferStr () const { return Buffer.getStringRef (); }
254+ StringRef getBufferStr () const { return Buffer.Stream . str (); }
213255
214- void resetBuffer (size_t toPos) { Buffer.resetSize (toPos); }
256+ void resetBuffer (size_t toPos) { Buffer.Stream . resetSize (toPos); }
215257
216258 template <typename Mangler>
217259 friend void mangleIdentifier (Mangler &M, StringRef ident);
@@ -348,12 +390,8 @@ class Remangler {
348390#include " swift/Demangling/DemangleNodes.def"
349391
350392public:
351- Remangler (DemanglerPrinter &Buffer, SymbolicResolver Resolver,
352- NodeFactory *BorrowFrom)
353- : Buffer(Buffer), Resolver(Resolver) {
354- if (BorrowFrom)
355- Factory.providePreallocatedMemory (*BorrowFrom);
356- }
393+ Remangler (SymbolicResolver Resolver, NodeFactory &Factory)
394+ : Factory(Factory), Buffer(Factory), Resolver(Resolver) { }
357395
358396 void mangle (Node *node) {
359397 switch (node->getKind ()) {
@@ -362,6 +400,14 @@ class Remangler {
362400 }
363401 unreachable (" bad demangling tree node" );
364402 }
403+
404+ StringRef strRef () {
405+ return Buffer.Stream .str ();
406+ }
407+
408+ std::string str () {
409+ return strRef ().str ();
410+ }
365411};
366412
367413bool Remangler::trySubstitution (Node *node, SubstitutionEntry &entry,
@@ -2373,22 +2419,34 @@ void Remangler::mangleSugaredParen(Node *node) {
23732419} // anonymous namespace
23742420
23752421// / The top-level interface to the remangler.
2376- std::string Demangle::mangleNode (NodePointer node, NodeFactory *BorrowFrom ) {
2422+ std::string Demangle::mangleNode (NodePointer node) {
23772423 return mangleNode (node, [](SymbolicReferenceKind, const void *) -> NodePointer {
23782424 unreachable (" should not try to mangle a symbolic reference; "
23792425 " resolve it to a non-symbolic demangling tree instead" );
2380- }, BorrowFrom );
2426+ });
23812427}
23822428
23832429std::string
2384- Demangle::mangleNode (NodePointer node, SymbolicResolver resolver,
2385- NodeFactory *BorrowFrom) {
2430+ Demangle::mangleNode (NodePointer node, SymbolicResolver resolver) {
23862431 if (!node) return " " ;
23872432
2388- DemanglerPrinter printer;
2389- Remangler (printer, resolver, BorrowFrom).mangle (node);
2433+ NodeFactory Factory;
2434+ Remangler remangler (resolver, Factory);
2435+ remangler.mangle (node);
2436+
2437+ return remangler.str ();
2438+ }
2439+
2440+ llvm::StringRef
2441+ Demangle::mangleNode (NodePointer node, SymbolicResolver resolver,
2442+ NodeFactory &Factory) {
2443+ if (!node)
2444+ return StringRef ();
2445+
2446+ Remangler remangler (resolver, Factory);
2447+ remangler.mangle (node);
23902448
2391- return std::move (printer). str ();
2449+ return remangler. strRef ();
23922450}
23932451
23942452bool Demangle::isSpecialized (Node *node) {
0 commit comments