ソースを参照

LibJS: Create lexical scope for "catch" on the spot when throwing

Andreas Kling 4 年 前
コミット
38268f1c53
1 ファイル変更6 行追加2 行削除
  1. 6 2
      Libraries/LibJS/AST.cpp

+ 6 - 2
Libraries/LibJS/AST.cpp

@@ -1901,8 +1901,12 @@ Value TryStatement::execute(Interpreter& interpreter, GlobalObject& global_objec
     if (auto* exception = interpreter.exception()) {
         if (m_handler) {
             interpreter.vm().clear_exception();
-            ArgumentVector arguments { { m_handler->parameter(), exception->value() } };
-            interpreter.execute_statement(global_object, m_handler->body(), move(arguments));
+
+            HashMap<FlyString, Variable> parameters;
+            parameters.set(m_handler->parameter(), Variable { exception->value(), DeclarationKind::Var });
+            auto* catch_scope = interpreter.heap().allocate<LexicalEnvironment>(global_object, move(parameters), interpreter.vm().call_frame().scope);
+            TemporaryChange<ScopeObject*> scope_change(interpreter.vm().call_frame().scope, catch_scope);
+            interpreter.execute_statement(global_object, m_handler->body());
         }
     }