Ver Fonte

LibJS: Convert to_property_key() to ThrowCompletionOr

Idan Horowitz há 3 anos atrás
pai
commit
c488f5a59d

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

@@ -1043,7 +1043,7 @@ Reference MemberExpression::to_reference(Interpreter& interpreter, GlobalObject&
             if (interpreter.exception())
                 return {};
             // 5. Let propertyKey be ? ToPropertyKey(propertyNameValue).
-            property_key = property_name_value.to_property_key(global_object);
+            property_key = TRY_OR_DISCARD(property_name_value.to_property_key(global_object));
         } else {
             // SuperProperty : super . IdentifierName
 
@@ -1273,9 +1273,7 @@ ThrowCompletionOr<Value> ClassExpression::class_definition_evaluation(Interprete
         if (auto* exception = interpreter.exception())
             return throw_completion(exception->value());
 
-        auto property_key = key.to_property_key(global_object);
-        if (auto* exception = interpreter.exception())
-            return throw_completion(exception->value());
+        auto property_key = TRY(key.to_property_key(global_object));
 
         auto& target = method.is_static() ? *class_constructor : class_prototype.as_object();
         method_function.set_home_object(&target);
@@ -1302,9 +1300,7 @@ ThrowCompletionOr<Value> ClassExpression::class_definition_evaluation(Interprete
         if (auto* exception = interpreter.exception())
             return throw_completion(exception->value());
 
-        auto property_key = key.to_property_key(global_object);
-        if (auto* exception = interpreter.exception())
-            return throw_completion(exception->value());
+        auto property_key = TRY(key.to_property_key(global_object));
 
         ECMAScriptFunctionObject* initializer = nullptr;
         if (field.initializer()) {

+ 10 - 7
Userland/Libraries/LibJS/Bytecode/Op.cpp

@@ -201,7 +201,10 @@ void CopyObjectExcludingProperties::execute_impl(Bytecode::Interpreter& interpre
 
     for (auto& key : own_keys) {
         if (!excluded_names.contains(key)) {
-            auto property_name = PropertyName(key.to_property_key(interpreter.global_object()));
+            auto property_name_or_error = key.to_property_key(interpreter.global_object());
+            if (property_name_or_error.is_error())
+                return;
+            PropertyName property_name = property_name_or_error.release_value();
             auto property_value_or_error = from_object->get(property_name);
             if (property_value_or_error.is_error())
                 return;
@@ -443,10 +446,10 @@ void GetByValue::execute_impl(Bytecode::Interpreter& interpreter) const
     if (object_or_error.is_error())
         return;
     auto* object = object_or_error.release_value();
-    auto property_key = interpreter.accumulator().to_property_key(interpreter.global_object());
-    if (interpreter.vm().exception())
+    auto property_key_or_error = interpreter.accumulator().to_property_key(interpreter.global_object());
+    if (property_key_or_error.is_error())
         return;
-    auto value_or_error = object->get(property_key);
+    auto value_or_error = object->get(property_key_or_error.release_value());
     if (value_or_error.is_error())
         return;
     interpreter.accumulator() = value_or_error.release_value();
@@ -458,10 +461,10 @@ void PutByValue::execute_impl(Bytecode::Interpreter& interpreter) const
     if (object_or_error.is_error())
         return;
     auto* object = object_or_error.release_value();
-    auto property_key = interpreter.reg(m_property).to_property_key(interpreter.global_object());
-    if (interpreter.vm().exception())
+    auto property_key_or_error = interpreter.reg(m_property).to_property_key(interpreter.global_object());
+    if (property_key_or_error.is_error())
         return;
-    MUST(object->set(property_key, interpreter.accumulator(), Object::ShouldThrowExceptions::Yes));
+    MUST(object->set(property_key_or_error.release_value(), interpreter.accumulator(), Object::ShouldThrowExceptions::Yes));
 }
 
 void GetIterator::execute_impl(Bytecode::Interpreter& interpreter) const

+ 6 - 12
Userland/Libraries/LibJS/Runtime/ObjectConstructor.cpp

@@ -247,10 +247,10 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::from_entries)
         if (value_or_error.is_error())
             return IterationDecision::Break;
         auto value = value_or_error.release_value();
-        auto property_key = key.to_property_key(global_object);
-        if (vm.exception())
+        auto property_key_or_error = key.to_property_key(global_object);
+        if (property_key_or_error.is_error())
             return IterationDecision::Break;
-        auto result_or_error = object->create_data_property_or_throw(property_key, value);
+        auto result_or_error = object->create_data_property_or_throw(property_key_or_error.release_value(), value);
         if (result_or_error.is_error())
             return IterationDecision::Break;
         return IterationDecision::Continue;
@@ -278,9 +278,7 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::seal)
 JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::get_own_property_descriptor)
 {
     auto* object = TRY_OR_DISCARD(vm.argument(0).to_object(global_object));
-    auto key = vm.argument(1).to_property_key(global_object);
-    if (vm.exception())
-        return {};
+    auto key = TRY_OR_DISCARD(vm.argument(1).to_property_key(global_object));
     auto descriptor = TRY_OR_DISCARD(object->internal_get_own_property(key));
     return from_property_descriptor(global_object, descriptor);
 }
@@ -323,9 +321,7 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::define_property)
         vm.throw_exception<TypeError>(global_object, ErrorType::NotAnObject, vm.argument(0).to_string_without_side_effects());
         return {};
     }
-    auto key = vm.argument(1).to_property_key(global_object);
-    if (vm.exception())
-        return {};
+    auto key = TRY_OR_DISCARD(vm.argument(1).to_property_key(global_object));
     auto descriptor = TRY_OR_DISCARD(to_property_descriptor(global_object, vm.argument(2)));
     TRY_OR_DISCARD(vm.argument(0).as_object().define_property_or_throw(key, descriptor));
     return vm.argument(0);
@@ -409,9 +405,7 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::has_own)
     auto* object = TRY_OR_DISCARD(vm.argument(0).to_object(global_object));
 
     // 2. Let key be ? ToPropertyKey(P).
-    auto key = vm.argument(1).to_property_key(global_object);
-    if (vm.exception())
-        return {};
+    auto key = TRY_OR_DISCARD(vm.argument(1).to_property_key(global_object));
 
     // 3. Return ? HasOwnProperty(obj, key).
     return Value(TRY_OR_DISCARD(object->has_own_property(key)));

+ 6 - 18
Userland/Libraries/LibJS/Runtime/ObjectPrototype.cpp

@@ -62,9 +62,7 @@ ThrowCompletionOr<bool> ObjectPrototype::internal_set_prototype_of(Object* proto
 // 20.1.3.2 Object.prototype.hasOwnProperty ( V ), https://tc39.es/ecma262/#sec-object.prototype.hasownproperty
 JS_DEFINE_NATIVE_FUNCTION(ObjectPrototype::has_own_property)
 {
-    auto property_key = vm.argument(0).to_property_key(global_object);
-    if (vm.exception())
-        return {};
+    auto property_key = TRY_OR_DISCARD(vm.argument(0).to_property_key(global_object));
     auto* this_object = TRY_OR_DISCARD(vm.this_value(global_object).to_object(global_object));
     return Value(TRY_OR_DISCARD(this_object->has_own_property(property_key)));
 }
@@ -154,9 +152,7 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectPrototype::value_of)
 JS_DEFINE_NATIVE_FUNCTION(ObjectPrototype::property_is_enumerable)
 {
     // 1. Let P be ? ToPropertyKey(V).
-    auto property_key = vm.argument(0).to_property_key(global_object);
-    if (vm.exception())
-        return {};
+    auto property_key = TRY_OR_DISCARD(vm.argument(0).to_property_key(global_object));
     // 2. Let O be ? ToObject(this value).
     auto* this_object = TRY_OR_DISCARD(vm.this_value(global_object).to_object(global_object));
     // 3. Let desc be ? O.[[GetOwnProperty]](P).
@@ -199,9 +195,7 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectPrototype::define_getter)
 
     auto descriptor = PropertyDescriptor { .get = &getter.as_function(), .enumerable = true, .configurable = true };
 
-    auto key = vm.argument(0).to_property_key(global_object);
-    if (vm.exception())
-        return {};
+    auto key = TRY_OR_DISCARD(vm.argument(0).to_property_key(global_object));
 
     TRY_OR_DISCARD(object->define_property_or_throw(key, descriptor));
 
@@ -221,9 +215,7 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectPrototype::define_setter)
 
     auto descriptor = PropertyDescriptor { .set = &setter.as_function(), .enumerable = true, .configurable = true };
 
-    auto key = vm.argument(0).to_property_key(global_object);
-    if (vm.exception())
-        return {};
+    auto key = TRY_OR_DISCARD(vm.argument(0).to_property_key(global_object));
 
     TRY_OR_DISCARD(object->define_property_or_throw(key, descriptor));
 
@@ -235,9 +227,7 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectPrototype::lookup_getter)
 {
     auto* object = TRY_OR_DISCARD(vm.this_value(global_object).to_object(global_object));
 
-    auto key = vm.argument(0).to_property_key(global_object);
-    if (vm.exception())
-        return {};
+    auto key = TRY_OR_DISCARD(vm.argument(0).to_property_key(global_object));
 
     while (object) {
         auto desc = TRY_OR_DISCARD(object->internal_get_own_property(key));
@@ -257,9 +247,7 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectPrototype::lookup_setter)
 {
     auto* object = TRY_OR_DISCARD(vm.this_value(global_object).to_object(global_object));
 
-    auto key = vm.argument(0).to_property_key(global_object);
-    if (vm.exception())
-        return {};
+    auto key = TRY_OR_DISCARD(vm.argument(0).to_property_key(global_object));
 
     while (object) {
         auto desc = TRY_OR_DISCARD(object->internal_get_own_property(key));

+ 1 - 2
Userland/Libraries/LibJS/Runtime/ProxyObject.cpp

@@ -673,8 +673,7 @@ ThrowCompletionOr<MarkedValueList> ProxyObject::internal_own_property_keys() con
         auto& vm = global_object.vm();
         if (!value.is_string() && !value.is_symbol())
             return vm.throw_completion<TypeError>(global_object, ErrorType::ProxyOwnPropertyKeysNotStringOrSymbol);
-        auto property_key = value.to_property_key(global_object);
-        VERIFY(!vm.exception());
+        auto property_key = MUST(value.to_property_key(global_object));
         unique_keys.set(property_key, AK::HashSetExistingEntryBehavior::Keep);
         return {};
     }));

+ 6 - 18
Userland/Libraries/LibJS/Runtime/ReflectObject.cpp

@@ -112,9 +112,7 @@ JS_DEFINE_NATIVE_FUNCTION(ReflectObject::define_property)
     }
 
     // 2. Let key be ? ToPropertyKey(propertyKey).
-    auto key = property_key.to_property_key(global_object);
-    if (vm.exception())
-        return {};
+    auto key = TRY_OR_DISCARD(property_key.to_property_key(global_object));
 
     // 3. Let desc be ? ToPropertyDescriptor(attributes).
     auto descriptor = TRY_OR_DISCARD(to_property_descriptor(global_object, attributes));
@@ -136,9 +134,7 @@ JS_DEFINE_NATIVE_FUNCTION(ReflectObject::delete_property)
     }
 
     // 2. Let key be ? ToPropertyKey(propertyKey).
-    auto key = property_key.to_property_key(global_object);
-    if (vm.exception())
-        return {};
+    auto key = TRY_OR_DISCARD(property_key.to_property_key(global_object));
 
     // 3. Return ? target.[[Delete]](key).
     return Value(TRY_OR_DISCARD(target.as_object().internal_delete(key)));
@@ -158,9 +154,7 @@ JS_DEFINE_NATIVE_FUNCTION(ReflectObject::get)
     }
 
     // 2. Let key be ? ToPropertyKey(propertyKey).
-    auto key = property_key.to_property_key(global_object);
-    if (vm.exception())
-        return {};
+    auto key = TRY_OR_DISCARD(property_key.to_property_key(global_object));
 
     // 3. If receiver is not present, then
     if (vm.argument_count() < 3) {
@@ -185,9 +179,7 @@ JS_DEFINE_NATIVE_FUNCTION(ReflectObject::get_own_property_descriptor)
     }
 
     // 2. Let key be ? ToPropertyKey(propertyKey).
-    auto key = property_key.to_property_key(global_object);
-    if (vm.exception())
-        return {};
+    auto key = TRY_OR_DISCARD(property_key.to_property_key(global_object));
 
     // 3. Let desc be ? target.[[GetOwnProperty]](key).
     auto descriptor = TRY_OR_DISCARD(target.as_object().internal_get_own_property(key));
@@ -224,9 +216,7 @@ JS_DEFINE_NATIVE_FUNCTION(ReflectObject::has)
     }
 
     // 2. Let key be ? ToPropertyKey(propertyKey).
-    auto key = property_key.to_property_key(global_object);
-    if (vm.exception())
-        return {};
+    auto key = TRY_OR_DISCARD(property_key.to_property_key(global_object));
 
     // 3. Return ? target.[[HasProperty]](key).
     return Value(TRY_OR_DISCARD(target.as_object().internal_has_property(key)));
@@ -295,9 +285,7 @@ JS_DEFINE_NATIVE_FUNCTION(ReflectObject::set)
     }
 
     // 2. Let key be ? ToPropertyKey(propertyKey).
-    auto key = property_key.to_property_key(global_object);
-    if (vm.exception())
-        return {};
+    auto key = TRY_OR_DISCARD(property_key.to_property_key(global_object));
 
     // 3. If receiver is not present, then
     if (vm.argument_count() < 4) {

+ 4 - 1
Userland/Libraries/LibJS/Runtime/VM.cpp

@@ -263,7 +263,10 @@ ThrowCompletionOr<void> VM::property_binding_initialization(BindingPattern const
                 auto result = expression->execute(interpreter(), global_object);
                 if (exception())
                     return;
-                name = result.to_property_key(global_object);
+                auto name_or_error = result.to_property_key(global_object);
+                if (name_or_error.is_error())
+                    return;
+                name = name_or_error.release_value();
             });
 
         if (auto* thrown_exception = exception())

+ 5 - 7
Userland/Libraries/LibJS/Runtime/Value.cpp

@@ -568,12 +568,12 @@ ThrowCompletionOr<double> Value::to_double(GlobalObject& global_object) const
 }
 
 // 7.1.19 ToPropertyKey ( argument ), https://tc39.es/ecma262/#sec-topropertykey
-StringOrSymbol Value::to_property_key(GlobalObject& global_object) const
+ThrowCompletionOr<StringOrSymbol> Value::to_property_key(GlobalObject& global_object) const
 {
-    auto key = TRY_OR_DISCARD(to_primitive(global_object, PreferredType::String));
+    auto key = TRY(to_primitive(global_object, PreferredType::String));
     if (key.is_symbol())
-        return &key.as_symbol();
-    return TRY_OR_DISCARD(key.to_string(global_object));
+        return StringOrSymbol { &key.as_symbol() };
+    return StringOrSymbol { TRY(key.to_string(global_object)) };
 }
 
 i32 Value::to_i32_slow_case(GlobalObject& global_object) const
@@ -1181,9 +1181,7 @@ Value in(GlobalObject& global_object, Value lhs, Value rhs)
         global_object.vm().throw_exception<TypeError>(global_object, ErrorType::InOperatorWithObject);
         return {};
     }
-    auto lhs_property_key = lhs.to_property_key(global_object);
-    if (global_object.vm().exception())
-        return {};
+    auto lhs_property_key = TRY_OR_DISCARD(lhs.to_property_key(global_object));
     return Value(TRY_OR_DISCARD(rhs.as_object().has_property(lhs_property_key)));
 }
 

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

@@ -314,7 +314,7 @@ public:
     ThrowCompletionOr<i64> to_bigint_int64(GlobalObject&) const;
     ThrowCompletionOr<u64> to_bigint_uint64(GlobalObject&) const;
     ThrowCompletionOr<double> to_double(GlobalObject&) const;
-    StringOrSymbol to_property_key(GlobalObject&) const;
+    ThrowCompletionOr<StringOrSymbol> to_property_key(GlobalObject&) const;
     i32 to_i32(GlobalObject& global_object) const
     {
         if (m_type == Type::Int32)