Skip to content

Commit 87a5b83

Browse files
use unique_ptr instead of PointerStorage
1 parent 0245da0 commit 87a5b83

File tree

4 files changed

+46
-44
lines changed

4 files changed

+46
-44
lines changed

include/swift/Demangling/Demangle.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,7 @@ class Context {
492492
std::string
493493
demangleSymbolAsString(llvm::StringRef MangledName,
494494
const DemangleOptions &Options = DemangleOptions(),
495-
DemanglerPrinter *printer = nullptr);
495+
std::unique_ptr<DemanglerPrinter> printer = nullptr);
496496

497497
/// Demangle the given type and return the readable name.
498498
///
@@ -550,7 +550,7 @@ class Context {
550550
std::string
551551
demangleSymbolAsString(const char *mangledName, size_t mangledNameLength,
552552
const DemangleOptions &options = DemangleOptions(),
553-
DemanglerPrinter *printer = nullptr);
553+
std::unique_ptr<DemanglerPrinter> printer = nullptr);
554554

555555
/// Standalone utility function to demangle the given symbol as string.
556556
///
@@ -561,9 +561,9 @@ demangleSymbolAsString(const char *mangledName, size_t mangledNameLength,
561561
inline std::string
562562
demangleSymbolAsString(const std::string &mangledName,
563563
const DemangleOptions &options = DemangleOptions(),
564-
DemanglerPrinter *printer = nullptr) {
564+
std::unique_ptr<DemanglerPrinter> printer = nullptr) {
565565
return demangleSymbolAsString(mangledName.data(), mangledName.size(), options,
566-
printer);
566+
std::move(printer));
567567
}
568568

569569
/// Standalone utility function to demangle the given symbol as string.
@@ -575,9 +575,9 @@ demangleSymbolAsString(const std::string &mangledName,
575575
inline std::string
576576
demangleSymbolAsString(llvm::StringRef MangledName,
577577
const DemangleOptions &Options = DemangleOptions(),
578-
DemanglerPrinter *printer = nullptr) {
578+
std::unique_ptr<DemanglerPrinter> printer = nullptr) {
579579
return demangleSymbolAsString(MangledName.data(), MangledName.size(), Options,
580-
printer);
580+
std::move(printer));
581581
}
582582

583583
/// Standalone utility function to demangle the given type as string.
@@ -752,7 +752,7 @@ ManglingErrorOr<const char *> mangleNodeAsObjcCString(NodePointer node,
752752
///
753753
std::string nodeToString(NodePointer Root,
754754
const DemangleOptions &Options = DemangleOptions(),
755-
DemanglerPrinter *printer = nullptr);
755+
std::unique_ptr<DemanglerPrinter> printer = nullptr);
756756

757757
/// Transforms a mangled key path accessor thunk helper
758758
/// into the identfier/subscript that would be used to invoke it in swift code.

lib/Demangling/Context.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,11 @@ NodePointer Context::demangleTypeAsNode(llvm::StringRef MangledName) {
5757

5858
std::string Context::demangleSymbolAsString(llvm::StringRef MangledName,
5959
const DemangleOptions &Options,
60-
DemanglerPrinter *printer) {
60+
std::unique_ptr<DemanglerPrinter> printer) {
6161
NodePointer root = demangleSymbolAsNode(MangledName);
6262
if (!root) return MangledName.str();
6363

64-
std::string demangling = nodeToString(root, Options, printer);
64+
std::string demangling = nodeToString(root, Options, std::move(printer));
6565
if (demangling.empty())
6666
return MangledName.str();
6767
return demangling;
@@ -271,10 +271,10 @@ std::string Context::getModuleName(llvm::StringRef mangledName) {
271271
std::string demangleSymbolAsString(const char *MangledName,
272272
size_t MangledNameLength,
273273
const DemangleOptions &Options,
274-
DemanglerPrinter *printer) {
274+
std::unique_ptr<DemanglerPrinter> printer) {
275275
Context Ctx;
276276
return Ctx.demangleSymbolAsString(StringRef(MangledName, MangledNameLength),
277-
Options, printer);
277+
Options, std::move(printer));
278278
}
279279

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

lib/Demangling/NodePrinter.cpp

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -167,27 +167,29 @@ static StringRef toString(ValueWitnessKind k) {
167167
printer_unreachable("bad value witness kind");
168168
}
169169

170+
template <typename T>
171+
auto operator<<(const std::unique_ptr<DemanglerPrinter> &printer,
172+
const T &n) -> decltype((*printer) << n) {
173+
return (*printer) << n;
174+
}
175+
170176
class NodePrinter {
171177
private:
172-
std::unique_ptr<DemanglerPrinter> PrinterStorage;
173-
DemanglerPrinter &Printer;
178+
std::unique_ptr<DemanglerPrinter> Printer;
174179
DemangleOptions Options;
175180
bool SpecializationPrefixPrinted = false;
176181
bool isValid = true;
177182

178183
public:
179-
NodePrinter(DemangleOptions options, DemanglerPrinter *printer = nullptr)
180-
: PrinterStorage(),
181-
Printer(printer
182-
? *printer
183-
: *(PrinterStorage = std::make_unique<DemanglerPrinter>())),
184+
NodePrinter(DemangleOptions options, std::unique_ptr<DemanglerPrinter> printer = nullptr)
185+
: Printer(printer ? std::move(printer) : std::make_unique<DemanglerPrinter>()),
184186
Options(options) {}
185187

186188
std::string printRoot(NodePointer root) {
187189
isValid = true;
188190
print(root, 0);
189191
if (isValid)
190-
return std::move(Printer).str();
192+
return std::move(*Printer).str();
191193
return "";
192194
}
193195

@@ -808,7 +810,7 @@ class NodePrinter {
808810
return;
809811
}
810812

811-
Printer.startParameters(depth);
813+
Printer->startParameters(depth);
812814
NodePointer Parameters = ParameterType->getFirstChild();
813815
assert(Parameters->getKind() == Node::Kind::Type);
814816
Parameters = Parameters->getFirstChild();
@@ -821,7 +823,7 @@ class NodePrinter {
821823
} else {
822824
Printer << "(_:)";
823825
}
824-
Printer.endParameters(depth);
826+
Printer->endParameters(depth);
825827
return;
826828
}
827829

@@ -861,7 +863,7 @@ class NodePrinter {
861863
},
862864
[&]() { Printer << (showTypes ? ", " : ""); });
863865
Printer << ')';
864-
Printer.endParameters(depth);
866+
Printer->endParameters(depth);
865867
}
866868

867869
void printFunctionType(NodePointer LabelList, NodePointer node,
@@ -2414,11 +2416,11 @@ NodePointer NodePrinter::print(NodePointer Node, unsigned depth,
24142416
return nullptr;
24152417
case Node::Kind::TypeSymbolicReference:
24162418
Printer << "type symbolic reference 0x";
2417-
Printer.writeHex(Node->getIndex());
2419+
Printer->writeHex(Node->getIndex());
24182420
return nullptr;
24192421
case Node::Kind::OpaqueTypeDescriptorSymbolicReference:
24202422
Printer << "opaque type symbolic reference 0x";
2421-
Printer.writeHex(Node->getIndex());
2423+
Printer->writeHex(Node->getIndex());
24222424
return nullptr;
24232425
case Node::Kind::DistributedThunk:
24242426
if (!Options.ShortenThunk) {
@@ -2460,7 +2462,7 @@ NodePointer NodePrinter::print(NodePointer Node, unsigned depth,
24602462
return nullptr;
24612463
case Node::Kind::ProtocolSymbolicReference:
24622464
Printer << "protocol symbolic reference 0x";
2463-
Printer.writeHex(Node->getIndex());
2465+
Printer->writeHex(Node->getIndex());
24642466
return nullptr;
24652467
case Node::Kind::GenericTypeMetadataPattern:
24662468
Printer << "generic type metadata pattern for ";
@@ -3472,15 +3474,15 @@ NodePointer NodePrinter::print(NodePointer Node, unsigned depth,
34723474
}
34733475
case Node::Kind::UniqueExtendedExistentialTypeShapeSymbolicReference:
34743476
Printer << "unique existential shape symbolic reference 0x";
3475-
Printer.writeHex(Node->getIndex());
3477+
Printer->writeHex(Node->getIndex());
34763478
return nullptr;
34773479
case Node::Kind::NonUniqueExtendedExistentialTypeShapeSymbolicReference:
34783480
Printer << "non-unique existential shape symbolic reference 0x";
3479-
Printer.writeHex(Node->getIndex());
3481+
Printer->writeHex(Node->getIndex());
34803482
return nullptr;
34813483
case Node::Kind::ObjectiveCProtocolSymbolicReference:
34823484
Printer << "objective-c protocol symbolic reference 0x";
3483-
Printer.writeHex(Node->getIndex());
3485+
Printer->writeHex(Node->getIndex());
34843486
return nullptr;
34853487
case Node::Kind::SymbolicExtendedExistentialType: {
34863488
auto shape = Node->getChild(0);
@@ -3490,7 +3492,7 @@ NodePointer NodePrinter::print(NodePointer Node, unsigned depth,
34903492
Printer << "symbolic existential type ("
34913493
<< (isUnique ? "" : "non-")
34923494
<< "unique) 0x";
3493-
Printer.writeHex(shape->getIndex());
3495+
Printer->writeHex(shape->getIndex());
34943496
Printer << " <";
34953497
print(Node->getChild(1), depth + 1);
34963498
if (Node->getNumChildren() > 2) {
@@ -3577,16 +3579,16 @@ NodePointer NodePrinter::printEntity(NodePointer Entity, unsigned depth,
35773579
// later in suffix form.
35783580
PostfixContext = Context;
35793581
} else {
3580-
size_t CurrentPos = Printer.getStringRef().size();
3582+
size_t CurrentPos = Printer->getStringRef().size();
35813583
PostfixContext = print(Context, depth + 1, /*asPrefixContext*/ true);
35823584

35833585
// Was the context printed as prefix?
3584-
if (Printer.getStringRef().size() != CurrentPos)
3586+
if (Printer->getStringRef().size() != CurrentPos)
35853587
Printer << '.';
35863588
}
35873589
}
35883590
if (Entity->shouldTrackNameRange()) {
3589-
Printer.startName();
3591+
Printer->startName();
35903592
}
35913593
if (hasName || !OverwriteName.empty()) {
35923594
if (!ExtraName.empty() && MultiWordName) {
@@ -3598,7 +3600,7 @@ NodePointer NodePrinter::printEntity(NodePointer Entity, unsigned depth,
35983600
ExtraName = "";
35993601
ExtraIndex = -1;
36003602
}
3601-
size_t CurrentPos = Printer.getStringRef().size();
3603+
size_t CurrentPos = Printer->getStringRef().size();
36023604
if (!OverwriteName.empty()) {
36033605
Printer << OverwriteName;
36043606
} else {
@@ -3609,7 +3611,7 @@ NodePointer NodePrinter::printEntity(NodePointer Entity, unsigned depth,
36093611
if (auto PrivateName = getChildIf(Entity, Node::Kind::PrivateDeclName))
36103612
print(PrivateName, depth + 1);
36113613
}
3612-
if (Printer.getStringRef().size() != CurrentPos && !ExtraName.empty())
3614+
if (Printer->getStringRef().size() != CurrentPos && !ExtraName.empty())
36133615
Printer << '.';
36143616
}
36153617
if (!ExtraName.empty()) {
@@ -3618,7 +3620,7 @@ NodePointer NodePrinter::printEntity(NodePointer Entity, unsigned depth,
36183620
Printer << ExtraIndex;
36193621
}
36203622
if (Entity->shouldTrackNameRange()) {
3621-
Printer.endName();
3623+
Printer->endName();
36223624
}
36233625
if (TypePr != TypePrinting::NoType) {
36243626
NodePointer type = getChildIf(Entity, Node::Kind::Type);
@@ -3851,11 +3853,11 @@ std::string Demangle::keyPathSourceString(const char *MangledName,
38513853

38523854
std::string Demangle::nodeToString(NodePointer root,
38533855
const DemangleOptions &options,
3854-
DemanglerPrinter *printer) {
3856+
std::unique_ptr<DemanglerPrinter> printer) {
38553857
if (!root)
38563858
return "";
38573859

3858-
return NodePrinter(options, printer).printRoot(root);
3860+
return NodePrinter(options, std::move(printer)).printRoot(root);
38593861
}
38603862

38613863
#endif

tools/swift-demangle/swift-demangle.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -255,9 +255,9 @@ static void demangle(llvm::raw_ostream &os, llvm::StringRef name,
255255
return;
256256
}
257257

258-
TrackingDemanglerPrinter printer;
258+
std::unique_ptr<TrackingDemanglerPrinter> printer;
259259
std::string string =
260-
swift::Demangle::nodeToString(pointer, options, &printer);
260+
swift::Demangle::nodeToString(pointer, options, std::move(printer));
261261
if (!CompactMode)
262262
os << name << " ---> ";
263263

@@ -284,13 +284,13 @@ static void demangle(llvm::raw_ostream &os, llvm::StringRef name,
284284
os << (string.empty() ? name : llvm::StringRef(string));
285285

286286
if (!string.empty() && Ranges &&
287-
(printer.hasBaseName() || printer.hasParameters())) {
287+
(printer->hasBaseName() || printer->hasParameters())) {
288288
os << " | {(";
289-
if (printer.hasBaseName())
290-
os << printer.getNameStart() << "," << printer.getNameEnd();
289+
if (printer->hasBaseName())
290+
os << printer->getNameStart() << "," << printer->getNameEnd();
291291
os << ") - (";
292-
if (printer.hasParameters())
293-
os << printer.getParametersStart() << "," << printer.getParametersEnd();
292+
if (printer->hasParameters())
293+
os << printer->getParametersStart() << "," << printer->getParametersEnd();
294294
os << ")}";
295295
}
296296
}

0 commit comments

Comments
 (0)