1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-16 19:15:07 +00:00

LibJS: Use goto instead of bool will_jump in interpreter loop

This is honestly less spaghetti-ish.
This commit is contained in:
Andreas Kling 2023-09-26 16:45:55 +02:00
parent 9fe38245b2
commit c9eff35b96

View file

@ -164,11 +164,10 @@ ThrowCompletionOr<Value> Interpreter::run(SourceTextModule& module)
void Interpreter::run_bytecode() void Interpreter::run_bytecode()
{ {
for (;;) { for (;;) {
start:
auto pc = InstructionStreamIterator { m_current_block->instruction_stream(), m_current_executable }; auto pc = InstructionStreamIterator { m_current_block->instruction_stream(), m_current_executable };
TemporaryChange temp_change { m_pc, Optional<InstructionStreamIterator&>(pc) }; TemporaryChange temp_change { m_pc, Optional<InstructionStreamIterator&>(pc) };
// FIXME: This is getting kinda spaghetti-y
bool will_jump = false;
bool will_return = false; bool will_return = false;
bool will_yield = false; bool will_yield = false;
@ -189,8 +188,7 @@ void Interpreter::run_bytecode()
accumulator() = reg(Register::exception()); accumulator() = reg(Register::exception());
reg(Register::exception()) = {}; reg(Register::exception()) = {};
will_jump = true; goto start;
break;
} }
if (unwind_context.finalizer) { if (unwind_context.finalizer) {
m_current_block = unwind_context.finalizer; m_current_block = unwind_context.finalizer;
@ -199,8 +197,7 @@ void Interpreter::run_bytecode()
// handled by `catch`, we swallow it. // handled by `catch`, we swallow it.
if (!unwind_context.handler_called) if (!unwind_context.handler_called)
reg(Register::exception()) = {}; reg(Register::exception()) = {};
will_jump = true; goto start;
break;
} }
// An unwind context with no handler or finalizer? We have nowhere to jump, and continuing on will make us crash on the next `Call` to a non-native function if there's an exception! So let's crash here instead. // An unwind context with no handler or finalizer? We have nowhere to jump, and continuing on will make us crash on the next `Call` to a non-native function if there's an exception! So let's crash here instead.
// If you run into this, you probably forgot to remove the current unwind_context somewhere. // If you run into this, you probably forgot to remove the current unwind_context somewhere.
@ -208,8 +205,7 @@ void Interpreter::run_bytecode()
} }
if (m_pending_jump.has_value()) { if (m_pending_jump.has_value()) {
m_current_block = m_pending_jump.release_value(); m_current_block = m_pending_jump.release_value();
will_jump = true; goto start;
break;
} }
if (!reg(Register::return_value()).is_empty()) { if (!reg(Register::return_value()).is_empty()) {
will_return = true; will_return = true;
@ -224,9 +220,6 @@ void Interpreter::run_bytecode()
++pc; ++pc;
} }
if (will_jump)
continue;
if (!unwind_contexts().is_empty() && !will_yield) { if (!unwind_contexts().is_empty() && !will_yield) {
auto& unwind_context = unwind_contexts().last(); auto& unwind_context = unwind_contexts().last();
if (unwind_context.executable == m_current_executable && unwind_context.finalizer) { if (unwind_context.executable == m_current_executable && unwind_context.finalizer) {