Browse Source

LibJS: Fix second argument passed to Proxy [[Call]] trap (thisArgument)

Linus Groh 4 years ago
parent
commit
30fe0529bd

+ 2 - 1
Userland/Libraries/LibJS/Runtime/ProxyObject.cpp

@@ -899,6 +899,7 @@ Value ProxyObject::call()
 {
     auto& vm = this->vm();
     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.
     if (!is_function()) {
@@ -935,7 +936,7 @@ Value ProxyObject::call()
     });
 
     // 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

+ 3 - 2
Userland/Libraries/LibJS/Tests/builtins/Proxy/Proxy.handler-apply.js

@@ -13,14 +13,15 @@ describe("[[Call]] trap normal behavior", () => {
         const handler = {
             apply(target, this_, arguments_) {
                 expect(target).toBe(f);
-                expect(this_).toBe(handler);
+                // FIXME: `this_` is currently `handler`
+                // expect(this_).toBeUndefined();
                 if (arguments_[2]) {
                     return arguments_[0] * arguments_[1];
                 }
                 return f(...arguments_);
             },
         };
-        p = new Proxy(f, handler);
+        let p = new Proxy(f, handler);
 
         expect(p(2, 4)).toBe(6);
         expect(p(2, 4, true)).toBe(8);