From e11bf8d4efb1396594f469c5cfe99234aeac237c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Bargull?= Date: Wed, 13 Jun 2018 09:47:21 -0700 Subject: [PATCH] Bug 1465350 - Use UniquePtr instead of ScopedJSFreePtr for JSErrorReporter. r=Waldo --- js/src/jsapi.cpp | 2 +- js/src/jsexn.cpp | 39 ++++++++++++++++++++------------------- js/src/jsexn.h | 5 +++-- js/src/vm/ErrorObject.cpp | 16 +++++++++------- js/src/vm/ErrorObject.h | 5 +++-- 5 files changed, 36 insertions(+), 31 deletions(-) diff --git a/js/src/jsapi.cpp b/js/src/jsapi.cpp index c300848f7682..9f83f5cea4c0 100644 --- a/js/src/jsapi.cpp +++ b/js/src/jsapi.cpp @@ -7093,7 +7093,7 @@ JSErrorNotes::copy(JSContext* cx) } for (auto&& note : *this) { - js::UniquePtr copied(CopyErrorNote(cx, note.get())); + UniquePtr copied = CopyErrorNote(cx, note.get()); if (!copied) return nullptr; diff --git a/js/src/jsexn.cpp b/js/src/jsexn.cpp index dafd663091fc..4bd5a96185cc 100644 --- a/js/src/jsexn.cpp +++ b/js/src/jsexn.cpp @@ -14,6 +14,7 @@ #include "mozilla/Sprintf.h" #include +#include #include "jsapi.h" #include "jsnum.h" @@ -23,6 +24,7 @@ #include "gc/FreeOp.h" #include "gc/Marking.h" #include "js/CharacterEncoding.h" +#include "js/UniquePtr.h" #include "js/Wrapper.h" #include "util/StringBuffer.h" #include "vm/ErrorObject.h" @@ -267,7 +269,7 @@ CopyExtraData(JSContext* cx, uint8_t** cursor, JSErrorNotes::Note* copy, JSError } template -static T* +static UniquePtr CopyErrorHelper(JSContext* cx, T* report) { /* @@ -298,7 +300,7 @@ CopyErrorHelper(JSContext* cx, T* report) if (!cursor) return nullptr; - T* copy = new (cursor) T(); + UniquePtr copy(new (cursor) T()); cursor += sizeof(T); if (report->message()) { @@ -313,13 +315,10 @@ CopyErrorHelper(JSContext* cx, T* report) cursor += filenameSize; } - if (!CopyExtraData(cx, &cursor, copy, report)) { - /* js_delete calls destructor for T and js_free for pod_calloc. */ - js_delete(copy); + if (!CopyExtraData(cx, &cursor, copy.get(), report)) return nullptr; - } - MOZ_ASSERT(cursor == (uint8_t*)copy + mallocSize); + MOZ_ASSERT(cursor == (uint8_t*)copy.get() + mallocSize); /* Copy non-pointer members. */ copy->lineno = report->lineno; @@ -329,13 +328,13 @@ CopyErrorHelper(JSContext* cx, T* report) return copy; } -JSErrorNotes::Note* +UniquePtr js::CopyErrorNote(JSContext* cx, JSErrorNotes::Note* note) { return CopyErrorHelper(cx, note); } -JSErrorReport* +UniquePtr js::CopyErrorReport(JSContext* cx, JSErrorReport* report) { return CopyErrorHelper(cx, report); @@ -686,12 +685,12 @@ js::ErrorToException(JSContext* cx, JSErrorReport* reportp, if (!CaptureStack(cx, &stack)) return; - js::ScopedJSFreePtr report(CopyErrorReport(cx, reportp)); + UniquePtr report = CopyErrorReport(cx, reportp); if (!report) return; - RootedObject errObject(cx, ErrorObject::create(cx, exnType, stack, fileName, - lineNumber, columnNumber, &report, messageStr)); + RootedObject errObject(cx, ErrorObject::create(cx, exnType, stack, fileName, lineNumber, + columnNumber, std::move(report), messageStr)); if (!errObject) return; @@ -990,7 +989,7 @@ ErrorReport::populateUncaughtExceptionReportUTF8VA(JSContext* cx, va_list ap) JSObject* js::CopyErrorObject(JSContext* cx, Handle err) { - js::ScopedJSFreePtr copyReport; + UniquePtr copyReport; if (JSErrorReport* errorReport = err->getErrorReport()) { copyReport = CopyErrorReport(cx, errorReport); if (!copyReport) @@ -1012,7 +1011,7 @@ js::CopyErrorObject(JSContext* cx, Handle err) // Create the Error object. return ErrorObject::create(cx, errorType, stack, fileName, - lineNumber, columnNumber, ©Report, message); + lineNumber, columnNumber, std::move(copyReport), message); } JS_PUBLIC_API(bool) @@ -1023,13 +1022,15 @@ JS::CreateError(JSContext* cx, JSExnType type, HandleObject stack, HandleString assertSameCompartment(cx, stack, fileName, message); AssertObjectIsSavedFrameOrWrapper(cx, stack); - js::ScopedJSFreePtr rep; - if (report) + js::UniquePtr rep; + if (report) { rep = CopyErrorReport(cx, report); + if (!rep) + return false; + } - RootedObject obj(cx, - js::ErrorObject::create(cx, type, stack, fileName, - lineNumber, columnNumber, &rep, message)); + JSObject* obj = js::ErrorObject::create(cx, type, stack, fileName, lineNumber, columnNumber, + std::move(rep), message); if (!obj) return false; diff --git a/js/src/jsexn.h b/js/src/jsexn.h index 233bcf6efbfd..f7fc36231701 100644 --- a/js/src/jsexn.h +++ b/js/src/jsexn.h @@ -14,15 +14,16 @@ #include "jsapi.h" #include "NamespaceImports.h" +#include "js/UniquePtr.h" #include "vm/JSContext.h" namespace js { class ErrorObject; -JSErrorNotes::Note* +UniquePtr CopyErrorNote(JSContext* cx, JSErrorNotes::Note* note); -JSErrorReport* +UniquePtr CopyErrorReport(JSContext* cx, JSErrorReport* report); JSString* diff --git a/js/src/vm/ErrorObject.cpp b/js/src/vm/ErrorObject.cpp index dfa3526184b6..307ac897ec80 100644 --- a/js/src/vm/ErrorObject.cpp +++ b/js/src/vm/ErrorObject.cpp @@ -9,6 +9,8 @@ #include "mozilla/Range.h" +#include + #include "jsexn.h" #include "js/CallArgs.h" @@ -38,7 +40,7 @@ js::ErrorObject::assignInitialShape(JSContext* cx, Handle obj) /* static */ bool js::ErrorObject::init(JSContext* cx, Handle obj, JSExnType type, - ScopedJSFreePtr* errorReport, HandleString fileName, + UniquePtr errorReport, HandleString fileName, HandleObject stack, uint32_t lineNumber, uint32_t columnNumber, HandleString message) { @@ -72,7 +74,7 @@ js::ErrorObject::init(JSContext* cx, Handle obj, JSExnType type, MOZ_ASSERT(JSEXN_ERR <= type && type < JSEXN_LIMIT); - JSErrorReport* report = errorReport ? errorReport->forget() : nullptr; + JSErrorReport* report = errorReport.release(); obj->initReservedSlot(EXNTYPE_SLOT, Int32Value(type)); obj->initReservedSlot(STACK_SLOT, ObjectOrNullValue(stack)); obj->setReservedSlot(ERROR_REPORT_SLOT, PrivateValue(report)); @@ -88,7 +90,7 @@ js::ErrorObject::init(JSContext* cx, Handle obj, JSExnType type, /* static */ ErrorObject* js::ErrorObject::create(JSContext* cx, JSExnType errorType, HandleObject stack, HandleString fileName, uint32_t lineNumber, uint32_t columnNumber, - ScopedJSFreePtr* report, HandleString message, + UniquePtr report, HandleString message, HandleObject protoArg /* = nullptr */) { AssertObjectIsSavedFrameOrWrapper(cx, stack); @@ -109,7 +111,7 @@ js::ErrorObject::create(JSContext* cx, JSExnType errorType, HandleObject stack, errObject = &obj->as(); } - if (!ErrorObject::init(cx, errObject, errorType, report, fileName, stack, + if (!ErrorObject::init(cx, errObject, errorType, std::move(report), fileName, stack, lineNumber, columnNumber, message)) { return nullptr; @@ -156,11 +158,11 @@ js::ErrorObject::getOrCreateErrorReport(JSContext* cx) report.initOwnedMessage(utf8.release()); // Cache and return. - JSErrorReport* copy = CopyErrorReport(cx, &report); + UniquePtr copy = CopyErrorReport(cx, &report); if (!copy) return nullptr; - setReservedSlot(ERROR_REPORT_SLOT, PrivateValue(copy)); - return copy; + setReservedSlot(ERROR_REPORT_SLOT, PrivateValue(copy.get())); + return copy.release(); } static bool diff --git a/js/src/vm/ErrorObject.h b/js/src/vm/ErrorObject.h index 2e2427a388d5..0727235dd16a 100644 --- a/js/src/vm/ErrorObject.h +++ b/js/src/vm/ErrorObject.h @@ -9,6 +9,7 @@ #include "mozilla/ArrayUtils.h" +#include "js/UniquePtr.h" #include "vm/NativeObject.h" #include "vm/SavedStacks.h" #include "vm/Shape.h" @@ -35,7 +36,7 @@ class ErrorObject : public NativeObject static bool init(JSContext* cx, Handle obj, JSExnType type, - ScopedJSFreePtr* errorReport, HandleString fileName, HandleObject stack, + UniquePtr errorReport, HandleString fileName, HandleObject stack, uint32_t lineNumber, uint32_t columnNumber, HandleString message); static const ClassSpec classSpecs[JSEXN_ERROR_LIMIT]; @@ -70,7 +71,7 @@ class ErrorObject : public NativeObject // property. static ErrorObject* create(JSContext* cx, JSExnType type, HandleObject stack, HandleString fileName, - uint32_t lineNumber, uint32_t columnNumber, ScopedJSFreePtr* report, + uint32_t lineNumber, uint32_t columnNumber, UniquePtr report, HandleString message, HandleObject proto = nullptr); /*