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:
parent
9fe38245b2
commit
c9eff35b96
1 changed files with 4 additions and 11 deletions
|
@ -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) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue