void js_TraceAtomState(JSTracer *trc) { JSRuntime *rt = trc->context->runtime; JSAtomState *state = &rt->atomState; #ifdef DEBUG size_t number = 0; #endif if (rt->gcKeepAtoms) { for (AtomSet::Range r = state->atoms.all(); !r.empty(); r.popFront()) { JS_SET_TRACING_INDEX(trc, "locked_atom", number++); MarkString(trc, r.front().asPtr()); } } else { for (AtomSet::Range r = state->atoms.all(); !r.empty(); r.popFront()) { AtomStateEntry entry = r.front(); if (!entry.isTagged()) continue; JS_SET_TRACING_INDEX(trc, "interned_atom", number++); MarkString(trc, entry.asPtr()); } } }
void js::MarkAtoms(JSTracer *trc) { JSRuntime *rt = trc->runtime; for (AtomSet::Range r = rt->atoms.all(); !r.empty(); r.popFront()) { AtomStateEntry entry = r.front(); if (!entry.isTagged()) continue; JSAtom *tmp = entry.asPtr(); MarkStringRoot(trc, &tmp, "interned_atom"); JS_ASSERT(tmp == entry.asPtr()); } }
void js::SweepAtoms(JSRuntime *rt) { for (AtomSet::Enum e(rt->atoms); !e.empty(); e.popFront()) { AtomStateEntry entry = e.front(); JSAtom *atom = entry.asPtr(); bool isDying = IsStringAboutToBeFinalized(&atom); /* Pinned or interned key cannot be finalized. */ JS_ASSERT_IF(entry.isTagged(), !isDying); if (isDying) e.removeFront(); } }
js_DumpAtoms(JSContext *cx, FILE *fp) { JSAtomState *state = &cx->runtime->atomState; fprintf(fp, "atoms table contents:\n"); unsigned number = 0; for (AtomSet::Range r = state->atoms.all(); !r.empty(); r.popFront()) { AtomStateEntry entry = r.front(); fprintf(fp, "%3u ", number++); JSAtom *key = entry.asPtr(); FileEscapedString(fp, key, '"'); if (entry.isTagged()) fputs(" interned", fp); putc('\n', fp); } putc('\n', fp); }
void js_SweepAtomState(JSContext *cx) { JSAtomState *state = &cx->runtime->atomState; for (AtomSet::Enum e(state->atoms); !e.empty(); e.popFront()) { AtomStateEntry entry = e.front(); if (entry.isTagged()) { /* Pinned or interned key cannot be finalized. */ JS_ASSERT(!IsAboutToBeFinalized(cx, entry.asPtr())); continue; } if (IsAboutToBeFinalized(cx, entry.asPtr())) e.removeFront(); } }
void JSRuntime::sweepAtoms() { if (!atoms_) return; for (AtomSet::Enum e(*atoms_); !e.empty(); e.popFront()) { AtomStateEntry entry = e.front(); JSAtom *atom = entry.asPtr(); bool isDying = IsStringAboutToBeFinalizedFromAnyThread(&atom); /* Pinned or interned key cannot be finalized. */ MOZ_ASSERT_IF(hasContexts() && entry.isTagged(), !isDying); if (isDying) e.removeFront(); } }
void js_TraceAtomState(JSTracer *trc) { JSRuntime *rt = trc->runtime; JSAtomState *state = &rt->atomState; if (rt->gcKeepAtoms) { for (AtomSet::Range r = state->atoms.all(); !r.empty(); r.popFront()) { MarkRoot(trc, r.front().asPtr(), "locked_atom"); } } else { for (AtomSet::Range r = state->atoms.all(); !r.empty(); r.popFront()) { AtomStateEntry entry = r.front(); if (!entry.isTagged()) continue; MarkRoot(trc, entry.asPtr(), "interned_atom"); } } }