diff --git a/js/src/vm/HelperThreads.cpp b/js/src/vm/HelperThreads.cpp index 17768a5bc8f5..4fc560fd8488 100644 --- a/js/src/vm/HelperThreads.cpp +++ b/js/src/vm/HelperThreads.cpp @@ -1497,7 +1497,7 @@ LeaveParseTaskZone(JSRuntime* rt, ParseTask* task) { // Mark the zone as no longer in use by a helper thread, and available // to be collected by the GC. - rt->clearUsedByHelperThread(task->parseGlobal->zone()); + rt->clearUsedByHelperThread(task->parseGlobal->zoneFromAnyThread()); } ParseTask* diff --git a/js/src/vm/Runtime.cpp b/js/src/vm/Runtime.cpp index 4047e677722e..f883463e410d 100644 --- a/js/src/vm/Runtime.cpp +++ b/js/src/vm/Runtime.cpp @@ -914,11 +914,12 @@ js::CurrentThreadCanAccessRuntime(const JSRuntime* rt) bool js::CurrentThreadCanAccessZone(Zone* zone) { - if (CurrentThreadCanAccessRuntime(zone->runtime_)) - return true; + // Helper thread zones can only be used by their owning thread. + if (zone->usedByHelperThread()) + return zone->group()->ownedByCurrentThread(); - // Only zones marked for use by a helper thread can be used off thread. - return zone->usedByHelperThread() && zone->group()->ownedByCurrentThread(); + // Other zones can only be accessed by the runtime's active context. + return CurrentThreadCanAccessRuntime(zone->runtime_); } #ifdef DEBUG