Skip to content

Commit d46aec9

Browse files
committed
[Basic] Handle multiline strings in abortWithPrettyStackTraceMessage
Improve the formatting by indenting to match the rest of the pretty stack trace.
1 parent 742a96d commit d46aec9

File tree

2 files changed

+28
-5
lines changed

2 files changed

+28
-5
lines changed

include/swift/Basic/PrettyStackTrace.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,15 @@ class PrettyStackTraceSwiftVersion : public llvm::PrettyStackTraceEntry {
5151
};
5252

5353
/// Aborts the program, printing a given message to a PrettyStackTrace frame
54-
/// before exiting.
54+
/// before exiting. This should be preferred over manually logging to stderr and
55+
/// aborting since that won't be picked up by the crash reporter.
5556
[[noreturn]]
5657
void abortWithPrettyStackTraceMessage(
5758
llvm::function_ref<void(llvm::raw_ostream &)> message);
5859

5960
/// Aborts the program, printing a given message to a PrettyStackTrace frame
60-
/// before exiting.
61+
/// before exiting. This should be preferred over manually logging to stderr and
62+
/// aborting since that won't be picked up by the crash reporter.
6163
[[noreturn]]
6264
void abortWithPrettyStackTraceMessage(llvm::StringRef message);
6365

lib/Basic/PrettyStackTrace.cpp

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,38 @@ void PrettyStackTraceSwiftVersion::print(llvm::raw_ostream &out) const {
4040
out << version::getSwiftFullVersion() << '\n';
4141
}
4242

43+
namespace {
44+
/// Similar to PrettyStackTraceString, but formats multi-line strings for
45+
/// the stack trace.
46+
class PrettyStackTraceMultilineString : public llvm::PrettyStackTraceEntry {
47+
StringRef Str;
48+
49+
public:
50+
PrettyStackTraceMultilineString(StringRef str) : Str(str) {}
51+
void print(raw_ostream &OS) const override {
52+
// For each line, add a leading character and indentation to better match
53+
// the formatting of the stack trace.
54+
for (auto c : Str.rtrim('\n')) {
55+
OS << c;
56+
if (c == '\n')
57+
OS << "| \t";
58+
}
59+
OS << '\n';
60+
}
61+
};
62+
} // end anonymous namespace
63+
4364
void swift::abortWithPrettyStackTraceMessage(
4465
llvm::function_ref<void(llvm::raw_ostream &)> message) {
4566
llvm::SmallString<0> errorStr;
4667
llvm::raw_svector_ostream out(errorStr);
4768
message(out);
48-
llvm::PrettyStackTraceString trace(errorStr.c_str());
69+
70+
PrettyStackTraceMultilineString trace(errorStr);
4971
abort();
5072
}
5173

5274
void swift::abortWithPrettyStackTraceMessage(StringRef message) {
53-
auto messageStr = message.str();
54-
llvm::PrettyStackTraceString trace(messageStr.c_str());
75+
PrettyStackTraceMultilineString trace(message);
5576
abort();
5677
}

0 commit comments

Comments
 (0)