diff --git a/js/public/ErrorReport.h b/js/public/ErrorReport.h index e565ac4565bb..bab704f069f8 100644 --- a/js/public/ErrorReport.h +++ b/js/public/ErrorReport.h @@ -306,9 +306,9 @@ struct MOZ_STACK_CLASS JS_PUBLIC_API ErrorReportBuilder { bool init(JSContext* cx, const JS::ExceptionStack& exnStack, SniffingBehavior sniffingBehavior); - JSErrorReport* report() { return reportp; } + JSErrorReport* report() const { return reportp; } - const JS::ConstUTF8CharsZ toStringResult() { return toStringResult_; } + const JS::ConstUTF8CharsZ toStringResult() const { return toStringResult_; } private: // More or less an equivalent of JS_ReportErrorNumber/js::ReportErrorNumberVA @@ -348,10 +348,13 @@ struct MOZ_STACK_CLASS JS_PUBLIC_API ErrorReportBuilder { // Writes a full report to a file descriptor. Does nothing for JSErrorReports // which are warnings, unless reportWarnings is set. extern JS_PUBLIC_API void PrintError(JSContext* cx, FILE* file, - ConstUTF8CharsZ toStringResult, JSErrorReport* report, bool reportWarnings); +extern JS_PUBLIC_API void PrintError(JSContext* cx, FILE* file, + const JS::ErrorReportBuilder& builder, + bool reportWarnings); + } // namespace JS #endif /* js_ErrorReport_h */ diff --git a/js/src/jsapi-tests/testBinASTReader.cpp b/js/src/jsapi-tests/testBinASTReader.cpp index b30ac5ca4212..af5b8f79a0ba 100644 --- a/js/src/jsapi-tests/testBinASTReader.cpp +++ b/js/src/jsapi-tests/testBinASTReader.cpp @@ -399,8 +399,7 @@ void runTestFromPath(JSContext* cx, const char* path) { MOZ_CRASH("Couldn't report txtExn"); } - PrintError(cx, stderr, report.toStringResult(), report.report(), - /* reportWarnings */ true); + PrintError(cx, stderr, report, /* reportWarnings */ true); MOZ_CRASH("Binary parser accepted a file that text parser rejected"); } @@ -412,8 +411,7 @@ void runTestFromPath(JSContext* cx, const char* path) { MOZ_CRASH("Couldn't report binExn"); } - PrintError(cx, stderr, report.toStringResult(), report.report(), - /* reportWarnings */ true); + PrintError(cx, stderr, report, /* reportWarnings */ true); MOZ_CRASH("Binary parser rejected a file that text parser accepted"); } diff --git a/js/src/jsapi-tests/testPrintError.cpp b/js/src/jsapi-tests/testPrintError.cpp index d9c869697f8e..b42b40abe0d4 100644 --- a/js/src/jsapi-tests/testPrintError.cpp +++ b/js/src/jsapi-tests/testPrintError.cpp @@ -52,8 +52,7 @@ BEGIN_TEST(testPrintError_Works) { JS::ErrorReportBuilder builder(cx); CHECK(builder.init(cx, exnStack, JS::ErrorReportBuilder::NoSideEffects)); - JS::PrintError(cx, buf.stream(), builder.toStringResult(), builder.report(), - false); + JS::PrintError(cx, buf.stream(), builder, false); CHECK(buf.contains("testPrintError_Works.js:3:1 uncaught exception: null\n")); @@ -72,7 +71,7 @@ static bool warningSuccess; static void warningReporter(JSContext* cx, JSErrorReport* report) { AutoStreamBuffer buf; - JS::PrintError(cx, buf.stream(), JS::ConstUTF8CharsZ(), report, false); + JS::PrintError(cx, buf.stream(), report, false); warningSuccess = buf.contains(""); } END_TEST(testPrintError_SkipWarning) @@ -90,7 +89,7 @@ static bool warningSuccess; static void warningReporter(JSContext* cx, JSErrorReport* report) { AutoStreamBuffer buf; - JS::PrintError(cx, buf.stream(), JS::ConstUTF8CharsZ(), report, true); + JS::PrintError(cx, buf.stream(), report, true); warningSuccess = buf.contains("warning: warning message\n"); } END_TEST(testPrintError_PrintWarning) @@ -112,8 +111,7 @@ BEGIN_TEST(testPrintError_UTF16CodePoints) { JS::ErrorReportBuilder builder(cx); CHECK(builder.init(cx, exnStack, JS::ErrorReportBuilder::NoSideEffects)); - JS::PrintError(cx, buf.stream(), builder.toStringResult(), builder.report(), - false); + JS::PrintError(cx, buf.stream(), builder, false); CHECK(buf.contains( "testPrintError_UTF16CodePoints.js:3:4 SyntaxError: illegal character:\n" diff --git a/js/src/jsexn.cpp b/js/src/jsexn.cpp index 1f4367c1a93c..99896ae895c2 100644 --- a/js/src/jsexn.cpp +++ b/js/src/jsexn.cpp @@ -288,7 +288,7 @@ void js::ErrorToException(JSContext* cx, JSErrorReport* reportp, // cannot construct the Error constructor without self-hosted code. Just // print the error to stderr to help debugging. if (cx->realm()->isSelfHostingRealm()) { - JS::PrintError(cx, stderr, JS::ConstUTF8CharsZ(), reportp, true); + JS::PrintError(cx, stderr, reportp, true); return; } diff --git a/js/src/shell/js.cpp b/js/src/shell/js.cpp index 6913ba3b0acd..396abba7e1b1 100644 --- a/js/src/shell/js.cpp +++ b/js/src/shell/js.cpp @@ -9742,8 +9742,7 @@ js::shell::AutoReportException::~AutoReportException() { MOZ_ASSERT(!report.report()->isWarning()); FILE* fp = ErrorFilePointer(); - JS::PrintError(cx, fp, report.toStringResult(), report.report(), - reportWarnings); + JS::PrintError(cx, fp, report, reportWarnings); JS_ClearPendingException(cx); if (!PrintStackTrace(cx, exnStack.stack())) { @@ -9783,7 +9782,7 @@ void js::shell::WarningReporter(JSContext* cx, JSErrorReport* report) { } // Print the warning. - JS::PrintError(cx, fp, JS::ConstUTF8CharsZ(), report, reportWarnings); + JS::PrintError(cx, fp, report, reportWarnings); } static bool global_enumerate(JSContext* cx, JS::HandleObject obj, diff --git a/js/src/shell/jsrtfuzzing/jsrtfuzzing.cpp b/js/src/shell/jsrtfuzzing/jsrtfuzzing.cpp index 0119191c0bf2..cffc3476e180 100644 --- a/js/src/shell/jsrtfuzzing/jsrtfuzzing.cpp +++ b/js/src/shell/jsrtfuzzing/jsrtfuzzing.cpp @@ -43,8 +43,7 @@ static void CrashOnPendingException() { fprintf(stderr, "out of memory initializing JS::ErrorReportBuilder\n"); fflush(stderr); } else { - JS::PrintError(gCx, stderr, report.toStringResult(), report.report(), - js::shell::reportWarnings); + JS::PrintError(gCx, stderr, report, js::shell::reportWarnings); if (!js::shell::PrintStackTrace(gCx, exnStack.stack())) { fputs("(Unable to print stack trace)\n", stderr); } diff --git a/js/src/vm/JSContext.cpp b/js/src/vm/JSContext.cpp index d859db98fa81..c725923e3644 100644 --- a/js/src/vm/JSContext.cpp +++ b/js/src/vm/JSContext.cpp @@ -476,9 +476,9 @@ static void PrintSingleError(JSContext* cx, FILE* file, fflush(file); } -JS_PUBLIC_API void JS::PrintError(JSContext* cx, FILE* file, - JS::ConstUTF8CharsZ toStringResult, - JSErrorReport* report, bool reportWarnings) { +static void PrintErrorImpl(JSContext* cx, FILE* file, + JS::ConstUTF8CharsZ toStringResult, + JSErrorReport* report, bool reportWarnings) { MOZ_ASSERT(report); /* Conditionally ignore reported warnings. */ @@ -500,6 +500,18 @@ JS_PUBLIC_API void JS::PrintError(JSContext* cx, FILE* file, } } +JS_PUBLIC_API void JS::PrintError(JSContext* cx, FILE* file, + JSErrorReport* report, bool reportWarnings) { + PrintErrorImpl(cx, file, JS::ConstUTF8CharsZ(), report, reportWarnings); +} + +JS_PUBLIC_API void JS::PrintError(JSContext* cx, FILE* file, + const JS::ErrorReportBuilder& builder, + bool reportWarnings) { + PrintErrorImpl(cx, file, builder.toStringResult(), builder.report(), + reportWarnings); +} + void js::ReportIsNotDefined(JSContext* cx, HandleId id) { if (UniqueChars printable = IdToPrintableUTF8(cx, id, IdToPrintableBehavior::IdIsIdentifier)) { diff --git a/js/src/vm/SelfHosting.cpp b/js/src/vm/SelfHosting.cpp index 9f2d75aeb429..c63444d5c691 100644 --- a/js/src/vm/SelfHosting.cpp +++ b/js/src/vm/SelfHosting.cpp @@ -109,7 +109,7 @@ using mozilla::Maybe; static void selfHosting_WarningReporter(JSContext* cx, JSErrorReport* report) { MOZ_ASSERT(report->isWarning()); - JS::PrintError(cx, stderr, JS::ConstUTF8CharsZ(), report, true); + JS::PrintError(cx, stderr, report, true); } static bool intrinsic_ToObject(JSContext* cx, unsigned argc, Value* vp) { @@ -2602,7 +2602,7 @@ static void MaybePrintAndClearPendingException(JSContext* cx, FILE* file) { } MOZ_ASSERT(!report.report()->isWarning()); - JS::PrintError(cx, file, report.toStringResult(), report.report(), true); + JS::PrintError(cx, file, report, true); } class MOZ_STACK_CLASS AutoSelfHostingErrorReporter {