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:
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() {