LibWeb: Convert is_named_property_exposed_on_object to ThrowCompletions

This is the last usage of old-style exceptions in the WrapperGenerator.
This commit is contained in:
Idan Horowitz 2021-11-02 10:00:36 +02:00
parent 07b0aded99
commit 19e28d5798
Notes: sideshowbarker 2024-07-18 01:37:45 +09:00

View file

@ -1550,7 +1550,7 @@ private:
if (interface.is_legacy_platform_object()) { if (interface.is_legacy_platform_object()) {
generator.append(R"~~~( generator.append(R"~~~(
bool is_named_property_exposed_on_object(JS::PropertyKey const&) const; JS::ThrowCompletionOr<bool> is_named_property_exposed_on_object(JS::PropertyKey const&) const;
JS::ThrowCompletionOr<Optional<JS::PropertyDescriptor>> legacy_platform_object_get_own_property_for_get_own_property_slot(JS::PropertyKey const&) const; JS::ThrowCompletionOr<Optional<JS::PropertyDescriptor>> legacy_platform_object_get_own_property_for_get_own_property_slot(JS::PropertyKey const&) const;
JS::ThrowCompletionOr<Optional<JS::PropertyDescriptor>> legacy_platform_object_get_own_property_for_set_slot(JS::PropertyKey const&) const; JS::ThrowCompletionOr<Optional<JS::PropertyDescriptor>> legacy_platform_object_get_own_property_for_set_slot(JS::PropertyKey const&) const;
)~~~"); )~~~");
@ -1730,7 +1730,7 @@ static JS::Value wrap_for_legacy_platform_object_get_own_property(JS::GlobalObje
// https://webidl.spec.whatwg.org/#dfn-named-property-visibility // https://webidl.spec.whatwg.org/#dfn-named-property-visibility
scoped_generator.append(R"~~~( scoped_generator.append(R"~~~(
bool @class_name@::is_named_property_exposed_on_object(JS::PropertyKey const& property_name) const JS::ThrowCompletionOr<bool> @class_name@::is_named_property_exposed_on_object(JS::PropertyKey const& property_name) const
{ {
[[maybe_unused]] auto& vm = this->vm(); [[maybe_unused]] auto& vm = this->vm();
@ -1750,7 +1750,7 @@ bool @class_name@::is_named_property_exposed_on_object(JS::PropertyKey const& pr
// 2. If O has an own property named P, then return false. // 2. If O has an own property named P, then return false.
// NOTE: This has to be done manually instead of using Object::has_own_property, as that would use the overrided internal_get_own_property. // NOTE: This has to be done manually instead of using Object::has_own_property, as that would use the overrided internal_get_own_property.
auto own_property_named_p = TRY_OR_DISCARD(Object::internal_get_own_property(property_name)); auto own_property_named_p = MUST(Object::internal_get_own_property(property_name));
if (own_property_named_p.has_value()) if (own_property_named_p.has_value())
return false; return false;
@ -1766,18 +1766,18 @@ bool @class_name@::is_named_property_exposed_on_object(JS::PropertyKey const& pr
scoped_generator.append(R"~~~( scoped_generator.append(R"~~~(
// NOTE: Step 3 is not here as the interface doesn't have the LegacyOverrideBuiltIns extended attribute. // NOTE: Step 3 is not here as the interface doesn't have the LegacyOverrideBuiltIns extended attribute.
// 4. Let prototype be O.[[GetPrototypeOf]](). // 4. Let prototype be O.[[GetPrototypeOf]]().
auto* prototype = TRY_OR_DISCARD(internal_get_prototype_of()); auto* prototype = TRY(internal_get_prototype_of());
// 5. While prototype is not null: // 5. While prototype is not null:
while (prototype) { while (prototype) {
// FIXME: 1. If prototype is not a named properties object, and prototype has an own property named P, then return false. // FIXME: 1. If prototype is not a named properties object, and prototype has an own property named P, then return false.
// (It currently does not check for named property objects) // (It currently does not check for named property objects)
bool prototype_has_own_property_named_p = TRY_OR_DISCARD(prototype->has_own_property(property_name)); bool prototype_has_own_property_named_p = TRY(prototype->has_own_property(property_name));
if (prototype_has_own_property_named_p) if (prototype_has_own_property_named_p)
return false; return false;
// 2. Set prototype to prototype.[[GetPrototypeOf]](). // 2. Set prototype to prototype.[[GetPrototypeOf]]().
prototype = TRY_OR_DISCARD(prototype->internal_get_prototype_of()); prototype = TRY(prototype->internal_get_prototype_of());
} }
// 6. Return true. // 6. Return true.
@ -1881,7 +1881,7 @@ JS::ThrowCompletionOr<Optional<JS::PropertyDescriptor>> @class_name@::legacy_pla
if (interface.supports_named_properties() && ignore_named_props == IgnoreNamedProps::No) { if (interface.supports_named_properties() && ignore_named_props == IgnoreNamedProps::No) {
get_own_property_generator.append(R"~~~( get_own_property_generator.append(R"~~~(
// 1. If the result of running the named property visibility algorithm with property name P and object O is true, then: // 1. If the result of running the named property visibility algorithm with property name P and object O is true, then:
if (is_named_property_exposed_on_object(property_name)) { if (TRY(is_named_property_exposed_on_object(property_name))) {
// FIXME: It's unfortunate that this is done twice, once in is_named_property_exposed_on_object and here. // FIXME: It's unfortunate that this is done twice, once in is_named_property_exposed_on_object and here.
auto property_name_string = property_name.to_string(); auto property_name_string = property_name.to_string();
)~~~"); )~~~");
@ -2277,7 +2277,7 @@ JS::ThrowCompletionOr<bool> @class_name@::internal_delete(JS::PropertyKey const&
if (interface.supports_named_properties() && !interface.extended_attributes.contains("Global")) { if (interface.supports_named_properties() && !interface.extended_attributes.contains("Global")) {
// ...and the result of calling the named property visibility algorithm with property name P and object O is true, then: // ...and the result of calling the named property visibility algorithm with property name P and object O is true, then:
scoped_generator.append(R"~~~( scoped_generator.append(R"~~~(
if (is_named_property_exposed_on_object(property_name)) { if (TRY(is_named_property_exposed_on_object(property_name))) {
)~~~"); )~~~");
// 1. If O does not implement an interface with a named property deleter, then return false. // 1. If O does not implement an interface with a named property deleter, then return false.
@ -2387,7 +2387,7 @@ JS::ThrowCompletionOr<JS::MarkedValueList> @class_name@::internal_own_property_k
if (interface.supports_named_properties()) { if (interface.supports_named_properties()) {
scoped_generator.append(R"~~~( scoped_generator.append(R"~~~(
for (auto& named_property : impl().supported_property_names()) { for (auto& named_property : impl().supported_property_names()) {
if (is_named_property_exposed_on_object(named_property)) if (TRY(is_named_property_exposed_on_object(named_property)))
keys.append(js_string(vm, named_property)); keys.append(js_string(vm, named_property));
} }
)~~~"); )~~~");