Browse Source

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.
Hendiadyoin1 2 năm trước cách đây
mục cha
commit
088dc1b24b

+ 1 - 2
Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp

@@ -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).

+ 4 - 16
Userland/Libraries/LibJS/Bytecode/Generator.h

@@ -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;
             };
         }