From 1295093170c4c6e44fde1d58797b01e73b77f557 Mon Sep 17 00:00:00 2001 From: Jon Coppeard Date: Thu, 22 Sep 2016 13:02:40 +0100 Subject: [PATCH] Bug 1301496 - Simplify runtime check when tracing helper threads r=terrence a=decoder --- js/src/jit-test/tests/gc/bug-1301496.js | 7 +++++++ js/src/jit/CompileWrappers.cpp | 6 ++++++ js/src/jit/CompileWrappers.h | 2 ++ js/src/jit/IonBuilder.cpp | 2 +- js/src/jscntxt.h | 4 ++++ js/src/vm/HelperThreads.cpp | 2 +- js/src/vm/HelperThreads.h | 2 +- 7 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 js/src/jit-test/tests/gc/bug-1301496.js diff --git a/js/src/jit-test/tests/gc/bug-1301496.js b/js/src/jit-test/tests/gc/bug-1301496.js new file mode 100644 index 000000000000..7200ab98c952 --- /dev/null +++ b/js/src/jit-test/tests/gc/bug-1301496.js @@ -0,0 +1,7 @@ +if (helperThreadCount() == 0) + quit(); +startgc(1, 'shrinking'); +offThreadCompileScript(""); +// Adapted from randomly chosen test: js/src/jit-test/tests/parser/bug-1263355-13.js +gczeal(9); +newGlobal(); diff --git a/js/src/jit/CompileWrappers.cpp b/js/src/jit/CompileWrappers.cpp index 286bd17c51ba..9402efcbd96c 100644 --- a/js/src/jit/CompileWrappers.cpp +++ b/js/src/jit/CompileWrappers.cpp @@ -188,6 +188,12 @@ CompileRuntime::setMinorGCShouldCancelIonCompilations() runtime()->gc.storeBuffer.setShouldCancelIonCompilations(); } +bool +CompileRuntime::runtimeMatches(JSRuntime* rt) +{ + return rt == runtime(); +} + Zone* CompileZone::zone() { diff --git a/js/src/jit/CompileWrappers.h b/js/src/jit/CompileWrappers.h index ae42d8602c94..bbec9ffa34bd 100644 --- a/js/src/jit/CompileWrappers.h +++ b/js/src/jit/CompileWrappers.h @@ -86,6 +86,8 @@ class CompileRuntime const Nursery& gcNursery(); void setMinorGCShouldCancelIonCompilations(); + + bool runtimeMatches(JSRuntime* rt); }; class CompileZone diff --git a/js/src/jit/IonBuilder.cpp b/js/src/jit/IonBuilder.cpp index 3d02994f58e8..a4aa7405a7e6 100644 --- a/js/src/jit/IonBuilder.cpp +++ b/js/src/jit/IonBuilder.cpp @@ -14622,7 +14622,7 @@ IonBuilder::convertToBoolean(MDefinition* input) void IonBuilder::trace(JSTracer* trc) { - if (script_->zoneFromAnyThread()->runtimeFromAnyThread() != trc->runtime()) + if (!compartment->runtime()->runtimeMatches(trc->runtime())) return; TraceManuallyBarrieredEdge(trc, &script_, "IonBuiler::script_"); diff --git a/js/src/jscntxt.h b/js/src/jscntxt.h index b96ae9d2ace1..1702660dee4a 100644 --- a/js/src/jscntxt.h +++ b/js/src/jscntxt.h @@ -162,6 +162,10 @@ class ExclusiveContext : public ContextFriendFields, return options_; } + bool runtimeMatches(JSRuntime* rt) const { + return runtime_ == rt; + } + protected: js::gc::ArenaLists* arenas_; diff --git a/js/src/vm/HelperThreads.cpp b/js/src/vm/HelperThreads.cpp index 625157869958..91da8329cbb1 100644 --- a/js/src/vm/HelperThreads.cpp +++ b/js/src/vm/HelperThreads.cpp @@ -345,7 +345,7 @@ ParseTask::~ParseTask() void ParseTask::trace(JSTracer* trc) { - if (exclusiveContextGlobal->zoneFromAnyThread()->runtimeFromAnyThread() != trc->runtime()) + if (!cx->runtimeMatches(trc->runtime())) return; TraceManuallyBarrieredEdge(trc, &exclusiveContextGlobal, "ParseTask::exclusiveContextGlobal"); diff --git a/js/src/vm/HelperThreads.h b/js/src/vm/HelperThreads.h index b300099dda64..e9cfa90a8091 100644 --- a/js/src/vm/HelperThreads.h +++ b/js/src/vm/HelperThreads.h @@ -568,7 +568,7 @@ struct ParseTask bool finish(JSContext* cx); bool runtimeMatches(JSRuntime* rt) { - return exclusiveContextGlobal->runtimeFromAnyThread() == rt; + return cx->runtimeMatches(rt); } virtual ~ParseTask();