mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 18:57:45 +00:00
LibJS: Use the function's bound |this| and bound arguments in
Interpreter::call()
This commit is contained in:
parent
3ffb0a4e87
commit
f4129ac422
2 changed files with 14 additions and 2 deletions
|
@ -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,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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue