diff --git a/js/src/gc/Barrier-inl.h b/js/src/gc/Barrier-inl.h index 40b8aef58cc4..cbe497cb091b 100644 --- a/js/src/gc/Barrier-inl.h +++ b/js/src/gc/Barrier-inl.h @@ -149,7 +149,7 @@ HeapValue::set(Zone *zone, const Value &v) if (value.isMarkable()) { js::gc::Cell *cell = (js::gc::Cell *)value.toGCThing(); JS_ASSERT(cell->zone() == zone || - cell->zone() == zone->rt->atomsCompartment); + cell->zone() == zone->rt->atomsCompartment->zone()); } #endif diff --git a/js/src/gc/Barrier.h b/js/src/gc/Barrier.h index 2e921a2f8e5e..7e4a5553466f 100644 --- a/js/src/gc/Barrier.h +++ b/js/src/gc/Barrier.h @@ -264,7 +264,7 @@ class RelocatablePtr : public EncapsulatedPtr ~RelocatablePtr() { if (this->value) - relocate(this->value->compartment()); + relocate(this->value->zone()); } RelocatablePtr &operator=(T *v) { diff --git a/js/src/gc/Heap.h b/js/src/gc/Heap.h index e267433f97cf..76b22859b6d7 100644 --- a/js/src/gc/Heap.h +++ b/js/src/gc/Heap.h @@ -767,7 +767,7 @@ struct Chunk inline void insertToAvailableList(Chunk **insertPoint); inline void removeFromAvailableList(); - ArenaHeader *allocateArena(JSCompartment *comp, AllocKind kind); + ArenaHeader *allocateArena(JS::Zone *zone, AllocKind kind); void releaseArena(ArenaHeader *aheader); diff --git a/js/src/gc/Iteration.cpp b/js/src/gc/Iteration.cpp index 0537e0e02cce..7d92d2860b44 100644 --- a/js/src/gc/Iteration.cpp +++ b/js/src/gc/Iteration.cpp @@ -13,6 +13,7 @@ #include "js/HashTable.h" #include "gc/GCInternals.h" +#include "jsobjinlines.h" #include "jsgcinlines.h" using namespace js; diff --git a/js/src/gc/Marking.cpp b/js/src/gc/Marking.cpp index e41375b29c0c..b77662124a6f 100644 --- a/js/src/gc/Marking.cpp +++ b/js/src/gc/Marking.cpp @@ -119,8 +119,8 @@ CheckMarkedThing(JSTracer *trc, T *thing) { JS_ASSERT(trc); JS_ASSERT(thing); - JS_ASSERT(thing->compartment()); - JS_ASSERT(thing->compartment()->rt == trc->runtime); + JS_ASSERT(thing->zone()); + JS_ASSERT(thing->zone()->rt == trc->runtime); JS_ASSERT(trc->debugPrinter || trc->debugPrintArg); DebugOnly rt = trc->runtime; @@ -132,16 +132,16 @@ CheckMarkedThing(JSTracer *trc, T *thing) rt->assertValidThread(); #endif - JS_ASSERT_IF(thing->compartment()->requireGCTracer(), IS_GC_MARKING_TRACER(trc)); + JS_ASSERT_IF(thing->zone()->requireGCTracer(), IS_GC_MARKING_TRACER(trc)); JS_ASSERT(thing->isAligned()); JS_ASSERT_IF(rt->gcStrictCompartmentChecking, - thing->compartment()->isCollecting() || + thing->zone()->isCollecting() || thing->compartment() == rt->atomsCompartment); JS_ASSERT_IF(IS_GC_MARKING_TRACER(trc) && ((GCMarker *)trc)->getMarkColor() == GRAY, - thing->compartment()->isGCMarkingGray() || + thing->zone()->isGCMarkingGray() || thing->compartment() == rt->atomsCompartment); /* @@ -176,7 +176,7 @@ MarkInternal(JSTracer *trc, T **thingp) * GC. */ if (!trc->callback) { - if (thing->compartment()->isGCMarking()) { + if (thing->zone()->isGCMarking()) { PushMarkStack(AsGCMarker(trc), thing); thing->compartment()->maybeAlive = true; } @@ -259,8 +259,8 @@ IsMarked(T **thingp) { JS_ASSERT(thingp); JS_ASSERT(*thingp); - JSCompartment *c = (*thingp)->compartment(); - if (!c->isCollecting() || c->isGCFinished()) + Zone *zone = (*thingp)->zone(); + if (!zone->isCollecting() || zone->isGCFinished()) return true; return (*thingp)->isMarked(); } @@ -271,7 +271,7 @@ IsAboutToBeFinalized(T **thingp) { JS_ASSERT(thingp); JS_ASSERT(*thingp); - if (!(*thingp)->compartment()->isGCSweeping()) + if (!(*thingp)->zone()->isGCSweeping()) return false; return !(*thingp)->isMarked(); } @@ -644,7 +644,7 @@ ShouldMarkCrossCompartment(JSTracer *trc, RawObject src, Cell *cell) if (!IS_GC_MARKING_TRACER(trc)) return true; - JSCompartment *c = cell->compartment(); + JS::Zone *zone = cell->zone(); uint32_t color = AsGCMarker(trc)->getMarkColor(); JS_ASSERT(color == BLACK || color == GRAY); @@ -657,12 +657,12 @@ ShouldMarkCrossCompartment(JSTracer *trc, RawObject src, Cell *cell) * but the source was marked black by the conservative scanner. */ if (cell->isMarked(GRAY)) { - JS_ASSERT(!cell->compartment()->isCollecting()); + JS_ASSERT(!zone->isCollecting()); trc->runtime->gcFoundBlackGrayEdges = true; } - return c->isGCMarking(); + return zone->isGCMarking(); } else { - if (c->isGCMarkingBlack()) { + if (zone->isGCMarkingBlack()) { /* * The destination compartment is being not being marked gray now, * but it will be later, so record the cell so it can be marked gray @@ -672,7 +672,7 @@ ShouldMarkCrossCompartment(JSTracer *trc, RawObject src, Cell *cell) DelayCrossCompartmentGrayMarking(src); return false; } - return c->isGCMarkingGray(); + return zone->isGCMarkingGray(); } } @@ -729,10 +729,10 @@ gc::IsCellAboutToBeFinalized(Cell **thingp) /*** Push Mark Stack ***/ #define JS_COMPARTMENT_ASSERT(rt, thing) \ - JS_ASSERT((thing)->compartment()->isGCMarking()) + JS_ASSERT((thing)->zone()->isGCMarking()) #define JS_COMPARTMENT_ASSERT_STR(rt, thing) \ - JS_ASSERT((thing)->compartment()->isGCMarking() || \ + JS_ASSERT((thing)->zone()->isGCMarking() || \ (thing)->compartment() == (rt)->atomsCompartment); #if JS_HAS_XML_SUPPORT diff --git a/js/src/gc/RootMarking.cpp b/js/src/gc/RootMarking.cpp index 75d5ac8190bc..9a9e8be3398a 100644 --- a/js/src/gc/RootMarking.cpp +++ b/js/src/gc/RootMarking.cpp @@ -669,7 +669,7 @@ js::gc::MarkRuntime(JSTracer *trc, bool useSavedRoots) if (IS_GC_MARKING_TRACER(trc)) { for (CompartmentsIter c(rt); !c.done(); c.next()) { - if (!c->isCollecting()) + if (!c->zone()->isCollecting()) c->markCrossCompartmentWrappers(trc); } Debugger::markCrossCompartmentDebuggerObjectReferents(trc); @@ -710,7 +710,7 @@ js::gc::MarkRuntime(JSTracer *trc, bool useSavedRoots) MarkScriptRoot(trc, &vec[i].script, "scriptAndCountsVector"); } - if (!IS_GC_MARKING_TRACER(trc) || rt->atomsCompartment->isCollecting()) { + if (!IS_GC_MARKING_TRACER(trc) || rt->atomsCompartment->zone()->isCollecting()) { MarkAtoms(trc); #ifdef JS_ION /* Any Ion wrappers survive until the runtime is being torn down. */ @@ -726,7 +726,7 @@ js::gc::MarkRuntime(JSTracer *trc, bool useSavedRoots) /* We can't use GCCompartmentsIter if we're called from TraceRuntime. */ for (CompartmentsIter c(rt); !c.done(); c.next()) { - if (IS_GC_MARKING_TRACER(trc) && !c->isCollecting()) + if (IS_GC_MARKING_TRACER(trc) && !c->zone()->isCollecting()) continue; if (IS_GC_MARKING_TRACER(trc) && c->isPreservingCode()) { diff --git a/js/src/gc/Statistics.cpp b/js/src/gc/Statistics.cpp index e11e2ab780c4..83f56b21f610 100644 --- a/js/src/gc/Statistics.cpp +++ b/js/src/gc/Statistics.cpp @@ -367,6 +367,7 @@ Statistics::formatData(StatisticsSerializer &ss, uint64_t timestamp) ss.appendDecimal("Total Time", "ms", t(total)); ss.appendNumber("Compartments Collected", "%d", "", collectedCount); ss.appendNumber("Total Compartments", "%d", "", compartmentCount); + ss.appendNumber("Total Zones", "%d", "", zoneCount); ss.appendNumber("MMU (20ms)", "%d", "%", int(mmu20 * 100)); ss.appendNumber("MMU (50ms)", "%d", "%", int(mmu50 * 100)); ss.appendDecimal("SCC Sweep Total", "ms", t(sccTotal)); @@ -447,6 +448,7 @@ Statistics::Statistics(JSRuntime *rt) fullFormat(false), gcDepth(0), collectedCount(0), + zoneCount(0), compartmentCount(0), nonincrementalReason(NULL), preBytes(0), @@ -547,7 +549,7 @@ Statistics::endGC() int64_t sccTotal, sccLongest; sccDurations(&sccTotal, &sccLongest); - (*cb)(JS_TELEMETRY_GC_IS_COMPARTMENTAL, collectedCount == compartmentCount ? 0 : 1); + (*cb)(JS_TELEMETRY_GC_IS_COMPARTMENTAL, collectedCount == zoneCount ? 0 : 1); (*cb)(JS_TELEMETRY_GC_MS, t(total)); (*cb)(JS_TELEMETRY_GC_MAX_PAUSE_MS, t(longest)); (*cb)(JS_TELEMETRY_GC_MARK_MS, t(phaseTimes[PHASE_MARK])); @@ -568,9 +570,11 @@ Statistics::endGC() } void -Statistics::beginSlice(int collectedCount, int compartmentCount, gcreason::Reason reason) +Statistics::beginSlice(int collectedCount, int zoneCount, int compartmentCount, + gcreason::Reason reason) { this->collectedCount = collectedCount; + this->zoneCount = zoneCount; this->compartmentCount = compartmentCount; bool first = runtime->gcIncrementalState == gc::NO_INCREMENTAL; @@ -585,7 +589,7 @@ Statistics::beginSlice(int collectedCount, int compartmentCount, gcreason::Reaso // Slice callbacks should only fire for the outermost level if (++gcDepth == 1) { - bool wasFullGC = collectedCount == compartmentCount; + bool wasFullGC = collectedCount == zoneCount; if (GCSliceCallback cb = runtime->gcSliceCallback) (*cb)(runtime, first ? GC_CYCLE_BEGIN : GC_SLICE_BEGIN, GCDescription(!wasFullGC)); } @@ -608,7 +612,7 @@ Statistics::endSlice() // Slice callbacks should only fire for the outermost level if (--gcDepth == 0) { - bool wasFullGC = collectedCount == compartmentCount; + bool wasFullGC = collectedCount == zoneCount; if (GCSliceCallback cb = runtime->gcSliceCallback) (*cb)(runtime, last ? GC_CYCLE_END : GC_SLICE_END, GCDescription(!wasFullGC)); } diff --git a/js/src/gc/Statistics.h b/js/src/gc/Statistics.h index 9efd6e649cb8..ff4e5f6c106f 100644 --- a/js/src/gc/Statistics.h +++ b/js/src/gc/Statistics.h @@ -86,7 +86,7 @@ struct Statistics { void beginPhase(Phase phase); void endPhase(Phase phase); - void beginSlice(int collectedCount, int compartmentCount, gcreason::Reason reason); + void beginSlice(int collectedCount, int zoneCount, int compartmentCount, gcreason::Reason reason); void endSlice(); void reset(const char *reason) { slices.back().resetReason = reason; } @@ -118,6 +118,7 @@ struct Statistics { int gcDepth; int collectedCount; + int zoneCount; int compartmentCount; const char *nonincrementalReason; @@ -177,12 +178,13 @@ struct Statistics { struct AutoGCSlice { - AutoGCSlice(Statistics &stats, int collectedCount, int compartmentCount, gcreason::Reason reason + AutoGCSlice(Statistics &stats, int collectedCount, int zoneCount, int compartmentCount, + gcreason::Reason reason MOZ_GUARD_OBJECT_NOTIFIER_PARAM) : stats(stats) { MOZ_GUARD_OBJECT_NOTIFIER_INIT; - stats.beginSlice(collectedCount, compartmentCount, reason); + stats.beginSlice(collectedCount, zoneCount, compartmentCount, reason); } ~AutoGCSlice() { stats.endSlice(); } diff --git a/js/src/gc/Verifier.cpp b/js/src/gc/Verifier.cpp index 319f6157337d..3e5c1a98f2be 100644 --- a/js/src/gc/Verifier.cpp +++ b/js/src/gc/Verifier.cpp @@ -17,6 +17,7 @@ #include "js/HashTable.h" #include "gc/GCInternals.h" +#include "jsobjinlines.h" #include "jsgcinlines.h" #ifdef MOZ_VALGRIND @@ -506,10 +507,12 @@ gc::StartVerifyPreBarriers(JSRuntime *rt) rt->gcVerifyPreData = trc; rt->gcIncrementalState = MARK; rt->gcMarker.start(); - for (CompartmentsIter c(rt); !c.done(); c.next()) { + for (CompartmentsIter c(rt); !c.done(); c.next()) PurgeJITCaches(c); - c->setNeedsBarrier(true, JSCompartment::UpdateIon); - c->allocator.arenas.purge(); + + for (ZonesIter zone(rt); !zone.done(); zone.next()) { + zone->setNeedsBarrier(true, Zone::UpdateIon); + zone->allocator.arenas.purge(); } return; @@ -581,14 +584,16 @@ gc::EndVerifyPreBarriers(JSRuntime *rt) bool compartmentCreated = false; /* We need to disable barriers before tracing, which may invoke barriers. */ - for (CompartmentsIter c(rt); !c.done(); c.next()) { - if (!c->needsBarrier()) + for (ZonesIter zone(rt); !zone.done(); zone.next()) { + if (!zone->needsBarrier()) compartmentCreated = true; - PurgeJITCaches(c); - c->setNeedsBarrier(false, JSCompartment::UpdateIon); + zone->setNeedsBarrier(false, Zone::UpdateIon); } + for (CompartmentsIter c(rt); !c.done(); c.next()) + PurgeJITCaches(c); + /* * We need to bump gcNumber so that the methodjit knows that jitcode has * been discarded. diff --git a/js/src/ion/CodeGenerator.cpp b/js/src/ion/CodeGenerator.cpp index e63c03aa4fec..d77f26d0bafb 100644 --- a/js/src/ion/CodeGenerator.cpp +++ b/js/src/ion/CodeGenerator.cpp @@ -3681,7 +3681,7 @@ CodeGenerator::link() // The correct state for prebarriers is unknown until the end of compilation, // since a GC can occur during code generation. All barriers are emitted // off-by-default, and are toggled on here if necessary. - if (cx->compartment->needsBarrier()) + if (cx->zone()->needsBarrier()) ionScript->toggleBarriers(true); return true; diff --git a/js/src/ion/Ion.cpp b/js/src/ion/Ion.cpp index 3f26557752fb..9018416376b2 100644 --- a/js/src/ion/Ion.cpp +++ b/js/src/ion/Ion.cpp @@ -1818,13 +1818,13 @@ InvalidateActivation(FreeOp *fop, uint8_t *ionTop, bool invalidateAll) const SafepointIndex *si = ionScript->getSafepointIndex(it.returnAddressToFp()); IonCode *ionCode = ionScript->method(); - JSCompartment *compartment = script->compartment(); - if (compartment->needsBarrier()) { + JS::Zone *zone = script->zone(); + if (zone->needsBarrier()) { // We're about to remove edges from the JSScript to gcthings // embedded in the IonCode. Perform one final trace of the // IonCode for the incremental GC, as it must know about // those edges. - ionCode->trace(compartment->barrierTracer()); + ionCode->trace(zone->barrierTracer()); } ionCode->setInvalidated(); @@ -1927,13 +1927,13 @@ ion::Invalidate(types::TypeCompartment &types, FreeOp *fop, UnrootedScript script = co.script; IonScript *ionScript = GetIonScript(script, executionMode); - JSCompartment *compartment = script->compartment(); - if (compartment->needsBarrier()) { + Zone *zone = script->zone(); + if (zone->needsBarrier()) { // We're about to remove edges from the JSScript to gcthings // embedded in the IonScript. Perform one final trace of the // IonScript for the incremental GC, as it must know about // those edges. - IonScript::Trace(compartment->barrierTracer(), ionScript); + IonScript::Trace(zone->barrierTracer(), ionScript); } ionScript->decref(fop); diff --git a/js/src/ion/IonCaches.cpp b/js/src/ion/IonCaches.cpp index 8d8044447737..c0afc82ea800 100644 --- a/js/src/ion/IonCaches.cpp +++ b/js/src/ion/IonCaches.cpp @@ -1066,7 +1066,7 @@ IonCacheSetProperty::attachNativeExisting(JSContext *cx, IonScript *ion, if (obj->isFixedSlot(shape->slot())) { Address addr(object(), JSObject::getFixedSlotOffset(shape->slot())); - if (cx->compartment->needsBarrier()) + if (cx->zone()->needsBarrier()) masm.callPreBarrier(addr, MIRType_Value); masm.storeConstantOrRegister(value(), addr); @@ -1076,7 +1076,7 @@ IonCacheSetProperty::attachNativeExisting(JSContext *cx, IonScript *ion, Address addr(slotsReg, obj->dynamicSlotIndex(shape->slot()) * sizeof(Value)); - if (cx->compartment->needsBarrier()) + if (cx->zone()->needsBarrier()) masm.callPreBarrier(addr, MIRType_Value); masm.storeConstantOrRegister(value(), addr); @@ -1336,7 +1336,7 @@ IonCacheSetProperty::attachNativeAdding(JSContext *cx, IonScript *ion, JSObject /* Changing object shape. Write the object's new shape. */ Address shapeAddr(object(), JSObject::offsetOfShape()); - if (cx->compartment->needsBarrier()) + if (cx->zone()->needsBarrier()) masm.callPreBarrier(shapeAddr, MIRType_Shape); masm.storePtr(ImmGCPtr(newShape), shapeAddr); diff --git a/js/src/ion/IonMacroAssembler.cpp b/js/src/ion/IonMacroAssembler.cpp index 0315b5beb000..d1bca696c294 100644 --- a/js/src/ion/IonMacroAssembler.cpp +++ b/js/src/ion/IonMacroAssembler.cpp @@ -308,11 +308,11 @@ MacroAssembler::newGCThing(const Register &result, JS_ASSERT(!templateObject->hasDynamicElements()); - JSCompartment *compartment = GetIonContext()->compartment; + Zone *zone = GetIonContext()->compartment->zone(); #ifdef JS_GC_ZEAL // Don't execute the inline path if gcZeal is active. - movePtr(ImmWord(compartment->rt), result); + movePtr(ImmWord(zone->rt), result); loadPtr(Address(result, offsetof(JSRuntime, gcZeal_)), result); branch32(Assembler::NotEqual, result, Imm32(0), fail); #endif @@ -322,7 +322,7 @@ MacroAssembler::newGCThing(const Register &result, // If a FreeSpan is replaced, its members are updated in the freeLists table, // which the code below always re-reads. gc::FreeSpan *list = const_cast - (compartment->allocator.arenas.getFreeList(allocKind)); + (zone->allocator.arenas.getFreeList(allocKind)); loadPtr(AbsoluteAddress(&list->first), result); branchPtr(Assembler::BelowOrEqual, AbsoluteAddress(&list->last), result, fail); diff --git a/js/src/ion/IonMacroAssembler.h b/js/src/ion/IonMacroAssembler.h index c54e26d280d0..33a3b1689106 100644 --- a/js/src/ion/IonMacroAssembler.h +++ b/js/src/ion/IonMacroAssembler.h @@ -382,9 +382,9 @@ class MacroAssembler : public MacroAssemblerSpecific void branchTestNeedsBarrier(Condition cond, const Register &scratch, Label *label) { JS_ASSERT(cond == Zero || cond == NonZero); - JSCompartment *comp = GetIonContext()->compartment; - movePtr(ImmWord(comp), scratch); - Address needsBarrierAddr(scratch, JSCompartment::OffsetOfNeedsBarrier()); + JS::Zone *zone = GetIonContext()->compartment->zone(); + movePtr(ImmWord(zone), scratch); + Address needsBarrierAddr(scratch, JS::Zone::OffsetOfNeedsBarrier()); branchTest32(cond, needsBarrierAddr, Imm32(0x1), label); } diff --git a/js/src/jsapi-tests/tests.h b/js/src/jsapi-tests/tests.h index 2c9f5c25e916..40ebcbed4aa9 100644 --- a/js/src/jsapi-tests/tests.h +++ b/js/src/jsapi-tests/tests.h @@ -13,6 +13,7 @@ // For js::gc::AutoSuppressGC #include "jsgc.h" +#include "jsobjinlines.h" #include "jsgcinlines.h" #include "js/Vector.h" diff --git a/js/src/jscntxt.h b/js/src/jscntxt.h index c8b678b44ab0..8002c28d5877 100644 --- a/js/src/jscntxt.h +++ b/js/src/jscntxt.h @@ -1382,7 +1382,8 @@ struct JSContext : js::ContextFriendFields, JSContext *thisDuringConstruction() { return this; } ~JSContext(); - js::PerThreadData& mainThread() { return runtime->mainThread; } + inline JS::Zone *zone(); + js::PerThreadData &mainThread() { return runtime->mainThread; } private: /* See JSContext::findVersion. */ diff --git a/js/src/jscntxtinlines.h b/js/src/jscntxtinlines.h index 94ac3d3213d6..7d9640db8a44 100644 --- a/js/src/jscntxtinlines.h +++ b/js/src/jscntxtinlines.h @@ -607,4 +607,10 @@ JSContext::leaveCompartment(JSCompartment *oldCompartment) wrapPendingException(); } +inline JS::Zone * +JSContext::zone() +{ + return compartment->zone(); +} + #endif /* jscntxtinlines_h___ */ diff --git a/js/src/jscompartment.cpp b/js/src/jscompartment.cpp index 974a799a58dd..62fb1f2279f2 100644 --- a/js/src/jscompartment.cpp +++ b/js/src/jscompartment.cpp @@ -374,7 +374,7 @@ JSCompartment::wrap(JSContext *cx, Value *vp, JSObject *existingArg) if (!putWrapper(orig, *vp)) return false; - if (str->compartment()->isGCMarking()) { + if (str->zone()->isGCMarking()) { /* * All string wrappers are dropped when collection starts, but we * just created a new one. Mark the wrapped string to stop it being @@ -522,7 +522,7 @@ JSCompartment::wrap(JSContext *cx, AutoIdVector &props) void JSCompartment::markCrossCompartmentWrappers(JSTracer *trc) { - JS_ASSERT(!isCollecting()); + JS_ASSERT(!zone()->isCollecting()); for (WrapperMap::Enum e(crossCompartmentWrappers); !e.empty(); e.popFront()) { Value v = e.front().value; @@ -815,10 +815,9 @@ JSCompartment::setGCMaxMallocBytes(size_t value) void JSCompartment::onTooMuchMalloc() { - TriggerZoneGC(this, gcreason::TOO_MUCH_MALLOC); + TriggerZoneGC(zone(), gcreason::TOO_MUCH_MALLOC); } - bool JSCompartment::hasScriptsOnStack() { @@ -908,7 +907,7 @@ JSCompartment::updateForDebugMode(FreeOp *fop, AutoDebugModeGC &dmgc) // to run any scripts in this compartment until the dmgc is destroyed. // That is the caller's responsibility. if (!rt->isHeapBusy()) - dmgc.scheduleGC(this); + dmgc.scheduleGC(zone()); #endif } diff --git a/js/src/jsfriendapi.cpp b/js/src/jsfriendapi.cpp index 077769ee0be9..721e80dc9cfd 100644 --- a/js/src/jsfriendapi.cpp +++ b/js/src/jsfriendapi.cpp @@ -135,8 +135,8 @@ JS::PrepareZoneForGC(Zone *zone) JS_FRIEND_API(void) JS::PrepareForFullGC(JSRuntime *rt) { - for (CompartmentsIter c(rt); !c.done(); c.next()) - c->scheduleGC(); + for (ZonesIter zone(rt); !zone.done(); zone.next()) + zone->scheduleGC(); } JS_FRIEND_API(void) @@ -145,17 +145,17 @@ JS::PrepareForIncrementalGC(JSRuntime *rt) if (!IsIncrementalGCInProgress(rt)) return; - for (CompartmentsIter c(rt); !c.done(); c.next()) { - if (c->wasGCStarted()) - PrepareZoneForGC(c); + for (ZonesIter zone(rt); !zone.done(); zone.next()) { + if (zone->wasGCStarted()) + PrepareZoneForGC(zone); } } JS_FRIEND_API(bool) JS::IsGCScheduled(JSRuntime *rt) { - for (CompartmentsIter c(rt); !c.done(); c.next()) { - if (c->isGCScheduled()) + for (ZonesIter zone(rt); !zone.done(); zone.next()) { + if (zone->isGCScheduled()) return true; } @@ -218,7 +218,7 @@ JS_SetCompartmentPrincipals(JSCompartment *compartment, JSPrincipals *principals // with the old one, but JSPrincipals doesn't give us a way to do that. // But we can at least assert that we're not switching between system // and non-system. - JS_ASSERT(compartment->isSystemCompartment == isSystem); + JS_ASSERT(compartment->zone()->isSystemCompartment == isSystem); } // Set up the new principals. @@ -228,7 +228,7 @@ JS_SetCompartmentPrincipals(JSCompartment *compartment, JSPrincipals *principals } // Update the system flag. - compartment->isSystemCompartment = isSystem; + compartment->zone()->isSystemCompartment = isSystem; } JS_FRIEND_API(JSBool) @@ -318,7 +318,7 @@ AutoSwitchCompartment::~AutoSwitchCompartment() JS_FRIEND_API(bool) js::IsSystemCompartment(const JSCompartment *c) { - return c->isSystemCompartment; + return c->zone()->isSystemCompartment; } JS_FRIEND_API(bool) diff --git a/js/src/jsgc.cpp b/js/src/jsgc.cpp index 0a624cf26f4c..6c2b3c383b92 100644 --- a/js/src/jsgc.cpp +++ b/js/src/jsgc.cpp @@ -1503,9 +1503,9 @@ template /* static */ void * ArenaLists::refillFreeList(JSContext *cx, AllocKind thingKind) { - JS_ASSERT(cx->compartment->allocator.arenas.freeLists[thingKind].isEmpty()); + JS_ASSERT(cx->zone()->allocator.arenas.freeLists[thingKind].isEmpty()); - Zone *zone = cx->compartment; + Zone *zone = cx->zone(); JSRuntime *rt = zone->rt; JS_ASSERT(!rt->isHeapBusy()); @@ -1987,7 +1987,7 @@ js::TriggerZoneGC(Zone *zone, gcreason::Reason reason) return; } - if (zone == rt->atomsCompartment) { + if (zone == rt->atomsCompartment->zone()) { /* We can't do a zone GC of the atoms compartment. */ TriggerGC(rt, reason); return; @@ -2015,7 +2015,7 @@ js::MaybeGC(JSContext *cx) } double factor = rt->gcHighFrequencyGC ? 0.75 : 0.9; - Zone *zone = cx->compartment; + Zone *zone = cx->zone(); if (zone->gcBytes > 1024 * 1024 && zone->gcBytes >= factor * zone->gcTriggerBytes && rt->gcIncrementalState == NO_INCREMENTAL && @@ -2539,9 +2539,9 @@ SweepCompartments(FreeOp *fop, bool lastGC) JSCompartment *compartment = *read++; if (!compartment->hold && compartment->wasGCStarted() && - (compartment->allocator.arenas.arenaListsAreEmpty() || lastGC)) + (compartment->zone()->allocator.arenas.arenaListsAreEmpty() || lastGC)) { - compartment->allocator.arenas.checkEmptyFreeLists(); + compartment->zone()->allocator.arenas.checkEmptyFreeLists(); if (callback) callback(fop, compartment); if (compartment->principals) @@ -2683,9 +2683,9 @@ BeginMarkPhase(JSRuntime *rt) /* Set up which compartments will be collected. */ if (zone->isGCScheduled()) { - if (zone != rt->atomsCompartment) { + if (zone != rt->atomsCompartment->zone()) { any = true; - zone->setGCState(JSCompartment::Mark); + zone->setGCState(Zone::Mark); } } else { rt->gcIsFull = false; @@ -2702,10 +2702,10 @@ BeginMarkPhase(JSRuntime *rt) * atoms. Otherwise, the non-collected compartments could contain pointers * to atoms that we would miss. */ - JSCompartment *atomsComp = rt->atomsCompartment; - if (atomsComp->isGCScheduled() && rt->gcIsFull && !rt->gcKeepAtoms) { - JS_ASSERT(!atomsComp->isCollecting()); - atomsComp->setGCState(JSCompartment::Mark); + Zone *atomsZone = rt->atomsCompartment->zone(); + if (atomsZone->isGCScheduled() && rt->gcIsFull && !rt->gcKeepAtoms) { + JS_ASSERT(!atomsZone->isCollecting()); + atomsZone->setGCState(Zone::Mark); } /* @@ -3019,7 +3019,7 @@ js::gc::MarkingValidator::nonIncrementalMark() /* Update compartment state for gray marking. */ for (GCZonesIter zone(runtime); !zone.done(); zone.next()) { JS_ASSERT(zone->isGCMarkingBlack()); - zone->setGCState(JSCompartment::MarkGray); + zone->setGCState(Zone::MarkGray); } MarkAllGrayReferences(runtime); @@ -3027,7 +3027,7 @@ js::gc::MarkingValidator::nonIncrementalMark() /* Restore compartment state. */ for (GCZonesIter zone(runtime); !zone.done(); zone.next()) { JS_ASSERT(zone->isGCMarkingGray()); - zone->setGCState(JSCompartment::Mark); + zone->setGCState(Zone::Mark); } } @@ -3207,7 +3207,7 @@ JSCompartment::findOutgoingEdgesFromCompartment(ComponentFinder &finde #endif } - Debugger::findCompartmentEdges(this, finder); + Debugger::findCompartmentEdges(zone(), finder); } void @@ -3256,8 +3256,8 @@ GetNextZoneGroup(JSRuntime *rt) for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) { JS_ASSERT(!zone->gcNextGraphComponent); JS_ASSERT(zone->isGCMarking()); - zone->setNeedsBarrier(false, JSCompartment::UpdateIon); - zone->setGCState(JSCompartment::NoGC); + zone->setNeedsBarrier(false, Zone::UpdateIon); + zone->setGCState(Zone::NoGC); } for (GCCompartmentGroupIter comp(rt); !comp.done(); comp.next()) { @@ -3395,8 +3395,8 @@ MarkIncomingCrossCompartmentPointers(JSRuntime *rt, const uint32_t color) bool unlinkList = color == GRAY; for (GCCompartmentGroupIter c(rt); !c.done(); c.next()) { - JS_ASSERT_IF(color == GRAY, c->isGCMarkingGray()); - JS_ASSERT_IF(color == BLACK, c->isGCMarkingBlack()); + JS_ASSERT_IF(color == GRAY, c->zone()->isGCMarkingGray()); + JS_ASSERT_IF(color == BLACK, c->zone()->isGCMarkingBlack()); JS_ASSERT_IF(c->gcIncomingGrayPointers, IsGrayListObject(c->gcIncomingGrayPointers)); for (RawObject src = c->gcIncomingGrayPointers; @@ -3528,7 +3528,7 @@ EndMarkingZoneGroup(JSRuntime *rt) */ for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) { JS_ASSERT(zone->isGCMarkingBlack()); - zone->setGCState(JSCompartment::MarkGray); + zone->setGCState(Zone::MarkGray); } /* Mark incoming gray pointers from previously swept compartments. */ @@ -3542,7 +3542,7 @@ EndMarkingZoneGroup(JSRuntime *rt) /* Restore marking state. */ for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) { JS_ASSERT(zone->isGCMarkingGray()); - zone->setGCState(JSCompartment::Mark); + zone->setGCState(Zone::Mark); } JS_ASSERT(rt->gcMarker.isDrained()); @@ -3560,12 +3560,12 @@ BeginSweepingZoneGroup(JSRuntime *rt) for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) { /* Set the GC state to sweeping. */ JS_ASSERT(zone->isGCMarking()); - zone->setGCState(JSCompartment::Sweep); + zone->setGCState(Zone::Sweep); /* Purge the ArenaLists before sweeping. */ zone->allocator.arenas.purge(); - if (zone == rt->atomsCompartment) + if (zone == rt->atomsCompartment->zone()) sweepingAtoms = true; } @@ -3652,7 +3652,7 @@ EndSweepingZoneGroup(JSRuntime *rt) /* Update the GC state for compartments we have swept and unlink the list. */ for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) { JS_ASSERT(zone->isGCSweeping()); - zone->setGCState(JSCompartment::Finished); + zone->setGCState(Zone::Finished); } /* Reset the list of arenas marked as being allocated during sweep phase. */ @@ -3772,8 +3772,8 @@ EndSweepPhase(JSRuntime *rt, JSGCInvocationKind gckind, bool lastGC) * newly created compartments. Can only change from full to not full. */ if (rt->gcIsFull) { - for (CompartmentsIter c(rt); !c.done(); c.next()) { - if (!c->isCollecting()) { + for (ZonesIter zone(rt); !zone.done(); zone.next()) { + if (!zone->isCollecting()) { rt->gcIsFull = false; break; } @@ -3787,9 +3787,9 @@ EndSweepPhase(JSRuntime *rt, JSGCInvocationKind gckind, bool lastGC) * prevent the cycle collector from collecting some dead objects. */ if (rt->gcFoundBlackGrayEdges) { - for (CompartmentsIter c(rt); !c.done(); c.next()) { - if (!c->isCollecting()) - c->allocator.arenas.unmarkAll(); + for (ZonesIter zone(rt); !zone.done(); zone.next()) { + if (!zone->isCollecting()) + zone->allocator.arenas.unmarkAll(); } } @@ -3863,17 +3863,27 @@ EndSweepPhase(JSRuntime *rt, JSGCInvocationKind gckind, bool lastGC) SweepCompartments(&fop, lastGC); } - for (CompartmentsIter c(rt); !c.done(); c.next()) { - c->setGCLastBytes(c->gcBytes, gckind); - if (c->isCollecting()) { - JS_ASSERT(c->isGCFinished()); - c->setGCState(JSCompartment::NoGC); + for (ZonesIter zone(rt); !zone.done(); zone.next()) { + zone->setGCLastBytes(zone->gcBytes, gckind); + if (zone->isCollecting()) { + JS_ASSERT(zone->isGCFinished()); + zone->setGCState(Zone::NoGC); } #ifdef DEBUG - JS_ASSERT(!c->isCollecting()); - JS_ASSERT(!c->wasGCStarted()); + JS_ASSERT(!zone->isCollecting()); + JS_ASSERT(!zone->wasGCStarted()); + for (unsigned i = 0 ; i < FINALIZE_LIMIT ; ++i) { + JS_ASSERT_IF(!IsBackgroundFinalized(AllocKind(i)) || + !rt->gcSweepOnBackgroundThread, + !zone->allocator.arenas.arenaListsToSweep[i]); + } +#endif + } + +#ifdef DEBUG + for (CompartmentsIter c(rt); !c.done(); c.next()) { JS_ASSERT(!c->gcIncomingGrayPointers); JS_ASSERT(!c->gcLiveArrayBuffers); @@ -3881,14 +3891,8 @@ EndSweepPhase(JSRuntime *rt, JSGCInvocationKind gckind, bool lastGC) if (e.front().key.kind != CrossCompartmentKey::StringWrapper) AssertNotOnGrayList(&e.front().value.get().toObject()); } - - for (unsigned i = 0 ; i < FINALIZE_LIMIT ; ++i) { - JS_ASSERT_IF(!IsBackgroundFinalized(AllocKind(i)) || - !rt->gcSweepOnBackgroundThread, - !c->allocator.arenas.arenaListsToSweep[i]); - } -#endif } +#endif FinishMarkingValidation(rt); @@ -3942,10 +3946,11 @@ AutoGCSession::~AutoGCSession() #endif /* Clear gcMallocBytes for all compartments */ - for (CompartmentsIter c(runtime); !c.done(); c.next()) { + for (CompartmentsIter c(runtime); !c.done(); c.next()) c->resetGCMallocBytes(); - c->unscheduleGC(); - } + + for (ZonesIter zone(runtime); !zone.done(); zone.next()) + zone->unscheduleGC(); runtime->resetGCMallocBytes(); } @@ -3953,14 +3958,14 @@ AutoGCSession::~AutoGCSession() AutoCopyFreeListToArenas::AutoCopyFreeListToArenas(JSRuntime *rt) : runtime(rt) { - for (CompartmentsIter c(rt); !c.done(); c.next()) - c->allocator.arenas.copyFreeListsToArenas(); + for (ZonesIter zone(rt); !zone.done(); zone.next()) + zone->allocator.arenas.copyFreeListsToArenas(); } AutoCopyFreeListToArenas::~AutoCopyFreeListToArenas() { - for (CompartmentsIter c(runtime); !c.done(); c.next()) - c->allocator.arenas.clearFreeListsInArenas(); + for (ZonesIter zone(runtime); !zone.done(); zone.next()) + zone->allocator.arenas.clearFreeListsInArenas(); } static void @@ -3990,8 +3995,8 @@ ResetIncrementalGC(JSRuntime *rt, const char *reason) for (GCZonesIter zone(rt); !zone.done(); zone.next()) { JS_ASSERT(zone->isGCMarking()); - zone->setNeedsBarrier(false, JSCompartment::UpdateIon); - zone->setGCState(JSCompartment::NoGC); + zone->setNeedsBarrier(false, Zone::UpdateIon); + zone->setGCState(Zone::NoGC); } rt->gcIncrementalState = NO_INCREMENTAL; @@ -4064,7 +4069,7 @@ AutoGCSlice::AutoGCSlice(JSRuntime *rt) */ if (zone->isGCMarking()) { JS_ASSERT(zone->needsBarrier()); - zone->setNeedsBarrier(false, JSCompartment::DontUpdateIon); + zone->setNeedsBarrier(false, Zone::DontUpdateIon); } else { JS_ASSERT(!zone->needsBarrier()); } @@ -4076,10 +4081,10 @@ AutoGCSlice::~AutoGCSlice() /* We can't use GCZonesIter if this is the end of the last slice. */ for (ZonesIter zone(runtime); !zone.done(); zone.next()) { if (zone->isGCMarking()) { - zone->setNeedsBarrier(true, JSCompartment::UpdateIon); + zone->setNeedsBarrier(true, Zone::UpdateIon); zone->allocator.arenas.prepareForIncrementalGC(runtime); } else { - zone->setNeedsBarrier(false, JSCompartment::UpdateIon); + zone->setNeedsBarrier(false, Zone::UpdateIon); } } } @@ -4260,21 +4265,24 @@ BudgetIncrementalGC(JSRuntime *rt, int64_t *budget) } bool reset = false; - for (CompartmentsIter c(rt); !c.done(); c.next()) { - if (c->gcBytes >= c->gcTriggerBytes) { + for (ZonesIter zone(rt); !zone.done(); zone.next()) { + if (zone->gcBytes >= zone->gcTriggerBytes) { *budget = SliceBudget::Unlimited; rt->gcStats.nonincremental("allocation trigger"); } + if (rt->gcIncrementalState != NO_INCREMENTAL && + zone->isGCScheduled() != zone->wasGCStarted()) + { + reset = true; + } + } + + for (CompartmentsIter c(rt); !c.done(); c.next()) { if (c->isTooMuchMalloc()) { *budget = SliceBudget::Unlimited; rt->gcStats.nonincremental("malloc bytes trigger"); } - - if (rt->gcIncrementalState != NO_INCREMENTAL && - c->isGCScheduled() != c->wasGCStarted()) { - reset = true; - } } if (reset) @@ -4294,8 +4302,8 @@ GCCycle(JSRuntime *rt, bool incremental, int64_t budget, JSGCInvocationKind gcki AutoAssertNoGC nogc; #ifdef DEBUG - for (CompartmentsIter c(rt); !c.done(); c.next()) - JS_ASSERT_IF(rt->gcMode == JSGC_MODE_GLOBAL, c->isGCScheduled()); + for (ZonesIter zone(rt); !zone.done(); zone.next()) + JS_ASSERT_IF(rt->gcMode == JSGC_MODE_GLOBAL, zone->isGCScheduled()); #endif /* @@ -4418,24 +4426,28 @@ Collect(JSRuntime *rt, bool incremental, int64_t budget, RecordNativeStackTopForGC(rt); + int zoneCount = 0; int compartmentCount = 0; int collectedCount = 0; - for (CompartmentsIter c(rt); !c.done(); c.next()) { + for (ZonesIter zone(rt); !zone.done(); zone.next()) { if (rt->gcMode == JSGC_MODE_GLOBAL) - c->scheduleGC(); + zone->scheduleGC(); /* This is a heuristic to avoid resets. */ - if (rt->gcIncrementalState != NO_INCREMENTAL && c->needsBarrier()) - c->scheduleGC(); + if (rt->gcIncrementalState != NO_INCREMENTAL && zone->needsBarrier()) + zone->scheduleGC(); - compartmentCount++; - if (c->isGCScheduled()) + zoneCount++; + if (zone->isGCScheduled()) collectedCount++; } + for (CompartmentsIter c(rt); !c.done(); c.next()) + compartmentCount++; + rt->gcShouldCleanUpEverything = ShouldCleanUpEverything(rt, reason, gckind); - gcstats::AutoGCSlice agc(rt->gcStats, collectedCount, compartmentCount, reason); + gcstats::AutoGCSlice agc(rt->gcStats, collectedCount, zoneCount, compartmentCount, reason); do { /* @@ -4498,10 +4510,10 @@ js::GCFinalSlice(JSRuntime *rt, JSGCInvocationKind gckind, gcreason::Reason reas } static bool -CompartmentsSelected(JSRuntime *rt) +ZonesSelected(JSRuntime *rt) { - for (CompartmentsIter c(rt); !c.done(); c.next()) { - if (c->isGCScheduled()) + for (ZonesIter zone(rt); !zone.done(); zone.next()) { + if (zone->isGCScheduled()) return true; } return false; @@ -4512,7 +4524,7 @@ js::GCDebugSlice(JSRuntime *rt, bool limit, int64_t objCount) { AssertCanGC(); int64_t budget = limit ? SliceBudget::WorkBudget(objCount) : SliceBudget::Unlimited; - if (!CompartmentsSelected(rt)) { + if (!ZonesSelected(rt)) { if (IsIncrementalGCInProgress(rt)) PrepareForIncrementalGC(rt); else @@ -4525,7 +4537,7 @@ js::GCDebugSlice(JSRuntime *rt, bool limit, int64_t objCount) void js::PrepareForDebugGC(JSRuntime *rt) { - if (!CompartmentsSelected(rt)) + if (!ZonesSelected(rt)) PrepareForFullGC(rt); } diff --git a/js/src/jsgc.h b/js/src/jsgc.h index feff4d501a5c..57f16609eac6 100644 --- a/js/src/jsgc.h +++ b/js/src/jsgc.h @@ -459,7 +459,7 @@ struct ArenaLists { inline void queueForForegroundSweep(FreeOp *fop, AllocKind thingKind); inline void queueForBackgroundSweep(FreeOp *fop, AllocKind thingKind); - inline void *allocateFromArena(JSCompartment *comp, AllocKind thingKind); + inline void *allocateFromArena(JS::Zone *zone, AllocKind thingKind); }; /* diff --git a/js/src/jsgcinlines.h b/js/src/jsgcinlines.h index 49e04c473782..b06208f5ab03 100644 --- a/js/src/jsgcinlines.h +++ b/js/src/jsgcinlines.h @@ -505,17 +505,20 @@ NewGCThing(JSContext *cx, js::gc::AllocKind kind, size_t thingSize) if (allowGC) MaybeCheckStackRoots(cx, /* relax = */ false); - JSCompartment *comp = cx->compartment; - T *t = static_cast(comp->allocator.arenas.allocateFromFreeList(kind, thingSize)); + JS::Zone *zone = cx->zone(); + T *t = static_cast(zone->allocator.arenas.allocateFromFreeList(kind, thingSize)); if (!t) t = static_cast(js::gc::ArenaLists::refillFreeList(cx, kind)); - JS_ASSERT_IF(t && comp->wasGCStarted() && (comp->isGCMarking() || comp->isGCSweeping()), + JS_ASSERT_IF(t && zone->wasGCStarted() && (zone->isGCMarking() || zone->isGCSweeping()), t->arenaHeader()->allocatedDuringIncremental); #if defined(JSGC_GENERATIONAL) && defined(JS_GC_ZEAL) - if (cx->runtime->gcVerifyPostData && IsNurseryAllocable(kind) && !IsAtomsCompartment(comp)) - comp->gcNursery.insertPointer(t); + if (cx->runtime->gcVerifyPostData && IsNurseryAllocable(kind) + && !IsAtomsCompartment(cx->compartment)) + { + zone->gcNursery.insertPointer(t); + } #endif return t; diff --git a/js/src/jsinfer.cpp b/js/src/jsinfer.cpp index 4c6030ea41d6..910d5c8a7c11 100644 --- a/js/src/jsinfer.cpp +++ b/js/src/jsinfer.cpp @@ -6229,7 +6229,7 @@ void TypeSet::sweep(JSCompartment *compartment) { JS_ASSERT(!purged()); - JS_ASSERT(compartment->isGCSweeping()); + JS_ASSERT(compartment->zone()->isGCSweeping()); /* * Purge references to type objects that are no longer live. Type sets hold @@ -6309,7 +6309,7 @@ TypeObject::sweep(FreeOp *fop) } JSCompartment *compartment = this->compartment(); - JS_ASSERT(compartment->isGCSweeping()); + JS_ASSERT(compartment->zone()->isGCSweeping()); if (!isMarked()) { if (newScript) @@ -6393,7 +6393,7 @@ struct SweepTypeObjectOp void SweepTypeObjects(FreeOp *fop, JSCompartment *compartment) { - JS_ASSERT(compartment->isGCSweeping()); + JS_ASSERT(compartment->zone()->isGCSweeping()); SweepTypeObjectOp op(fop); gc::ForEachArenaAndCell(compartment, gc::FINALIZE_TYPE_OBJECT, gc::EmptyArenaOp, op); } @@ -6402,7 +6402,7 @@ void TypeCompartment::sweep(FreeOp *fop) { JSCompartment *compartment = this->compartment(); - JS_ASSERT(compartment->isGCSweeping()); + JS_ASSERT(compartment->zone()->isGCSweeping()); SweepTypeObjects(fop, compartment); @@ -6539,7 +6539,7 @@ JSCompartment::sweepNewTypeObjectTable(TypeObjectSet &table) { gcstats::AutoPhase ap(rt->gcStats, gcstats::PHASE_SWEEP_TABLES_TYPE_OBJECT); - JS_ASSERT(isGCSweeping()); + JS_ASSERT(zone()->isGCSweeping()); if (table.initialized()) { for (TypeObjectSet::Enum e(table); !e.empty(); e.popFront()) { TypeObject *type = e.front(); @@ -6570,7 +6570,7 @@ TypeCompartment::~TypeCompartment() TypeScript::Sweep(FreeOp *fop, RawScript script) { JSCompartment *compartment = script->compartment(); - JS_ASSERT(compartment->isGCSweeping()); + JS_ASSERT(compartment->zone()->isGCSweeping()); JS_ASSERT(compartment->types.inferenceEnabled); unsigned num = NumTypeSets(script); diff --git a/js/src/jsinferinlines.h b/js/src/jsinferinlines.h index 2ceb8fe292c8..093e31460631 100644 --- a/js/src/jsinferinlines.h +++ b/js/src/jsinferinlines.h @@ -420,7 +420,7 @@ struct AutoEnterCompilation co.script = script; co.setKind(kind); co.constructing = constructing; - co.barriers = cx->compartment->compileBarriers(); + co.barriers = cx->zone()->compileBarriers(); co.chunkIndex = chunkIndex; // This flag is used to prevent adding the current compiled script in diff --git a/js/src/jsiter.cpp b/js/src/jsiter.cpp index b31338a2f083..3bc12860d7f0 100644 --- a/js/src/jsiter.cpp +++ b/js/src/jsiter.cpp @@ -1369,9 +1369,9 @@ MarkGeneratorFrame(JSTracer *trc, JSGenerator *gen) static void GeneratorWriteBarrierPre(JSContext *cx, JSGenerator *gen) { - JSCompartment *comp = cx->compartment; - if (comp->needsBarrier()) - MarkGeneratorFrame(comp->barrierTracer(), gen); + JS::Zone *zone = cx->zone(); + if (zone->needsBarrier()) + MarkGeneratorFrame(zone->barrierTracer(), gen); } /* diff --git a/js/src/jsmemorymetrics.cpp b/js/src/jsmemorymetrics.cpp index d1c6bab9b37e..1a00e0209107 100644 --- a/js/src/jsmemorymetrics.cpp +++ b/js/src/jsmemorymetrics.cpp @@ -334,7 +334,7 @@ JS::SystemCompartmentCount(const JSRuntime *rt) { size_t n = 0; for (size_t i = 0; i < rt->compartments.length(); i++) { - if (rt->compartments[i]->isSystemCompartment) + if (rt->compartments[i]->zone()->isSystemCompartment) ++n; } return n; @@ -345,7 +345,7 @@ JS::UserCompartmentCount(const JSRuntime *rt) { size_t n = 0; for (size_t i = 0; i < rt->compartments.length(); i++) { - if (!rt->compartments[i]->isSystemCompartment) + if (!rt->compartments[i]->zone()->isSystemCompartment) ++n; } return n; diff --git a/js/src/jsobj.cpp b/js/src/jsobj.cpp index 073691e7e6c5..7c8cb2be4f94 100644 --- a/js/src/jsobj.cpp +++ b/js/src/jsobj.cpp @@ -1769,10 +1769,10 @@ JSObject::ReserveForTradeGuts(JSContext *cx, JSObject *aArg, JSObject *bArg, * after the swap, |b|'s guts would never be marked. The write barrier * solves this. */ - JSCompartment *comp = a->compartment(); - if (comp->needsBarrier()) { - MarkChildren(comp->barrierTracer(), a); - MarkChildren(comp->barrierTracer(), b); + JS::Zone *zone = a->zone(); + if (zone->needsBarrier()) { + MarkChildren(zone->barrierTracer(), a); + MarkChildren(zone->barrierTracer(), b); } #endif diff --git a/js/src/jsprobes.cpp b/js/src/jsprobes.cpp index b834dfc6fbb6..84ef31930b2e 100644 --- a/js/src/jsprobes.cpp +++ b/js/src/jsprobes.cpp @@ -439,9 +439,9 @@ Probes::ETWStopExecution(UnrootedScript script) } bool -Probes::ETWResizeHeap(JSCompartment *compartment, size_t oldSize, size_t newSize) +Probes::ETWResizeHeap(JS::Zone *zone, size_t oldSize, size_t newSize) { - return EventWriteEvtHeapResize(reinterpret_cast(compartment), + return EventWriteEvtHeapResize(reinterpret_cast(zone), oldSize, newSize) == ERROR_SUCCESS; } diff --git a/js/src/jsprobes.h b/js/src/jsprobes.h index e84b1f846653..c185d5c1b2b1 100644 --- a/js/src/jsprobes.h +++ b/js/src/jsprobes.h @@ -104,7 +104,7 @@ bool startExecution(UnrootedScript script); bool stopExecution(UnrootedScript script); /* Heap has been resized */ -bool resizeHeap(JSCompartment *compartment, size_t oldSize, size_t newSize); +bool resizeHeap(JS::Zone *zone, size_t oldSize, size_t newSize); /* * Object has been created. |obj| must exist (its class and size are read) @@ -371,12 +371,12 @@ Probes::exitScript(JSContext *cx, UnrootedScript script, UnrootedFunction maybeF } inline bool -Probes::resizeHeap(JSCompartment *compartment, size_t oldSize, size_t newSize) +Probes::resizeHeap(JS::Zone *zone, size_t oldSize, size_t newSize) { bool ok = true; #ifdef MOZ_ETW - if (ProfilingActive && !ETWResizeHeap(compartment, oldSize, newSize)) + if (ProfilingActive && !ETWResizeHeap(zone, oldSize, newSize)) ok = false; #endif diff --git a/js/src/jspropertytree.cpp b/js/src/jspropertytree.cpp index 5589b08e50c5..ca9a0da994f1 100644 --- a/js/src/jspropertytree.cpp +++ b/js/src/jspropertytree.cpp @@ -159,16 +159,16 @@ PropertyTree::getChild(JSContext *cx, Shape *parent_, uint32_t nfixed, const Sta #ifdef JSGC_INCREMENTAL if (shape) { - JSCompartment *comp = shape->compartment(); - if (comp->needsBarrier()) { + JS::Zone *zone = shape->zone(); + if (zone->needsBarrier()) { /* * We need a read barrier for the shape tree, since these are weak * pointers. */ Shape *tmp = shape; - MarkShapeUnbarriered(comp->barrierTracer(), &tmp, "read barrier"); + MarkShapeUnbarriered(zone->barrierTracer(), &tmp, "read barrier"); JS_ASSERT(tmp == shape); - } else if (comp->isGCSweeping() && !shape->isMarked() && + } else if (zone->isGCSweeping() && !shape->isMarked() && !shape->arenaHeader()->allocatedDuringIncremental) { /* diff --git a/js/src/jsscript.cpp b/js/src/jsscript.cpp index 681ecf8a1960..104f763e9ef1 100644 --- a/js/src/jsscript.cpp +++ b/js/src/jsscript.cpp @@ -2601,7 +2601,7 @@ JSScript::markChildren(JSTracer *trc) // JSScript::Create(), but not yet finished initializing it with // fullyInitFromEmitter() or fullyInitTrivial(). - JS_ASSERT_IF(trc->runtime->gcStrictCompartmentChecking, compartment()->isCollecting()); + JS_ASSERT_IF(trc->runtime->gcStrictCompartmentChecking, zone()->isCollecting()); for (uint32_t i = 0; i < natoms; ++i) { if (atoms[i]) diff --git a/js/src/jsweakmap.cpp b/js/src/jsweakmap.cpp index 620bd32d680b..19544700930b 100644 --- a/js/src/jsweakmap.cpp +++ b/js/src/jsweakmap.cpp @@ -308,7 +308,7 @@ WeakMap_set_impl(JSContext *cx, CallArgs args) JS_ReportOutOfMemory(cx); return false; } - HashTableWriteBarrierPost(cx->compartment, map, key); + HashTableWriteBarrierPost(cx->zone(), map, key); args.rval().setUndefined(); return true; diff --git a/js/src/methodjit/BaseAssembler.h b/js/src/methodjit/BaseAssembler.h index f0a3b4fa4322..d26f14cc54b1 100644 --- a/js/src/methodjit/BaseAssembler.h +++ b/js/src/methodjit/BaseAssembler.h @@ -1365,7 +1365,7 @@ static const JSC::MacroAssembler::RegisterID JSParamReg_Argc = JSC::MIPSRegiste * span is not empty is handled. */ gc::FreeSpan *list = const_cast - (cx->compartment->allocator.arenas.getFreeList(allocKind)); + (cx->zone()->allocator.arenas.getFreeList(allocKind)); loadPtr(&list->first, result); Jump jump = branchPtr(Assembler::BelowOrEqual, AbsoluteAddress(&list->last), result); diff --git a/js/src/methodjit/Compiler.cpp b/js/src/methodjit/Compiler.cpp index 4e96f9f0a4e4..5d3097702187 100644 --- a/js/src/methodjit/Compiler.cpp +++ b/js/src/methodjit/Compiler.cpp @@ -146,7 +146,7 @@ mjit::Compiler::compile() if (status != Compile_Okay && status != Compile_Retry) { if (!outerScript->ensureHasMJITInfo(cx)) return Compile_Error; - JSScript::JITScriptHandle *jith = outerScript->jitHandle(isConstructing, cx->compartment->compileBarriers()); + JSScript::JITScriptHandle *jith = outerScript->jitHandle(isConstructing, cx->zone()->compileBarriers()); JSScript::ReleaseCode(cx->runtime->defaultFreeOp(), jith); jith->setUnjittable(); @@ -1015,7 +1015,7 @@ mjit::CanMethodJIT(JSContext *cx, JSScript *script, jsbytecode *pc, } if (script->hasMJITInfo()) { - JSScript::JITScriptHandle *jith = script->jitHandle(construct, cx->compartment->compileBarriers()); + JSScript::JITScriptHandle *jith = script->jitHandle(construct, cx->zone()->compileBarriers()); if (jith->isUnjittable()) return Compile_Abort; } @@ -1040,7 +1040,7 @@ mjit::CanMethodJIT(JSContext *cx, JSScript *script, jsbytecode *pc, if (!script->ensureHasMJITInfo(cx)) return Compile_Error; - JSScript::JITScriptHandle *jith = script->jitHandle(construct, cx->compartment->compileBarriers()); + JSScript::JITScriptHandle *jith = script->jitHandle(construct, cx->zone()->compileBarriers()); JITScript *jit; if (jith->isEmpty()) { @@ -5654,7 +5654,7 @@ mjit::Compiler::jsop_setprop(HandlePropertyName name, bool popGuaranteed) if (!isObject) notObject = frame.testObject(Assembler::NotEqual, lhs); #ifdef JSGC_INCREMENTAL_MJ - if (cx->compartment->compileBarriers() && propertyTypes->needsBarrier(cx)) { + if (cx->zone()->compileBarriers() && propertyTypes->needsBarrier(cx)) { /* Write barrier. */ Jump j = masm.testGCThing(Address(reg, JSObject::getFixedSlotOffset(slot))); stubcc.linkExit(j, Uses(0)); @@ -5687,7 +5687,7 @@ mjit::Compiler::jsop_setprop(HandlePropertyName name, bool popGuaranteed) #ifdef JSGC_INCREMENTAL_MJ /* Write barrier. We don't have type information for JSOP_SETNAME. */ - if (cx->compartment->compileBarriers() && + if (cx->zone()->compileBarriers() && (!types || JSOp(*PC) == JSOP_SETNAME || types->propertyNeedsBarrier(cx, id))) { jsop_setprop_slow(name); @@ -6063,7 +6063,7 @@ mjit::Compiler::jsop_aliasedArg(unsigned arg, bool get, bool poppedAfter) frame.push(Address(reg), type, true /* = reuseBase */); } else { #ifdef JSGC_INCREMENTAL_MJ - if (cx->compartment->compileBarriers()) { + if (cx->zone()->compileBarriers()) { /* Write barrier. */ stubcc.linkExit(masm.testGCThing(Address(reg)), Uses(0)); stubcc.leave(); @@ -6106,7 +6106,7 @@ mjit::Compiler::jsop_aliasedVar(ScopeCoordinate sc, bool get, bool poppedAfter) finishBarrier(barrier, REJOIN_FALLTHROUGH, 0); } else { #ifdef JSGC_INCREMENTAL_MJ - if (cx->compartment->compileBarriers()) { + if (cx->zone()->compileBarriers()) { /* Write barrier. */ stubcc.linkExit(masm.testGCThing(addr), Uses(0)); stubcc.leave(); @@ -6261,7 +6261,7 @@ mjit::Compiler::iter(unsigned flags) * Write barrier for stores to the iterator. We only need to take a write * barrier if NativeIterator::obj is actually going to change. */ - if (cx->compartment->compileBarriers()) { + if (cx->zone()->compileBarriers()) { Jump j = masm.branchPtr(Assembler::NotEqual, Address(nireg, offsetof(NativeIterator, obj)), reg); stubcc.linkExit(j, Uses(1)); @@ -6672,7 +6672,7 @@ mjit::Compiler::jsop_setgname(HandlePropertyName name, bool popGuaranteed) RegisterID reg = frame.allocReg(); #ifdef JSGC_INCREMENTAL_MJ /* Write barrier. */ - if (cx->compartment->compileBarriers() && types->needsBarrier(cx)) { + if (cx->zone()->compileBarriers() && types->needsBarrier(cx)) { stubcc.linkExit(masm.jump(), Uses(0)); stubcc.leave(); stubcc.masm.move(ImmPtr(value), Registers::ArgReg1); @@ -6690,7 +6690,7 @@ mjit::Compiler::jsop_setgname(HandlePropertyName name, bool popGuaranteed) #ifdef JSGC_INCREMENTAL_MJ /* Write barrier. */ - if (cx->compartment->compileBarriers()) { + if (cx->zone()->compileBarriers()) { jsop_setgname_slow(name); return true; } diff --git a/js/src/methodjit/Compiler.h b/js/src/methodjit/Compiler.h index 4d611c8fb91a..962220a0d150 100644 --- a/js/src/methodjit/Compiler.h +++ b/js/src/methodjit/Compiler.h @@ -495,7 +495,7 @@ private: } JITScript *outerJIT() { - return outerScript->getJIT(isConstructing, cx->compartment->compileBarriers()); + return outerScript->getJIT(isConstructing, cx->zone()->compileBarriers()); } ChunkDescriptor &outerChunkRef() { diff --git a/js/src/methodjit/FastBuiltins.cpp b/js/src/methodjit/FastBuiltins.cpp index db27ff65b586..ad55c0ef164b 100644 --- a/js/src/methodjit/FastBuiltins.cpp +++ b/js/src/methodjit/FastBuiltins.cpp @@ -478,7 +478,7 @@ mjit::Compiler::compileArrayPopShift(FrameEntry *thisValue, bool isPacked, bool #ifdef JSGC_INCREMENTAL_MJ /* Write barrier. */ - if (cx->compartment->compileBarriers()) + if (cx->zone()->compileBarriers()) return Compile_InlineAbort; #endif diff --git a/js/src/methodjit/FastOps.cpp b/js/src/methodjit/FastOps.cpp index 5d1e39e428c3..2a4849fb16f7 100644 --- a/js/src/methodjit/FastOps.cpp +++ b/js/src/methodjit/FastOps.cpp @@ -974,7 +974,7 @@ mjit::Compiler::jsop_setelem_dense() * undefined. */ types::StackTypeSet *types = frame.extra(obj).types; - if (cx->compartment->compileBarriers() && (!types || types->propertyNeedsBarrier(cx, JSID_VOID))) { + if (cx->zone()->compileBarriers() && (!types || types->propertyNeedsBarrier(cx, JSID_VOID))) { Label barrierStart = stubcc.masm.label(); stubcc.linkExitDirect(masm.jump(), barrierStart); @@ -1371,7 +1371,7 @@ mjit::Compiler::jsop_setelem(bool popGuaranteed) #ifdef JSGC_INCREMENTAL_MJ // Write barrier. - if (cx->compartment->compileBarriers()) { + if (cx->zone()->compileBarriers()) { jsop_setelem_slow(); return true; } @@ -2482,7 +2482,7 @@ mjit::Compiler::jsop_initprop() RootedObject baseobj(cx, frame.extra(obj).initObject); - if (!baseobj || monitored(PC) || cx->compartment->compileBarriers()) { + if (!baseobj || monitored(PC) || cx->zone()->compileBarriers()) { if (monitored(PC) && script_ == outerScript) monitoredBytecodes.append(PC - script_->code); diff --git a/js/src/methodjit/InvokeHelpers.cpp b/js/src/methodjit/InvokeHelpers.cpp index 7bf4f7dea6b0..de59ca60f54d 100644 --- a/js/src/methodjit/InvokeHelpers.cpp +++ b/js/src/methodjit/InvokeHelpers.cpp @@ -370,7 +370,7 @@ UncachedInlineCall(VMFrame &f, InitialFrameFlags initial, * will be constructing a new type object for 'this'. */ if (!newType) { - if (JITScript *jit = newscript->getJIT(regs.fp()->isConstructing(), cx->compartment->compileBarriers())) { + if (JITScript *jit = newscript->getJIT(regs.fp()->isConstructing(), cx->zone()->compileBarriers())) { if (jit->invokeEntry) { *pret = jit->invokeEntry; diff --git a/js/src/methodjit/MethodJIT.cpp b/js/src/methodjit/MethodJIT.cpp index 568db9e626eb..8794bbd4482d 100644 --- a/js/src/methodjit/MethodJIT.cpp +++ b/js/src/methodjit/MethodJIT.cpp @@ -1104,7 +1104,7 @@ JaegerStatus mjit::JaegerShot(JSContext *cx, bool partial) { StackFrame *fp = cx->fp(); - JITScript *jit = fp->script()->getJIT(fp->isConstructing(), cx->compartment->compileBarriers()); + JITScript *jit = fp->script()->getJIT(fp->isConstructing(), cx->zone()->compileBarriers()); JS_ASSERT(cx->regs().pc == fp->script()->code); @@ -1334,8 +1334,8 @@ JITScript::destroyChunk(FreeOp *fop, unsigned chunkIndex, bool resetUses) * Write barrier: Before we destroy the chunk, trace through the objects * it holds. */ - if (script->compartment()->needsBarrier()) - desc.chunk->trace(script->compartment()->barrierTracer()); + if (script->zone()->needsBarrier()) + desc.chunk->trace(script->zone()->barrierTracer()); Probes::discardMJITCode(fop, this, desc.chunk, desc.chunk->code.m_code.executableAddress()); fop->delete_(desc.chunk); @@ -1386,7 +1386,7 @@ JITScript::trace(JSTracer *trc) static ic::PICInfo * GetPIC(JSContext *cx, JSScript *script, jsbytecode *pc, bool constructing) { - JITScript *jit = script->getJIT(constructing, cx->compartment->needsBarrier()); + JITScript *jit = script->getJIT(constructing, cx->zone()->needsBarrier()); if (!jit) return NULL; diff --git a/js/src/methodjit/MonoIC.cpp b/js/src/methodjit/MonoIC.cpp index 783b467b3c5f..19238f1d3b1f 100644 --- a/js/src/methodjit/MonoIC.cpp +++ b/js/src/methodjit/MonoIC.cpp @@ -874,7 +874,7 @@ class CallCompiler : public BaseCompiler masm.loadPtr(Address(t0, JSScript::offsetOfMJITInfo()), t0); Jump hasNoJitInfo = masm.branchPtr(Assembler::Equal, t0, ImmPtr(NULL)); size_t offset = JSScript::JITScriptSet::jitHandleOffset(callingNew, - f.cx->compartment->compileBarriers()); + f.cx->zone()->compileBarriers()); masm.loadPtr(Address(t0, offset), t0); Jump hasNoJitCode = masm.branchPtr(Assembler::BelowOrEqual, t0, ImmPtr(JSScript::JITScriptHandle::UNJITTABLE)); @@ -962,7 +962,7 @@ class CallCompiler : public BaseCompiler bool patchInlinePath(JSScript *script, JSObject *obj) { JS_ASSERT(ic.frameSize.isStatic()); - JITScript *jit = script->getJIT(callingNew, f.cx->compartment->compileBarriers()); + JITScript *jit = script->getJIT(callingNew, f.cx->zone()->compileBarriers()); /* Very fast path. */ Repatcher repatch(f.chunk()); diff --git a/js/src/methodjit/PolyIC.cpp b/js/src/methodjit/PolyIC.cpp index 61e810a70079..cd7066b8184c 100644 --- a/js/src/methodjit/PolyIC.cpp +++ b/js/src/methodjit/PolyIC.cpp @@ -564,7 +564,7 @@ class SetPropCompiler : public PICStubCompiler * Since we're changing the object's shape, we need a write * barrier. Taking the slow path is the easiest way to get one. */ - if (cx->compartment->compileBarriers()) + if (cx->zone()->compileBarriers()) return disable("ADDPROP write barrier required"); #endif @@ -2846,7 +2846,7 @@ SetElementIC::shouldUpdate(VMFrame &f) return false; } #ifdef JSGC_INCREMENTAL_MJ - JS_ASSERT(!f.cx->compartment->compileBarriers()); + JS_ASSERT(!f.cx->zone()->compileBarriers()); #endif JS_ASSERT(stubsGenerated < MAX_PIC_STUBS); return true; diff --git a/js/src/methodjit/StubCalls.cpp b/js/src/methodjit/StubCalls.cpp index 1f8be3783a90..5d294fb2c335 100644 --- a/js/src/methodjit/StubCalls.cpp +++ b/js/src/methodjit/StubCalls.cpp @@ -1749,21 +1749,21 @@ void JS_FASTCALL stubs::WriteBarrier(VMFrame &f, Value *addr) { #ifdef JS_GC_ZEAL - if (!f.cx->compartment->needsBarrier()) + if (!f.cx->zone()->needsBarrier()) return; #endif - gc::MarkValueUnbarriered(f.cx->compartment->barrierTracer(), addr, "write barrier"); + gc::MarkValueUnbarriered(f.cx->zone()->barrierTracer(), addr, "write barrier"); } void JS_FASTCALL stubs::GCThingWriteBarrier(VMFrame &f, Value *addr) { #ifdef JS_GC_ZEAL - if (!f.cx->compartment->needsBarrier()) + if (!f.cx->zone()->needsBarrier()) return; #endif gc::Cell *cell = (gc::Cell *)addr->toGCThing(); if (cell && !cell->isMarked()) - gc::MarkValueUnbarriered(f.cx->compartment->barrierTracer(), addr, "write barrier"); + gc::MarkValueUnbarriered(f.cx->zone()->barrierTracer(), addr, "write barrier"); } diff --git a/js/src/vm/ArgumentsObject-inl.h b/js/src/vm/ArgumentsObject-inl.h index c3a6d55e39ec..f0cd3a50bd01 100644 --- a/js/src/vm/ArgumentsObject-inl.h +++ b/js/src/vm/ArgumentsObject-inl.h @@ -159,7 +159,7 @@ NormalArgumentsObject::callee() const inline void NormalArgumentsObject::clearCallee() { - data()->callee.set(compartment(), MagicValue(JS_OVERWRITTEN_CALLEE)); + data()->callee.set(zone(), MagicValue(JS_OVERWRITTEN_CALLEE)); } } /* namespace js */ diff --git a/js/src/vm/Debugger.cpp b/js/src/vm/Debugger.cpp index 85efcaf597c5..bf961e160dc8 100644 --- a/js/src/vm/Debugger.cpp +++ b/js/src/vm/Debugger.cpp @@ -698,7 +698,7 @@ Debugger::wrapDebuggeeValue(JSContext *cx, MutableHandleValue vp) js_ReportOutOfMemory(cx); return false; } - HashTableWriteBarrierPost(cx->compartment, &objects, obj); + HashTableWriteBarrierPost(cx->zone(), &objects, obj); if (obj->compartment() != object->compartment()) { CrossCompartmentKey key(CrossCompartmentKey::DebuggerObject, object, obj); @@ -1418,7 +1418,7 @@ Debugger::markCrossCompartmentDebuggerObjectReferents(JSTracer *tracer) * compartments. */ for (Debugger *dbg = rt->debuggerList.getFirst(); dbg; dbg = dbg->getNext()) { - if (!dbg->object->compartment()->isCollecting()) + if (!dbg->object->zone()->isCollecting()) dbg->markKeysInCompartment(tracer); } } @@ -1468,7 +1468,7 @@ Debugger::markAllIteratively(GCMarker *trc) * - it actually has hooks that might be called */ HeapPtrObject &dbgobj = dbg->toJSObjectRef(); - if (!dbgobj->compartment()->isGCMarking()) + if (!dbgobj->zone()->isGCMarking()) continue; bool dbgMarked = IsObjectMarked(&dbgobj); diff --git a/js/src/vm/ObjectImpl.cpp b/js/src/vm/ObjectImpl.cpp index acc26b757f1b..911e7c0667ce 100644 --- a/js/src/vm/ObjectImpl.cpp +++ b/js/src/vm/ObjectImpl.cpp @@ -219,25 +219,25 @@ js::ObjectImpl::checkShapeConsistency() void js::ObjectImpl::initSlotRange(uint32_t start, const Value *vector, uint32_t length) { - JSCompartment *comp = compartment(); + JS::Zone *zone = this->zone(); HeapSlot *fixedStart, *fixedEnd, *slotsStart, *slotsEnd; getSlotRange(start, length, &fixedStart, &fixedEnd, &slotsStart, &slotsEnd); for (HeapSlot *sp = fixedStart; sp < fixedEnd; sp++) - sp->init(comp, this->asObjectPtr(), HeapSlot::Slot, start++, *vector++); + sp->init(zone, this->asObjectPtr(), HeapSlot::Slot, start++, *vector++); for (HeapSlot *sp = slotsStart; sp < slotsEnd; sp++) - sp->init(comp, this->asObjectPtr(), HeapSlot::Slot, start++, *vector++); + sp->init(zone, this->asObjectPtr(), HeapSlot::Slot, start++, *vector++); } void js::ObjectImpl::copySlotRange(uint32_t start, const Value *vector, uint32_t length) { - JSCompartment *comp = compartment(); + JS::Zone *zone = this->zone(); HeapSlot *fixedStart, *fixedEnd, *slotsStart, *slotsEnd; getSlotRange(start, length, &fixedStart, &fixedEnd, &slotsStart, &slotsEnd); for (HeapSlot *sp = fixedStart; sp < fixedEnd; sp++) - sp->set(comp, this->asObjectPtr(), HeapSlot::Slot, start++, *vector++); + sp->set(zone, this->asObjectPtr(), HeapSlot::Slot, start++, *vector++); for (HeapSlot *sp = slotsStart; sp < slotsEnd; sp++) - sp->set(comp, this->asObjectPtr(), HeapSlot::Slot, start++, *vector++); + sp->set(zone, this->asObjectPtr(), HeapSlot::Slot, start++, *vector++); } #ifdef DEBUG diff --git a/js/src/vm/RegExpStatics-inl.h b/js/src/vm/RegExpStatics-inl.h index 87a785e9007a..491eb8655485 100644 --- a/js/src/vm/RegExpStatics-inl.h +++ b/js/src/vm/RegExpStatics-inl.h @@ -433,7 +433,7 @@ RegExpStatics::updateLazily(JSContext *cx, JSLinearString *input, JS_ASSERT(input && shared); aboutToWrite(); - BarrieredSetPair(cx->compartment, + BarrieredSetPair(cx->zone(), pendingInput, input, matchesInput, input); if (regexp.initialized()) @@ -455,7 +455,7 @@ RegExpStatics::updateFromMatchPairs(JSContext *cx, JSLinearString *input, MatchP this->regexp.release(); this->lastIndex = size_t(-1); - BarrieredSetPair(cx->compartment, + BarrieredSetPair(cx->zone(), pendingInput, input, matchesInput, input); diff --git a/js/src/vm/ScopeObject.cpp b/js/src/vm/ScopeObject.cpp index 5e683d4ff29d..954ab209dacc 100644 --- a/js/src/vm/ScopeObject.cpp +++ b/js/src/vm/ScopeObject.cpp @@ -1687,7 +1687,7 @@ DebugScopes::addDebugScope(JSContext *cx, ScopeObject &scope, DebugScopeObject & return false; } - HashTableWriteBarrierPost(cx->compartment, &scopes->proxiedScopes, &scope); + HashTableWriteBarrierPost(cx->zone(), &scopes->proxiedScopes, &scope); return true; } diff --git a/js/src/vm/Stack-inl.h b/js/src/vm/Stack-inl.h index 0a490a933f38..95da855adbad 100644 --- a/js/src/vm/Stack-inl.h +++ b/js/src/vm/Stack-inl.h @@ -76,7 +76,7 @@ inline mjit::JITScript * StackFrame::jit() { AutoAssertNoGC nogc; - return script()->getJIT(isConstructing(), script()->compartment()->compileBarriers()); + return script()->getJIT(isConstructing(), script()->zone()->compileBarriers()); } #endif diff --git a/js/src/vm/Stack.cpp b/js/src/vm/Stack.cpp index cc7395661208..581b8ea61aac 100644 --- a/js/src/vm/Stack.cpp +++ b/js/src/vm/Stack.cpp @@ -192,7 +192,8 @@ StackFrame::prevpcSlow(InlinedSite **pinlined) JS_ASSERT(!(flags_ & HAS_PREVPC)); #if defined(JS_METHODJIT) && defined(JS_MONOIC) StackFrame *p = prev(); - mjit::JITScript *jit = p->script()->getJIT(p->isConstructing(), p->compartment()->compileBarriers()); + mjit::JITScript *jit = p->script()->getJIT(p->isConstructing(), + p->compartment()->zone()->compileBarriers()); prevpc_ = jit->nativeToPC(ncode_, &prevInline_); flags_ |= HAS_PREVPC; if (pinlined)