Skip to content

Commit 9bf53cc

Browse files
create a separate API to avoid access to a string that has been moved
1 parent eb11777 commit 9bf53cc

File tree

3 files changed

+84
-28
lines changed

3 files changed

+84
-28
lines changed

include/swift/Demangling/Demangle.h

Lines changed: 58 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -484,17 +484,27 @@ class Context {
484484
/// The lifetime of the returned node tree ends with the lifetime of the
485485
/// context or with a call of clear().
486486
NodePointer demangleTypeAsNode(llvm::StringRef MangledName);
487-
487+
488488
/// Demangle the given symbol and return the readable name.
489489
///
490490
/// \param MangledName The mangled symbol string, which start a mangling
491491
/// prefix: _T, _T0, $S, _$S.
492+
/// \param Options The DemangleOptions that will be used by the NodePrinter.
492493
///
493494
/// \returns The demangled string.
494495
std::string
495496
demangleSymbolAsString(llvm::StringRef MangledName,
496-
const DemangleOptions &Options = DemangleOptions(),
497-
NodePrinter *printer = nullptr);
497+
const DemangleOptions &Options = DemangleOptions());
498+
499+
/// Demangle the given symbol.
500+
///
501+
/// \param MangledName The mangled symbol string, which start a mangling
502+
/// prefix: _T, _T0, $S, _$S.
503+
/// \param printer The NodePrinter that will be used to demangle the symbol.
504+
///
505+
/// \returns The demangled string.
506+
void demangleSymbolAsString(llvm::StringRef MangledName,
507+
NodePrinter *printer);
498508

499509
/// Demangle the given type and return the readable name.
500510
///
@@ -551,8 +561,19 @@ class Context {
551561
/// \returns The demangled string.
552562
std::string
553563
demangleSymbolAsString(const char *mangledName, size_t mangledNameLength,
554-
const DemangleOptions &options = DemangleOptions(),
555-
NodePrinter *printer = nullptr);
564+
const DemangleOptions &options = DemangleOptions());
565+
566+
/// Standalone utility function to demangle the given symbol as string.
567+
///
568+
/// If performance is an issue when demangling multiple symbols,
569+
/// Context::demangleSymbolAsString should be used instead.
570+
/// \param mangledName The mangled name string pointer.
571+
/// \param mangledNameLength The length of the mangledName string.
572+
/// \param printer The NodePrinter that will be used to demangle the symbol.
573+
///
574+
/// \returns The demangled string.
575+
void demangleSymbolAsString(const char *mangledName, size_t mangledNameLength,
576+
NodePrinter *printer);
556577

557578
/// Standalone utility function to demangle the given symbol as string.
558579
///
@@ -562,10 +583,9 @@ demangleSymbolAsString(const char *mangledName, size_t mangledNameLength,
562583
/// \returns The demangled string.
563584
inline std::string
564585
demangleSymbolAsString(const std::string &mangledName,
565-
const DemangleOptions &options = DemangleOptions(),
566-
NodePrinter *printer = nullptr) {
567-
return demangleSymbolAsString(mangledName.data(), mangledName.size(), options,
568-
printer);
586+
const DemangleOptions &options = DemangleOptions()) {
587+
return demangleSymbolAsString(mangledName.data(), mangledName.size(),
588+
options);
569589
}
570590

571591
/// Standalone utility function to demangle the given symbol as string.
@@ -576,10 +596,21 @@ demangleSymbolAsString(const std::string &mangledName,
576596
/// \returns The demangled string.
577597
inline std::string
578598
demangleSymbolAsString(llvm::StringRef MangledName,
579-
const DemangleOptions &Options = DemangleOptions(),
580-
NodePrinter *printer = nullptr) {
581-
return demangleSymbolAsString(MangledName.data(), MangledName.size(), Options,
582-
printer);
599+
const DemangleOptions &Options = DemangleOptions()) {
600+
return demangleSymbolAsString(MangledName.data(), MangledName.size(),
601+
Options);
602+
}
603+
604+
/// Standalone utility function to demangle the given symbol as string.
605+
///
606+
/// If performance is an issue when demangling multiple symbols,
607+
/// Context::demangleSymbolAsString should be used instead.
608+
/// \param MangledName The mangled name string.
609+
///
610+
/// \returns The demangled string.
611+
inline void demangleSymbolAsString(llvm::StringRef MangledName,
612+
NodePrinter *printer) {
613+
demangleSymbolAsString(MangledName.data(), MangledName.size(), printer);
583614
}
584615

585616
/// Standalone utility function to demangle the given type as string.
@@ -753,8 +784,16 @@ ManglingErrorOr<const char *> mangleNodeAsObjcCString(NodePointer node,
753784
/// \returns A string representing the demangled name.
754785
///
755786
std::string nodeToString(NodePointer Root,
756-
const DemangleOptions &Options = DemangleOptions(),
757-
NodePrinter *printer = nullptr);
787+
const DemangleOptions &Options = DemangleOptions());
788+
789+
/// Transform the node structure to a string.
790+
///
791+
/// \endcode
792+
///
793+
/// \param Root A pointer to a parse tree generated by the demangler.
794+
/// \param Printer A NodePrinter used to pretty print the demangled Node.
795+
///
796+
void nodeToString(NodePointer Root, NodePrinter *Printer);
758797

759798
/// Transforms a mangled key path accessor thunk helper
760799
/// into the identfier/subscript that would be used to invoke it in swift code.
@@ -865,9 +904,12 @@ class NodePrinter {
865904

866905
virtual ~NodePrinter() {}
867906

868-
std::string printRoot(NodePointer root) {
907+
void printRoot(NodePointer root) {
869908
isValid = true;
870909
print(root, 0);
910+
}
911+
912+
std::string takeString() {
871913
if (isValid)
872914
return std::move(Printer).str();
873915
return "";

lib/Demangling/Context.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,17 +56,22 @@ NodePointer Context::demangleTypeAsNode(llvm::StringRef MangledName) {
5656
#if SWIFT_STDLIB_HAS_TYPE_PRINTING
5757

5858
std::string Context::demangleSymbolAsString(llvm::StringRef MangledName,
59-
const DemangleOptions &Options,
60-
NodePrinter *printer) {
59+
const DemangleOptions &Options) {
6160
NodePointer root = demangleSymbolAsNode(MangledName);
6261
if (!root) return MangledName.str();
6362

64-
std::string demangling = nodeToString(root, Options, printer);
63+
std::string demangling = nodeToString(root, Options);
6564
if (demangling.empty())
6665
return MangledName.str();
6766
return demangling;
6867
}
6968

69+
void Context::demangleSymbolAsString(llvm::StringRef MangledName,
70+
NodePrinter *printer) {
71+
NodePointer root = demangleSymbolAsNode(MangledName);
72+
nodeToString(root, printer);
73+
}
74+
7075
std::string Context::demangleTypeAsString(llvm::StringRef MangledName,
7176
const DemangleOptions &Options) {
7277
NodePointer root = demangleTypeAsNode(MangledName);
@@ -270,11 +275,17 @@ std::string Context::getModuleName(llvm::StringRef mangledName) {
270275

271276
std::string demangleSymbolAsString(const char *MangledName,
272277
size_t MangledNameLength,
273-
const DemangleOptions &Options,
274-
NodePrinter *printer) {
278+
const DemangleOptions &Options) {
279+
Context Ctx;
280+
return Ctx.demangleSymbolAsString(StringRef(MangledName, MangledNameLength),
281+
Options);
282+
}
283+
284+
void demangleSymbolAsString(const char *MangledName, size_t MangledNameLength,
285+
NodePrinter *printer) {
275286
Context Ctx;
276287
return Ctx.demangleSymbolAsString(StringRef(MangledName, MangledNameLength),
277-
Options, printer);
288+
printer);
278289
}
279290

280291
std::string demangleTypeAsString(const char *MangledName,

lib/Demangling/NodePrinter.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3747,15 +3747,18 @@ std::string Demangle::keyPathSourceString(const char *MangledName,
37473747
}
37483748

37493749
std::string Demangle::nodeToString(NodePointer root,
3750-
const DemangleOptions &options,
3751-
NodePrinter *printer) {
3750+
const DemangleOptions &options) {
37523751
if (!root)
37533752
return "";
3753+
NodePrinter printer = NodePrinter(options);
3754+
nodeToString(root, &printer);
3755+
return printer.takeString();
3756+
}
37543757

3755-
if (printer) {
3756-
return printer->printRoot(root);
3757-
}
3758-
return NodePrinter(options).printRoot(root);
3758+
void Demangle::nodeToString(NodePointer root, NodePrinter *printer) {
3759+
if (!root)
3760+
return;
3761+
printer->printRoot(root);
37593762
}
37603763

37613764
#endif

0 commit comments

Comments
 (0)