Parcourir la source

LibJS: Use the function's bound |this| and bound arguments in
Interpreter::call()

Jack Karamanian il y a 5 ans
Parent
commit
f4129ac422

+ 3 - 2
Libraries/LibJS/Interpreter.cpp

@@ -207,9 +207,10 @@ Value Interpreter::call(Function& function, Value this_value, Optional<MarkedVal
 {
     auto& call_frame = push_call_frame();
     call_frame.function_name = function.name();
-    call_frame.this_value = this_value;
+    call_frame.this_value = function.bound_this().value_or(this_value);
+    call_frame.arguments = function.bound_arguments();
     if (arguments.has_value())
-        call_frame.arguments = arguments.value().values();
+        call_frame.arguments.append(arguments.value().values());
     call_frame.environment = function.create_environment();
     auto result = function.call(*this);
     pop_call_frame();

+ 11 - 0
Libraries/LibJS/Tests/Function.prototype.bind.js

@@ -11,6 +11,17 @@ try {
     }
     assert(getB.bind("bar")() === "B");
 
+    // Bound functions should work with array functions
+    var Make3 = Number.bind(null, 3);
+    assert([55].map(Make3)[0] === 3);
+
+    var MakeTrue = Boolean.bind(null, true);
+    assert([1, 2, 3].filter(MakeTrue).length === 3);
+
+    assert([1, 2, 3].reduce((function (acc, x) { return acc + x }).bind(null, 4, 5)) === 9);
+
+    assert([1, 2, 3].reduce((function (acc, x) { return acc + x + this; }).bind(3)) === 12);
+
     function sum(a, b, c) {
         return a + b + c;
     }