Bug 1223990 - Cleanly throw errors in self-hosted code. (r=till)
--- a/js/src/jsexn.cpp
+++ b/js/src/jsexn.cpp
@@ -532,16 +532,23 @@ bool
js::ErrorToException(JSContext* cx, const char* message, JSErrorReport* reportp,
JSErrorCallback callback, void* userRef)
{
// Tell our caller to report immediately if this report is just a warning.
MOZ_ASSERT(reportp);
if (JSREPORT_IS_WARNING(reportp->flags))
return false;
+ // Similarly, we cannot throw a proper object inside the self-hosting
+ // compartment, as we cannot construct the Error constructor without
+ // self-hosted code. Tell our caller to report immediately.
+ // Without self-hosted code, we cannot get started anyway.
+ if (cx->runtime()->isSelfHostingCompartment(cx->compartment()))
+ return false;
+
// Find the exception index associated with this error.
JSErrNum errorNumber = static_cast<JSErrNum>(reportp->errorNumber);
if (!callback)
callback = GetErrorMessage;
const JSErrorFormatString* errorString = callback(userRef, errorNumber);
JSExnType exnType = errorString ? static_cast<JSExnType>(errorString->exnType) : JSEXN_NONE;
MOZ_ASSERT(exnType < JSEXN_LIMIT);