bool Throw(JSContext* aCx, nsresult aRv, const char* aMessage) { if (JS_IsExceptionPending(aCx)) { // Don't clobber the existing exception. return false; } CycleCollectedJSRuntime* runtime = CycleCollectedJSRuntime::Get(); nsCOMPtr<nsIException> existingException = runtime->GetPendingException(); if (existingException) { nsresult nr; if (NS_SUCCEEDED(existingException->GetResult(&nr)) && aRv == nr) { // Reuse the existing exception. // Clear pending exception runtime->SetPendingException(nullptr); if (!ThrowExceptionObject(aCx, existingException)) { // If we weren't able to throw an exception we're // most likely out of memory JS_ReportOutOfMemory(aCx); } return false; } } nsRefPtr<Exception> finalException; // Do we use DOM exceptions for this error code? switch (NS_ERROR_GET_MODULE(aRv)) { case NS_ERROR_MODULE_DOM: case NS_ERROR_MODULE_SVG: case NS_ERROR_MODULE_DOM_XPATH: case NS_ERROR_MODULE_DOM_INDEXEDDB: case NS_ERROR_MODULE_DOM_FILEHANDLE: finalException = DOMException::Create(aRv); break; default: break; } // If not, use the default. if (!finalException) { finalException = new Exception(aMessage, aRv, nullptr, nullptr, nullptr); } MOZ_ASSERT(finalException); if (!ThrowExceptionObject(aCx, finalException)) { // If we weren't able to throw an exception we're // most likely out of memory JS_ReportOutOfMemory(aCx); } return false; }
// static void XPCThrower::BuildAndThrowException(JSContext* cx, nsresult rv, const char* sz) { JSBool success = false; /* no need to set an expection if the security manager already has */ if (rv == NS_ERROR_XPC_SECURITY_MANAGER_VETO && JS_IsExceptionPending(cx)) return; nsCOMPtr<nsIException> finalException; nsCOMPtr<nsIException> defaultException; nsXPCException::NewException(sz, rv, nsnull, nsnull, getter_AddRefs(defaultException)); nsIExceptionManager * exceptionManager = XPCJSRuntime::Get()->GetExceptionManager(); if (exceptionManager) { // Ask the provider for the exception, if there is no provider // we expect it to set e to null exceptionManager->GetExceptionFromProvider(rv, defaultException, getter_AddRefs(finalException)); // We should get at least the defaultException back, // but just in case if (finalException == nsnull) { finalException = defaultException; } } // XXX Should we put the following test and call to JS_ReportOutOfMemory // inside this test? if (finalException) success = ThrowExceptionObject(cx, finalException); // If we weren't able to build or throw an exception we're // most likely out of memory if (!success) JS_ReportOutOfMemory(cx); }
bool Throw(JSContext* aCx, nsresult aRv, const nsACString& aMessage) { if (aRv == NS_ERROR_UNCATCHABLE_EXCEPTION) { // Nuke any existing exception on aCx, to make sure we're uncatchable. JS_ClearPendingException(aCx); return false; } if (JS_IsExceptionPending(aCx)) { // Don't clobber the existing exception. return false; } CycleCollectedJSRuntime* runtime = CycleCollectedJSRuntime::Get(); nsCOMPtr<nsIException> existingException = runtime->GetPendingException(); // Make sure to clear the pending exception now. Either we're going to reuse // it (and we already grabbed it), or we plan to throw something else and this // pending exception is no longer relevant. runtime->SetPendingException(nullptr); // Ignore the pending exception if we have a non-default message passed in. if (aMessage.IsEmpty() && existingException) { nsresult nr; if (NS_SUCCEEDED(existingException->GetResult(&nr)) && aRv == nr) { // Reuse the existing exception. if (!ThrowExceptionObject(aCx, existingException)) { // If we weren't able to throw an exception we're // most likely out of memory JS_ReportOutOfMemory(aCx); } return false; } } RefPtr<Exception> finalException = CreateException(aCx, aRv, aMessage); MOZ_ASSERT(finalException); if (!ThrowExceptionObject(aCx, finalException)) { // If we weren't able to throw an exception we're // most likely out of memory JS_ReportOutOfMemory(aCx); } return false; }
bool Throw(JSContext* aCx, nsresult aRv, const char* aMessage) { if (aRv == NS_ERROR_UNCATCHABLE_EXCEPTION) { // Nuke any existing exception on aCx, to make sure we're uncatchable. JS_ClearPendingException(aCx); return false; } if (JS_IsExceptionPending(aCx)) { // Don't clobber the existing exception. return false; } CycleCollectedJSRuntime* runtime = CycleCollectedJSRuntime::Get(); nsCOMPtr<nsIException> existingException = runtime->GetPendingException(); if (existingException) { nsresult nr; if (NS_SUCCEEDED(existingException->GetResult(&nr)) && aRv == nr) { // Reuse the existing exception. // Clear pending exception runtime->SetPendingException(nullptr); if (!ThrowExceptionObject(aCx, existingException)) { // If we weren't able to throw an exception we're // most likely out of memory JS_ReportOutOfMemory(aCx); } return false; } } nsRefPtr<Exception> finalException = CreateException(aCx, aRv, aMessage); MOZ_ASSERT(finalException); if (!ThrowExceptionObject(aCx, finalException)) { // If we weren't able to throw an exception we're // most likely out of memory JS_ReportOutOfMemory(aCx); } return false; }
// static JSBool XPCThrower::CheckForPendingException(nsresult result, JSContext *cx) { nsCOMPtr<nsIException> e; XPCJSRuntime::Get()->GetPendingException(getter_AddRefs(e)); if (!e) return false; XPCJSRuntime::Get()->SetPendingException(nsnull); nsresult e_result; if (NS_FAILED(e->GetResult(&e_result)) || e_result != result) return false; if (!ThrowExceptionObject(cx, e)) JS_ReportOutOfMemory(cx); return true; }
// static JSBool XPCThrower::CheckForPendingException(nsresult result, JSContext *cx) { nsXPConnect* xpc = nsXPConnect::GetXPConnect(); if(!xpc) return JS_FALSE; nsCOMPtr<nsIException> e; xpc->GetPendingException(getter_AddRefs(e)); if(!e) return JS_FALSE; xpc->SetPendingException(nsnull); nsresult e_result; if(NS_FAILED(e->GetResult(&e_result)) || e_result != result) return JS_FALSE; if(!ThrowExceptionObject(cx, e)) JS_ReportOutOfMemory(cx); return JS_TRUE; }