tor-browser

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

commit e78b98f730ecd5918e4ee804a70a21abbe478d04
parent 3becf845e53965e579b9ecc48ea9368400907793
Author: Matthew Gaudet <mgaudet@mozilla.com>
Date:   Fri, 28 Nov 2025 16:31:03 +0000

Bug 2002849 - Revert "Bug 1997702 - Remove use of PersistentRooted on JSContext for MicroTaskQueues" r=jonco

For now let's focus on the industry benchmark rather than a microbenchmark.

Bug 2002850 has been opened to track further improvement here.

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

Diffstat:
Mjs/src/vm/JSContext.cpp | 19++++++-------------
Mjs/src/vm/JSContext.h | 4++--
2 files changed, 8 insertions(+), 15 deletions(-)

diff --git a/js/src/vm/JSContext.cpp b/js/src/vm/JSContext.cpp @@ -1067,11 +1067,9 @@ void js::MicroTaskQueueElement::trace(JSTracer* trc) { auto* queue = cx->jobQueue.ref(); if (!queue || value.isGCThing()) { - TraceEdge(trc, &value, "microtask-queue-entry"); + TraceRoot(trc, &value, "microtask-queue-entry"); } else { - // It's OK to use unbarriered address here because this is not a GC thing - // and so there are no worthwhile barriers to consider here. - queue->traceNonGCThingMicroTask(trc, value.unbarrieredAddress()); + queue->traceNonGCThingMicroTask(trc, &value); } } @@ -1163,7 +1161,7 @@ JS_PUBLIC_API bool JS::HasDebuggerMicroTasks(JSContext* cx) { struct SavedMicroTaskQueueImpl : public JS::SavedMicroTaskQueue { explicit SavedMicroTaskQueueImpl(JSContext* cx) : savedQueues(cx) { savedQueues = js::MakeUnique<js::MicroTaskQueueSet>(cx); - std::swap(cx->microTaskQueues, savedQueues.get()); + std::swap(cx->microTaskQueues.get(), savedQueues.get()); } ~SavedMicroTaskQueueImpl() override = default; JS::PersistentRooted<js::UniquePtr<js::MicroTaskQueueSet>> savedQueues; @@ -1186,7 +1184,7 @@ JS_PUBLIC_API void JS::RestoreMicroTaskQueue( // There's only one impl, so we know this is safe. SavedMicroTaskQueueImpl* savedQueueImpl = static_cast<SavedMicroTaskQueueImpl*>(savedQueue.get()); - std::swap(savedQueueImpl->savedQueues.get(), cx->microTaskQueues); + std::swap(savedQueueImpl->savedQueues.get(), cx->microTaskQueues.get()); } JS_PUBLIC_API size_t JS::GetRegularMicroTaskCount(JSContext* cx) { @@ -1292,7 +1290,8 @@ JSContext::JSContext(JSRuntime* runtime, const JS::ContextOptions& options) canSkipEnqueuingJobs(this, false), promiseRejectionTrackerCallback(this, nullptr), promiseRejectionTrackerCallbackData(this, nullptr), - insideExclusiveDebuggerOnEval(this, nullptr) { + insideExclusiveDebuggerOnEval(this, nullptr), + microTaskQueues(this) { MOZ_ASSERT(static_cast<JS::RootingContext*>(this) == JS::RootingContext::get(this)); } @@ -1538,12 +1537,6 @@ void JSContext::trace(JSTracer* trc) { #ifdef ENABLE_WASM_JSPI wasm().promiseIntegration.trace(trc); #endif - - // Skip tracing the microtask queues on minor GC as we will be updating - // nursery pointers through the store buffer instead. - if (!trc->isTenuringTracer() && microTaskQueues) { - microTaskQueues->trace(trc); - } } JS::NativeStackLimit JSContext::stackLimitForJitCode(JS::StackKind kind) { diff --git a/js/src/vm/JSContext.h b/js/src/vm/JSContext.h @@ -166,7 +166,7 @@ struct MicroTaskQueueElement { void trace(JSTracer* trc); private: - js::HeapPtr<JS::Value> value; + JS::Value value; }; // Use TempAllocPolicy to report OOM @@ -1070,7 +1070,7 @@ struct JS_PUBLIC_API JSContext : public JS::RootingContext, bool hasExecutionTracer() { return false; } #endif - js::UniquePtr<js::MicroTaskQueueSet> microTaskQueues; + JS::PersistentRooted<js::UniquePtr<js::MicroTaskQueueSet>> microTaskQueues; }; /* struct JSContext */ inline JSContext* JSRuntime::mainContextFromOwnThread() {