Selaa lähdekoodia

LibJS: Convert can_declare_global_var() to ThrowCompletionOr

Linus Groh 3 vuotta sitten
vanhempi
commit
215a56b0e4

+ 3 - 2
Userland/Libraries/LibJS/AST.cpp

@@ -3650,9 +3650,10 @@ ThrowCompletionOr<void> Program::global_declaration_instantiation(Interpreter& i
             if (declared_function_names.contains(name))
             if (declared_function_names.contains(name))
                 return IterationDecision::Continue;
                 return IterationDecision::Continue;
 
 
-            auto var_definable = global_environment.can_declare_global_var(name);
-            if (interpreter.exception())
+            auto var_definable_or_error = global_environment.can_declare_global_var(name);
+            if (var_definable_or_error.is_error())
                 return IterationDecision::Break;
                 return IterationDecision::Break;
+            auto var_definable = var_definable_or_error.release_value();
 
 
             if (!var_definable) {
             if (!var_definable) {
                 interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::CannotDeclareGlobalVariable, name);
                 interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::CannotDeclareGlobalVariable, name);

+ 8 - 4
Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp

@@ -660,9 +660,12 @@ ThrowCompletionOr<void> eval_declaration_instantiation(VM& vm, GlobalObject& glo
             if (global_var_environment) {
             if (global_var_environment) {
                 if (global_var_environment->has_lexical_declaration(function_name))
                 if (global_var_environment->has_lexical_declaration(function_name))
                     return IterationDecision::Continue;
                     return IterationDecision::Continue;
-                auto var_definable = global_var_environment->can_declare_global_var(function_name);
-                if (vm.exception())
+
+                auto var_definable_or_error = global_var_environment->can_declare_global_var(function_name);
+                if (var_definable_or_error.is_error())
                     return IterationDecision::Break;
                     return IterationDecision::Break;
+                auto var_definable = var_definable_or_error.release_value();
+
                 if (!var_definable)
                 if (!var_definable)
                     return IterationDecision::Continue;
                     return IterationDecision::Continue;
             }
             }
@@ -697,9 +700,10 @@ ThrowCompletionOr<void> eval_declaration_instantiation(VM& vm, GlobalObject& glo
         declaration.for_each_bound_name([&](auto const& name) {
         declaration.for_each_bound_name([&](auto const& name) {
             if (!declared_function_names.contains(name)) {
             if (!declared_function_names.contains(name)) {
                 if (global_var_environment) {
                 if (global_var_environment) {
-                    auto variable_definable = global_var_environment->can_declare_global_var(name);
-                    if (vm.exception())
+                    auto variable_definable_or_error = global_var_environment->can_declare_global_var(name);
+                    if (variable_definable_or_error.is_error())
                         return IterationDecision::Break;
                         return IterationDecision::Break;
+                    auto variable_definable = variable_definable_or_error.release_value();
                     if (!variable_definable) {
                     if (!variable_definable) {
                         vm.throw_exception<TypeError>(global_object, ErrorType::CannotDeclareGlobalVariable, name);
                         vm.throw_exception<TypeError>(global_object, ErrorType::CannotDeclareGlobalVariable, name);
                         return IterationDecision::Break;
                         return IterationDecision::Break;

+ 3 - 3
Userland/Libraries/LibJS/Runtime/GlobalEnvironment.cpp

@@ -197,21 +197,21 @@ ThrowCompletionOr<bool> GlobalEnvironment::has_restricted_global_property(FlyStr
 }
 }
 
 
 // 9.1.1.4.15 CanDeclareGlobalVar ( N ), https://tc39.es/ecma262/#sec-candeclareglobalvar
 // 9.1.1.4.15 CanDeclareGlobalVar ( N ), https://tc39.es/ecma262/#sec-candeclareglobalvar
-bool GlobalEnvironment::can_declare_global_var(FlyString const& name) const
+ThrowCompletionOr<bool> GlobalEnvironment::can_declare_global_var(FlyString const& name) const
 {
 {
     // 1. Let ObjRec be envRec.[[ObjectRecord]].
     // 1. Let ObjRec be envRec.[[ObjectRecord]].
     // 2. Let globalObject be ObjRec.[[BindingObject]].
     // 2. Let globalObject be ObjRec.[[BindingObject]].
     auto& global_object = m_object_record->binding_object();
     auto& global_object = m_object_record->binding_object();
 
 
     // 3. Let hasProperty be ? HasOwnProperty(globalObject, N).
     // 3. Let hasProperty be ? HasOwnProperty(globalObject, N).
-    bool has_property = TRY_OR_DISCARD(global_object.has_own_property(name));
+    bool has_property = TRY(global_object.has_own_property(name));
 
 
     // 4. If hasProperty is true, return true.
     // 4. If hasProperty is true, return true.
     if (has_property)
     if (has_property)
         return true;
         return true;
 
 
     // 5. Return ? IsExtensible(globalObject).
     // 5. Return ? IsExtensible(globalObject).
-    return TRY_OR_DISCARD(global_object.is_extensible());
+    return global_object.is_extensible();
 }
 }
 
 
 // 9.1.1.4.16 CanDeclareGlobalFunction ( N ), https://tc39.es/ecma262/#sec-candeclareglobalfunction
 // 9.1.1.4.16 CanDeclareGlobalFunction ( N ), https://tc39.es/ecma262/#sec-candeclareglobalfunction

+ 1 - 1
Userland/Libraries/LibJS/Runtime/GlobalEnvironment.h

@@ -34,7 +34,7 @@ public:
     bool has_var_declaration(FlyString const& name) const;
     bool has_var_declaration(FlyString const& name) const;
     bool has_lexical_declaration(FlyString const& name) const;
     bool has_lexical_declaration(FlyString const& name) const;
     ThrowCompletionOr<bool> has_restricted_global_property(FlyString const& name) const;
     ThrowCompletionOr<bool> has_restricted_global_property(FlyString const& name) const;
-    bool can_declare_global_var(FlyString const& name) const;
+    ThrowCompletionOr<bool> can_declare_global_var(FlyString const& name) const;
     bool can_declare_global_function(FlyString const& name) const;
     bool can_declare_global_function(FlyString const& name) const;
     void create_global_var_binding(FlyString const& name, bool can_be_deleted);
     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);
     void create_global_function_binding(FlyString const& name, Value, bool can_be_deleted);