From 8296d3fbd2e32398f6f35d8d8fe25a0c590f54c3 Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Wed, 29 Dec 2021 15:56:53 +0100 Subject: [PATCH] LibJS: Convert can_declare_global_function() to ThrowCompletionOr --- Userland/Libraries/LibJS/AST.cpp | 12 ++++++------ .../Libraries/LibJS/Runtime/AbstractOperations.cpp | 6 ++++-- .../Libraries/LibJS/Runtime/GlobalEnvironment.cpp | 6 +++--- Userland/Libraries/LibJS/Runtime/GlobalEnvironment.h | 2 +- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/Userland/Libraries/LibJS/AST.cpp b/Userland/Libraries/LibJS/AST.cpp index 7aa96cc4f1..8234fb83c3 100644 --- a/Userland/Libraries/LibJS/AST.cpp +++ b/Userland/Libraries/LibJS/AST.cpp @@ -3626,10 +3626,10 @@ ThrowCompletionOr Program::global_declaration_instantiation(Interpreter& i if (declared_function_names.set(function.name()) != AK::HashSetResult::InsertedNewEntry) return IterationDecision::Continue; - auto function_definable = global_environment.can_declare_global_function(function.name()); - - if (interpreter.exception()) + auto function_definable_or_error = global_environment.can_declare_global_function(function.name()); + if (function_definable_or_error.is_error()) return IterationDecision::Break; + auto function_definable = function_definable_or_error.release_value(); if (!function_definable) { interpreter.vm().throw_exception(global_object, ErrorType::CannotDeclareGlobalFunction, function.name()); @@ -3677,10 +3677,10 @@ ThrowCompletionOr Program::global_declaration_instantiation(Interpreter& i if (global_environment.has_lexical_declaration(function_name)) return IterationDecision::Continue; - auto function_definable = global_environment.can_declare_global_function(function_name); - - if (interpreter.exception()) + auto function_definable_or_error = global_environment.can_declare_global_function(function_name); + if (function_definable_or_error.is_error()) return IterationDecision::Break; + auto function_definable = function_definable_or_error.release_value(); if (!function_definable) { interpreter.vm().throw_exception(global_object, ErrorType::CannotDeclareGlobalFunction, function_name); diff --git a/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp b/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp index 8650edb5de..52b784658c 100644 --- a/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp +++ b/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp @@ -627,9 +627,11 @@ ThrowCompletionOr eval_declaration_instantiation(VM& vm, GlobalObject& glo return IterationDecision::Continue; if (global_var_environment) { - auto function_definable = global_var_environment->can_declare_global_function(function.name()); - if (vm.exception()) + auto function_definable_or_error = global_var_environment->can_declare_global_function(function.name()); + if (function_definable_or_error.is_error()) return IterationDecision::Break; + auto function_definable = function_definable_or_error.release_value(); + if (!function_definable) { vm.throw_exception(global_object, ErrorType::CannotDeclareGlobalFunction, function.name()); return IterationDecision::Break; diff --git a/Userland/Libraries/LibJS/Runtime/GlobalEnvironment.cpp b/Userland/Libraries/LibJS/Runtime/GlobalEnvironment.cpp index 12d5fa2605..5f9ab7dea0 100644 --- a/Userland/Libraries/LibJS/Runtime/GlobalEnvironment.cpp +++ b/Userland/Libraries/LibJS/Runtime/GlobalEnvironment.cpp @@ -215,18 +215,18 @@ ThrowCompletionOr GlobalEnvironment::can_declare_global_var(FlyString cons } // 9.1.1.4.16 CanDeclareGlobalFunction ( N ), https://tc39.es/ecma262/#sec-candeclareglobalfunction -bool GlobalEnvironment::can_declare_global_function(FlyString const& name) const +ThrowCompletionOr GlobalEnvironment::can_declare_global_function(FlyString const& name) const { // 1. Let ObjRec be envRec.[[ObjectRecord]]. // 2. Let globalObject be ObjRec.[[BindingObject]]. auto& global_object = m_object_record->binding_object(); // 3. Let existingProp be ? globalObject.[[GetOwnProperty]](N). - auto existing_prop = TRY_OR_DISCARD(global_object.internal_get_own_property(name)); + auto existing_prop = TRY(global_object.internal_get_own_property(name)); // 4. If existingProp is undefined, return ? IsExtensible(globalObject). if (!existing_prop.has_value()) - return TRY_OR_DISCARD(global_object.is_extensible()); + return TRY(global_object.is_extensible()); // 5. If existingProp.[[Configurable]] is true, return true. if (*existing_prop->configurable) diff --git a/Userland/Libraries/LibJS/Runtime/GlobalEnvironment.h b/Userland/Libraries/LibJS/Runtime/GlobalEnvironment.h index 1a6a00cae3..e82debaf57 100644 --- a/Userland/Libraries/LibJS/Runtime/GlobalEnvironment.h +++ b/Userland/Libraries/LibJS/Runtime/GlobalEnvironment.h @@ -35,7 +35,7 @@ public: bool has_lexical_declaration(FlyString const& name) const; ThrowCompletionOr has_restricted_global_property(FlyString const& name) const; ThrowCompletionOr can_declare_global_var(FlyString const& name) const; - bool can_declare_global_function(FlyString const& name) const; + ThrowCompletionOr can_declare_global_function(FlyString const& name) const; void create_global_var_binding(FlyString const& name, bool can_be_deleted); void create_global_function_binding(FlyString const& name, Value, bool can_be_deleted);