diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index 49aa9e640f..bdbd344963 100644 --- a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp +++ b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp @@ -2474,8 +2474,7 @@ static Bytecode::CodeGenerationErrorOr 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(true); - generator.emit().set_targets(generator.nearest_breakable_scope(), {}); + generator.generate_break(); generator.switch_to_basic_block(continuation_block); // b. Let obj be ! ToObject(exprValue). diff --git a/Userland/Libraries/LibJS/Bytecode/Generator.h b/Userland/Libraries/LibJS/Bytecode/Generator.h index 12bb4c9e6c..c56af24b01 100644 --- a/Userland/Libraries/LibJS/Bytecode/Generator.h +++ b/Userland/Libraries/LibJS/Bytecode/Generator.h @@ -174,24 +174,16 @@ public: LeaveVariableEnvironment, }; template - void perform_needed_unwinds(bool is_break_node = false) - requires(OpType::IsTerminator) + void perform_needed_unwinds() + requires(OpType::IsTerminator && !IsSame) { - Optional boundary_to_stop_at; - if constexpr (IsSame || IsSame) - VERIFY(!is_break_node); - else if constexpr (IsSame) - 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) + return; emit(); 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) - break; return; }; }