commit a79c2bfce5b8d2416d01250dbbaa7e6cf0dc1ae1
Author: Jon Coppeard <jcoppeard(a)mozilla.com>
Date: Wed Apr 2 17:19:28 2014 +0100
Backed out changeset 42531d5e6ca2 (Bug 986843) for test failures
---
js/src/gc/RootMarking.cpp | 2 +-
js/src/gc/Zone.cpp | 1 +
js/src/gc/Zone.h | 2 ++
js/src/jsapi.cpp | 29 +++++++++++------------------
js/src/jscompartment.cpp | 2 +-
js/src/jscompartment.h | 2 +-
js/src/jsgc.cpp | 4 ++--
7 files changed, 19 insertions(+), 23 deletions(-)
diff --git a/js/src/gc/RootMarking.cpp b/js/src/gc/RootMarking.cpp
index 88574f3..861c2d6 100644
--- a/js/src/gc/RootMarking.cpp
+++ b/js/src/gc/RootMarking.cpp
@@ -744,7 +744,7 @@ js::gc::MarkRuntime(JSTracer *trc, bool useSavedRoots)
#endif
for (CompartmentsIter c(rt); !c.done(); c.next())
- c->markRoots(trc);
+ c->mark(trc);
/* The embedding can register additional roots here. */
for (size_t i = 0; i < rt->gcBlackRootTracers.length(); i++) {
diff --git a/js/src/gc/Zone.cpp b/js/src/gc/Zone.cpp
index 0b6161c..5625b99 100644
--- a/js/src/gc/Zone.cpp
+++ b/js/src/gc/Zone.cpp
@@ -23,6 +23,7 @@ using namespace js::gc;
JS::Zone::Zone(JSRuntime *rt)
: rt(rt),
allocator(this),
+ hold(false),
ionUsingBarriers_(false),
active(false),
gcScheduled(false),
diff --git a/js/src/gc/Zone.h b/js/src/gc/Zone.h
index 39e867d..73e7043 100644
--- a/js/src/gc/Zone.h
+++ b/js/src/gc/Zone.h
@@ -108,6 +108,8 @@ struct Zone : private JS::shadow::Zone,
js::CompartmentVector compartments;
+ bool hold;
+
private:
bool ionUsingBarriers_;
diff --git a/js/src/jsapi.cpp b/js/src/jsapi.cpp
index 68b6afa..3632a74 100644
--- a/js/src/jsapi.cpp
+++ b/js/src/jsapi.cpp
@@ -3171,32 +3171,23 @@ JS_GetObjectId(JSContext *cx, JSObject *obj, jsid *idp)
return JS_TRUE;
}
-class AutoCompartmentRooter : private JS::CustomAutoRooter
+class AutoHoldZone
{
public:
- explicit AutoCompartmentRooter(JSContext *cx, JSCompartment *comp
- MOZ_GUARD_OBJECT_NOTIFIER_PARAM)
- : CustomAutoRooter(cx), compartment(comp)
+ explicit AutoHoldZone(Zone *zone
+ MOZ_GUARD_OBJECT_NOTIFIER_PARAM)
+ : holdp(&zone->hold)
{
MOZ_GUARD_OBJECT_NOTIFIER_INIT;
+ *holdp = true;
}
- operator JSCompartment *() {
- return compartment;
- }
-
- JSCompartment *operator->() {
- return compartment;
- }
-
- protected:
- virtual void trace(JSTracer *trc)
- {
- compartment->mark();
+ ~AutoHoldZone() {
+ *holdp = false;
}
private:
- JSCompartment *compartment;
+ bool *holdp;
MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
};
@@ -3218,7 +3209,7 @@ JS_NewGlobalObject(JSContext *cx, JSClass *clasp, JSPrincipals *principals,
else
zone = ((JSObject *)options.zoneSpec)->zone();
- AutoCompartmentRooter compartment(cx, NewCompartment(cx, zone, principals, options));
+ JSCompartment *compartment = NewCompartment(cx, zone, principals, options);
if (!compartment)
return NULL;
@@ -3227,6 +3218,8 @@ JS_NewGlobalObject(JSContext *cx, JSClass *clasp, JSPrincipals *principals,
rt->systemZone->isSystem = true;
}
+ AutoHoldZone hold(compartment->zone());
+
Rooted<GlobalObject *> global(cx);
{
AutoCompartment ac(cx, compartment);
diff --git a/js/src/jscompartment.cpp b/js/src/jscompartment.cpp
index 2e66253..c448e10 100644
--- a/js/src/jscompartment.cpp
+++ b/js/src/jscompartment.cpp
@@ -488,7 +488,7 @@ JSCompartment::markAllCrossCompartmentWrappers(JSTracer *trc)
}
void
-JSCompartment::markRoots(JSTracer *trc)
+JSCompartment::mark(JSTracer *trc)
{
#ifdef JS_ION
if (ionCompartment_)
diff --git a/js/src/jscompartment.h b/js/src/jscompartment.h
index 1ef2ed8..6cc1bc8 100644
--- a/js/src/jscompartment.h
+++ b/js/src/jscompartment.h
@@ -293,7 +293,7 @@ struct JSCompartment
WrapperEnum(JSCompartment *c) : js::WrapperMap::Enum(c->crossCompartmentWrappers) {}
};
- void markRoots(JSTracer *trc);
+ void mark(JSTracer *trc);
bool isDiscardingJitCode(JSTracer *trc);
void sweep(js::FreeOp *fop, bool releaseTypes);
void sweepCrossCompartmentWrappers();
diff --git a/js/src/jsgc.cpp b/js/src/jsgc.cpp
index 3157861..53a636e 100644
--- a/js/src/jsgc.cpp
+++ b/js/src/jsgc.cpp
@@ -2541,7 +2541,7 @@ SweepZones(FreeOp *fop, bool lastGC)
while (read < end) {
Zone *zone = *read++;
- if (zone->wasGCStarted()) {
+ if (!zone->hold && zone->wasGCStarted()) {
if (zone->allocator.arenas.arenaListsAreEmpty() || lastGC) {
zone->allocator.arenas.checkEmptyFreeLists();
if (callback)
@@ -2723,7 +2723,7 @@ BeginMarkPhase(JSRuntime *rt)
}
zone->scheduledForDestruction = false;
- zone->maybeAlive = false;
+ zone->maybeAlive = zone->hold;
zone->setPreservingCode(false);
}