From c0bb456fd2753e49f9be990f530d8fd2509c0635 Mon Sep 17 00:00:00 2001 From: Idan Horowitz Date: Fri, 29 Oct 2021 00:36:21 +0300 Subject: [PATCH] LibJS: Convert the CreateDynamicFunction AO to ThrowCompletionOr --- .../LibJS/Runtime/FunctionConstructor.cpp | 15 ++++++--------- .../Libraries/LibJS/Runtime/FunctionConstructor.h | 2 +- .../Runtime/GeneratorFunctionConstructor.cpp | 4 +--- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/Userland/Libraries/LibJS/Runtime/FunctionConstructor.cpp b/Userland/Libraries/LibJS/Runtime/FunctionConstructor.cpp index 92cf4c1425..c5405a13f1 100644 --- a/Userland/Libraries/LibJS/Runtime/FunctionConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/FunctionConstructor.cpp @@ -37,21 +37,21 @@ FunctionConstructor::~FunctionConstructor() } // 20.2.1.1.1 CreateDynamicFunction ( constructor, newTarget, kind, args ), https://tc39.es/ecma262/#sec-createdynamicfunction -RefPtr FunctionConstructor::create_dynamic_function_node(GlobalObject& global_object, FunctionObject&, FunctionKind kind) +ThrowCompletionOr> FunctionConstructor::create_dynamic_function_node(GlobalObject& global_object, FunctionObject&, FunctionKind kind) { auto& vm = global_object.vm(); String parameters_source = ""; String body_source = ""; if (vm.argument_count() == 1) - body_source = TRY_OR_DISCARD(vm.argument(0).to_string(global_object)); + body_source = TRY(vm.argument(0).to_string(global_object)); if (vm.argument_count() > 1) { Vector parameters; for (size_t i = 0; i < vm.argument_count() - 1; ++i) - parameters.append(TRY_OR_DISCARD(vm.argument(i).to_string(global_object))); + parameters.append(TRY(vm.argument(i).to_string(global_object))); StringBuilder parameters_builder; parameters_builder.join(',', parameters); parameters_source = parameters_builder.build(); - body_source = TRY_OR_DISCARD(vm.argument(vm.argument_count() - 1).to_string(global_object)); + body_source = TRY(vm.argument(vm.argument_count() - 1).to_string(global_object)); } auto is_generator = kind == FunctionKind::Generator; auto source = String::formatted("function{} anonymous({}\n) {{\n{}\n}}", is_generator ? "*" : "", parameters_source, body_source); @@ -59,8 +59,7 @@ RefPtr FunctionConstructor::create_dynamic_function_node(Glo auto function = parser.parse_function_node(); if (parser.has_errors()) { auto error = parser.errors()[0]; - vm.throw_exception(global_object, error.to_string()); - return {}; + return vm.throw_completion(global_object, error.to_string()); } return function; @@ -76,9 +75,7 @@ ThrowCompletionOr FunctionConstructor::call() ThrowCompletionOr FunctionConstructor::construct(FunctionObject& new_target) { auto& vm = this->vm(); - auto function = create_dynamic_function_node(global_object(), new_target, FunctionKind::Regular); - if (auto* exception = vm.exception()) - return throw_completion(exception->value()); + auto function = TRY(create_dynamic_function_node(global_object(), new_target, FunctionKind::Regular)); OwnPtr local_interpreter; Interpreter* interpreter = vm.interpreter_if_exists(); diff --git a/Userland/Libraries/LibJS/Runtime/FunctionConstructor.h b/Userland/Libraries/LibJS/Runtime/FunctionConstructor.h index 426782de44..aa117d3801 100644 --- a/Userland/Libraries/LibJS/Runtime/FunctionConstructor.h +++ b/Userland/Libraries/LibJS/Runtime/FunctionConstructor.h @@ -15,7 +15,7 @@ class FunctionConstructor final : public NativeFunction { JS_OBJECT(FunctionConstructor, NativeFunction); public: - static RefPtr create_dynamic_function_node(GlobalObject& global_object, FunctionObject& new_target, FunctionKind kind); + static ThrowCompletionOr> create_dynamic_function_node(GlobalObject& global_object, FunctionObject& new_target, FunctionKind kind); explicit FunctionConstructor(GlobalObject&); virtual void initialize(GlobalObject&) override; diff --git a/Userland/Libraries/LibJS/Runtime/GeneratorFunctionConstructor.cpp b/Userland/Libraries/LibJS/Runtime/GeneratorFunctionConstructor.cpp index ef310a384d..192045b400 100644 --- a/Userland/Libraries/LibJS/Runtime/GeneratorFunctionConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/GeneratorFunctionConstructor.cpp @@ -45,9 +45,7 @@ ThrowCompletionOr GeneratorFunctionConstructor::call() // 27.3.1.1 GeneratorFunction ( p1, p2, … , pn, body ), https://tc39.es/ecma262/#sec-generatorfunction ThrowCompletionOr GeneratorFunctionConstructor::construct(FunctionObject& new_target) { - auto function = FunctionConstructor::create_dynamic_function_node(global_object(), new_target, FunctionKind::Generator); - if (auto* exception = vm().exception()) - return throw_completion(exception->value()); + auto function = TRY(FunctionConstructor::create_dynamic_function_node(global_object(), new_target, FunctionKind::Generator)); auto* bytecode_interpreter = Bytecode::Interpreter::current(); VERIFY(bytecode_interpreter);