1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-25 22:35:07 +00:00

LibJS: Fix ProxyObject get/set with symbol property name

We can't assume that property names can be converted to strings anymore,
as we have symbols. Use name.to_value() instead.

This makes something like this possible:

    new Proxy(Object, { get(t, p) { return t[p] }  })[Symbol.hasInstance]
This commit is contained in:
Linus Groh 2020-11-04 21:55:15 +00:00 committed by Andreas Kling
parent 44e38b8457
commit 2cf8649d0e
3 changed files with 8 additions and 5 deletions

View file

@ -229,7 +229,7 @@ Optional<PropertyDescriptor> ProxyObject::get_own_property_descriptor(const Prop
return {};
}
auto trap_result = vm.call(trap.as_function(), Value(&m_handler), Value(&m_target), js_string(vm, name.to_string()));
auto trap_result = vm.call(trap.as_function(), Value(&m_handler), Value(&m_target), name.to_value(vm));
if (vm.exception())
return {};
if (!trap_result.is_object() && !trap_result.is_undefined()) {
@ -337,7 +337,7 @@ bool ProxyObject::has_property(const PropertyName& name) const
return false;
}
auto trap_result = vm.call(trap.as_function(), Value(&m_handler), Value(&m_target), js_string(vm, name.to_string()));
auto trap_result = vm.call(trap.as_function(), Value(&m_handler), Value(&m_target), name.to_value(vm));
if (vm.exception())
return false;
if (!trap_result.to_boolean()) {
@ -376,7 +376,7 @@ Value ProxyObject::get(const PropertyName& name, Value) const
return {};
}
auto trap_result = vm.call(trap.as_function(), Value(&m_handler), Value(&m_target), js_string(vm, name.to_string()), Value(const_cast<ProxyObject*>(this)));
auto trap_result = vm.call(trap.as_function(), Value(&m_handler), Value(&m_target), name.to_value(vm), Value(const_cast<ProxyObject*>(this)));
if (vm.exception())
return {};
auto target_desc = m_target.get_own_property_descriptor(name);
@ -411,7 +411,7 @@ bool ProxyObject::put(const PropertyName& name, Value value, Value)
vm.throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "set");
return false;
}
auto trap_result = vm.call(trap.as_function(), Value(&m_handler), Value(&m_target), js_string(vm, name.to_string()), value, Value(const_cast<ProxyObject*>(this)));
auto trap_result = vm.call(trap.as_function(), Value(&m_handler), Value(&m_target), name.to_value(vm), value, Value(const_cast<ProxyObject*>(this)));
if (vm.exception() || !trap_result.to_boolean())
return false;
auto target_desc = m_target.get_own_property_descriptor(name);
@ -446,7 +446,7 @@ Value ProxyObject::delete_property(const PropertyName& name)
return {};
}
auto trap_result = vm.call(trap.as_function(), Value(&m_handler), Value(&m_target), js_string(vm, name.to_string()));
auto trap_result = vm.call(trap.as_function(), Value(&m_handler), Value(&m_target), name.to_value(vm));
if (vm.exception())
return {};
if (!trap_result.to_boolean())