LibJS: Fix propagation of setters and getters from prototypes

If we define a property with just a setter/getter (not both) we must:
- take the previous getter/setter if defined on the actual object
- overwrite the other to nullptr if it is from a prototype
This commit is contained in:
davidot 2021-06-25 17:01:00 +02:00 committed by Linus Groh
parent b1441a47b1
commit 19f505d320
Notes: sideshowbarker 2024-07-18 11:28:40 +09:00

View file

@ -438,11 +438,13 @@ Value Object::get_own_property_descriptor_object(const PropertyName& property_na
if (descriptor.is_data_descriptor()) {
descriptor_object->define_property(vm.names.value, descriptor.value.value_or(js_undefined()));
descriptor_object->define_property(vm.names.writable, Value(descriptor.attributes.is_writable()));
} else {
VERIFY(descriptor.is_accessor_descriptor());
}
if (descriptor.is_accessor_descriptor()) {
descriptor_object->define_property(vm.names.get, descriptor.getter ? Value(descriptor.getter) : js_undefined());
descriptor_object->define_property(vm.names.set, descriptor.setter ? Value(descriptor.setter) : js_undefined());
}
descriptor_object->define_property(vm.names.enumerable, Value(descriptor.attributes.is_enumerable()));
descriptor_object->define_property(vm.names.configurable, Value(descriptor.attributes.is_configurable()));
return descriptor_object;
@ -491,7 +493,8 @@ bool Object::define_property(const StringOrSymbol& property_name, const Object&
Function* getter_function { nullptr };
Function* setter_function { nullptr };
auto existing_property = get_without_side_effects(property_name).value_or(js_undefined());
// We should only take previous getters for our own object not from any prototype
auto existing_property = get_own_property(property_name, {}, AllowSideEffects::No).value_or(js_undefined());
if (getter.is_function()) {
getter_function = &getter.as_function();