void mozilla::DeferredFinalize(nsISupports* aSupports) { CycleCollectedJSRuntime* rt = CycleCollectedJSRuntime::Get(); MOZ_ASSERT(rt, "Should have a CycleCollectedJSRuntime by now"); rt->DeferredFinalize(aSupports); }
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) { // aMessage can be null. finalException = new Exception(nsCString(aMessage), aRv, EmptyCString(), 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; }
bool IsJSHolder(void* aHolder) { CycleCollectedJSRuntime* rt = CycleCollectedJSRuntime::Get(); MOZ_ASSERT(rt, "Should have a CycleCollectedJSRuntime by now"); return rt->IsJSHolder(aHolder); }
void DropJSObjectsImpl(void* aHolder) { CycleCollectedJSRuntime* rt = CycleCollectedJSRuntime::Get(); MOZ_ASSERT(rt, "Should have a CycleCollectedJSRuntime by now"); rt->RemoveJSHolder(aHolder); }
void HoldJSObjectsImpl(void* aHolder, nsScriptObjectTracer* aTracer) { CycleCollectedJSRuntime* rt = CycleCollectedJSRuntime::Get(); MOZ_ASSERT(rt, "Should have a CycleCollectedJSRuntime by now"); rt->AddJSHolder(aHolder, aTracer); }
void mozilla::DeferredFinalize(DeferredFinalizeAppendFunction aAppendFunc, DeferredFinalizeFunction aFunc, void* aThing) { CycleCollectedJSRuntime* rt = CycleCollectedJSRuntime::Get(); MOZ_ASSERT(rt, "Should have a CycleCollectedJSRuntime by now"); rt->DeferredFinalize(aAppendFunc, aFunc, aThing); }
void Animation::DoFinishNotification(SyncNotifyFlag aSyncNotifyFlag) { CycleCollectedJSRuntime* runtime = CycleCollectedJSRuntime::Get(); if (aSyncNotifyFlag == SyncNotifyFlag::Sync) { DoFinishNotificationImmediately(); } else if (!mFinishNotificationTask.IsPending()) { RefPtr<nsRunnableMethod<Animation>> runnable = NS_NewRunnableMethod(this, &Animation::DoFinishNotificationImmediately); runtime->DispatchToMicroTask(runnable); mFinishNotificationTask = runnable; } }
TEST(GCPostBarriers, nsTArray) { CycleCollectedJSRuntime* ccrt = CycleCollectedJSRuntime::Get(); ASSERT_TRUE(ccrt != nullptr); JSRuntime* rt = ccrt->Runtime(); ASSERT_TRUE(rt != nullptr); JSContext *cx = JS_NewContext(rt, 8192); ASSERT_TRUE(cx != nullptr); JS_BeginRequest(cx); CreateGlobalAndRunTest(rt, cx); JS_EndRequest(cx); JS_DestroyContext(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; }