tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit bacf29978d812f7178c3dfa9e5021d1c95c7c5eb
parent 54a523d23d99d6f787d79104dafa9830b3c24e8e
Author: Ryan Hunt <rhunt@eqrion.net>
Date:   Thu, 18 Dec 2025 16:45:25 +0000

Bug 2002625 - wasm: Move activeSuspender updating into wasm::Context. r=yury

I'd like to move all the logic for updating the VM state when a
suspender changes into a single location. wasm::Context makes the
most sense to me.

Differential Revision: https://phabricator.services.mozilla.com/D274184

Diffstat:
Mjs/src/wasm/WasmContext.cpp | 11++++++-----
Mjs/src/wasm/WasmContext.h | 4++--
Mjs/src/wasm/WasmPI.cpp | 17++++++-----------
3 files changed, 14 insertions(+), 18 deletions(-)

diff --git a/js/src/wasm/WasmContext.cpp b/js/src/wasm/WasmContext.cpp @@ -56,10 +56,6 @@ void Context::initStackLimit(JSContext* cx) { #ifdef ENABLE_WASM_JSPI SuspenderObject* Context::activeSuspender() { return activeSuspender_; } -void Context::setActiveSuspender(SuspenderObject* obj) { - activeSuspender_.set(obj); -} - void Context::trace(JSTracer* trc) { if (activeSuspender_) { TraceEdge(trc, &activeSuspender_, "suspender"); @@ -80,14 +76,19 @@ void Context::traceRoots(JSTracer* trc) { } } -void Context::enterSuspendableStack(JS::NativeStackLimit newStackLimit) { +void Context::enterSuspendableStack(SuspenderObject* suspender, + JS::NativeStackLimit newStackLimit) { MOZ_ASSERT(onSuspendableStack == 0); + MOZ_ASSERT(!activeSuspender_); + activeSuspender_ = suspender; onSuspendableStack = 1; stackLimit = newStackLimit; } void Context::leaveSuspendableStack(JSContext* cx) { MOZ_ASSERT(onSuspendableStack != 0); + MOZ_ASSERT(activeSuspender_); + activeSuspender_ = nullptr; onSuspendableStack = 0; initStackLimit(cx); } diff --git a/js/src/wasm/WasmContext.h b/js/src/wasm/WasmContext.h @@ -55,9 +55,9 @@ class Context { #ifdef ENABLE_WASM_JSPI SuspenderObject* activeSuspender(); - void setActiveSuspender(SuspenderObject* obj); - void enterSuspendableStack(JS::NativeStackLimit newStackLimit); + void enterSuspendableStack(SuspenderObject* suspender, + JS::NativeStackLimit newStackLimit); void leaveSuspendableStack(JSContext* cx); void trace(JSTracer* trc); diff --git a/js/src/wasm/WasmPI.cpp b/js/src/wasm/WasmPI.cpp @@ -357,7 +357,7 @@ void SuspenderObject::setMoribund(JSContext* cx) { void SuspenderObject::setActive(JSContext* cx) { data()->setState(SuspenderState::Active); - cx->wasm().enterSuspendableStack(getStackMemoryLimit()); + cx->wasm().enterSuspendableStack(this, getStackMemoryLimit()); # if defined(_WIN32) data()->updateTIBStackFields(); # endif @@ -373,7 +373,6 @@ void SuspenderObject::setSuspended(JSContext* cx) { void SuspenderObject::enter(JSContext* cx) { MOZ_ASSERT(state() == SuspenderState::Initial); - cx->wasm().setActiveSuspender(this); setActive(cx); # ifdef DEBUG cx->runtime()->jitRuntime()->disallowArbitraryCode(); @@ -385,7 +384,6 @@ void SuspenderObject::suspend(JSContext* cx) { setSuspended(cx); cx->wasm().suspendedStacks_.pushFront(data()); data()->setSuspendedBy(&cx->wasm()); - cx->wasm().setActiveSuspender(nullptr); # ifdef DEBUG cx->runtime()->jitRuntime()->clearDisallowArbitraryCode(); # endif @@ -407,7 +405,6 @@ void SuspenderObject::suspend(JSContext* cx) { void SuspenderObject::resume(JSContext* cx) { MOZ_ASSERT(state() == SuspenderState::Suspended); - cx->wasm().setActiveSuspender(this); setActive(cx); data()->setSuspendedBy(nullptr); // Use barrier because object is being removed from the suspendable stack @@ -435,18 +432,20 @@ void SuspenderObject::resume(JSContext* cx) { } void SuspenderObject::leave(JSContext* cx) { - cx->wasm().setActiveSuspender(nullptr); # ifdef DEBUG cx->runtime()->jitRuntime()->clearDisallowArbitraryCode(); # endif // We are exiting alternative stack if state is active, // otherwise the stack was just suspended. switch (state()) { - case SuspenderState::Active: + case SuspenderState::Active: { setMoribund(cx); break; - case SuspenderState::Suspended: + } + case SuspenderState::Suspended: { + MOZ_ASSERT(cx->wasm().onSuspendableStack == 0); break; + } case SuspenderState::Initial: case SuspenderState::Moribund: MOZ_CRASH(); @@ -467,8 +466,6 @@ bool CallOnMainStack(JSContext* cx, CallOnMainStackFn fn, void* data) { Rooted<SuspenderObject*> suspender(cx, cx->wasm().activeSuspender()); SuspenderObjectData* stacks = suspender->data(); - cx->wasm().setActiveSuspender(nullptr); - MOZ_ASSERT(suspender->state() == SuspenderState::Active); suspender->setSuspended(cx); // Keep suspendedBy not set -- the stack has no defined entry. @@ -806,7 +803,6 @@ bool CallOnMainStack(JSContext* cx, CallOnMainStackFn fn, void* data) { bool ok = (res & 255) != 0; // need only low byte suspender->setActive(cx); - cx->wasm().setActiveSuspender(suspender); # undef INLINED_ASM # undef CHECK_OFFSETS @@ -818,7 +814,6 @@ bool CallOnMainStack(JSContext* cx, CallOnMainStackFn fn, void* data) { static void CleanupActiveSuspender(JSContext* cx) { SuspenderObject* suspender = cx->wasm().activeSuspender(); MOZ_ASSERT(suspender); - cx->wasm().setActiveSuspender(nullptr); suspender->setMoribund(cx); }