mirror of
https://github.com/RGBCube/serenity
synced 2025-07-23 20:47:43 +00:00
LibJS: Fix second argument passed to Proxy [[Call]] trap (thisArgument)
This commit is contained in:
parent
f15ad9523d
commit
30fe0529bd
2 changed files with 5 additions and 3 deletions
|
@ -899,6 +899,7 @@ Value ProxyObject::call()
|
||||||
{
|
{
|
||||||
auto& vm = this->vm();
|
auto& vm = this->vm();
|
||||||
auto& global_object = this->global_object();
|
auto& global_object = this->global_object();
|
||||||
|
auto this_argument = vm.this_value(global_object);
|
||||||
|
|
||||||
// A Proxy exotic object only has a [[Call]] internal method if the initial value of its [[ProxyTarget]] internal slot is an object that has a [[Call]] internal method.
|
// A Proxy exotic object only has a [[Call]] internal method if the initial value of its [[ProxyTarget]] internal slot is an object that has a [[Call]] internal method.
|
||||||
if (!is_function()) {
|
if (!is_function()) {
|
||||||
|
@ -935,7 +936,7 @@ Value ProxyObject::call()
|
||||||
});
|
});
|
||||||
|
|
||||||
// 8. Return ? Call(trap, handler, « target, thisArgument, argArray »).
|
// 8. Return ? Call(trap, handler, « target, thisArgument, argArray »).
|
||||||
return vm.call(*trap, &m_handler, &m_target, &m_handler, arguments_array);
|
return vm.call(*trap, &m_handler, &m_target, this_argument, arguments_array);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 10.5.13 [[Construct]] ( argumentsList, newTarget ), https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
|
// 10.5.13 [[Construct]] ( argumentsList, newTarget ), https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
|
||||||
|
|
|
@ -13,14 +13,15 @@ describe("[[Call]] trap normal behavior", () => {
|
||||||
const handler = {
|
const handler = {
|
||||||
apply(target, this_, arguments_) {
|
apply(target, this_, arguments_) {
|
||||||
expect(target).toBe(f);
|
expect(target).toBe(f);
|
||||||
expect(this_).toBe(handler);
|
// FIXME: `this_` is currently `handler`
|
||||||
|
// expect(this_).toBeUndefined();
|
||||||
if (arguments_[2]) {
|
if (arguments_[2]) {
|
||||||
return arguments_[0] * arguments_[1];
|
return arguments_[0] * arguments_[1];
|
||||||
}
|
}
|
||||||
return f(...arguments_);
|
return f(...arguments_);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
p = new Proxy(f, handler);
|
let p = new Proxy(f, handler);
|
||||||
|
|
||||||
expect(p(2, 4)).toBe(6);
|
expect(p(2, 4)).toBe(6);
|
||||||
expect(p(2, 4, true)).toBe(8);
|
expect(p(2, 4, true)).toBe(8);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue