1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 12:48:10 +00:00

LibJS: Set the bound |this| value to the |this| value of the current

scope for arrow functions
This commit is contained in:
Jack Karamanian 2020-05-30 00:13:42 -05:00 committed by Andreas Kling
parent c12125fa81
commit 45ccd9f8d9
3 changed files with 16 additions and 4 deletions

View file

@ -53,7 +53,7 @@ ScriptFunction* ScriptFunction::create(GlobalObject& global_object, const FlyStr
}
ScriptFunction::ScriptFunction(const FlyString& name, const Statement& body, Vector<FunctionNode::Parameter> parameters, i32 m_function_length, LexicalEnvironment* parent_environment, Object& prototype, bool is_arrow_function)
: Function(prototype)
: Function(prototype, is_arrow_function ? interpreter().this_value() : Value(), {})
, m_name(name)
, m_body(body)
, m_parameters(move(parameters))

View file

@ -102,9 +102,8 @@ try {
// assert(strictIdentity.bind(undefined)() === undefined);
// })();
// FIXME: Uncomment me when arrow functions have the correct |this| value.
// // Arrow functions can not have their |this| value set.
// assert((() => this).bind("foo")() === globalThis)
// Arrow functions can not have their |this| value set.
assert((() => this).bind("foo")() === globalThis)
console.log("PASS");
} catch (e) {

View file

@ -64,6 +64,19 @@ try {
assert(foo === undefined);
assert(bar === undefined);
function FooBar() {
this.x = {
y: () => this,
z: function () {
return (() => this)();
}
};
}
var foobar = new FooBar();
assert(foobar.x.y() === foobar);
assert(foobar.x.z() === foobar.x);
(() => {
"use strict";
assert(isStrictMode());