LibJS: GC should gather roots from all active interpreters

If we are in a nested execution context, we shouldn't only mark things
used by the active interpreter.
This commit is contained in:
Andreas Kling 2020-09-21 13:47:33 +02:00
parent 31bb107922
commit fbe2907510
Notes: sideshowbarker 2024-07-19 02:18:15 +09:00
5 changed files with 11 additions and 5 deletions

View file

@ -105,9 +105,7 @@ void Heap::collect_garbage(CollectionType collection_type, bool print_report)
void Heap::gather_roots(HashTable<Cell*>& roots)
{
if (auto* interpreter = vm().interpreter_if_exists())
interpreter->gather_roots({}, roots);
vm().gather_roots(roots);
gather_conservative_roots(roots);
for (auto* handle : m_handles)

View file

@ -223,7 +223,7 @@ Symbol* Interpreter::get_global_symbol(const String& description)
return new_global_symbol;
}
void Interpreter::gather_roots(Badge<Heap>, HashTable<Cell*>& roots)
void Interpreter::gather_roots(HashTable<Cell*>& roots)
{
roots.set(m_exception);

View file

@ -135,7 +135,7 @@ public:
Symbol* get_global_symbol(const String& description);
void gather_roots(Badge<Heap>, HashTable<Cell*>&);
void gather_roots(HashTable<Cell*>&);
void enter_scope(const ScopeNode&, ArgumentVector, ScopeType, GlobalObject&);
void exit_scope(const ScopeNode&);

View file

@ -82,4 +82,10 @@ VM::InterpreterScope::~InterpreterScope()
m_interpreter.vm().pop_interpreter(m_interpreter);
}
void VM::gather_roots(HashTable<Cell*>& roots)
{
for (auto* interpreter : m_interpreters)
interpreter->gather_roots(roots);
}
}

View file

@ -53,6 +53,8 @@ public:
Interpreter& m_interpreter;
};
void gather_roots(HashTable<Cell*>&);
private:
VM();