Parcourir la source

LibJS: Return early from Interpreter on unhandled exception

If we don't have a local unwind context to handle the exception, we can
just return right away. This allows us to remove one check from the
inner loop.
Andreas Kling il y a 1 an
Parent
commit
39cfb64269
1 fichiers modifiés avec 3 ajouts et 5 suppressions
  1. 3 5
      Userland/Libraries/LibJS/Bytecode/Interpreter.cpp

+ 3 - 5
Userland/Libraries/LibJS/Bytecode/Interpreter.cpp

@@ -173,14 +173,15 @@ void Interpreter::run_bytecode()
 
         while (!pc.at_end()) {
             auto& instruction = *pc;
+
             auto ran_or_error = instruction.execute(*this);
             if (ran_or_error.is_error()) [[unlikely]] {
                 reg(Register::exception()) = *ran_or_error.throw_completion().value();
                 if (unwind_contexts().is_empty())
-                    break;
+                    return;
                 auto& unwind_context = unwind_contexts().last();
                 if (unwind_context.executable != m_current_executable)
-                    break;
+                    return;
                 if (unwind_context.handler && !unwind_context.handler_called) {
                     vm().running_execution_context().lexical_environment = unwind_context.lexical_environment;
                     m_current_block = unwind_context.handler;
@@ -234,9 +235,6 @@ void Interpreter::run_bytecode()
         if (pc.at_end())
             break;
 
-        if (!reg(Register::exception()).is_empty())
-            break;
-
         if (will_return)
             break;
     }