1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 08:37:45 +00:00

LibWasm: Simplify the return instruction execution code a bit

This commit is contained in:
Ali Mohammad Pur 2022-04-22 11:03:23 +04:30 committed by Ali Mohammad Pur
parent 846b2c8a99
commit 2c0716e314

View file

@ -461,18 +461,21 @@ void BytecodeInterpreter::interpret(Configuration& configuration, InstructionPoi
} }
case Instructions::return_.value(): { case Instructions::return_.value(): {
auto& frame = configuration.frame(); auto& frame = configuration.frame();
size_t end = configuration.stack().size() - frame.arity(); Checked checked_index { configuration.stack().size() };
size_t start = end; checked_index -= frame.arity();
for (; start + 1 > 0 && start < configuration.stack().size(); --start) { VERIFY(!checked_index.has_overflow());
auto& entry = configuration.stack().entries()[start];
if (entry.has<Frame>()) { auto index = checked_index.value();
// Leave the frame, _and_ its label. size_t i = 1;
start += 2; for (; i <= index; ++i) {
break; auto& entry = configuration.stack().entries()[index - i];
if (entry.has<Label>()) {
if (configuration.stack().entries()[index - i - 1].has<Frame>())
break;
} }
} }
configuration.stack().entries().remove(start, end - start); configuration.stack().entries().remove(index - i + 1, i - 1);
// Jump past the call/indirect instruction // Jump past the call/indirect instruction
configuration.ip() = configuration.frame().expression().instructions().size(); configuration.ip() = configuration.frame().expression().instructions().size();