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:
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);
}