summaryrefslogtreecommitdiff
path: root/Libraries
diff options
context:
space:
mode:
Diffstat (limited to 'Libraries')
-rw-r--r--Libraries/LibJS/Interpreter.cpp5
-rw-r--r--Libraries/LibJS/Tests/Function.prototype.bind.js11
2 files changed, 14 insertions, 2 deletions
diff --git a/Libraries/LibJS/Interpreter.cpp b/Libraries/LibJS/Interpreter.cpp
index 28b52900f6..d7b3a51fa5 100644
--- a/Libraries/LibJS/Interpreter.cpp
+++ b/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();
diff --git a/Libraries/LibJS/Tests/Function.prototype.bind.js b/Libraries/LibJS/Tests/Function.prototype.bind.js
index c6df364c15..34df409e21 100644
--- a/Libraries/LibJS/Tests/Function.prototype.bind.js
+++ b/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;
}