mirror of
https://github.com/RGBCube/serenity
synced 2025-07-23 10:07:40 +00:00
LibJS: Simplify Generator::perform_needed_unwinds
This does not need to cater to the needs of `break` and `continue anymore, which allows us to simplify it a bit.
This commit is contained in:
parent
d65488b80c
commit
088dc1b24b
2 changed files with 5 additions and 18 deletions
|
@ -2474,8 +2474,7 @@ static Bytecode::CodeGenerationErrorOr<ForInOfHeadEvaluationResult> for_in_of_he
|
|||
|
||||
// i. Return Completion Record { [[Type]]: break, [[Value]]: empty, [[Target]]: empty }.
|
||||
generator.switch_to_basic_block(nullish_block);
|
||||
generator.perform_needed_unwinds<Bytecode::Op::Jump>(true);
|
||||
generator.emit<Bytecode::Op::Jump>().set_targets(generator.nearest_breakable_scope(), {});
|
||||
generator.generate_break();
|
||||
|
||||
generator.switch_to_basic_block(continuation_block);
|
||||
// b. Let obj be ! ToObject(exprValue).
|
||||
|
|
|
@ -174,24 +174,16 @@ public:
|
|||
LeaveVariableEnvironment,
|
||||
};
|
||||
template<typename OpType>
|
||||
void perform_needed_unwinds(bool is_break_node = false)
|
||||
requires(OpType::IsTerminator)
|
||||
void perform_needed_unwinds()
|
||||
requires(OpType::IsTerminator && !IsSame<OpType, Op::Jump>)
|
||||
{
|
||||
Optional<BlockBoundaryType> boundary_to_stop_at;
|
||||
if constexpr (IsSame<OpType, Bytecode::Op::Return> || IsSame<OpType, Bytecode::Op::Yield>)
|
||||
VERIFY(!is_break_node);
|
||||
else if constexpr (IsSame<OpType, Bytecode::Op::Throw>)
|
||||
boundary_to_stop_at = BlockBoundaryType::Unwind;
|
||||
else
|
||||
boundary_to_stop_at = is_break_node ? BlockBoundaryType::Break : BlockBoundaryType::Continue;
|
||||
|
||||
for (size_t i = m_boundaries.size(); i > 0; --i) {
|
||||
auto boundary = m_boundaries[i - 1];
|
||||
if (boundary_to_stop_at.has_value() && boundary == *boundary_to_stop_at)
|
||||
break;
|
||||
using enum BlockBoundaryType;
|
||||
switch (boundary) {
|
||||
case Unwind:
|
||||
if constexpr (IsSame<OpType, Bytecode::Op::Throw>)
|
||||
return;
|
||||
emit<Bytecode::Op::LeaveUnwindContext>();
|
||||
break;
|
||||
case LeaveLexicalEnvironment:
|
||||
|
@ -204,10 +196,6 @@ public:
|
|||
case Continue:
|
||||
break;
|
||||
case ReturnToFinally:
|
||||
// FIXME: In the case of breaks/continues we need to tell the `finally` to break/continue
|
||||
// For now let's ignore the finally to avoid a crash
|
||||
if (IsSame<OpType, Bytecode::Op::Jump>)
|
||||
break;
|
||||
return;
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue