mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 935903 - Unmark shared script data at start of GC r=billm
This commit is contained in:
parent
7067a85ea3
commit
874e3d93ec
@ -2912,6 +2912,9 @@ BeginMarkPhase(JSRuntime *rt)
|
||||
WeakMapBase::resetCompartmentWeakMapList(c);
|
||||
}
|
||||
|
||||
if (rt->gcIsFull)
|
||||
UnmarkScriptData(rt);
|
||||
|
||||
MarkRuntime(gcmarker);
|
||||
BufferGrayRoots(gcmarker);
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -1404,6 +1404,9 @@ typedef HashSet<SharedScriptData*,
|
||||
ScriptBytecodeHasher,
|
||||
SystemAllocPolicy> ScriptDataTable;
|
||||
|
||||
extern void
|
||||
UnmarkScriptData(JSRuntime *rt);
|
||||
|
||||
extern void
|
||||
SweepScriptData(JSRuntime *rt);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user