mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 06:58:11 +00:00
LibJS: Handle "receiver" argument in Reflect.{get,set}()
This commit is contained in:
parent
f08aa6324e
commit
afcfea2001
7 changed files with 60 additions and 17 deletions
|
@ -152,7 +152,7 @@ bool Object::prevent_extensions()
|
|||
return true;
|
||||
}
|
||||
|
||||
Value Object::get_own_property(const Object& this_object, PropertyName property_name) const
|
||||
Value Object::get_own_property(const Object& this_object, PropertyName property_name, Value receiver) const
|
||||
{
|
||||
Value value_here;
|
||||
|
||||
|
@ -170,7 +170,7 @@ Value Object::get_own_property(const Object& this_object, PropertyName property_
|
|||
|
||||
ASSERT(!value_here.is_empty());
|
||||
if (value_here.is_accessor()) {
|
||||
return value_here.as_accessor().call_getter(Value(const_cast<Object*>(this)));
|
||||
return value_here.as_accessor().call_getter(receiver);
|
||||
}
|
||||
if (value_here.is_native_property())
|
||||
return call_native_property_getter(const_cast<Object*>(&this_object), value_here);
|
||||
|
@ -605,7 +605,7 @@ Value Object::get_by_index(u32 property_index) const
|
|||
return {};
|
||||
}
|
||||
|
||||
Value Object::get(PropertyName property_name) const
|
||||
Value Object::get(PropertyName property_name, Value receiver) const
|
||||
{
|
||||
if (property_name.is_number())
|
||||
return get_by_index(property_name.as_number());
|
||||
|
@ -617,7 +617,9 @@ Value Object::get(PropertyName property_name) const
|
|||
|
||||
const Object* object = this;
|
||||
while (object) {
|
||||
auto value = object->get_own_property(*this, property_name);
|
||||
if (receiver.is_empty())
|
||||
receiver = Value(const_cast<Object*>(this));
|
||||
auto value = object->get_own_property(*this, property_name, receiver);
|
||||
if (interpreter().exception())
|
||||
return {};
|
||||
if (!value.is_empty())
|
||||
|
@ -656,7 +658,7 @@ bool Object::put_by_index(u32 property_index, Value value)
|
|||
return put_own_property_by_index(*this, property_index, value, default_attributes, PutOwnPropertyMode::Put);
|
||||
}
|
||||
|
||||
bool Object::put(PropertyName property_name, Value value)
|
||||
bool Object::put(PropertyName property_name, Value value, Value receiver)
|
||||
{
|
||||
if (property_name.is_number())
|
||||
return put_by_index(property_name.as_number(), value);
|
||||
|
@ -676,7 +678,9 @@ bool Object::put(PropertyName property_name, Value value)
|
|||
if (metadata.has_value()) {
|
||||
auto value_here = object->m_storage[metadata.value().offset];
|
||||
if (value_here.is_accessor()) {
|
||||
value_here.as_accessor().call_setter(Value(this), value);
|
||||
if (receiver.is_empty())
|
||||
receiver = Value(this);
|
||||
value_here.as_accessor().call_setter(receiver, value);
|
||||
return true;
|
||||
}
|
||||
if (value_here.is_native_property()) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue