Bug 935903 - Unmark shared script data at start of GC r=billm

This commit is contained in:
Jon Coppeard 2013-11-08 09:53:24 +00:00
parent 7067a85ea3
commit 874e3d93ec
3 changed files with 22 additions and 6 deletions

View File

@ -2912,6 +2912,9 @@ BeginMarkPhase(JSRuntime *rt)
WeakMapBase::resetCompartmentWeakMapList(c);
}
if (rt->gcIsFull)
UnmarkScriptData(rt);
MarkRuntime(gcmarker);
BufferGrayRoots(gcmarker);

View File

@ -1519,21 +1519,31 @@ MarkScriptData(JSRuntime *rt, const jsbytecode *bytecode)
SharedScriptData::fromBytecode(bytecode)->marked = true;
}
void
js::UnmarkScriptData(JSRuntime *rt)
{
JS_ASSERT(rt->gcIsFull);
ScriptDataTable &table = rt->scriptDataTable();
for (ScriptDataTable::Enum e(table); !e.empty(); e.popFront()) {
SharedScriptData *entry = e.front();
entry->marked = false;
}
}
void
js::SweepScriptData(JSRuntime *rt)
{
JS_ASSERT(rt->gcIsFull);
ScriptDataTable &table = rt->scriptDataTable();
bool keepAtoms = false;
for (ThreadDataIter iter(rt); !iter.done(); iter.next())
keepAtoms |= iter->gcKeepAtoms;
for (ThreadDataIter iter(rt); !iter.done(); iter.next()) {
if (iter->gcKeepAtoms)
return;
}
for (ScriptDataTable::Enum e(table); !e.empty(); e.popFront()) {
SharedScriptData *entry = e.front();
if (entry->marked) {
entry->marked = false;
} else if (!keepAtoms) {
if (!entry->marked) {
js_free(entry);
e.removeFront();
}

View File

@ -1404,6 +1404,9 @@ typedef HashSet<SharedScriptData*,
ScriptBytecodeHasher,
SystemAllocPolicy> ScriptDataTable;
extern void
UnmarkScriptData(JSRuntime *rt);
extern void
SweepScriptData(JSRuntime *rt);