diff --git a/js/src/gc/Barrier.h b/js/src/gc/Barrier.h index 4622c56dc0b..95a65916c42 100644 --- a/js/src/gc/Barrier.h +++ b/js/src/gc/Barrier.h @@ -299,7 +299,6 @@ struct InternalGCMethods static bool isMarkable(T* v) { return v != nullptr; } static void preBarrier(T* v) { T::writeBarrierPre(v); } - static void preBarrier(Zone* zone, T* v) { T::writeBarrierPre(zone, v); } static void postBarrier(T** vp) { T::writeBarrierPost(*vp, vp); } static void postBarrierRelocate(T** vp) { T::writeBarrierPostRelocate(*vp, vp); } @@ -391,18 +390,31 @@ struct InternalGCMethods static bool isMarkable(jsid id) { return JSID_IS_STRING(id) || JSID_IS_SYMBOL(id); } static void preBarrier(jsid id) { - if (JSID_IS_GCTHING(id)) { - JS::Zone* zone = ZoneOfIdFromAnyThread(id); - JS::shadow::Zone* shadowZone = JS::shadow::Zone::asShadowZone(zone); - if (shadowZone->needsIncrementalBarrier()) { - jsid tmp(id); - js::gc::MarkIdForBarrier(shadowZone->barrierTracer(), &tmp, "id write barrier"); - MOZ_ASSERT(tmp == id); - } + MOZ_ASSERT(!CurrentThreadIsIonCompiling()); + if (JSID_IS_STRING(id) && StringIsPermanentAtom(JSID_TO_STRING(id))) + return; + if (JSID_IS_GCTHING(id) && shadowRuntimeFromAnyThread(id)->needsIncrementalBarrier()) + preBarrierImpl(ZoneOfIdFromAnyThread(id), id); + } + + private: + static JSRuntime* runtimeFromAnyThread(jsid id) { + MOZ_ASSERT(JSID_IS_GCTHING(id)); + return JSID_TO_GCTHING(id).asCell()->runtimeFromAnyThread(); + } + static JS::shadow::Runtime* shadowRuntimeFromAnyThread(jsid id) { + return reinterpret_cast(runtimeFromAnyThread(id)); + } + static void preBarrierImpl(Zone *zone, jsid id) { + JS::shadow::Zone* shadowZone = JS::shadow::Zone::asShadowZone(zone); + if (shadowZone->needsIncrementalBarrier()) { + jsid tmp(id); + js::gc::MarkIdForBarrier(shadowZone->barrierTracer(), &tmp, "id write barrier"); + MOZ_ASSERT(tmp == id); } } - static void preBarrier(Zone* zone, jsid id) { preBarrier(id); } + public: static void postBarrier(jsid* idp) {} static void postBarrierRelocate(jsid* idp) {} static void postBarrierRemove(jsid* idp) {}