1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 05:48:12 +00:00

LibJS: Implement generator functions (only in bytecode mode)

This commit is contained in:
Ali Mohammad Pur 2021-06-11 01:38:30 +04:30 committed by Andreas Kling
parent c53a86a3fe
commit 3234697eca
21 changed files with 407 additions and 34 deletions

View file

@ -35,7 +35,7 @@ Interpreter::~Interpreter()
s_current = nullptr;
}
Value Interpreter::run(Executable const& executable)
Value Interpreter::run(Executable const& executable, BasicBlock const* entry_point)
{
dbgln_if(JS_BYTECODE_DEBUG, "Bytecode::Interpreter will run unit {:p}", &executable);
@ -56,10 +56,14 @@ Value Interpreter::run(Executable const& executable)
VERIFY(!vm().exception());
}
auto block = &executable.basic_blocks.first();
m_register_windows.append(make<RegisterWindow>());
registers().resize(executable.number_of_registers);
registers()[Register::global_object_index] = Value(&global_object());
auto block = entry_point ?: &executable.basic_blocks.first();
if (m_manually_entered_frames) {
VERIFY(registers().size() >= executable.number_of_registers);
} else {
m_register_windows.append(make<RegisterWindow>());
registers().resize(executable.number_of_registers);
registers()[Register::global_object_index] = Value(&global_object());
}
for (;;) {
Bytecode::InstructionStreamIterator pc(block->instruction_stream());
@ -124,7 +128,8 @@ Value Interpreter::run(Executable const& executable)
vm().set_last_value(Badge<Interpreter> {}, accumulator());
m_register_windows.take_last();
if (!m_manually_entered_frames)
m_register_windows.take_last();
auto return_value = m_return_value.value_or(js_undefined());
m_return_value = {};