Skip to content

Commit 29e96ec

Browse files
committed
LibJS: Convert PropertyKey::from_value() to ThrowCompletionOr
Lots of MUST() - perhaps we'll eventually come up with a better API for the common case where it can't fail.
1 parent 62356cf commit 29e96ec

File tree

7 files changed

+23
-25
lines changed

7 files changed

+23
-25
lines changed

Userland/Libraries/LibJS/AST.cpp

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1286,9 +1286,7 @@ ThrowCompletionOr<Reference> MemberExpression::to_reference(Interpreter& interpr
12861286

12871287
TRY(require_object_coercible(global_object, base_value));
12881288

1289-
property_name = PropertyKey::from_value(global_object, value);
1290-
if (auto* exception = interpreter.exception())
1291-
return throw_completion(exception->value());
1289+
property_name = TRY(PropertyKey::from_value(global_object, value));
12921290
} else if (is<PrivateIdentifier>(*m_property)) {
12931291
auto& private_identifier = static_cast<PrivateIdentifier const&>(*m_property);
12941292
return make_private_reference(interpreter.vm(), base_value, private_identifier.string());
@@ -1380,9 +1378,7 @@ static ThrowCompletionOr<ClassElement::ClassElementName> class_key_to_property_n
13801378
if (prop_key.is_object())
13811379
prop_key = TRY(prop_key.to_primitive(global_object, Value::PreferredType::String));
13821380

1383-
auto property_key = PropertyKey::from_value(global_object, prop_key);
1384-
if (auto* exception = interpreter.exception())
1385-
return throw_completion(exception->value());
1381+
auto property_key = TRY(PropertyKey::from_value(global_object, prop_key));
13861382
return ClassElement::ClassElementName { property_key };
13871383
}
13881384

@@ -2858,14 +2854,14 @@ Completion ObjectExpression::execute(Interpreter& interpreter, GlobalObject& glo
28582854
switch (property.type()) {
28592855
case ObjectProperty::Type::Getter:
28602856
VERIFY(value.is_function());
2861-
object->define_direct_accessor(PropertyKey::from_value(global_object, key), &value.as_function(), nullptr, Attribute::Configurable | Attribute::Enumerable);
2857+
object->define_direct_accessor(TRY(PropertyKey::from_value(global_object, key)), &value.as_function(), nullptr, Attribute::Configurable | Attribute::Enumerable);
28622858
break;
28632859
case ObjectProperty::Type::Setter:
28642860
VERIFY(value.is_function());
2865-
object->define_direct_accessor(PropertyKey::from_value(global_object, key), nullptr, &value.as_function(), Attribute::Configurable | Attribute::Enumerable);
2861+
object->define_direct_accessor(TRY(PropertyKey::from_value(global_object, key)), nullptr, &value.as_function(), Attribute::Configurable | Attribute::Enumerable);
28662862
break;
28672863
case ObjectProperty::Type::KeyValue:
2868-
object->define_direct_property(PropertyKey::from_value(global_object, key), value, JS::default_attributes);
2864+
object->define_direct_property(TRY(PropertyKey::from_value(global_object, key)), value, JS::default_attributes);
28692865
break;
28702866
case ObjectProperty::Type::Spread:
28712867
default:

Userland/Libraries/LibJS/Runtime/Object.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ ThrowCompletionOr<bool> Object::set_integrity_level(IntegrityLevel level)
296296
if (level == IntegrityLevel::Sealed) {
297297
// a. For each element k of keys, do
298298
for (auto& key : keys) {
299-
auto property_name = PropertyKey::from_value(global_object, key);
299+
auto property_name = MUST(PropertyKey::from_value(global_object, key));
300300

301301
// i. Perform ? DefinePropertyOrThrow(O, k, PropertyDescriptor { [[Configurable]]: false }).
302302
TRY(define_property_or_throw(property_name, { .configurable = false }));
@@ -308,7 +308,7 @@ ThrowCompletionOr<bool> Object::set_integrity_level(IntegrityLevel level)
308308

309309
// b. For each element k of keys, do
310310
for (auto& key : keys) {
311-
auto property_name = PropertyKey::from_value(global_object, key);
311+
auto property_name = MUST(PropertyKey::from_value(global_object, key));
312312

313313
// i. Let currentDesc be ? O.[[GetOwnProperty]](k).
314314
auto current_descriptor = TRY(internal_get_own_property(property_name));
@@ -360,7 +360,7 @@ ThrowCompletionOr<bool> Object::test_integrity_level(IntegrityLevel level) const
360360

361361
// 7. For each element k of keys, do
362362
for (auto& key : keys) {
363-
auto property_name = PropertyKey::from_value(global_object(), key);
363+
auto property_name = MUST(PropertyKey::from_value(global_object(), key));
364364

365365
// a. Let currentDesc be ? O.[[GetOwnProperty]](k).
366366
auto current_descriptor = TRY(internal_get_own_property(property_name));
@@ -405,7 +405,7 @@ ThrowCompletionOr<MarkedValueList> Object::enumerable_own_property_names(Propert
405405
// a. If Type(key) is String, then
406406
if (!key.is_string())
407407
continue;
408-
auto property_name = PropertyKey::from_value(global_object, key);
408+
auto property_name = MUST(PropertyKey::from_value(global_object, key));
409409

410410
// i. Let desc be ? O.[[GetOwnProperty]](key).
411411
auto descriptor = TRY(internal_get_own_property(property_name));
@@ -453,7 +453,7 @@ ThrowCompletionOr<Object*> Object::copy_data_properties(Value source, HashTable<
453453
auto* from_object = MUST(source.to_object(global_object));
454454

455455
for (auto& next_key_value : TRY(from_object->internal_own_property_keys())) {
456-
auto next_key = PropertyKey::from_value(global_object, next_key_value);
456+
auto next_key = MUST(PropertyKey::from_value(global_object, next_key_value));
457457
if (seen_names.contains(next_key))
458458
continue;
459459

@@ -1151,7 +1151,7 @@ ThrowCompletionOr<Object*> Object::define_properties(Value properties)
11511151

11521152
// 5. For each element nextKey of keys, do
11531153
for (auto& next_key : keys) {
1154-
auto property_name = PropertyKey::from_value(global_object, next_key);
1154+
auto property_name = MUST(PropertyKey::from_value(global_object, next_key));
11551155

11561156
// a. Let propDesc be ? props.[[GetOwnProperty]](nextKey).
11571157
auto property_descriptor = TRY(props->internal_get_own_property(property_name));

Userland/Libraries/LibJS/Runtime/ObjectConstructor.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::get_own_property_descriptors)
277277

278278
// 4. For each element key of ownKeys, do
279279
for (auto& key : own_keys) {
280-
auto property_name = PropertyKey::from_value(global_object, key);
280+
auto property_name = MUST(PropertyKey::from_value(global_object, key));
281281

282282
// a. Let desc be ? obj.[[GetOwnProperty]](key).
283283
auto desc = TRY(object->internal_get_own_property(property_name));
@@ -411,7 +411,7 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::assign)
411411

412412
// iii. For each element nextKey of keys, do
413413
for (auto& next_key : keys) {
414-
auto property_name = PropertyKey::from_value(global_object, next_key);
414+
auto property_name = MUST(PropertyKey::from_value(global_object, next_key));
415415

416416
// 1. Let desc be ? from.[[GetOwnProperty]](nextKey).
417417
auto desc = TRY(from->internal_get_own_property(property_name));

Userland/Libraries/LibJS/Runtime/PropertyKey.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,15 @@ class PropertyKey {
2626
No,
2727
};
2828

29-
static PropertyKey from_value(GlobalObject& global_object, Value value)
29+
static ThrowCompletionOr<PropertyKey> from_value(GlobalObject& global_object, Value value)
3030
{
3131
if (value.is_empty())
32-
return {};
32+
return PropertyKey {};
3333
if (value.is_symbol())
34-
return value.as_symbol();
34+
return PropertyKey { value.as_symbol() };
3535
if (value.is_integral_number() && value.as_double() >= 0 && value.as_double() < NumericLimits<u32>::max())
3636
return value.as_u32();
37-
return TRY_OR_DISCARD(value.to_string(global_object));
37+
return TRY(value.to_string(global_object));
3838
}
3939

4040
PropertyKey() { }

Userland/Libraries/LibJS/Runtime/ProxyObject.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -699,8 +699,10 @@ ThrowCompletionOr<MarkedValueList> ProxyObject::internal_own_property_keys() con
699699

700700
// 16. For each element key of targetKeys, do
701701
for (auto& key : target_keys) {
702+
auto property_key = MUST(PropertyKey::from_value(global_object, key));
703+
702704
// a. Let desc be ? target.[[GetOwnProperty]](key).
703-
auto descriptor = TRY(m_target.internal_get_own_property(PropertyKey::from_value(global_object, key)));
705+
auto descriptor = TRY(m_target.internal_get_own_property(property_key));
704706

705707
// b. If desc is not undefined and desc.[[Configurable]] is false, then
706708
if (descriptor.has_value() && !*descriptor->configurable) {

Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -810,7 +810,7 @@ ThrowCompletionOr<Object*> merge_largest_unit_option(GlobalObject& global_object
810810

811811
// 3. For each element nextKey of keys, do
812812
for (auto& key : keys) {
813-
auto next_key = PropertyKey::from_value(global_object, key);
813+
auto next_key = MUST(PropertyKey::from_value(global_object, key));
814814

815815
// a. Let propValue be ? Get(options, nextKey).
816816
auto prop_value = TRY(options.get(next_key));

Userland/Libraries/LibJS/Runtime/Temporal/Calendar.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -995,7 +995,7 @@ ThrowCompletionOr<Object*> default_merge_fields(GlobalObject& global_object, Obj
995995
for (auto& next_key : original_keys) {
996996
// a. If nextKey is not "month" or "monthCode", then
997997
if (next_key.as_string().string() != vm.names.month.as_string() && next_key.as_string().string() != vm.names.monthCode.as_string()) {
998-
auto property_name = PropertyKey::from_value(global_object, next_key);
998+
auto property_name = MUST(PropertyKey::from_value(global_object, next_key));
999999

10001000
// i. Let propValue be ? Get(fields, nextKey).
10011001
auto prop_value = TRY(fields.get(property_name));
@@ -1016,7 +1016,7 @@ ThrowCompletionOr<Object*> default_merge_fields(GlobalObject& global_object, Obj
10161016

10171017
// 5. For each element nextKey of newKeys, do
10181018
for (auto& next_key : new_keys) {
1019-
auto property_name = PropertyKey::from_value(global_object, next_key);
1019+
auto property_name = MUST(PropertyKey::from_value(global_object, next_key));
10201020

10211021
// a. Let propValue be ? Get(additionalFields, nextKey).
10221022
auto prop_value = TRY(additional_fields.get(property_name));

0 commit comments

Comments
 (0)