LibJS: Convert set_integrity_level() to ThrowCompletionOr

This commit is contained in:
Linus Groh 2021-10-03 02:20:19 +01:00
parent 3be26f56db
commit ed5a9aa038
Notes: sideshowbarker 2024-07-18 03:07:03 +09:00
4 changed files with 10 additions and 14 deletions

View file

@ -273,7 +273,7 @@ ThrowCompletionOr<bool> Object::has_own_property(PropertyName const& property_na
}
// 7.3.15 SetIntegrityLevel ( O, level ), https://tc39.es/ecma262/#sec-setintegritylevel
bool Object::set_integrity_level(IntegrityLevel level)
ThrowCompletionOr<bool> Object::set_integrity_level(IntegrityLevel level)
{
auto& global_object = this->global_object();
@ -283,14 +283,14 @@ bool Object::set_integrity_level(IntegrityLevel level)
VERIFY(level == IntegrityLevel::Sealed || level == IntegrityLevel::Frozen);
// 3. Let status be ? O.[[PreventExtensions]]().
auto status = TRY_OR_DISCARD(internal_prevent_extensions());
auto status = TRY(internal_prevent_extensions());
// 4. If status is false, return false.
if (!status)
return false;
// 5. Let keys be ? O.[[OwnPropertyKeys]]().
auto keys = TRY_OR_DISCARD(internal_own_property_keys());
auto keys = TRY(internal_own_property_keys());
// 6. If level is sealed, then
if (level == IntegrityLevel::Sealed) {
@ -299,7 +299,7 @@ bool Object::set_integrity_level(IntegrityLevel level)
auto property_name = PropertyName::from_value(global_object, key);
// i. Perform ? DefinePropertyOrThrow(O, k, PropertyDescriptor { [[Configurable]]: false }).
TRY_OR_DISCARD(define_property_or_throw(property_name, { .configurable = false }));
TRY(define_property_or_throw(property_name, { .configurable = false }));
}
}
// 7. Else,
@ -311,7 +311,7 @@ bool Object::set_integrity_level(IntegrityLevel level)
auto property_name = PropertyName::from_value(global_object, key);
// i. Let currentDesc be ? O.[[GetOwnProperty]](k).
auto current_descriptor = TRY_OR_DISCARD(internal_get_own_property(property_name));
auto current_descriptor = TRY(internal_get_own_property(property_name));
// ii. If currentDesc is not undefined, then
if (!current_descriptor.has_value())
@ -331,7 +331,7 @@ bool Object::set_integrity_level(IntegrityLevel level)
}
// 3. Perform ? DefinePropertyOrThrow(O, k, desc).
TRY_OR_DISCARD(define_property_or_throw(property_name, descriptor));
TRY(define_property_or_throw(property_name, descriptor));
}
}

View file

@ -85,7 +85,7 @@ public:
ThrowCompletionOr<bool> delete_property_or_throw(PropertyName const&);
ThrowCompletionOr<bool> has_property(PropertyName const&) const;
ThrowCompletionOr<bool> has_own_property(PropertyName const&) const;
bool set_integrity_level(IntegrityLevel);
ThrowCompletionOr<bool> set_integrity_level(IntegrityLevel);
bool test_integrity_level(IntegrityLevel) const;
MarkedValueList enumerable_own_property_names(PropertyKind kind) const;
ThrowCompletionOr<Object*> copy_data_properties(Value source, HashTable<PropertyName, PropertyNameTraits> const& seen_names, GlobalObject& global_object);

View file

@ -221,9 +221,7 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::freeze)
auto argument = vm.argument(0);
if (!argument.is_object())
return argument;
auto status = argument.as_object().set_integrity_level(Object::IntegrityLevel::Frozen);
if (vm.exception())
return {};
auto status = TRY_OR_DISCARD(argument.as_object().set_integrity_level(Object::IntegrityLevel::Frozen));
if (!status) {
vm.throw_exception<TypeError>(global_object, ErrorType::ObjectFreezeFailed);
return {};
@ -272,9 +270,7 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::seal)
auto argument = vm.argument(0);
if (!argument.is_object())
return argument;
auto status = argument.as_object().set_integrity_level(Object::IntegrityLevel::Sealed);
if (vm.exception())
return {};
auto status = TRY_OR_DISCARD(argument.as_object().set_integrity_level(Object::IntegrityLevel::Sealed));
if (!status) {
vm.throw_exception<TypeError>(global_object, ErrorType::ObjectSealFailed);
return {};

View file

@ -54,7 +54,7 @@ void WebAssemblyInstanceObject::initialize(JS::GlobalObject& global_object)
});
}
m_exports_object->set_integrity_level(IntegrityLevel::Frozen);
MUST(m_exports_object->set_integrity_level(IntegrityLevel::Frozen));
}
void WebAssemblyInstanceObject::visit_edges(Visitor& visitor)