Bug 790338 - Make weakmap list per-compartment rather than per-runtime r=billm

This commit is contained in:
Jon Coppeard
2012-11-02 18:03:59 +00:00
parent 3d6d540256
commit 95a57be5c2
10 changed files with 102 additions and 81 deletions

View File

@@ -21,12 +21,24 @@
using namespace js;
WeakMapBase::WeakMapBase(JSObject *memOf, JSCompartment *c)
: memberOf(memOf),
compartment(c),
next(WeakMapNotInList)
{
JS_ASSERT_IF(memberOf, memberOf->compartment() == c);
}
WeakMapBase::~WeakMapBase()
{
JS_ASSERT(next == WeakMapNotInList);
}
bool
WeakMapBase::markAllIteratively(JSTracer *tracer)
WeakMapBase::markCompartmentIteratively(JSCompartment *c, JSTracer *tracer)
{
bool markedAny = false;
JSRuntime *rt = tracer->runtime;
for (WeakMapBase *m = rt->gcWeakMapList; m; m = m->next) {
for (WeakMapBase *m = c->gcWeakMapList; m; m = m->next) {
if (m->markIteratively(tracer))
markedAny = true;
}
@@ -34,28 +46,29 @@ WeakMapBase::markAllIteratively(JSTracer *tracer)
}
void
WeakMapBase::sweepAll(JSTracer *tracer)
WeakMapBase::sweepCompartment(JSCompartment *c)
{
JSRuntime *rt = tracer->runtime;
for (WeakMapBase *m = rt->gcWeakMapList; m; m = m->next)
m->sweep(tracer);
for (WeakMapBase *m = c->gcWeakMapList; m; m = m->next)
m->sweep();
}
void
WeakMapBase::traceAllMappings(WeakMapTracer *tracer)
{
JSRuntime *rt = tracer->runtime;
for (WeakMapBase *m = rt->gcWeakMapList; m; m = m->next)
m->traceMappings(tracer);
for (CompartmentsIter c(rt); !c.done(); c.next()) {
for (WeakMapBase *m = c->gcWeakMapList; m; m = m->next)
m->traceMappings(tracer);
}
}
void
WeakMapBase::resetWeakMapList(JSRuntime *rt)
WeakMapBase::resetCompartmentWeakMapList(JSCompartment *c)
{
JS_ASSERT(WeakMapNotInList != NULL);
WeakMapBase *m = rt->gcWeakMapList;
rt->gcWeakMapList = NULL;
WeakMapBase *m = c->gcWeakMapList;
c->gcWeakMapList = NULL;
while (m) {
WeakMapBase *n = m->next;
m->next = WeakMapNotInList;
@@ -64,9 +77,9 @@ WeakMapBase::resetWeakMapList(JSRuntime *rt)
}
bool
WeakMapBase::saveWeakMapList(JSRuntime *rt, WeakMapVector &vector)
WeakMapBase::saveCompartmentWeakMapList(JSCompartment *c, WeakMapVector &vector)
{
WeakMapBase *m = rt->gcWeakMapList;
WeakMapBase *m = c->gcWeakMapList;
while (m) {
if (!vector.append(m))
return false;
@@ -76,21 +89,22 @@ WeakMapBase::saveWeakMapList(JSRuntime *rt, WeakMapVector &vector)
}
void
WeakMapBase::restoreWeakMapList(JSRuntime *rt, WeakMapVector &vector)
WeakMapBase::restoreCompartmentWeakMapLists(WeakMapVector &vector)
{
JS_ASSERT(!rt->gcWeakMapList);
for (WeakMapBase **p = vector.begin(); p != vector.end(); p++) {
WeakMapBase *m = *p;
JS_ASSERT(m->next == WeakMapNotInList);
m->next = rt->gcWeakMapList;
rt->gcWeakMapList = m;
JSCompartment *c = m->compartment;
m->next = c->gcWeakMapList;
c->gcWeakMapList = m;
}
}
void
WeakMapBase::removeWeakMapFromList(JSRuntime *rt, WeakMapBase *weakmap)
WeakMapBase::removeWeakMapFromList(WeakMapBase *weakmap)
{
for (WeakMapBase **p = &rt->gcWeakMapList; *p; p = &(*p)->next) {
JSCompartment *c = weakmap->compartment;
for (WeakMapBase **p = &c->gcWeakMapList; *p; p = &(*p)->next) {
if (*p == weakmap) {
*p = (*p)->next;
weakmap->next = WeakMapNotInList;