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 // 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(); auto& global_object = this->global_object();
@ -283,14 +283,14 @@ bool Object::set_integrity_level(IntegrityLevel level)
VERIFY(level == IntegrityLevel::Sealed || level == IntegrityLevel::Frozen); VERIFY(level == IntegrityLevel::Sealed || level == IntegrityLevel::Frozen);
// 3. Let status be ? O.[[PreventExtensions]](). // 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. // 4. If status is false, return false.
if (!status) if (!status)
return false; return false;
// 5. Let keys be ? O.[[OwnPropertyKeys]](). // 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 // 6. If level is sealed, then
if (level == IntegrityLevel::Sealed) { if (level == IntegrityLevel::Sealed) {
@ -299,7 +299,7 @@ bool Object::set_integrity_level(IntegrityLevel level)
auto property_name = PropertyName::from_value(global_object, key); auto property_name = PropertyName::from_value(global_object, key);
// i. Perform ? DefinePropertyOrThrow(O, k, PropertyDescriptor { [[Configurable]]: false }). // 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, // 7. Else,
@ -311,7 +311,7 @@ bool Object::set_integrity_level(IntegrityLevel level)
auto property_name = PropertyName::from_value(global_object, key); auto property_name = PropertyName::from_value(global_object, key);
// i. Let currentDesc be ? O.[[GetOwnProperty]](k). // 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 // ii. If currentDesc is not undefined, then
if (!current_descriptor.has_value()) if (!current_descriptor.has_value())
@ -331,7 +331,7 @@ bool Object::set_integrity_level(IntegrityLevel level)
} }
// 3. Perform ? DefinePropertyOrThrow(O, k, desc). // 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> delete_property_or_throw(PropertyName const&);
ThrowCompletionOr<bool> has_property(PropertyName const&) const; ThrowCompletionOr<bool> has_property(PropertyName const&) const;
ThrowCompletionOr<bool> has_own_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; bool test_integrity_level(IntegrityLevel) const;
MarkedValueList enumerable_own_property_names(PropertyKind kind) 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); 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); auto argument = vm.argument(0);
if (!argument.is_object()) if (!argument.is_object())
return argument; return argument;
auto status = argument.as_object().set_integrity_level(Object::IntegrityLevel::Frozen); auto status = TRY_OR_DISCARD(argument.as_object().set_integrity_level(Object::IntegrityLevel::Frozen));
if (vm.exception())
return {};
if (!status) { if (!status) {
vm.throw_exception<TypeError>(global_object, ErrorType::ObjectFreezeFailed); vm.throw_exception<TypeError>(global_object, ErrorType::ObjectFreezeFailed);
return {}; return {};
@ -272,9 +270,7 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::seal)
auto argument = vm.argument(0); auto argument = vm.argument(0);
if (!argument.is_object()) if (!argument.is_object())
return argument; return argument;
auto status = argument.as_object().set_integrity_level(Object::IntegrityLevel::Sealed); auto status = TRY_OR_DISCARD(argument.as_object().set_integrity_level(Object::IntegrityLevel::Sealed));
if (vm.exception())
return {};
if (!status) { if (!status) {
vm.throw_exception<TypeError>(global_object, ErrorType::ObjectSealFailed); vm.throw_exception<TypeError>(global_object, ErrorType::ObjectSealFailed);
return {}; 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) void WebAssemblyInstanceObject::visit_edges(Visitor& visitor)