mirror of
https://github.com/RGBCube/serenity
synced 2025-07-24 20:07:34 +00:00
LibJS: Convert to_property_key() to ThrowCompletionOr
This commit is contained in:
parent
1639ed7e0a
commit
c488f5a59d
9 changed files with 42 additions and 73 deletions
|
@ -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()) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)));
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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 {};
|
||||
}));
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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)));
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue