From 5398dcc55e1b8279f6b3edf62ad249a27b4f2f64 Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Tue, 16 Aug 2022 19:28:17 +0100 Subject: [PATCH] LibJS: Remove GlobalObject from execute() and related AST functions This is a continuation of the previous four commits. Passing a global object here is largely redundant, we definitely need the interpreter but can get the VM and (later) current active realm from there - and also the global object while we still need it, although I'd like to remove Interpreter::global_object() in the future. This now matches the bytecode interpreter's execute_impl() functions. --- Userland/Libraries/LibJS/AST.cpp | 526 ++++++++++-------- Userland/Libraries/LibJS/AST.h | 190 +++---- Userland/Libraries/LibJS/Bytecode/Op.cpp | 2 +- Userland/Libraries/LibJS/Interpreter.cpp | 4 +- .../LibJS/Runtime/AbstractOperations.cpp | 2 +- .../Runtime/ECMAScriptFunctionObject.cpp | 6 +- .../Libraries/LibJS/Runtime/ShadowRealm.cpp | 6 +- Userland/Libraries/LibJS/Runtime/VM.cpp | 26 +- Userland/Libraries/LibJS/Runtime/VM.h | 2 +- Userland/Libraries/LibJS/SourceTextModule.cpp | 2 +- 10 files changed, 409 insertions(+), 357 deletions(-) diff --git a/Userland/Libraries/LibJS/AST.cpp b/Userland/Libraries/LibJS/AST.cpp index db1b8faeba..7044063c40 100644 --- a/Userland/Libraries/LibJS/AST.cpp +++ b/Userland/Libraries/LibJS/AST.cpp @@ -91,11 +91,11 @@ static ThrowCompletionOr get_function_property_name(PropertyKey key) // 14.2.2 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-block-runtime-semantics-evaluation // StatementList : StatementList StatementListItem -Completion ScopeNode::evaluate_statements(Interpreter& interpreter, GlobalObject& global_object) const +Completion ScopeNode::evaluate_statements(Interpreter& interpreter) const { auto completion = normal_completion({}); for (auto const& node : children()) { - completion = node.execute(interpreter, global_object).update_empty(completion.value()); + completion = node.execute(interpreter).update_empty(completion.value()); if (completion.is_abrupt()) break; } @@ -104,10 +104,10 @@ Completion ScopeNode::evaluate_statements(Interpreter& interpreter, GlobalObject // 14.13.4 Runtime Semantics: LabelledEvaluation, https://tc39.es/ecma262/#sec-runtime-semantics-labelledevaluation // BreakableStatement : IterationStatement -static Completion labelled_evaluation(Interpreter& interpreter, GlobalObject& global_object, IterationStatement const& statement, Vector const& label_set) +static Completion labelled_evaluation(Interpreter& interpreter, IterationStatement const& statement, Vector const& label_set) { // 1. Let stmtResult be Completion(LoopEvaluation of IterationStatement with argument labelSet). - auto result = statement.loop_evaluation(interpreter, global_object, label_set); + auto result = statement.loop_evaluation(interpreter, label_set); // 2. If stmtResult.[[Type]] is break, then if (result.type() == Completion::Type::Break) { @@ -125,10 +125,10 @@ static Completion labelled_evaluation(Interpreter& interpreter, GlobalObject& gl // 14.13.4 Runtime Semantics: LabelledEvaluation, https://tc39.es/ecma262/#sec-runtime-semantics-labelledevaluation // BreakableStatement : SwitchStatement -static Completion labelled_evaluation(Interpreter& interpreter, GlobalObject& global_object, SwitchStatement const& statement, Vector const&) +static Completion labelled_evaluation(Interpreter& interpreter, SwitchStatement const& statement, Vector const&) { // 1. Let stmtResult be the result of evaluating SwitchStatement. - auto result = statement.execute_impl(interpreter, global_object); + auto result = statement.execute_impl(interpreter); // 2. If stmtResult.[[Type]] is break, then if (result.type() == Completion::Type::Break) { @@ -146,7 +146,7 @@ static Completion labelled_evaluation(Interpreter& interpreter, GlobalObject& gl // 14.13.4 Runtime Semantics: LabelledEvaluation, https://tc39.es/ecma262/#sec-runtime-semantics-labelledevaluation // LabelledStatement : LabelIdentifier : LabelledItem -static Completion labelled_evaluation(Interpreter& interpreter, GlobalObject& global_object, LabelledStatement const& statement, Vector const& label_set) +static Completion labelled_evaluation(Interpreter& interpreter, LabelledStatement const& statement, Vector const& label_set) { auto const& labelled_item = *statement.labelled_item(); @@ -164,13 +164,13 @@ static Completion labelled_evaluation(Interpreter& interpreter, GlobalObject& gl // 3. Let stmtResult be Completion(LabelledEvaluation of LabelledItem with argument newLabelSet). Completion result; if (is(labelled_item)) - result = labelled_evaluation(interpreter, global_object, static_cast(labelled_item), *new_label_set); + result = labelled_evaluation(interpreter, static_cast(labelled_item), *new_label_set); else if (is(labelled_item)) - result = labelled_evaluation(interpreter, global_object, static_cast(labelled_item), *new_label_set); + result = labelled_evaluation(interpreter, static_cast(labelled_item), *new_label_set); else if (is(labelled_item)) - result = labelled_evaluation(interpreter, global_object, static_cast(labelled_item), *new_label_set); + result = labelled_evaluation(interpreter, static_cast(labelled_item), *new_label_set); else - result = labelled_item.execute(interpreter, global_object); + result = labelled_item.execute(interpreter); // 4. If stmtResult.[[Type]] is break and SameValue(stmtResult.[[Target]], label) is true, then if (result.type() == Completion::Type::Break && result.target() == label) { @@ -183,12 +183,12 @@ static Completion labelled_evaluation(Interpreter& interpreter, GlobalObject& gl } // 14.13.3 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-labelled-statements-runtime-semantics-evaluation -Completion LabelledStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion LabelledStatement::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; // 1. Return ? LabelledEvaluation of this LabelledStatement with argument « ». - return labelled_evaluation(interpreter, global_object, *this, {}); + return labelled_evaluation(interpreter, *this, {}); } void LabelledStatement::dump(int indent) const @@ -206,17 +206,17 @@ void LabelledStatement::dump(int indent) const } // 10.2.1.3 Runtime Semantics: EvaluateBody, https://tc39.es/ecma262/#sec-runtime-semantics-evaluatebody -Completion FunctionBody::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion FunctionBody::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; // Note: Scoping should have already been set up by whoever is calling this FunctionBody. // 1. Return ? EvaluateFunctionBody of FunctionBody with arguments functionObject and argumentsList. - return evaluate_statements(interpreter, global_object); + return evaluate_statements(interpreter); } // 14.2.2 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-block-runtime-semantics-evaluation -Completion BlockStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion BlockStatement::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; @@ -231,26 +231,27 @@ Completion BlockStatement::execute(Interpreter& interpreter, GlobalObject& globa if (has_lexical_declarations()) { old_environment = vm.running_execution_context().lexical_environment; auto* block_environment = new_declarative_environment(*old_environment); - block_declaration_instantiation(interpreter, global_object, block_environment); + block_declaration_instantiation(interpreter, block_environment); vm.running_execution_context().lexical_environment = block_environment; } else { restore_environment.disarm(); } - return evaluate_statements(interpreter, global_object); + return evaluate_statements(interpreter); } -Completion Program::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion Program::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; - return evaluate_statements(interpreter, global_object); + return evaluate_statements(interpreter); } // 15.2.6 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-function-definitions-runtime-semantics-evaluation -Completion FunctionDeclaration::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion FunctionDeclaration::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); if (m_is_hoisted) { // Perform special annexB steps see step 3 of: https://tc39.es/ecma262/#sec-web-compat-functiondeclarationinstantiation @@ -276,17 +277,18 @@ Completion FunctionDeclaration::execute(Interpreter& interpreter, GlobalObject& } // 15.2.6 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-function-definitions-runtime-semantics-evaluation -Completion FunctionExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion FunctionExpression::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; // 1. Return InstantiateOrdinaryFunctionExpression of FunctionExpression. - return instantiate_ordinary_function_expression(interpreter, global_object, name()); + return instantiate_ordinary_function_expression(interpreter, name()); } // 15.2.5 Runtime Semantics: InstantiateOrdinaryFunctionExpression, https://tc39.es/ecma262/#sec-runtime-semantics-instantiateordinaryfunctionexpression -Value FunctionExpression::instantiate_ordinary_function_expression(Interpreter& interpreter, GlobalObject& global_object, FlyString given_name) const +Value FunctionExpression::instantiate_ordinary_function_expression(Interpreter& interpreter, FlyString given_name) const { + auto& global_object = interpreter.global_object(); auto& realm = *global_object.associated_realm(); if (given_name.is_empty()) @@ -315,25 +317,26 @@ Value FunctionExpression::instantiate_ordinary_function_expression(Interpreter& } // 14.4.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-empty-statement-runtime-semantics-evaluation -Completion EmptyStatement::execute(Interpreter&, GlobalObject&) const +Completion EmptyStatement::execute(Interpreter&) const { // 1. Return empty. return Optional {}; } // 14.5.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-expression-statement-runtime-semantics-evaluation -Completion ExpressionStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion ExpressionStatement::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; // 1. Let exprRef be the result of evaluating Expression. // 2. Return ? GetValue(exprRef). - return m_expression->execute(interpreter, global_object); + return m_expression->execute(interpreter); } // TODO: This shouldn't exist. Refactor into EvaluateCall. -ThrowCompletionOr CallExpression::compute_this_and_callee(Interpreter& interpreter, GlobalObject& global_object, Reference const& callee_reference) const +ThrowCompletionOr CallExpression::compute_this_and_callee(Interpreter& interpreter, Reference const& callee_reference) const { + auto& global_object = interpreter.global_object(); if (callee_reference.is_property_reference()) { auto this_value = callee_reference.get_this_value(); auto callee = TRY(callee_reference.get_value(global_object)); @@ -351,18 +354,19 @@ ThrowCompletionOr CallExpression::compute_this_an return ThisAndCallee { this_value, callee_reference.is_unresolvable() - ? TRY(m_callee->execute(interpreter, global_object)).release_value() + ? TRY(m_callee->execute(interpreter)).release_value() : TRY(callee_reference.get_value(global_object)) }; } // 13.3.8.1 Runtime Semantics: ArgumentListEvaluation, https://tc39.es/ecma262/#sec-runtime-semantics-argumentlistevaluation -static ThrowCompletionOr argument_list_evaluation(Interpreter& interpreter, GlobalObject& global_object, Vector const& arguments, MarkedVector& list) +static ThrowCompletionOr argument_list_evaluation(Interpreter& interpreter, Vector const& arguments, MarkedVector& list) { + auto& global_object = interpreter.global_object(); list.ensure_capacity(arguments.size()); for (auto& argument : arguments) { - auto value = TRY(argument.value->execute(interpreter, global_object)).release_value(); + auto value = TRY(argument.value->execute(interpreter)).release_value(); if (argument.is_spread) { TRY(get_iterator_values(global_object, value, [&](Value iterator_value) -> Optional { list.append(iterator_value); @@ -377,32 +381,35 @@ static ThrowCompletionOr argument_list_evaluation(Interpreter& interpreter // 13.3.5.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-new-operator-runtime-semantics-evaluation // 13.3.5.1.1 EvaluateNew ( constructExpr, arguments ), https://tc39.es/ecma262/#sec-evaluatenew -Completion NewExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion NewExpression::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); auto& vm = interpreter.vm(); // 1. Let ref be the result of evaluating constructExpr. // 2. Let constructor be ? GetValue(ref). - auto constructor = TRY(m_callee->execute(interpreter, global_object)).release_value(); + auto constructor = TRY(m_callee->execute(interpreter)).release_value(); // 3. If arguments is empty, let argList be a new empty List. // 4. Else, // a. Let argList be ? ArgumentListEvaluation of arguments. MarkedVector arg_list(vm.heap()); - TRY(argument_list_evaluation(interpreter, global_object, m_arguments, arg_list)); + TRY(argument_list_evaluation(interpreter, m_arguments, arg_list)); // 5. If IsConstructor(constructor) is false, throw a TypeError exception. if (!constructor.is_constructor()) - return throw_type_error_for_callee(interpreter, global_object, constructor, "constructor"sv); + return throw_type_error_for_callee(interpreter, constructor, "constructor"sv); // 6. Return ? Construct(constructor, argList). return Value { TRY(construct(global_object, constructor.as_function(), move(arg_list))) }; } -Completion CallExpression::throw_type_error_for_callee(Interpreter& interpreter, GlobalObject& global_object, Value callee_value, StringView call_type) const +Completion CallExpression::throw_type_error_for_callee(Interpreter& interpreter, Value callee_value, StringView call_type) const { + auto& global_object = interpreter.global_object(); auto& vm = interpreter.vm(); + if (is(*m_callee) || is(*m_callee)) { String expression_string; if (is(*m_callee)) { @@ -417,21 +424,23 @@ Completion CallExpression::throw_type_error_for_callee(Interpreter& interpreter, } // 13.3.6.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-function-calls-runtime-semantics-evaluation -Completion CallExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion CallExpression::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); auto& vm = interpreter.vm(); - auto callee_reference = TRY(m_callee->to_reference(interpreter, global_object)); - auto [this_value, callee] = TRY(compute_this_and_callee(interpreter, global_object, callee_reference)); + auto callee_reference = TRY(m_callee->to_reference(interpreter)); + + auto [this_value, callee] = TRY(compute_this_and_callee(interpreter, callee_reference)); VERIFY(!callee.is_empty()); MarkedVector arg_list(vm.heap()); - TRY(argument_list_evaluation(interpreter, global_object, m_arguments, arg_list)); + TRY(argument_list_evaluation(interpreter, m_arguments, arg_list)); if (!callee.is_function()) - return throw_type_error_for_callee(interpreter, global_object, callee, "function"sv); + return throw_type_error_for_callee(interpreter, callee, "function"sv); auto& function = callee.as_function(); @@ -449,9 +458,10 @@ Completion CallExpression::execute(Interpreter& interpreter, GlobalObject& globa // 13.3.7.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-super-keyword-runtime-semantics-evaluation // SuperCall : super Arguments -Completion SuperCall::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion SuperCall::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); auto& vm = interpreter.vm(); // 1. Let newTarget be GetNewTarget(). @@ -471,7 +481,7 @@ Completion SuperCall::execute(Interpreter& interpreter, GlobalObject& global_obj VERIFY(m_arguments.size() == 1); VERIFY(m_arguments[0].is_spread); auto const& argument = m_arguments[0]; - auto value = MUST(argument.value->execute(interpreter, global_object)).release_value(); + auto value = MUST(argument.value->execute(interpreter)).release_value(); VERIFY(value.is_object() && is(value.as_object())); auto& array_value = static_cast(value.as_object()); @@ -479,7 +489,7 @@ Completion SuperCall::execute(Interpreter& interpreter, GlobalObject& global_obj for (size_t i = 0; i < length; ++i) arg_list.append(array_value.get_without_side_effects(PropertyKey { i })); } else { - TRY(argument_list_evaluation(interpreter, global_object, m_arguments, arg_list)); + TRY(argument_list_evaluation(interpreter, m_arguments, arg_list)); } // 5. If IsConstructor(func) is false, throw a TypeError exception. @@ -508,27 +518,28 @@ Completion SuperCall::execute(Interpreter& interpreter, GlobalObject& global_obj } // 15.5.5 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-generator-function-definitions-runtime-semantics-evaluation -Completion YieldExpression::execute(Interpreter&, GlobalObject&) const +Completion YieldExpression::execute(Interpreter&) const { // This should be transformed to a return. VERIFY_NOT_REACHED(); } // 15.8.5 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-async-function-definitions-runtime-semantics-evaluation -Completion AwaitExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion AwaitExpression::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); // 1. Let exprRef be the result of evaluating UnaryExpression. // 2. Let value be ? GetValue(exprRef). - auto value = TRY(m_argument->execute(interpreter, global_object)).release_value(); + auto value = TRY(m_argument->execute(interpreter)).release_value(); // 3. Return ? Await(value). return await(global_object, value); } // 14.10.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-return-statement-runtime-semantics-evaluation -Completion ReturnStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion ReturnStatement::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; @@ -541,7 +552,7 @@ Completion ReturnStatement::execute(Interpreter& interpreter, GlobalObject& glob // ReturnStatement : return Expression ; // 1. Let exprRef be the result of evaluating Expression. // 2. Let exprValue be ? GetValue(exprRef). - auto value = TRY(m_argument->execute(interpreter, global_object)); + auto value = TRY(m_argument->execute(interpreter)); // NOTE: Generators are not supported in the AST interpreter // 3. If GetGeneratorKind() is async, set exprValue to ? Await(exprValue). @@ -551,27 +562,27 @@ Completion ReturnStatement::execute(Interpreter& interpreter, GlobalObject& glob } // 14.6.2 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-if-statement-runtime-semantics-evaluation -Completion IfStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion IfStatement::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; // IfStatement : if ( Expression ) Statement else Statement // 1. Let exprRef be the result of evaluating Expression. // 2. Let exprValue be ToBoolean(? GetValue(exprRef)). - auto predicate_result = TRY(m_predicate->execute(interpreter, global_object)).release_value(); + auto predicate_result = TRY(m_predicate->execute(interpreter)).release_value(); // 3. If exprValue is true, then if (predicate_result.to_boolean()) { // a. Let stmtCompletion be the result of evaluating the first Statement. // 5. Return ? UpdateEmpty(stmtCompletion, undefined). - return m_consequent->execute(interpreter, global_object).update_empty(js_undefined()); + return m_consequent->execute(interpreter).update_empty(js_undefined()); } // 4. Else, if (m_alternate) { // a. Let stmtCompletion be the result of evaluating the second Statement. // 5. Return ? UpdateEmpty(stmtCompletion, undefined). - return m_alternate->execute(interpreter, global_object).update_empty(js_undefined()); + return m_alternate->execute(interpreter).update_empty(js_undefined()); } // IfStatement : if ( Expression ) Statement @@ -582,12 +593,13 @@ Completion IfStatement::execute(Interpreter& interpreter, GlobalObject& global_o // 14.11.2 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-with-statement-runtime-semantics-evaluation // WithStatement : with ( Expression ) Statement -Completion WithStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion WithStatement::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); // 1. Let value be the result of evaluating Expression. - auto value = TRY(m_object->execute(interpreter, global_object)).release_value(); + auto value = TRY(m_object->execute(interpreter)).release_value(); // 2. Let obj be ? ToObject(? GetValue(value)). auto* object = TRY(value.to_object(global_object)); @@ -602,7 +614,7 @@ Completion WithStatement::execute(Interpreter& interpreter, GlobalObject& global interpreter.vm().running_execution_context().lexical_environment = new_environment; // 6. Let C be the result of evaluating Statement. - auto result = m_body->execute(interpreter, global_object); + auto result = m_body->execute(interpreter); // 7. Set the running execution context's LexicalEnvironment to oldEnv. interpreter.vm().running_execution_context().lexical_environment = old_environment; @@ -636,15 +648,15 @@ static bool loop_continues(Completion const& completion, Vector const // 14.1.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-statement-semantics-runtime-semantics-evaluation // BreakableStatement : IterationStatement -Completion WhileStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion WhileStatement::execute(Interpreter& interpreter) const { // 1. Let newLabelSet be a new empty List. // 2. Return ? LabelledEvaluation of this BreakableStatement with argument newLabelSet. - return labelled_evaluation(interpreter, global_object, *this, {}); + return labelled_evaluation(interpreter, *this, {}); } // 14.7.3.2 Runtime Semantics: WhileLoopEvaluation, https://tc39.es/ecma262/#sec-runtime-semantics-whileloopevaluation -Completion WhileStatement::loop_evaluation(Interpreter& interpreter, GlobalObject& global_object, Vector const& label_set) const +Completion WhileStatement::loop_evaluation(Interpreter& interpreter, Vector const& label_set) const { InterpreterNodeScope node_scope { interpreter, *this }; @@ -655,14 +667,14 @@ Completion WhileStatement::loop_evaluation(Interpreter& interpreter, GlobalObjec for (;;) { // a. Let exprRef be the result of evaluating Expression. // b. Let exprValue be ? GetValue(exprRef). - auto test_result = TRY(m_test->execute(interpreter, global_object)).release_value(); + auto test_result = TRY(m_test->execute(interpreter)).release_value(); // c. If ToBoolean(exprValue) is false, return V. if (!test_result.to_boolean()) return last_value; // d. Let stmtResult be the result of evaluating Statement. - auto body_result = m_body->execute(interpreter, global_object); + auto body_result = m_body->execute(interpreter); // e. If LoopContinues(stmtResult, labelSet) is false, return ? UpdateEmpty(stmtResult, V). if (!loop_continues(body_result, label_set)) @@ -678,15 +690,15 @@ Completion WhileStatement::loop_evaluation(Interpreter& interpreter, GlobalObjec // 14.1.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-statement-semantics-runtime-semantics-evaluation // BreakableStatement : IterationStatement -Completion DoWhileStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion DoWhileStatement::execute(Interpreter& interpreter) const { // 1. Let newLabelSet be a new empty List. // 2. Return ? LabelledEvaluation of this BreakableStatement with argument newLabelSet. - return labelled_evaluation(interpreter, global_object, *this, {}); + return labelled_evaluation(interpreter, *this, {}); } // 14.7.2.2 Runtime Semantics: DoWhileLoopEvaluation, https://tc39.es/ecma262/#sec-runtime-semantics-dowhileloopevaluation -Completion DoWhileStatement::loop_evaluation(Interpreter& interpreter, GlobalObject& global_object, Vector const& label_set) const +Completion DoWhileStatement::loop_evaluation(Interpreter& interpreter, Vector const& label_set) const { InterpreterNodeScope node_scope { interpreter, *this }; @@ -696,7 +708,7 @@ Completion DoWhileStatement::loop_evaluation(Interpreter& interpreter, GlobalObj // 2. Repeat, for (;;) { // a. Let stmtResult be the result of evaluating Statement. - auto body_result = m_body->execute(interpreter, global_object); + auto body_result = m_body->execute(interpreter); // b. If LoopContinues(stmtResult, labelSet) is false, return ? UpdateEmpty(stmtResult, V). if (!loop_continues(body_result, label_set)) @@ -708,7 +720,7 @@ Completion DoWhileStatement::loop_evaluation(Interpreter& interpreter, GlobalObj // d. Let exprRef be the result of evaluating Expression. // e. Let exprValue be ? GetValue(exprRef). - auto test_result = TRY(m_test->execute(interpreter, global_object)).release_value(); + auto test_result = TRY(m_test->execute(interpreter)).release_value(); // f. If ToBoolean(exprValue) is false, return V. if (!test_result.to_boolean()) @@ -720,17 +732,18 @@ Completion DoWhileStatement::loop_evaluation(Interpreter& interpreter, GlobalObj // 14.1.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-statement-semantics-runtime-semantics-evaluation // BreakableStatement : IterationStatement -Completion ForStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion ForStatement::execute(Interpreter& interpreter) const { // 1. Let newLabelSet be a new empty List. // 2. Return ? LabelledEvaluation of this BreakableStatement with argument newLabelSet. - return labelled_evaluation(interpreter, global_object, *this, {}); + return labelled_evaluation(interpreter, *this, {}); } // 14.7.4.2 Runtime Semantics: ForLoopEvaluation, https://tc39.es/ecma262/#sec-runtime-semantics-forloopevaluation -Completion ForStatement::loop_evaluation(Interpreter& interpreter, GlobalObject& global_object, Vector const& label_set) const +Completion ForStatement::loop_evaluation(Interpreter& interpreter, Vector const& label_set) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); // Note we don't always set a new environment but to use RAII we must do this here. auto* old_environment = interpreter.lexical_environment(); @@ -756,7 +769,7 @@ Completion ForStatement::loop_evaluation(Interpreter& interpreter, GlobalObject& interpreter.vm().running_execution_context().lexical_environment = loop_environment; } - (void)TRY(m_init->execute(interpreter, global_object)); + (void)TRY(m_init->execute(interpreter)); } // 14.7.4.4 CreatePerIterationEnvironment ( perIterationBindings ), https://tc39.es/ecma262/#sec-createperiterationenvironment @@ -807,7 +820,7 @@ Completion ForStatement::loop_evaluation(Interpreter& interpreter, GlobalObject& if (m_test) { // i. Let testRef be the result of evaluating test. // ii. Let testValue be ? GetValue(testRef). - auto test_value = TRY(m_test->execute(interpreter, global_object)).release_value(); + auto test_value = TRY(m_test->execute(interpreter)).release_value(); // iii. If ToBoolean(testValue) is false, return V. if (!test_value.to_boolean()) @@ -815,7 +828,7 @@ Completion ForStatement::loop_evaluation(Interpreter& interpreter, GlobalObject& } // b. Let result be the result of evaluating stmt. - auto result = m_body->execute(interpreter, global_object); + auto result = m_body->execute(interpreter); // c. If LoopContinues(result, labelSet) is false, return ? UpdateEmpty(result, V). if (!loop_continues(result, label_set)) @@ -832,7 +845,7 @@ Completion ForStatement::loop_evaluation(Interpreter& interpreter, GlobalObject& if (m_update) { // i. Let incRef be the result of evaluating increment. // ii. Perform ? GetValue(incRef). - (void)TRY(m_update->execute(interpreter, global_object)); + (void)TRY(m_update->execute(interpreter)); } } @@ -867,10 +880,12 @@ struct ForInOfHeadState { // 14.7.5.7 ForIn/OfBodyEvaluation ( lhs, stmt, iteratorRecord, iterationKind, lhsKind, labelSet [ , iteratorKind ] ), https://tc39.es/ecma262/#sec-runtime-semantics-forin-div-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset // Note: This is only steps 6.g through 6.j of the method because we currently implement for-in without an iterator so to prevent duplicated code we do this part here. - ThrowCompletionOr execute_head(Interpreter& interpreter, GlobalObject& global_object, Value next_value) const + ThrowCompletionOr execute_head(Interpreter& interpreter, Value next_value) const { VERIFY(!next_value.is_empty()); + auto& global_object = interpreter.global_object(); + Optional lhs_reference; Environment* iteration_environment = nullptr; @@ -881,11 +896,11 @@ struct ForInOfHeadState { if (is(*expression_lhs)) { auto& declaration = static_cast(*expression_lhs); VERIFY(declaration.declarations().first().target().has>()); - lhs_reference = TRY(declaration.declarations().first().target().get>()->to_reference(interpreter, global_object)); + lhs_reference = TRY(declaration.declarations().first().target().get>()->to_reference(interpreter)); } else { VERIFY(is(*expression_lhs) || is(*expression_lhs) || is(*expression_lhs)); auto& expression = static_cast(*expression_lhs); - lhs_reference = TRY(expression.to_reference(interpreter, global_object)); + lhs_reference = TRY(expression.to_reference(interpreter)); } } } @@ -937,8 +952,9 @@ struct ForInOfHeadState { // 14.7.5.6 ForIn/OfHeadEvaluation ( uninitializedBoundNames, expr, iterationKind ), https://tc39.es/ecma262/#sec-runtime-semantics-forinofheadevaluation // This method combines ForInOfLoopEvaluation and ForIn/OfHeadEvaluation for similar reason as ForIn/OfBodyEvaluation, to prevent code duplication. // For the same reason we also skip step 6 and 7 of ForIn/OfHeadEvaluation as this is done by the appropriate for loop type. -static ThrowCompletionOr for_in_of_head_execute(Interpreter& interpreter, GlobalObject& global_object, Variant, NonnullRefPtr> lhs, Expression const& rhs) +static ThrowCompletionOr for_in_of_head_execute(Interpreter& interpreter, Variant, NonnullRefPtr> lhs, Expression const& rhs) { + auto& global_object = interpreter.global_object(); ForInOfHeadState state(lhs); if (auto* ast_ptr = lhs.get_pointer>(); ast_ptr && is(*(*ast_ptr))) { // Runtime Semantics: ForInOfLoopEvaluation, for any of: @@ -961,7 +977,7 @@ static ThrowCompletionOr for_in_of_head_execute(Interpreter& i VERIFY(variable.target().has>()); auto& binding_id = variable.target().get>()->string(); auto reference = TRY(interpreter.vm().resolve_binding(binding_id)); - auto result = TRY(interpreter.vm().named_evaluation_if_anonymous_function(global_object, *variable.init(), binding_id)); + auto result = TRY(interpreter.vm().named_evaluation_if_anonymous_function(*variable.init(), binding_id)); TRY(reference.put_value(global_object, result)); } } else { @@ -978,7 +994,7 @@ static ThrowCompletionOr for_in_of_head_execute(Interpreter& i // 3. Let exprRef be the result of evaluating expr. // 5. Let exprValue be ? GetValue(exprRef). - state.rhs_value = TRY(rhs.execute(interpreter, global_object)).release_value(); + state.rhs_value = TRY(rhs.execute(interpreter)).release_value(); // Note that since a reference stores its environment it doesn't matter we only reset // this after step 5. (Also we have no way of separating these steps at this point) @@ -986,7 +1002,7 @@ static ThrowCompletionOr for_in_of_head_execute(Interpreter& i } else { // 3. Let exprRef be the result of evaluating expr. // 5. Let exprValue be ? GetValue(exprRef). - state.rhs_value = TRY(rhs.execute(interpreter, global_object)).release_value(); + state.rhs_value = TRY(rhs.execute(interpreter)).release_value(); } return state; @@ -1001,25 +1017,26 @@ static ThrowCompletionOr for_in_of_head_execute(Interpreter& i // We can skip step 1, 2 and 4 here (on top of already skipping step 6 and 7). // 3. Let exprRef be the result of evaluating expr. // 5. Let exprValue be ? GetValue(exprRef). - state.rhs_value = TRY(rhs.execute(interpreter, global_object)).release_value(); + state.rhs_value = TRY(rhs.execute(interpreter)).release_value(); return state; } // 14.1.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-statement-semantics-runtime-semantics-evaluation // BreakableStatement : IterationStatement -Completion ForInStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion ForInStatement::execute(Interpreter& interpreter) const { // 1. Let newLabelSet be a new empty List. // 2. Return ? LabelledEvaluation of this BreakableStatement with argument newLabelSet. - return labelled_evaluation(interpreter, global_object, *this, {}); + return labelled_evaluation(interpreter, *this, {}); } // 14.7.5.5 Runtime Semantics: ForInOfLoopEvaluation, https://tc39.es/ecma262/#sec-runtime-semantics-forinofloopevaluation -Completion ForInStatement::loop_evaluation(Interpreter& interpreter, GlobalObject& global_object, Vector const& label_set) const +Completion ForInStatement::loop_evaluation(Interpreter& interpreter, Vector const& label_set) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); - auto for_in_head_state = TRY(for_in_of_head_execute(interpreter, global_object, m_lhs, *m_rhs)); + auto for_in_head_state = TRY(for_in_of_head_execute(interpreter, m_lhs, *m_rhs)); auto rhs_result = for_in_head_state.rhs_value; @@ -1046,10 +1063,10 @@ Completion ForInStatement::loop_evaluation(Interpreter& interpreter, GlobalObjec auto last_value = js_undefined(); auto result = object->enumerate_object_properties([&](auto value) -> Optional { - TRY(for_in_head_state.execute_head(interpreter, global_object, value)); + TRY(for_in_head_state.execute_head(interpreter, value)); // l. Let result be the result of evaluating stmt. - auto result = m_body->execute(interpreter, global_object); + auto result = m_body->execute(interpreter); // m. Set the running execution context's LexicalEnvironment to oldEnv. interpreter.vm().running_execution_context().lexical_environment = old_environment; @@ -1072,19 +1089,20 @@ Completion ForInStatement::loop_evaluation(Interpreter& interpreter, GlobalObjec // 14.1.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-statement-semantics-runtime-semantics-evaluation // BreakableStatement : IterationStatement -Completion ForOfStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion ForOfStatement::execute(Interpreter& interpreter) const { // 1. Let newLabelSet be a new empty List. // 2. Return ? LabelledEvaluation of this BreakableStatement with argument newLabelSet. - return labelled_evaluation(interpreter, global_object, *this, {}); + return labelled_evaluation(interpreter, *this, {}); } // 14.7.5.5 Runtime Semantics: ForInOfLoopEvaluation, https://tc39.es/ecma262/#sec-runtime-semantics-forinofloopevaluation -Completion ForOfStatement::loop_evaluation(Interpreter& interpreter, GlobalObject& global_object, Vector const& label_set) const +Completion ForOfStatement::loop_evaluation(Interpreter& interpreter, Vector const& label_set) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); - auto for_of_head_state = TRY(for_in_of_head_execute(interpreter, global_object, m_lhs, m_rhs)); + auto for_of_head_state = TRY(for_in_of_head_execute(interpreter, m_lhs, m_rhs)); auto rhs_result = for_of_head_state.rhs_value; @@ -1103,10 +1121,10 @@ Completion ForOfStatement::loop_evaluation(Interpreter& interpreter, GlobalObjec Optional status; (void)TRY(get_iterator_values(global_object, rhs_result, [&](Value value) -> Optional { - TRY(for_of_head_state.execute_head(interpreter, global_object, value)); + TRY(for_of_head_state.execute_head(interpreter, value)); // l. Let result be the result of evaluating stmt. - auto result = m_body->execute(interpreter, global_object); + auto result = m_body->execute(interpreter); // m. Set the running execution context's LexicalEnvironment to oldEnv. interpreter.vm().running_execution_context().lexical_environment = old_environment; @@ -1135,21 +1153,22 @@ Completion ForOfStatement::loop_evaluation(Interpreter& interpreter, GlobalObjec // 14.1.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-statement-semantics-runtime-semantics-evaluation // BreakableStatement : IterationStatement -Completion ForAwaitOfStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion ForAwaitOfStatement::execute(Interpreter& interpreter) const { // 1. Let newLabelSet be a new empty List. // 2. Return ? LabelledEvaluation of this BreakableStatement with argument newLabelSet. - return labelled_evaluation(interpreter, global_object, *this, {}); + return labelled_evaluation(interpreter, *this, {}); } // 14.7.5.5 Runtime Semantics: ForInOfLoopEvaluation, https://tc39.es/ecma262/#sec-runtime-semantics-forinofloopevaluation -Completion ForAwaitOfStatement::loop_evaluation(Interpreter& interpreter, GlobalObject& global_object, Vector const& label_set) const +Completion ForAwaitOfStatement::loop_evaluation(Interpreter& interpreter, Vector const& label_set) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); // 14.7.5.6 ForIn/OfHeadEvaluation ( uninitializedBoundNames, expr, iterationKind ), https://tc39.es/ecma262/#sec-runtime-semantics-forinofheadevaluation // Note: Performs only steps 1 through 5. - auto for_of_head_state = TRY(for_in_of_head_execute(interpreter, global_object, m_lhs, m_rhs)); + auto for_of_head_state = TRY(for_in_of_head_execute(interpreter, m_lhs, m_rhs)); auto rhs_result = for_of_head_state.rhs_value; @@ -1195,10 +1214,10 @@ Completion ForAwaitOfStatement::loop_evaluation(Interpreter& interpreter, Global auto next_value = TRY(iterator_value(global_object, next_result.as_object())); // NOTE: This performs steps g. through to k. - TRY(for_of_head_state.execute_head(interpreter, global_object, next_value)); + TRY(for_of_head_state.execute_head(interpreter, next_value)); // l. Let result be the result of evaluating stmt. - auto result = m_body->execute(interpreter, global_object); + auto result = m_body->execute(interpreter); // m. Set the running execution context's LexicalEnvironment to oldEnv. interpreter.vm().running_execution_context().lexical_environment = old_environment; @@ -1229,16 +1248,17 @@ Completion ForAwaitOfStatement::loop_evaluation(Interpreter& interpreter, Global // 13.9.3.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-unsigned-right-shift-operator-runtime-semantics-evaluation // 13.10.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-relational-operators-runtime-semantics-evaluation // 13.11.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-equality-operators-runtime-semantics-evaluation -Completion BinaryExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion BinaryExpression::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); // Special case in which we cannot execute the lhs. RelationalExpression : PrivateIdentifier in ShiftExpression // RelationalExpression : PrivateIdentifier in ShiftExpression, https://tc39.es/ecma262/#sec-relational-operators-runtime-semantics-evaluation if (m_op == BinaryOp::In && is(*m_lhs)) { auto& private_identifier = static_cast(*m_lhs).string(); - auto rhs_result = TRY(m_rhs->execute(interpreter, global_object)).release_value(); + auto rhs_result = TRY(m_rhs->execute(interpreter)).release_value(); if (!rhs_result.is_object()) return interpreter.vm().throw_completion(global_object, ErrorType::InOperatorWithObject); auto* private_environment = interpreter.vm().running_execution_context().private_environment; @@ -1247,8 +1267,8 @@ Completion BinaryExpression::execute(Interpreter& interpreter, GlobalObject& glo return Value(rhs_result.as_object().private_element_find(private_name) != nullptr); } - auto lhs_result = TRY(m_lhs->execute(interpreter, global_object)).release_value(); - auto rhs_result = TRY(m_rhs->execute(interpreter, global_object)).release_value(); + auto lhs_result = TRY(m_lhs->execute(interpreter)).release_value(); + auto rhs_result = TRY(m_rhs->execute(interpreter)).release_value(); switch (m_op) { case BinaryOp::Addition: @@ -1301,13 +1321,13 @@ Completion BinaryExpression::execute(Interpreter& interpreter, GlobalObject& glo } // 13.13.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-binary-logical-operators-runtime-semantics-evaluation -Completion LogicalExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion LogicalExpression::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; // 1. Let lref be the result of evaluating . // 2. Let lval be ? GetValue(lref). - auto lhs_result = TRY(m_lhs->execute(interpreter, global_object)).release_value(); + auto lhs_result = TRY(m_lhs->execute(interpreter)).release_value(); switch (m_op) { // LogicalANDExpression : LogicalANDExpression && BitwiseORExpression @@ -1319,7 +1339,7 @@ Completion LogicalExpression::execute(Interpreter& interpreter, GlobalObject& gl // 5. Let rref be the result of evaluating BitwiseORExpression. // 6. Return ? GetValue(rref). - return m_rhs->execute(interpreter, global_object); + return m_rhs->execute(interpreter); // LogicalORExpression : LogicalORExpression || LogicalANDExpression case LogicalOp::Or: @@ -1330,7 +1350,7 @@ Completion LogicalExpression::execute(Interpreter& interpreter, GlobalObject& gl // 5. Let rref be the result of evaluating LogicalANDExpression. // 6. Return ? GetValue(rref). - return m_rhs->execute(interpreter, global_object); + return m_rhs->execute(interpreter); // CoalesceExpression : CoalesceExpressionHead ?? BitwiseORExpression case LogicalOp::NullishCoalescing: @@ -1338,7 +1358,7 @@ Completion LogicalExpression::execute(Interpreter& interpreter, GlobalObject& gl if (lhs_result.is_nullish()) { // a. Let rref be the result of evaluating BitwiseORExpression. // b. Return ? GetValue(rref). - return m_rhs->execute(interpreter, global_object); + return m_rhs->execute(interpreter); } // 4. Otherwise, return lval. @@ -1348,12 +1368,12 @@ Completion LogicalExpression::execute(Interpreter& interpreter, GlobalObject& gl VERIFY_NOT_REACHED(); } -ThrowCompletionOr Expression::to_reference(Interpreter&, GlobalObject&) const +ThrowCompletionOr Expression::to_reference(Interpreter&) const { return Reference {}; } -ThrowCompletionOr Identifier::to_reference(Interpreter& interpreter, GlobalObject&) const +ThrowCompletionOr Identifier::to_reference(Interpreter& interpreter) const { if (m_cached_environment_coordinate.has_value()) { auto* environment = interpreter.vm().running_execution_context().lexical_environment; @@ -1373,8 +1393,10 @@ ThrowCompletionOr Identifier::to_reference(Interpreter& interpreter, return reference; } -ThrowCompletionOr MemberExpression::to_reference(Interpreter& interpreter, GlobalObject& global_object) const +ThrowCompletionOr MemberExpression::to_reference(Interpreter& interpreter) const { + auto& global_object = interpreter.global_object(); + // 13.3.7.1 Runtime Semantics: Evaluation // SuperProperty : super [ Expression ] // SuperProperty : super . IdentifierName @@ -1392,7 +1414,7 @@ ThrowCompletionOr MemberExpression::to_reference(Interpreter& interpr // 3. Let propertyNameReference be the result of evaluating Expression. // 4. Let propertyNameValue be ? GetValue(propertyNameReference). - auto property_name_value = TRY(m_property->execute(interpreter, global_object)).release_value(); + auto property_name_value = TRY(m_property->execute(interpreter)).release_value(); // 5. Let propertyKey be ? ToPropertyKey(propertyNameValue). property_key = TRY(property_name_value.to_property_key(global_object)); @@ -1411,14 +1433,14 @@ ThrowCompletionOr MemberExpression::to_reference(Interpreter& interpr return TRY(make_super_property_reference(global_object, actual_this, property_key, strict)); } - auto base_reference = TRY(m_object->to_reference(interpreter, global_object)); + auto base_reference = TRY(m_object->to_reference(interpreter)); Value base_value; if (base_reference.is_valid_reference()) base_value = TRY(base_reference.get_value(global_object)); else - base_value = TRY(m_object->execute(interpreter, global_object)).release_value(); + base_value = TRY(m_object->execute(interpreter)).release_value(); VERIFY(!base_value.is_empty()); @@ -1427,7 +1449,7 @@ ThrowCompletionOr MemberExpression::to_reference(Interpreter& interpr PropertyKey property_key; if (is_computed()) { // Weird order which I can't quite find from the specs. - auto value = TRY(m_property->execute(interpreter, global_object)).release_value(); + auto value = TRY(m_property->execute(interpreter)).release_value(); VERIFY(!value.is_empty()); TRY(require_object_coercible(global_object, base_value)); @@ -1454,19 +1476,20 @@ ThrowCompletionOr MemberExpression::to_reference(Interpreter& interpr // 13.5.5.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-unary-minus-operator-runtime-semantics-evaluation // 13.5.6.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-bitwise-not-operator-runtime-semantics-evaluation // 13.5.7.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-logical-not-operator-runtime-semantics-evaluation -Completion UnaryExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion UnaryExpression::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); auto& vm = interpreter.vm(); if (m_op == UnaryOp::Delete) { - auto reference = TRY(m_lhs->to_reference(interpreter, global_object)); + auto reference = TRY(m_lhs->to_reference(interpreter)); return Value(TRY(reference.delete_(global_object))); } Value lhs_result; if (m_op == UnaryOp::Typeof && is(*m_lhs)) { - auto reference = TRY(m_lhs->to_reference(interpreter, global_object)); + auto reference = TRY(m_lhs->to_reference(interpreter)); if (reference.is_unresolvable()) lhs_result = js_undefined(); @@ -1475,7 +1498,7 @@ Completion UnaryExpression::execute(Interpreter& interpreter, GlobalObject& glob VERIFY(!lhs_result.is_empty()); } else { // 1. Let expr be the result of evaluating UnaryExpression. - lhs_result = TRY(m_lhs->execute(interpreter, global_object)).release_value(); + lhs_result = TRY(m_lhs->execute(interpreter)).release_value(); } switch (m_op) { @@ -1498,20 +1521,22 @@ Completion UnaryExpression::execute(Interpreter& interpreter, GlobalObject& glob VERIFY_NOT_REACHED(); } -Completion SuperExpression::execute(Interpreter&, GlobalObject&) const +Completion SuperExpression::execute(Interpreter&) const { // The semantics for SuperExpression are handled in CallExpression and SuperCall. VERIFY_NOT_REACHED(); } -Completion ClassElement::execute(Interpreter&, GlobalObject&) const +Completion ClassElement::execute(Interpreter&) const { // Note: The semantics of class element are handled in class_element_evaluation VERIFY_NOT_REACHED(); } -static ThrowCompletionOr class_key_to_property_name(Interpreter& interpreter, GlobalObject& global_object, Expression const& key) +static ThrowCompletionOr class_key_to_property_name(Interpreter& interpreter, Expression const& key) { + auto& global_object = interpreter.global_object(); + if (is(key)) { auto& private_identifier = static_cast(key); auto* private_environment = interpreter.vm().running_execution_context().private_environment; @@ -1519,7 +1544,7 @@ static ThrowCompletionOr class_key_to_property_name(Interprete return ClassElementName { private_environment->resolve_private_identifier(private_identifier.string()) }; } - auto prop_key = TRY(key.execute(interpreter, global_object)).release_value(); + auto prop_key = TRY(key.execute(interpreter)).release_value(); if (prop_key.is_object()) prop_key = TRY(prop_key.to_primitive(global_object, Value::PreferredType::String)); @@ -1529,11 +1554,11 @@ static ThrowCompletionOr class_key_to_property_name(Interprete } // 15.4.5 Runtime Semantics: MethodDefinitionEvaluation, https://tc39.es/ecma262/#sec-runtime-semantics-methoddefinitionevaluation -ThrowCompletionOr ClassMethod::class_element_evaluation(Interpreter& interpreter, GlobalObject& global_object, Object& target) const +ThrowCompletionOr ClassMethod::class_element_evaluation(Interpreter& interpreter, Object& target) const { - auto property_key_or_private_name = TRY(class_key_to_property_name(interpreter, global_object, *m_key)); + auto property_key_or_private_name = TRY(class_key_to_property_name(interpreter, *m_key)); - auto method_value = TRY(m_function->execute(interpreter, global_object)).release_value(); + auto method_value = TRY(m_function->execute(interpreter)).release_value(); auto function_handle = make_handle(&method_value.as_function()); @@ -1608,7 +1633,7 @@ public: { } - Completion execute(Interpreter& interpreter, GlobalObject& global_object) const override + Completion execute(Interpreter& interpreter) const override { // 1. Assert: argumentsList is empty. VERIFY(interpreter.vm().argument_count() == 0); @@ -1621,7 +1646,7 @@ public: // 4. Else, // a. Let rhs be the result of evaluating AssignmentExpression. // b. Let value be ? GetValue(rhs). - auto value = TRY(interpreter.vm().named_evaluation_if_anonymous_function(global_object, m_expression, m_class_field_identifier_name)); + auto value = TRY(interpreter.vm().named_evaluation_if_anonymous_function(m_expression, m_class_field_identifier_name)); // 5. Return Completion Record { [[Type]]: return, [[Value]]: value, [[Target]]: empty }. return { Completion::Type::Return, value, {} }; @@ -1639,11 +1664,12 @@ private: }; // 15.7.10 Runtime Semantics: ClassFieldDefinitionEvaluation, https://tc39.es/ecma262/#sec-runtime-semantics-classfielddefinitionevaluation -ThrowCompletionOr ClassField::class_element_evaluation(Interpreter& interpreter, GlobalObject& global_object, Object& target) const +ThrowCompletionOr ClassField::class_element_evaluation(Interpreter& interpreter, Object& target) const { + auto& global_object = interpreter.global_object(); auto& realm = *global_object.associated_realm(); - auto property_key_or_private_name = TRY(class_key_to_property_name(interpreter, global_object, *m_key)); + auto property_key_or_private_name = TRY(class_key_to_property_name(interpreter, *m_key)); Handle initializer {}; if (m_initializer) { auto copy_initializer = m_initializer; @@ -1687,8 +1713,9 @@ Optional ClassMethod::private_bound_identifier() const } // 15.7.11 Runtime Semantics: ClassStaticBlockDefinitionEvaluation, https://tc39.es/ecma262/#sec-runtime-semantics-classstaticblockdefinitionevaluation -ThrowCompletionOr StaticInitializer::class_element_evaluation(Interpreter& interpreter, GlobalObject& global_object, Object& home_object) const +ThrowCompletionOr StaticInitializer::class_element_evaluation(Interpreter& interpreter, Object& home_object) const { + auto& global_object = interpreter.global_object(); auto& realm = *global_object.associated_realm(); // 1. Let lex be the running execution context's LexicalEnvironment. @@ -1712,13 +1739,13 @@ ThrowCompletionOr StaticInitializer::class_element_eva // 15.7.16 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-class-definitions-runtime-semantics-evaluation // ClassExpression : class BindingIdentifier ClassTail -Completion ClassExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion ClassExpression::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; // 1. Let className be StringValue of BindingIdentifier. // 2. Let value be ? ClassDefinitionEvaluation of ClassTail with arguments className and className. - auto* value = TRY(class_definition_evaluation(interpreter, global_object, m_name, m_name.is_null() ? "" : m_name)); + auto* value = TRY(class_definition_evaluation(interpreter, m_name, m_name.is_null() ? "" : m_name)); // 3. Set value.[[SourceText]] to the source text matched by ClassExpression. value->set_source_text(m_source_text); @@ -1728,12 +1755,14 @@ Completion ClassExpression::execute(Interpreter& interpreter, GlobalObject& glob } // 15.7.15 Runtime Semantics: BindingClassDeclarationEvaluation, https://tc39.es/ecma262/#sec-runtime-semantics-bindingclassdeclarationevaluation -static ThrowCompletionOr binding_class_declaration_evaluation(Interpreter& interpreter, GlobalObject& global_object, ClassExpression const& class_expression) +static ThrowCompletionOr binding_class_declaration_evaluation(Interpreter& interpreter, ClassExpression const& class_expression) { + auto& global_object = interpreter.global_object(); + // ClassDeclaration : class ClassTail if (!class_expression.has_name()) { // 1. Let value be ? ClassDefinitionEvaluation of ClassTail with arguments undefined and "default". - auto value = TRY(class_expression.class_definition_evaluation(interpreter, global_object, {}, "default")); + auto value = TRY(class_expression.class_definition_evaluation(interpreter, {}, "default")); // 2. Set value.[[SourceText]] to the source text matched by ClassDeclaration. value->set_source_text(class_expression.source_text()); @@ -1749,7 +1778,7 @@ static ThrowCompletionOr binding_class_declaration_evaluation(Interpreter VERIFY(!class_name.is_empty()); // 2. Let value be ? ClassDefinitionEvaluation of ClassTail with arguments className and className. - auto value = TRY(class_expression.class_definition_evaluation(interpreter, global_object, class_name, class_name)); + auto value = TRY(class_expression.class_definition_evaluation(interpreter, class_name, class_name)); // 3. Set value.[[SourceText]] to the source text matched by ClassDeclaration. value->set_source_text(class_expression.source_text()); @@ -1766,20 +1795,21 @@ static ThrowCompletionOr binding_class_declaration_evaluation(Interpreter // 15.7.16 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-class-definitions-runtime-semantics-evaluation // ClassDeclaration : class BindingIdentifier ClassTail -Completion ClassDeclaration::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion ClassDeclaration::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; // 1. Perform ? BindingClassDeclarationEvaluation of this ClassDeclaration. - (void)TRY(binding_class_declaration_evaluation(interpreter, global_object, m_class_expression)); + (void)TRY(binding_class_declaration_evaluation(interpreter, m_class_expression)); // 2. Return empty. return Optional {}; } // 15.7.14 Runtime Semantics: ClassDefinitionEvaluation, https://tc39.es/ecma262/#sec-runtime-semantics-classdefinitionevaluation -ThrowCompletionOr ClassExpression::class_definition_evaluation(Interpreter& interpreter, GlobalObject& global_object, FlyString const& binding_name, FlyString const& class_name) const +ThrowCompletionOr ClassExpression::class_definition_evaluation(Interpreter& interpreter, FlyString const& binding_name, FlyString const& class_name) const { + auto& global_object = interpreter.global_object(); auto& vm = interpreter.vm(); auto& realm = *global_object.associated_realm(); @@ -1815,11 +1845,11 @@ ThrowCompletionOr ClassExpression::class_definition_e Value super_class; - auto reference = TRY(m_super_class->to_reference(interpreter, global_object)); + auto reference = TRY(m_super_class->to_reference(interpreter)); if (reference.is_valid_reference()) { super_class = TRY(reference.get_value(global_object)); } else { - super_class = TRY(m_super_class->execute(interpreter, global_object)).release_value(); + super_class = TRY(m_super_class->execute(interpreter)).release_value(); } vm.running_execution_context().lexical_environment = environment; @@ -1851,7 +1881,7 @@ ThrowCompletionOr ClassExpression::class_definition_e }; // FIXME: Step 14.a is done in the parser. By using a synthetic super(...args) which does not call @@iterator of %Array.prototype% - auto class_constructor_value = TRY(m_constructor->execute(interpreter, global_object)).release_value(); + auto class_constructor_value = TRY(m_constructor->execute(interpreter)).release_value(); update_function_name(class_constructor_value, class_name); @@ -1876,7 +1906,7 @@ ThrowCompletionOr ClassExpression::class_definition_e for (auto const& element : m_elements) { // Note: All ClassElementEvaluation start with evaluating the name (or we fake it). - auto element_value = TRY(element.class_element_evaluation(interpreter, global_object, element.is_static() ? *class_constructor : *prototype)); + auto element_value = TRY(element.class_element_evaluation(interpreter, element.is_static() ? *class_constructor : *prototype)); if (element_value.has()) { auto& container = element.is_static() ? static_private_methods : instance_private_methods; @@ -2504,9 +2534,10 @@ void ForAwaitOfStatement::dump(int indent) const } // 13.1.3 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-identifiers-runtime-semantics-evaluation -Completion Identifier::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion Identifier::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); // 1. Return ? ResolveBinding(StringValue of Identifier). auto reference = TRY(interpreter.vm().resolve_binding(m_string)); @@ -2522,7 +2553,7 @@ void Identifier::dump(int indent) const outln("Identifier \"{}\"", m_string); } -Completion PrivateIdentifier::execute(Interpreter&, GlobalObject&) const +Completion PrivateIdentifier::execute(Interpreter&) const { // Note: This should be handled by either the member expression this is part of // or the binary expression in the case of `#foo in bar`. @@ -2541,16 +2572,17 @@ void SpreadExpression::dump(int indent) const m_target->dump(indent + 1); } -Completion SpreadExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion SpreadExpression::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; - return m_target->execute(interpreter, global_object); + return m_target->execute(interpreter); } // 13.2.1.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-this-keyword-runtime-semantics-evaluation -Completion ThisExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion ThisExpression::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); // 1. Return ? ResolveThisBinding(). return interpreter.vm().resolve_this_binding(global_object); @@ -2562,9 +2594,10 @@ void ThisExpression::dump(int indent) const } // 13.15.2 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-assignment-operators-runtime-semantics-evaluation -Completion AssignmentExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion AssignmentExpression::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); if (m_op == AssignmentOp::Assignment) { // AssignmentExpression : LeftHandSideExpression = AssignmentExpression @@ -2573,7 +2606,7 @@ Completion AssignmentExpression::execute(Interpreter& interpreter, GlobalObject& [&](NonnullRefPtr const& lhs) -> ThrowCompletionOr { // a. Let lref be the result of evaluating LeftHandSideExpression. // b. ReturnIfAbrupt(lref). - auto reference = TRY(lhs->to_reference(interpreter, global_object)); + auto reference = TRY(lhs->to_reference(interpreter)); Value rhs_result; @@ -2581,13 +2614,13 @@ Completion AssignmentExpression::execute(Interpreter& interpreter, GlobalObject& if (lhs->is_identifier()) { // i. Let rval be ? NamedEvaluation of AssignmentExpression with argument lref.[[ReferencedName]]. auto& identifier_name = static_cast(*lhs).string(); - rhs_result = TRY(interpreter.vm().named_evaluation_if_anonymous_function(global_object, m_rhs, identifier_name)); + rhs_result = TRY(interpreter.vm().named_evaluation_if_anonymous_function(m_rhs, identifier_name)); } // d. Else, else { // i. Let rref be the result of evaluating AssignmentExpression. // ii. Let rval be ? GetValue(rref). - rhs_result = TRY(m_rhs->execute(interpreter, global_object)).release_value(); + rhs_result = TRY(m_rhs->execute(interpreter)).release_value(); } // e. Perform ? PutValue(lref, rval). @@ -2600,7 +2633,7 @@ Completion AssignmentExpression::execute(Interpreter& interpreter, GlobalObject& [&](NonnullRefPtr const& pattern) -> ThrowCompletionOr { // 3. Let rref be the result of evaluating AssignmentExpression. // 4. Let rval be ? GetValue(rref). - auto rhs_result = TRY(m_rhs->execute(interpreter, global_object)).release_value(); + auto rhs_result = TRY(m_rhs->execute(interpreter)).release_value(); // 5. Perform ? DestructuringAssignmentEvaluation of assignmentPattern with argument rval. TRY(interpreter.vm().destructuring_assignment_evaluation(pattern, rhs_result, global_object)); @@ -2613,7 +2646,7 @@ Completion AssignmentExpression::execute(Interpreter& interpreter, GlobalObject& // 1. Let lref be the result of evaluating LeftHandSideExpression. auto& lhs_expression = *m_lhs.get>(); - auto reference = TRY(lhs_expression.to_reference(interpreter, global_object)); + auto reference = TRY(lhs_expression.to_reference(interpreter)); // 2. Let lval be ? GetValue(lref). auto lhs_result = TRY(reference.get_value(global_object)); @@ -2654,13 +2687,13 @@ Completion AssignmentExpression::execute(Interpreter& interpreter, GlobalObject& if (lhs_expression.is_identifier()) { // a. Let rval be ? NamedEvaluation of AssignmentExpression with argument lref.[[ReferencedName]]. auto& identifier_name = static_cast(lhs_expression).string(); - rhs_result = TRY(interpreter.vm().named_evaluation_if_anonymous_function(global_object, m_rhs, identifier_name)); + rhs_result = TRY(interpreter.vm().named_evaluation_if_anonymous_function(m_rhs, identifier_name)); } // 6. Else, else { // a. Let rref be the result of evaluating AssignmentExpression. // b. Let rval be ? GetValue(rref). - rhs_result = TRY(m_rhs->execute(interpreter, global_object)).release_value(); + rhs_result = TRY(m_rhs->execute(interpreter)).release_value(); } // 7. Perform ? PutValue(lref, rval). @@ -2674,7 +2707,7 @@ Completion AssignmentExpression::execute(Interpreter& interpreter, GlobalObject& // 3. Let rref be the result of evaluating AssignmentExpression. // 4. Let rval be ? GetValue(rref). - auto rhs_result = TRY(m_rhs->execute(interpreter, global_object)).release_value(); + auto rhs_result = TRY(m_rhs->execute(interpreter)).release_value(); // 5. Let assignmentOpText be the source text matched by AssignmentOperator. // 6. Let opText be the sequence of Unicode code points associated with assignmentOpText in the following table: @@ -2734,12 +2767,13 @@ Completion AssignmentExpression::execute(Interpreter& interpreter, GlobalObject& // 13.4.3.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-postfix-decrement-operator-runtime-semantics-evaluation // 13.4.4.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-prefix-increment-operator-runtime-semantics-evaluation // 13.4.5.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-prefix-decrement-operator-runtime-semantics-evaluation -Completion UpdateExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion UpdateExpression::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); // 1. Let expr be the result of evaluating . - auto reference = TRY(m_argument->to_reference(interpreter, global_object)); + auto reference = TRY(m_argument->to_reference(interpreter)); // 2. Let oldValue be ? ToNumeric(? GetValue(expr)). auto old_value = TRY(reference.get_value(global_object)); @@ -2872,16 +2906,17 @@ void UpdateExpression::dump(int indent) const // 14.3.1.2 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-let-and-const-declarations-runtime-semantics-evaluation // 14.3.2.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-variable-statement-runtime-semantics-evaluation -Completion VariableDeclaration::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion VariableDeclaration::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); for (auto& declarator : m_declarations) { if (auto* init = declarator.init()) { TRY(declarator.target().visit( [&](NonnullRefPtr const& id) -> ThrowCompletionOr { - auto reference = TRY(id->to_reference(interpreter, global_object)); - auto initializer_result = TRY(interpreter.vm().named_evaluation_if_anonymous_function(global_object, *init, id->string())); + auto reference = TRY(id->to_reference(interpreter)); + auto initializer_result = TRY(interpreter.vm().named_evaluation_if_anonymous_function(*init, id->string())); VERIFY(!initializer_result.is_empty()); if (m_declaration_kind == DeclarationKind::Var) @@ -2890,7 +2925,7 @@ Completion VariableDeclaration::execute(Interpreter& interpreter, GlobalObject& return reference.initialize_referenced_binding(global_object, initializer_result); }, [&](NonnullRefPtr const& pattern) -> ThrowCompletionOr { - auto initializer_result = TRY(init->execute(interpreter, global_object)).release_value(); + auto initializer_result = TRY(init->execute(interpreter)).release_value(); Environment* environment = m_declaration_kind == DeclarationKind::Var ? nullptr : interpreter.lexical_environment(); @@ -2899,14 +2934,14 @@ Completion VariableDeclaration::execute(Interpreter& interpreter, GlobalObject& } else if (m_declaration_kind != DeclarationKind::Var) { VERIFY(declarator.target().has>()); auto& identifier = declarator.target().get>(); - auto reference = TRY(identifier->to_reference(interpreter, global_object)); + auto reference = TRY(identifier->to_reference(interpreter)); TRY(reference.initialize_referenced_binding(global_object, js_undefined())); } } return normal_completion({}); } -Completion VariableDeclarator::execute(Interpreter& interpreter, GlobalObject&) const +Completion VariableDeclarator::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; @@ -2990,7 +3025,7 @@ void ExpressionStatement::dump(int indent) const m_expression->dump(indent + 1); } -Completion ObjectProperty::execute(Interpreter& interpreter, GlobalObject&) const +Completion ObjectProperty::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; @@ -2999,9 +3034,10 @@ Completion ObjectProperty::execute(Interpreter& interpreter, GlobalObject&) cons } // 13.2.5.4 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-object-initializer-runtime-semantics-evaluation -Completion ObjectExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion ObjectExpression::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); auto& realm = *global_object.associated_realm(); // 1. Let obj be OrdinaryObjectCreate(%Object.prototype%). @@ -3009,7 +3045,7 @@ Completion ObjectExpression::execute(Interpreter& interpreter, GlobalObject& glo // 2. Perform ? PropertyDefinitionEvaluation of PropertyDefinitionList with argument obj. for (auto& property : m_properties) { - auto key = TRY(property.key().execute(interpreter, global_object)).release_value(); + auto key = TRY(property.key().execute(interpreter)).release_value(); // PropertyDefinition : ... AssignmentExpression if (property.type() == ObjectProperty::Type::Spread) { @@ -3020,7 +3056,7 @@ Completion ObjectExpression::execute(Interpreter& interpreter, GlobalObject& glo continue; } - auto value = TRY(property.value().execute(interpreter, global_object)).release_value(); + auto value = TRY(property.value().execute(interpreter)).release_value(); // 8. If isProtoSetter is true, then if (property.type() == ObjectProperty::Type::ProtoSetter) { @@ -3087,11 +3123,12 @@ String MemberExpression::to_string_approximation() const } // 13.3.2.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-property-accessors-runtime-semantics-evaluation -Completion MemberExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion MemberExpression::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); - auto reference = TRY(to_reference(interpreter, global_object)); + auto reference = TRY(to_reference(interpreter)); return TRY(reference.get_value(global_object)); } @@ -3137,11 +3174,12 @@ void OptionalChain::dump(int indent) const } } -ThrowCompletionOr OptionalChain::to_reference_and_value(Interpreter& interpreter, GlobalObject& global_object) const +ThrowCompletionOr OptionalChain::to_reference_and_value(Interpreter& interpreter) const { - auto base_reference = TRY(m_base->to_reference(interpreter, global_object)); + auto& global_object = interpreter.global_object(); + auto base_reference = TRY(m_base->to_reference(interpreter)); auto base = base_reference.is_unresolvable() - ? TRY(m_base->execute(interpreter, global_object)).release_value() + ? TRY(m_base->execute(interpreter)).release_value() : TRY(base_reference.get_value(global_object)); for (auto& reference : m_references) { @@ -3175,9 +3213,9 @@ ThrowCompletionOr OptionalChain::to_reference_ }); if (is(*expression)) { base_reference = JS::Reference {}; - base = TRY(expression->execute(interpreter, global_object)).release_value(); + base = TRY(expression->execute(interpreter)).release_value(); } else { - base_reference = TRY(expression->to_reference(interpreter, global_object)); + base_reference = TRY(expression->to_reference(interpreter)); base = TRY(base_reference.get_value(global_object)); } } @@ -3186,15 +3224,15 @@ ThrowCompletionOr OptionalChain::to_reference_ } // 13.3.9.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-optional-chaining-evaluation -Completion OptionalChain::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion OptionalChain::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; - return TRY(to_reference_and_value(interpreter, global_object)).value; + return TRY(to_reference_and_value(interpreter)).value; } -ThrowCompletionOr OptionalChain::to_reference(Interpreter& interpreter, GlobalObject& global_object) const +ThrowCompletionOr OptionalChain::to_reference(Interpreter& interpreter) const { - return TRY(to_reference_and_value(interpreter, global_object)).reference; + return TRY(to_reference_and_value(interpreter)).reference; } void MetaProperty::dump(int indent) const @@ -3211,9 +3249,10 @@ void MetaProperty::dump(int indent) const } // 13.3.12.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-meta-properties-runtime-semantics-evaluation -Completion MetaProperty::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion MetaProperty::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); auto& realm = *global_object.associated_realm(); // NewTarget : new . target @@ -3286,9 +3325,10 @@ void ImportCall::dump(int indent) const // 13.3.10.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-import-call-runtime-semantics-evaluation // Also includes assertions from proposal: https://tc39.es/proposal-import-assertions/#sec-import-call-runtime-semantics-evaluation -Completion ImportCall::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion ImportCall::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); auto& realm = *global_object.associated_realm(); // 2.1.1.1 EvaluateImportCall ( specifierExpression [ , optionsExpression ] ), https://tc39.es/proposal-import-assertions/#sec-evaluate-import-call @@ -3297,14 +3337,14 @@ Completion ImportCall::execute(Interpreter& interpreter, GlobalObject& global_ob // 2. Let specifierRef be the result of evaluating specifierExpression. // 3. Let specifier be ? GetValue(specifierRef). - auto specifier = TRY(m_specifier->execute(interpreter, global_object)); + auto specifier = TRY(m_specifier->execute(interpreter)); auto options_value = js_undefined(); // 4. If optionsExpression is present, then if (m_options) { // a. Let optionsRef be the result of evaluating optionsExpression. // b. Let options be ? GetValue(optionsRef). - options_value = TRY(m_options->execute(interpreter, global_object)).release_value(); + options_value = TRY(m_options->execute(interpreter)).release_value(); } // 5. Else, // a. Let options be undefined. @@ -3395,7 +3435,7 @@ Completion ImportCall::execute(Interpreter& interpreter, GlobalObject& global_ob } // 13.2.3.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-literals-runtime-semantics-evaluation -Completion StringLiteral::execute(Interpreter& interpreter, GlobalObject&) const +Completion StringLiteral::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; @@ -3404,7 +3444,7 @@ Completion StringLiteral::execute(Interpreter& interpreter, GlobalObject&) const } // 13.2.3.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-literals-runtime-semantics-evaluation -Completion NumericLiteral::execute(Interpreter& interpreter, GlobalObject&) const +Completion NumericLiteral::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; @@ -3413,7 +3453,7 @@ Completion NumericLiteral::execute(Interpreter& interpreter, GlobalObject&) cons } // 13.2.3.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-literals-runtime-semantics-evaluation -Completion BigIntLiteral::execute(Interpreter& interpreter, GlobalObject&) const +Completion BigIntLiteral::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; @@ -3432,7 +3472,7 @@ Completion BigIntLiteral::execute(Interpreter& interpreter, GlobalObject&) const } // 13.2.3.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-literals-runtime-semantics-evaluation -Completion BooleanLiteral::execute(Interpreter& interpreter, GlobalObject&) const +Completion BooleanLiteral::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; @@ -3442,7 +3482,7 @@ Completion BooleanLiteral::execute(Interpreter& interpreter, GlobalObject&) cons } // 13.2.3.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-literals-runtime-semantics-evaluation -Completion NullLiteral::execute(Interpreter& interpreter, GlobalObject&) const +Completion NullLiteral::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; @@ -3457,9 +3497,10 @@ void RegExpLiteral::dump(int indent) const } // 13.2.7.3 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-regular-expression-literals-runtime-semantics-evaluation -Completion RegExpLiteral::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion RegExpLiteral::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); auto& realm = *global_object.associated_realm(); // 1. Let pattern be CodePointsToString(BodyText of RegularExpressionLiteral). @@ -3487,9 +3528,10 @@ void ArrayExpression::dump(int indent) const } // 13.2.4.2 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-array-initializer-runtime-semantics-evaluation -Completion ArrayExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion ArrayExpression::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); auto& realm = *global_object.associated_realm(); // 1. Let array be ! ArrayCreate(0). @@ -3502,7 +3544,7 @@ Completion ArrayExpression::execute(Interpreter& interpreter, GlobalObject& glob for (auto& element : m_elements) { auto value = Value(); if (element) { - value = TRY(element->execute(interpreter, global_object)).release_value(); + value = TRY(element->execute(interpreter)).release_value(); if (is(*element)) { (void)TRY(get_iterator_values(global_object, value, [&](Value iterator_value) -> Optional { @@ -3527,9 +3569,10 @@ void TemplateLiteral::dump(int indent) const } // 13.2.8.5 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-template-literals-runtime-semantics-evaluation -Completion TemplateLiteral::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion TemplateLiteral::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); StringBuilder string_builder; @@ -3538,7 +3581,7 @@ Completion TemplateLiteral::execute(Interpreter& interpreter, GlobalObject& glob // 2. Let subRef be the result of evaluating Expression. // 3. Let sub be ? GetValue(subRef). - auto sub = TRY(expression.execute(interpreter, global_object)).release_value(); + auto sub = TRY(expression.execute(interpreter)).release_value(); // 4. Let middle be ? ToString(sub). auto string = TRY(sub.to_string(global_object)); @@ -3564,9 +3607,10 @@ void TaggedTemplateLiteral::dump(int indent) const } // 13.3.11.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-tagged-templates-runtime-semantics-evaluation -Completion TaggedTemplateLiteral::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion TaggedTemplateLiteral::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); // NOTE: This is both // MemberExpression : MemberExpression TemplateLiteral @@ -3577,7 +3621,7 @@ Completion TaggedTemplateLiteral::execute(Interpreter& interpreter, GlobalObject // 1. Let tagRef be ? Evaluation of CallExpression. // 2. Let tagFunc be ? GetValue(tagRef). - auto tag = TRY(m_tag->execute(interpreter, global_object)).release_value(); + auto tag = TRY(m_tag->execute(interpreter)).release_value(); // 3. Let thisCall be this CallExpression. // 3. Let thisCall be this MemberExpression. @@ -3586,7 +3630,7 @@ Completion TaggedTemplateLiteral::execute(Interpreter& interpreter, GlobalObject // NOTE: A tagged template is a function call where the arguments of the call are derived from a // TemplateLiteral (13.2.8). The actual arguments include a template object (13.2.8.3) // and the values produced by evaluating the expressions embedded within the TemplateLiteral. - auto template_ = TRY(get_template_object(interpreter, global_object)); + auto template_ = TRY(get_template_object(interpreter)); MarkedVector arguments(interpreter.vm().heap()); arguments.append(template_); @@ -3596,16 +3640,17 @@ Completion TaggedTemplateLiteral::execute(Interpreter& interpreter, GlobalObject // tag`foo${bar}baz${qux}` -> "foo", bar, "baz", qux, "" -> tag(["foo", "baz", ""], bar, qux) // So we want all the odd expressions for (size_t i = 1; i < expressions.size(); i += 2) - arguments.append(TRY(expressions[i].execute(interpreter, global_object)).release_value()); + arguments.append(TRY(expressions[i].execute(interpreter)).release_value()); // 5. Return ? EvaluateCall(tagFunc, tagRef, TemplateLiteral, tailCall). return call(global_object, tag, js_undefined(), move(arguments)); } // 13.2.8.3 GetTemplateObject ( templateLiteral ), https://tc39.es/ecma262/#sec-gettemplateobject -ThrowCompletionOr TaggedTemplateLiteral::get_template_object(Interpreter& interpreter, GlobalObject& global_object) const +ThrowCompletionOr TaggedTemplateLiteral::get_template_object(Interpreter& interpreter) const { // 1. Let realm be the current Realm Record. + auto& global_object = interpreter.global_object(); auto& realm = *global_object.associated_realm(); // 2. Let templateRegistry be realm.[[TemplateMap]]. @@ -3646,7 +3691,7 @@ ThrowCompletionOr TaggedTemplateLiteral::get_template_object(Interpreter& auto cooked_string_index = i * 2; // a. Let prop be ! ToString(𝔽(index)). // b. Let cookedValue be cookedStrings[index]. - auto cooked_value = TRY(expressions[cooked_string_index].execute(interpreter, global_object)).release_value(); + auto cooked_value = TRY(expressions[cooked_string_index].execute(interpreter)).release_value(); // NOTE: If the string contains invalid escapes we get a null expression here, // which we then convert to the expected `undefined` TV. See @@ -3659,7 +3704,7 @@ ThrowCompletionOr TaggedTemplateLiteral::get_template_object(Interpreter& // d. Let rawValue be the String value rawStrings[index]. // e. Perform ! DefinePropertyOrThrow(rawObj, prop, PropertyDescriptor { [[Value]]: rawValue, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false }). - raw_obj->indexed_properties().append(TRY(raw_strings[i].execute(interpreter, global_object)).release_value()); + raw_obj->indexed_properties().append(TRY(raw_strings[i].execute(interpreter)).release_value()); // f. Set index to index + 1. } @@ -3727,10 +3772,10 @@ void ThrowStatement::dump(int indent) const } // 14.15.3 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-try-statement-runtime-semantics-evaluation -Completion TryStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion TryStatement::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; - + auto& global_object = interpreter.global_object(); auto& vm = interpreter.vm(); // 14.15.2 Runtime Semantics: CatchClauseEvaluation, https://tc39.es/ecma262/#sec-runtime-semantics-catchclauseevaluation @@ -3777,7 +3822,7 @@ Completion TryStatement::execute(Interpreter& interpreter, GlobalObject& global_ } // 7. Let B be the result of evaluating Block. - auto handler_result = m_handler->body().execute(interpreter, global_object); + auto handler_result = m_handler->body().execute(interpreter); // 8. Set the running execution context's LexicalEnvironment to oldEnv. vm.running_execution_context().lexical_environment = old_environment; @@ -3789,7 +3834,7 @@ Completion TryStatement::execute(Interpreter& interpreter, GlobalObject& global_ Completion result; // 1. Let B be the result of evaluating Block. - auto block_result = m_block->execute(interpreter, global_object); + auto block_result = m_block->execute(interpreter); // TryStatement : try Block Catch // TryStatement : try Block Catch Finally @@ -3810,7 +3855,7 @@ Completion TryStatement::execute(Interpreter& interpreter, GlobalObject& global_ // TryStatement : try Block Catch Finally if (m_finalizer) { // 4. Let F be the result of evaluating Finally. - auto finalizer_result = m_finalizer->execute(interpreter, global_object); + auto finalizer_result = m_finalizer->execute(interpreter); // 5. If F.[[Type]] is normal, set F to C. if (finalizer_result.type() == Completion::Type::Normal) @@ -3824,7 +3869,7 @@ Completion TryStatement::execute(Interpreter& interpreter, GlobalObject& global_ return result.update_empty(js_undefined()); } -Completion CatchClause::execute(Interpreter& interpreter, GlobalObject&) const +Completion CatchClause::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; @@ -3834,13 +3879,13 @@ Completion CatchClause::execute(Interpreter& interpreter, GlobalObject&) const } // 14.14.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-throw-statement-runtime-semantics-evaluation -Completion ThrowStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion ThrowStatement::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; // 1. Let exprRef be the result of evaluating Expression. // 2. Let exprValue be ? GetValue(exprRef). - auto value = TRY(m_argument->execute(interpreter, global_object)).release_value(); + auto value = TRY(m_argument->execute(interpreter)).release_value(); // 3. Return ThrowCompletion(exprValue). return throw_completion(value); @@ -3848,17 +3893,17 @@ Completion ThrowStatement::execute(Interpreter& interpreter, GlobalObject& globa // 14.1.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-statement-semantics-runtime-semantics-evaluation // BreakableStatement : SwitchStatement -Completion SwitchStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion SwitchStatement::execute(Interpreter& interpreter) const { // 1. Let newLabelSet be a new empty List. // 2. Return ? LabelledEvaluation of this BreakableStatement with argument newLabelSet. - return labelled_evaluation(interpreter, global_object, *this, {}); + return labelled_evaluation(interpreter, *this, {}); } // NOTE: Since we don't have the 'BreakableStatement' from the spec as a separate ASTNode that wraps IterationStatement / SwitchStatement, // execute() needs to take care of LabelledEvaluation, which in turn calls execute_impl(). // 14.12.4 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-switch-statement-runtime-semantics-evaluation -Completion SwitchStatement::execute_impl(Interpreter& interpreter, GlobalObject& global_object) const +Completion SwitchStatement::execute_impl(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; @@ -3871,7 +3916,7 @@ Completion SwitchStatement::execute_impl(Interpreter& interpreter, GlobalObject& // 2. Let exprRef be the result of evaluating the Expression of C. // 3. Let clauseSelector be ? GetValue(exprRef). - auto clause_selector = TRY(case_clause.test()->execute(interpreter, global_object)).release_value(); + auto clause_selector = TRY(case_clause.test()->execute(interpreter)).release_value(); // 4. Return IsStrictlyEqual(input, clauseSelector). return is_strictly_equal(input, clause_selector); @@ -3922,7 +3967,7 @@ Completion SwitchStatement::execute_impl(Interpreter& interpreter, GlobalObject& // b. If found is true, then if (found) { // i. Let R be the result of evaluating C. - auto result = case_clause.evaluate_statements(interpreter, global_object); + auto result = case_clause.evaluate_statements(interpreter); // ii. If R.[[Value]] is not empty, set V to R.[[Value]]. if (result.value().has_value()) @@ -3962,7 +4007,7 @@ Completion SwitchStatement::execute_impl(Interpreter& interpreter, GlobalObject& // b. If found is true, then if (found) { // i. Let R be the result of evaluating C. - auto result = case_clause.evaluate_statements(interpreter, global_object); + auto result = case_clause.evaluate_statements(interpreter); // ii. If R.[[Value]] is not empty, set V to R.[[Value]]. if (result.value().has_value()) @@ -3996,7 +4041,7 @@ Completion SwitchStatement::execute_impl(Interpreter& interpreter, GlobalObject& // ii. If foundInB is true, then if (found_in_b) { // 1. Let R be the result of evaluating CaseClause C. - auto result = case_clause.evaluate_statements(interpreter, global_object); + auto result = case_clause.evaluate_statements(interpreter); // 2. If R.[[Value]] is not empty, set V to R.[[Value]]. if (result.value().has_value()) @@ -4014,7 +4059,7 @@ Completion SwitchStatement::execute_impl(Interpreter& interpreter, GlobalObject& return last_value; // 11. Let R be the result of evaluating DefaultClause. - auto result = default_clause->evaluate_statements(interpreter, global_object); + auto result = default_clause->evaluate_statements(interpreter); // 12. If R.[[Value]] is not empty, set V to R.[[Value]]. if (result.value().has_value()) @@ -4028,7 +4073,7 @@ Completion SwitchStatement::execute_impl(Interpreter& interpreter, GlobalObject& // 15. For each CaseClause C of B, do for (auto const& case_clause : case_clauses_2) { // a. Let R be the result of evaluating CaseClause C. - result = case_clause.evaluate_statements(interpreter, global_object); + result = case_clause.evaluate_statements(interpreter); // b. If R.[[Value]] is not empty, set V to R.[[Value]]. if (result.value().has_value()) @@ -4049,7 +4094,7 @@ Completion SwitchStatement::execute_impl(Interpreter& interpreter, GlobalObject& // SwitchStatement : switch ( Expression ) CaseBlock // 1. Let exprRef be the result of evaluating Expression. // 2. Let switchValue be ? GetValue(exprRef). - auto switch_value = TRY(m_discriminant->execute(interpreter, global_object)).release_value(); + auto switch_value = TRY(m_discriminant->execute(interpreter)).release_value(); // 3. Let oldEnv be the running execution context's LexicalEnvironment. auto* old_environment = interpreter.lexical_environment(); @@ -4060,7 +4105,7 @@ Completion SwitchStatement::execute_impl(Interpreter& interpreter, GlobalObject& auto* block_environment = new_declarative_environment(*old_environment); // 5. Perform BlockDeclarationInstantiation(CaseBlock, blockEnv). - block_declaration_instantiation(interpreter, global_object, block_environment); + block_declaration_instantiation(interpreter, block_environment); // 6. Set the running execution context's LexicalEnvironment to blockEnv. vm.running_execution_context().lexical_environment = block_environment; @@ -4076,7 +4121,7 @@ Completion SwitchStatement::execute_impl(Interpreter& interpreter, GlobalObject& return result; } -Completion SwitchCase::execute(Interpreter& interpreter, GlobalObject&) const +Completion SwitchCase::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; @@ -4086,7 +4131,7 @@ Completion SwitchCase::execute(Interpreter& interpreter, GlobalObject&) const } // 14.9.2 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-break-statement-runtime-semantics-evaluation -Completion BreakStatement::execute(Interpreter& interpreter, GlobalObject&) const +Completion BreakStatement::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; @@ -4103,7 +4148,7 @@ Completion BreakStatement::execute(Interpreter& interpreter, GlobalObject&) cons } // 14.8.2 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-continue-statement-runtime-semantics-evaluation -Completion ContinueStatement::execute(Interpreter& interpreter, GlobalObject&) const +Completion ContinueStatement::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; @@ -4143,25 +4188,25 @@ void SwitchCase::dump(int indent) const } // 13.14.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-conditional-operator-runtime-semantics-evaluation -Completion ConditionalExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion ConditionalExpression::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; // 1. Let lref be the result of evaluating ShortCircuitExpression. // 2. Let lval be ToBoolean(? GetValue(lref)). - auto test_result = TRY(m_test->execute(interpreter, global_object)).release_value(); + auto test_result = TRY(m_test->execute(interpreter)).release_value(); // 3. If lval is true, then if (test_result.to_boolean()) { // a. Let trueRef be the result of evaluating the first AssignmentExpression. // b. Return ? GetValue(trueRef). - return m_consequent->execute(interpreter, global_object); + return m_consequent->execute(interpreter); } // 4. Else, else { // a. Let falseRef be the result of evaluating the second AssignmentExpression. // b. Return ? GetValue(falseRef). - return m_alternate->execute(interpreter, global_object); + return m_alternate->execute(interpreter); } } @@ -4187,7 +4232,7 @@ void SequenceExpression::dump(int indent) const } // 13.16.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-comma-operator-runtime-semantics-evaluation -Completion SequenceExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion SequenceExpression::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; @@ -4198,12 +4243,12 @@ Completion SequenceExpression::execute(Interpreter& interpreter, GlobalObject& g // 4. Return ? GetValue(rref). Value last_value; for (auto const& expression : m_expressions) - last_value = TRY(expression.execute(interpreter, global_object)).release_value(); + last_value = TRY(expression.execute(interpreter)).release_value(); return { move(last_value) }; } // 14.16.1 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-debugger-statement-runtime-semantics-evaluation -Completion DebuggerStatement::execute(Interpreter& interpreter, GlobalObject&) const +Completion DebuggerStatement::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; @@ -4296,7 +4341,7 @@ void ScopeNode::add_hoisted_function(NonnullRefPtr declarat } // 16.2.1.11 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-module-semantics-runtime-semantics-evaluation -Completion ImportStatement::execute(Interpreter& interpreter, GlobalObject&) const +Completion ImportStatement::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; @@ -4307,14 +4352,15 @@ Completion ImportStatement::execute(Interpreter& interpreter, GlobalObject&) con FlyString ExportStatement::local_name_for_default = "*default*"; // 16.2.3.7 Runtime Semantics: Evaluation, https://tc39.es/ecma262/#sec-exports-runtime-semantics-evaluation -Completion ExportStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const +Completion ExportStatement::execute(Interpreter& interpreter) const { InterpreterNodeScope node_scope { interpreter, *this }; + auto& global_object = interpreter.global_object(); if (!is_default_export()) { if (m_statement) { // 1. Return the result of evaluating . - return m_statement->execute(interpreter, global_object); + return m_statement->execute(interpreter); } // 1. Return empty. @@ -4326,7 +4372,7 @@ Completion ExportStatement::execute(Interpreter& interpreter, GlobalObject& glob // ExportDeclaration : export default HoistableDeclaration if (is(*m_statement)) { // 1. Return the result of evaluating HoistableDeclaration. - return m_statement->execute(interpreter, global_object); + return m_statement->execute(interpreter); } // ExportDeclaration : export default ClassDeclaration @@ -4335,7 +4381,7 @@ Completion ExportStatement::execute(Interpreter& interpreter, GlobalObject& glob auto const& class_declaration = static_cast(*m_statement); // 1. Let value be ? BindingClassDeclarationEvaluation of ClassDeclaration. - auto value = TRY(binding_class_declaration_evaluation(interpreter, global_object, class_declaration.m_class_expression)); + auto value = TRY(binding_class_declaration_evaluation(interpreter, class_declaration.m_class_expression)); // 2. Let className be the sole element of BoundNames of ClassDeclaration. // 3. If className is "*default*", then @@ -4352,7 +4398,7 @@ Completion ExportStatement::execute(Interpreter& interpreter, GlobalObject& glob auto& class_expression = static_cast(*m_statement); // 1. Let value be ? BindingClassDeclarationEvaluation of ClassDeclaration. - auto value = TRY(binding_class_declaration_evaluation(interpreter, global_object, class_expression)); + auto value = TRY(binding_class_declaration_evaluation(interpreter, class_expression)); // 2. Let className be the sole element of BoundNames of ClassDeclaration. // 3. If className is "*default*", then @@ -4377,7 +4423,7 @@ Completion ExportStatement::execute(Interpreter& interpreter, GlobalObject& glob // 2. Else, // a. Let rhs be the result of evaluating AssignmentExpression. // b. Let value be ? GetValue(rhs). - auto value = TRY(interpreter.vm().named_evaluation_if_anonymous_function(global_object, *m_statement, "default")); + auto value = TRY(interpreter.vm().named_evaluation_if_anonymous_function(*m_statement, "default")); // 3. Let env be the running execution context's LexicalEnvironment. auto* env = interpreter.lexical_environment(); @@ -4468,9 +4514,10 @@ bool ImportStatement::has_bound_name(FlyString const& name) const } // 14.2.3 BlockDeclarationInstantiation ( code, env ), https://tc39.es/ecma262/#sec-blockdeclarationinstantiation -void ScopeNode::block_declaration_instantiation(Interpreter&, GlobalObject& global_object, Environment* environment) const +void ScopeNode::block_declaration_instantiation(Interpreter& interpreter, Environment* environment) const { // See also B.3.2.6 Changes to BlockDeclarationInstantiation, https://tc39.es/ecma262/#sec-web-compat-blockdeclarationinstantiation + auto& global_object = interpreter.global_object(); auto& realm = *global_object.associated_realm(); VERIFY(environment); @@ -4497,8 +4544,9 @@ void ScopeNode::block_declaration_instantiation(Interpreter&, GlobalObject& glob } // 16.1.7 GlobalDeclarationInstantiation ( script, env ), https://tc39.es/ecma262/#sec-globaldeclarationinstantiation -ThrowCompletionOr Program::global_declaration_instantiation(Interpreter& interpreter, GlobalObject& global_object, GlobalEnvironment& global_environment) const +ThrowCompletionOr Program::global_declaration_instantiation(Interpreter& interpreter, GlobalEnvironment& global_environment) const { + auto& global_object = interpreter.global_object(); auto& realm = *global_object.associated_realm(); // 1. Let lexNames be the LexicallyDeclaredNames of script. diff --git a/Userland/Libraries/LibJS/AST.h b/Userland/Libraries/LibJS/AST.h index 815f18ab62..87f7e9ae5f 100644 --- a/Userland/Libraries/LibJS/AST.h +++ b/Userland/Libraries/LibJS/AST.h @@ -48,7 +48,7 @@ create_ast_node(SourceRange range, Args&&... args) class ASTNode : public RefCounted { public: virtual ~ASTNode() = default; - virtual Completion execute(Interpreter&, GlobalObject&) const = 0; + virtual Completion execute(Interpreter&) const = 0; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const; virtual void dump(int indent) const; @@ -111,7 +111,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; virtual Bytecode::CodeGenerationErrorOr generate_labelled_evaluation(Bytecode::Generator&, Vector const&) const; @@ -143,7 +143,7 @@ class IterationStatement : public Statement { public: using Statement::Statement; - virtual Completion loop_evaluation(Interpreter&, GlobalObject&, Vector const&) const = 0; + virtual Completion loop_evaluation(Interpreter&, Vector const&) const = 0; virtual Bytecode::CodeGenerationErrorOr generate_labelled_evaluation(Bytecode::Generator&, Vector const&) const; private: @@ -156,7 +156,7 @@ public: : Statement(source_range) { } - Completion execute(Interpreter&, GlobalObject&) const override; + Completion execute(Interpreter&) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; }; @@ -166,7 +166,7 @@ public: : Statement(source_range) { } - Completion execute(Interpreter&, GlobalObject&) const override { return {}; } + Completion execute(Interpreter&) const override { return {}; } }; class ExpressionStatement final : public Statement { @@ -177,7 +177,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -235,7 +235,7 @@ public: virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; - Completion evaluate_statements(Interpreter& interpreter, GlobalObject& global_object) const; + Completion evaluate_statements(Interpreter&) const; void add_var_scoped_declaration(NonnullRefPtr variables); void add_lexical_declaration(NonnullRefPtr variables); @@ -255,7 +255,7 @@ public: ThrowCompletionOr for_each_var_function_declaration_in_reverse_order(ThrowCompletionOrVoidCallback&& callback) const; ThrowCompletionOr for_each_var_scoped_variable_declaration(ThrowCompletionOrVoidCallback&& callback) const; - void block_declaration_instantiation(Interpreter&, GlobalObject&, Environment*) const; + void block_declaration_instantiation(Interpreter&, Environment*) const; ThrowCompletionOr for_each_function_hoistable_with_annexB_extension(ThrowCompletionOrVoidCallback&& callback) const; @@ -336,7 +336,7 @@ public: entry.m_module_request = &m_module_request; } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; @@ -424,7 +424,7 @@ public: } } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; @@ -467,7 +467,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; bool is_strict_mode() const { return m_is_strict_mode; } void set_strict_mode() { m_is_strict_mode = true; } @@ -495,7 +495,7 @@ public: bool has_top_level_await() const { return m_has_top_level_await; } void set_has_top_level_await() { m_has_top_level_await = true; } - ThrowCompletionOr global_declaration_instantiation(Interpreter&, GlobalObject&, GlobalEnvironment&) const; + ThrowCompletionOr global_declaration_instantiation(Interpreter&, GlobalEnvironment&) const; private: virtual bool is_program() const override { return true; } @@ -514,7 +514,7 @@ public: : ScopeNode(source_range) { } - Completion execute(Interpreter& interpreter, GlobalObject& object) const override; + Completion execute(Interpreter&) const override; }; class FunctionBody final : public ScopeNode { @@ -528,7 +528,7 @@ public: bool in_strict_mode() const { return m_in_strict_mode; } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; private: bool m_in_strict_mode { false }; @@ -540,7 +540,7 @@ public: : ASTNode(source_range) { } - virtual ThrowCompletionOr to_reference(Interpreter&, GlobalObject&) const; + virtual ThrowCompletionOr to_reference(Interpreter&) const; }; class Declaration : public Statement { @@ -564,7 +564,7 @@ public: : Declaration(source_range) { } - Completion execute(Interpreter&, GlobalObject&) const override { return {}; } + Completion execute(Interpreter&) const override { return {}; } ThrowCompletionOr for_each_bound_name(ThrowCompletionOrVoidCallback&&) const override { @@ -662,7 +662,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -688,14 +688,14 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; bool has_name() const { return !name().is_empty(); } - Value instantiate_ordinary_function_expression(Interpreter& interpreter, GlobalObject& global_object, FlyString given_name) const; + Value instantiate_ordinary_function_expression(Interpreter&, FlyString given_name) const; private: virtual bool is_function_expression() const override { return true; } @@ -708,7 +708,7 @@ public: { } - Completion execute(Interpreter&, GlobalObject&) const override { return {}; } + Completion execute(Interpreter&) const override { return {}; } }; class YieldExpression final : public Expression { @@ -723,7 +723,7 @@ public: Expression const* argument() const { return m_argument; } bool is_yield_from() const { return m_is_yield_from; } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -740,7 +740,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -758,7 +758,7 @@ public: Expression const* argument() const { return m_argument; } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -780,7 +780,7 @@ public: Statement const& consequent() const { return *m_consequent; } Statement const* alternate() const { return m_alternate; } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -802,8 +802,8 @@ public: Expression const& test() const { return *m_test; } Statement const& body() const { return *m_body; } - virtual Completion execute(Interpreter&, GlobalObject&) const override; - virtual Completion loop_evaluation(Interpreter&, GlobalObject&, Vector const&) const override; + virtual Completion execute(Interpreter&) const override; + virtual Completion loop_evaluation(Interpreter&, Vector const&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; virtual Bytecode::CodeGenerationErrorOr generate_labelled_evaluation(Bytecode::Generator&, Vector const&) const override; @@ -825,8 +825,8 @@ public: Expression const& test() const { return *m_test; } Statement const& body() const { return *m_body; } - virtual Completion execute(Interpreter&, GlobalObject&) const override; - virtual Completion loop_evaluation(Interpreter&, GlobalObject&, Vector const&) const override; + virtual Completion execute(Interpreter&) const override; + virtual Completion loop_evaluation(Interpreter&, Vector const&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; virtual Bytecode::CodeGenerationErrorOr generate_labelled_evaluation(Bytecode::Generator&, Vector const&) const override; @@ -848,7 +848,7 @@ public: Expression const& object() const { return *m_object; } Statement const& body() const { return *m_body; } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -873,8 +873,8 @@ public: Expression const* update() const { return m_update; } Statement const& body() const { return *m_body; } - virtual Completion execute(Interpreter&, GlobalObject&) const override; - virtual Completion loop_evaluation(Interpreter&, GlobalObject&, Vector const&) const override; + virtual Completion execute(Interpreter&) const override; + virtual Completion loop_evaluation(Interpreter&, Vector const&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; virtual Bytecode::CodeGenerationErrorOr generate_labelled_evaluation(Bytecode::Generator&, Vector const&) const override; @@ -900,10 +900,10 @@ public: Expression const& rhs() const { return *m_rhs; } Statement const& body() const { return *m_body; } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; virtual Bytecode::CodeGenerationErrorOr generate_labelled_evaluation(Bytecode::Generator&, Vector const&) const override; - virtual Completion loop_evaluation(Interpreter&, GlobalObject&, Vector const&) const override; + virtual Completion loop_evaluation(Interpreter&, Vector const&) const override; virtual void dump(int indent) const override; private: @@ -926,10 +926,10 @@ public: Expression const& rhs() const { return *m_rhs; } Statement const& body() const { return *m_body; } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; virtual Bytecode::CodeGenerationErrorOr generate_labelled_evaluation(Bytecode::Generator&, Vector const&) const override; - virtual Completion loop_evaluation(Interpreter&, GlobalObject&, Vector const&) const override; + virtual Completion loop_evaluation(Interpreter&, Vector const&) const override; virtual void dump(int indent) const override; private: @@ -948,8 +948,8 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; - virtual Completion loop_evaluation(Interpreter&, GlobalObject&, Vector const&) const override; + virtual Completion execute(Interpreter&) const override; + virtual Completion loop_evaluation(Interpreter&, Vector const&) const override; virtual void dump(int indent) const override; private: @@ -993,7 +993,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -1019,7 +1019,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -1048,7 +1048,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -1067,7 +1067,7 @@ public: } virtual void dump(int indent) const override; - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; private: @@ -1090,7 +1090,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -1106,7 +1106,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -1122,7 +1122,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -1139,7 +1139,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -1160,7 +1160,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; }; @@ -1177,7 +1177,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -1206,9 +1206,9 @@ public: FlyString const& string() const { return m_string; } void set_lexically_bound_function_argument_index(size_t index) { m_lexically_bound_function_argument = index; } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; - virtual ThrowCompletionOr to_reference(Interpreter&, GlobalObject&) const override; + virtual ThrowCompletionOr to_reference(Interpreter&) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; private: @@ -1229,7 +1229,7 @@ public: FlyString const& string() const { return m_string; } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual bool is_private_identifier() const override { return true; } @@ -1246,7 +1246,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; enum class ElementKind { Method, @@ -1259,7 +1259,7 @@ public: // We use the Completion also as a ClassStaticBlockDefinition Record. using ClassValue = Variant; - virtual ThrowCompletionOr class_element_evaluation(Interpreter&, GlobalObject&, Object& home_object) const = 0; + virtual ThrowCompletionOr class_element_evaluation(Interpreter&, Object& home_object) const = 0; virtual Optional private_bound_identifier() const { return {}; }; @@ -1288,7 +1288,7 @@ public: virtual ElementKind class_element_kind() const override { return ElementKind::Method; } virtual void dump(int indent) const override; - virtual ThrowCompletionOr class_element_evaluation(Interpreter&, GlobalObject&, Object& home_object) const override; + virtual ThrowCompletionOr class_element_evaluation(Interpreter&, Object& home_object) const override; virtual Optional private_bound_identifier() const override; private: @@ -1315,7 +1315,7 @@ public: virtual ElementKind class_element_kind() const override { return ElementKind::Field; } virtual void dump(int indent) const override; - virtual ThrowCompletionOr class_element_evaluation(Interpreter& interpreter, GlobalObject& object, Object& home_object) const override; + virtual ThrowCompletionOr class_element_evaluation(Interpreter&, Object& home_object) const override; virtual Optional private_bound_identifier() const override; private: @@ -1334,7 +1334,7 @@ public: } virtual ElementKind class_element_kind() const override { return ElementKind::StaticInitializer; } - virtual ThrowCompletionOr class_element_evaluation(Interpreter&, GlobalObject&, Object& home_object) const override; + virtual ThrowCompletionOr class_element_evaluation(Interpreter&, Object& home_object) const override; virtual void dump(int indent) const override; @@ -1350,7 +1350,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual bool is_super_expression() const override { return true; } @@ -1372,13 +1372,13 @@ public: String const& source_text() const { return m_source_text; } RefPtr constructor() const { return m_constructor; } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; bool has_name() const { return !m_name.is_empty(); } - ThrowCompletionOr class_definition_evaluation(Interpreter& interpreter, GlobalObject& global_object, FlyString const& binding_name = {}, FlyString const& class_name = {}) const; + ThrowCompletionOr class_definition_evaluation(Interpreter&, FlyString const& binding_name = {}, FlyString const& class_name = {}) const; private: virtual bool is_class_expression() const override { return true; } @@ -1398,7 +1398,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -1424,7 +1424,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; private: @@ -1437,7 +1437,7 @@ public: : Expression(source_range) { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; }; @@ -1456,7 +1456,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -1465,7 +1465,7 @@ public: protected: virtual bool is_call_expression() const override { return true; } - Completion throw_type_error_for_callee(Interpreter&, GlobalObject&, Value callee_value, StringView call_type) const; + Completion throw_type_error_for_callee(Interpreter&, Value callee_value, StringView call_type) const; NonnullRefPtr m_callee; Vector const m_arguments; @@ -1475,7 +1475,7 @@ private: Value this_value; Value callee; }; - ThrowCompletionOr compute_this_and_callee(Interpreter&, GlobalObject&, Reference const&) const; + ThrowCompletionOr compute_this_and_callee(Interpreter&, Reference const&) const; }; class NewExpression final : public CallExpression { @@ -1485,7 +1485,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual bool is_new_expression() const override { return true; } }; @@ -1514,7 +1514,7 @@ public: VERIFY(is_part_of_synthetic_constructor == IsPartOfSyntheticConstructor::Yes); } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; private: @@ -1559,7 +1559,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -1584,7 +1584,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -1627,7 +1627,7 @@ public: auto& target() const { return m_target; } Expression const* init() const { return m_init; } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; private: @@ -1646,7 +1646,7 @@ public: DeclarationKind declaration_kind() const { return m_declaration_kind; } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -1695,7 +1695,7 @@ public: bool is_method() const { return m_is_method; } virtual void dump(int indent) const override; - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; private: NonnullRefPtr m_key; @@ -1713,7 +1713,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -1736,7 +1736,7 @@ public: Vector> const& elements() const { return m_elements; } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -1761,7 +1761,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -1782,11 +1782,11 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; - ThrowCompletionOr get_template_object(Interpreter& interpreter, GlobalObject& global_object) const; + ThrowCompletionOr get_template_object(Interpreter&) const; private: NonnullRefPtr const m_tag; @@ -1804,9 +1804,9 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; - virtual ThrowCompletionOr to_reference(Interpreter&, GlobalObject&) const override; + virtual ThrowCompletionOr to_reference(Interpreter&) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; bool is_computed() const { return m_computed; } @@ -1858,8 +1858,8 @@ public: { } - virtual Completion execute(Interpreter& interpreter, GlobalObject& global_object) const override; - virtual ThrowCompletionOr to_reference(Interpreter& interpreter, GlobalObject& global_object) const override; + virtual Completion execute(Interpreter&) const override; + virtual ThrowCompletionOr to_reference(Interpreter&) const override; virtual void dump(int indent) const override; private: @@ -1867,7 +1867,7 @@ private: JS::Reference reference; Value value; }; - ThrowCompletionOr to_reference_and_value(Interpreter&, GlobalObject&) const; + ThrowCompletionOr to_reference_and_value(Interpreter&) const; NonnullRefPtr m_base; Vector m_references; @@ -1886,7 +1886,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual void dump(int indent) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -1904,7 +1904,7 @@ public: } virtual void dump(int indent) const override; - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; private: virtual bool is_import_call() const override { return true; } @@ -1924,7 +1924,7 @@ public: } virtual void dump(int indent) const override; - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; private: @@ -1953,7 +1953,7 @@ public: BlockStatement const& body() const { return m_body; } virtual void dump(int indent) const override; - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; private: Variant> m_parameter; @@ -1975,7 +1975,7 @@ public: BlockStatement const* finalizer() const { return m_finalizer; } virtual void dump(int indent) const override; - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; private: @@ -1995,7 +1995,7 @@ public: Expression const& argument() const { return m_argument; } virtual void dump(int indent) const override; - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; private: @@ -2013,7 +2013,7 @@ public: Expression const* test() const { return m_test; } virtual void dump(int indent) const override; - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; private: RefPtr m_test; @@ -2028,11 +2028,11 @@ public: } virtual void dump(int indent) const override; - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; virtual Bytecode::CodeGenerationErrorOr generate_labelled_evaluation(Bytecode::Generator&, Vector const&) const; - Completion execute_impl(Interpreter&, GlobalObject&) const; + Completion execute_impl(Interpreter&) const; void add_case(NonnullRefPtr switch_case) { m_cases.append(move(switch_case)); } private: @@ -2048,7 +2048,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; FlyString const& target_label() const { return m_target_label; } virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; @@ -2065,7 +2065,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; FlyString const& target_label() const { return m_target_label; } @@ -2081,7 +2081,7 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override; + virtual Completion execute(Interpreter&) const override; virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; }; @@ -2094,8 +2094,8 @@ public: { } - virtual Completion execute(Interpreter&, GlobalObject&) const override { return m_value; } - virtual ThrowCompletionOr to_reference(Interpreter&, GlobalObject&) const override { return m_reference; } + virtual Completion execute(Interpreter&) const override { return m_value; } + virtual ThrowCompletionOr to_reference(Interpreter&) const override { return m_reference; } private: Reference m_reference; diff --git a/Userland/Libraries/LibJS/Bytecode/Op.cpp b/Userland/Libraries/LibJS/Bytecode/Op.cpp index 64e656a6d3..705d4e0a57 100644 --- a/Userland/Libraries/LibJS/Bytecode/Op.cpp +++ b/Userland/Libraries/LibJS/Bytecode/Op.cpp @@ -773,7 +773,7 @@ ThrowCompletionOr NewClass::execute_impl(Bytecode::Interpreter& interprete auto name = m_class_expression.name(); auto scope = interpreter.ast_interpreter_scope(); auto& ast_interpreter = scope.interpreter(); - auto class_object = TRY(m_class_expression.class_definition_evaluation(ast_interpreter, interpreter.global_object(), name, name.is_null() ? ""sv : name)); + auto class_object = TRY(m_class_expression.class_definition_evaluation(ast_interpreter, name, name.is_null() ? ""sv : name)); interpreter.accumulator() = class_object; return {}; } diff --git a/Userland/Libraries/LibJS/Interpreter.cpp b/Userland/Libraries/LibJS/Interpreter.cpp index d6542aef3b..f881241b9f 100644 --- a/Userland/Libraries/LibJS/Interpreter.cpp +++ b/Userland/Libraries/LibJS/Interpreter.cpp @@ -80,13 +80,13 @@ ThrowCompletionOr Interpreter::run(Script& script_record) auto& script = script_record.parse_node(); // 12. Let result be Completion(GlobalDeclarationInstantiation(script, globalEnv)). - auto instantiation_result = script.global_declaration_instantiation(*this, global_object, global_environment); + auto instantiation_result = script.global_declaration_instantiation(*this, global_environment); Completion result = instantiation_result.is_throw_completion() ? instantiation_result.throw_completion() : normal_completion({}); // 13. If result.[[Type]] is normal, then if (result.type() == Completion::Type::Normal) { // a. Set result to the result of evaluating script. - result = script.execute(*this, global_object); + result = script.execute(*this); } // 14. If result.[[Type]] is normal and result.[[Value]] is empty, then diff --git a/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp b/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp index 1ae9bdf066..ef15c210b6 100644 --- a/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp +++ b/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp @@ -712,7 +712,7 @@ ThrowCompletionOr perform_eval(GlobalObject& global_object, Value x, Call eval_result = result; } else { auto& ast_interpreter = vm.interpreter(); - eval_result = TRY(program->execute(ast_interpreter, global_object)); + eval_result = TRY(program->execute(ast_interpreter)); } // 30. If result.[[Type]] is normal and result.[[Value]] is empty, then diff --git a/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.cpp b/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.cpp index 292a84e7c5..68eec33529 100644 --- a/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.cpp +++ b/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.cpp @@ -451,7 +451,7 @@ ThrowCompletionOr ECMAScriptFunctionObject::function_declaration_instantia // Resulting value is in the accumulator. argument_value = value_and_frame.frame->registers.at(0); } else if (interpreter) { - argument_value = TRY(parameter.default_value->execute(*interpreter, global_object)).release_value(); + argument_value = TRY(parameter.default_value->execute(*interpreter)).release_value(); } } else { argument_value = js_undefined(); @@ -730,7 +730,7 @@ void async_block_start(VM& vm, NonnullRefPtr const& async_body, Promi // 3. Set the code evaluation state of asyncContext such that when evaluation is resumed for that execution context the following steps will be performed: auto* execution_steps = NativeFunction::create(realm, "", [&async_body, &promise_capability](auto& vm, auto& global_object) -> ThrowCompletionOr { // a. Let result be the result of evaluating asyncBody. - auto result = async_body->execute(vm.interpreter(), global_object); + auto result = async_body->execute(vm.interpreter()); // b. Assert: If we return here, the async function either threw an exception or performed an implicit or explicit return; all awaiting is done. @@ -862,7 +862,7 @@ Completion ECMAScriptFunctionObject::ordinary_call_evaluate_body() TRY(function_declaration_instantiation(ast_interpreter)); // 2. Return the result of evaluating FunctionStatementList. - return m_ecmascript_code->execute(*ast_interpreter, global_object); + return m_ecmascript_code->execute(*ast_interpreter); } // AsyncFunctionBody : FunctionBody else if (m_kind == FunctionKind::Async) { diff --git a/Userland/Libraries/LibJS/Runtime/ShadowRealm.cpp b/Userland/Libraries/LibJS/Runtime/ShadowRealm.cpp index 03a7eba4ae..885f904d0b 100644 --- a/Userland/Libraries/LibJS/Runtime/ShadowRealm.cpp +++ b/Userland/Libraries/LibJS/Runtime/ShadowRealm.cpp @@ -4,6 +4,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include #include @@ -173,9 +174,12 @@ ThrowCompletionOr perform_shadow_realm_eval(GlobalObject& global_object, // 17. If result.[[Type]] is normal, then if (!eval_result.is_throw_completion()) { + // FIXME: Remove once everything uses the VM's current realm. + auto eval_realm_interpreter = Interpreter::create_with_existing_realm(eval_realm); + // TODO: Optionally use bytecode interpreter? // a. Set result to the result of evaluating body. - result = program->execute(vm.interpreter(), eval_realm.global_object()); + result = program->execute(*eval_realm_interpreter); } // 18. If result.[[Type]] is normal and result.[[Value]] is empty, then diff --git a/Userland/Libraries/LibJS/Runtime/VM.cpp b/Userland/Libraries/LibJS/Runtime/VM.cpp index e57ea9c05a..bfabdd1551 100644 --- a/Userland/Libraries/LibJS/Runtime/VM.cpp +++ b/Userland/Libraries/LibJS/Runtime/VM.cpp @@ -235,23 +235,23 @@ Symbol* VM::get_global_symbol(String const& description) return new_global_symbol; } -ThrowCompletionOr VM::named_evaluation_if_anonymous_function(GlobalObject& global_object, ASTNode const& expression, FlyString const& name) +ThrowCompletionOr VM::named_evaluation_if_anonymous_function(ASTNode const& expression, FlyString const& name) { // 8.3.3 Static Semantics: IsAnonymousFunctionDefinition ( expr ), https://tc39.es/ecma262/#sec-isanonymousfunctiondefinition // And 8.3.5 Runtime Semantics: NamedEvaluation, https://tc39.es/ecma262/#sec-runtime-semantics-namedevaluation if (is(expression)) { auto& function = static_cast(expression); if (!function.has_name()) { - return function.instantiate_ordinary_function_expression(interpreter(), global_object, name); + return function.instantiate_ordinary_function_expression(interpreter(), name); } } else if (is(expression)) { auto& class_expression = static_cast(expression); if (!class_expression.has_name()) { - return TRY(class_expression.class_definition_evaluation(interpreter(), global_object, {}, name)); + return TRY(class_expression.class_definition_evaluation(interpreter(), {}, name)); } } - return TRY(expression.execute(interpreter(), global_object)).release_value(); + return TRY(expression.execute(interpreter())).release_value(); } // 13.15.5.2 Runtime Semantics: DestructuringAssignmentEvaluation, https://tc39.es/ecma262/#sec-runtime-semantics-destructuringassignmentevaluation @@ -327,7 +327,7 @@ ThrowCompletionOr VM::property_binding_initialization(BindingPattern const if (auto identifier_ptr = property.name.get_pointer>()) { assignment_target = TRY(resolve_binding((*identifier_ptr)->string(), environment)); } else if (auto member_ptr = property.alias.get_pointer>()) { - assignment_target = TRY((*member_ptr)->to_reference(interpreter(), global_object)); + assignment_target = TRY((*member_ptr)->to_reference(interpreter())); } else { VERIFY_NOT_REACHED(); } @@ -348,7 +348,7 @@ ThrowCompletionOr VM::property_binding_initialization(BindingPattern const return identifier->string(); }, [&](NonnullRefPtr const& expression) -> ThrowCompletionOr { - auto result = TRY(expression->execute(interpreter(), global_object)).release_value(); + auto result = TRY(expression->execute(interpreter())).release_value(); return result.to_property_key(global_object); })); @@ -361,7 +361,7 @@ ThrowCompletionOr VM::property_binding_initialization(BindingPattern const auto value_to_assign = TRY(object->get(name)); if (property.initializer && value_to_assign.is_undefined()) { - value_to_assign = TRY(named_evaluation_if_anonymous_function(global_object, *property.initializer, identifier.string())); + value_to_assign = TRY(named_evaluation_if_anonymous_function(*property.initializer, identifier.string())); } if (!environment) @@ -378,15 +378,15 @@ ThrowCompletionOr VM::property_binding_initialization(BindingPattern const }, [&](NonnullRefPtr const&) -> ThrowCompletionOr> { return Optional {}; }, [&](NonnullRefPtr const& member_expression) -> ThrowCompletionOr> { - return TRY(member_expression->to_reference(interpreter(), global_object)); + return TRY(member_expression->to_reference(interpreter())); })); auto value_to_assign = TRY(object->get(name)); if (property.initializer && value_to_assign.is_undefined()) { if (auto* identifier_ptr = property.alias.get_pointer>()) - value_to_assign = TRY(named_evaluation_if_anonymous_function(global_object, *property.initializer, (*identifier_ptr)->string())); + value_to_assign = TRY(named_evaluation_if_anonymous_function(*property.initializer, (*identifier_ptr)->string())); else - value_to_assign = TRY(property.initializer->execute(interpreter(), global_object)).release_value(); + value_to_assign = TRY(property.initializer->execute(interpreter())).release_value(); } if (auto* binding_ptr = property.alias.get_pointer>()) { @@ -421,7 +421,7 @@ ThrowCompletionOr VM::iterator_binding_initialization(BindingPattern const }, [&](NonnullRefPtr const&) -> ThrowCompletionOr> { return Optional {}; }, [&](NonnullRefPtr const& member_expression) -> ThrowCompletionOr> { - return TRY(member_expression->to_reference(interpreter(), global_object)); + return TRY(member_expression->to_reference(interpreter())); })); // BindingRestElement : ... BindingIdentifier @@ -520,9 +520,9 @@ ThrowCompletionOr VM::iterator_binding_initialization(BindingPattern const if (value.is_undefined() && entry.initializer) { VERIFY(!entry.is_rest); if (auto* identifier_ptr = entry.alias.get_pointer>()) - value = TRY(named_evaluation_if_anonymous_function(global_object, *entry.initializer, (*identifier_ptr)->string())); + value = TRY(named_evaluation_if_anonymous_function(*entry.initializer, (*identifier_ptr)->string())); else - value = TRY(entry.initializer->execute(interpreter(), global_object)).release_value(); + value = TRY(entry.initializer->execute(interpreter())).release_value(); } if (auto* binding_ptr = entry.alias.get_pointer>()) { diff --git a/Userland/Libraries/LibJS/Runtime/VM.h b/Userland/Libraries/LibJS/Runtime/VM.h index 8f5270ee28..5f3601fef1 100644 --- a/Userland/Libraries/LibJS/Runtime/VM.h +++ b/Userland/Libraries/LibJS/Runtime/VM.h @@ -203,7 +203,7 @@ public: ThrowCompletionOr binding_initialization(FlyString const& target, Value value, Environment* environment, GlobalObject& global_object); ThrowCompletionOr binding_initialization(NonnullRefPtr const& target, Value value, Environment* environment, GlobalObject& global_object); - ThrowCompletionOr named_evaluation_if_anonymous_function(GlobalObject& global_object, ASTNode const& expression, FlyString const& name); + ThrowCompletionOr named_evaluation_if_anonymous_function(ASTNode const& expression, FlyString const& name); void save_execution_context_stack(); void restore_execution_context_stack(); diff --git a/Userland/Libraries/LibJS/SourceTextModule.cpp b/Userland/Libraries/LibJS/SourceTextModule.cpp index 872f7b0292..05783fd82d 100644 --- a/Userland/Libraries/LibJS/SourceTextModule.cpp +++ b/Userland/Libraries/LibJS/SourceTextModule.cpp @@ -660,7 +660,7 @@ ThrowCompletionOr SourceTextModule::execute_module(VM& vm, Optionalexecute(vm.interpreter(), realm().global_object()); + auto result = m_ecmascript_code->execute(vm.interpreter()); // d. Suspend moduleContext and remove it from the execution context stack. vm.pop_execution_context();