summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibJS
diff options
context:
space:
mode:
Diffstat (limited to 'Userland/Libraries/LibJS')
-rw-r--r--Userland/Libraries/LibJS/Runtime/Function.h11
-rw-r--r--Userland/Libraries/LibJS/Runtime/ScriptFunction.cpp7
2 files changed, 18 insertions, 0 deletions
diff --git a/Userland/Libraries/LibJS/Runtime/Function.h b/Userland/Libraries/LibJS/Runtime/Function.h
index f8298515bb..997e5e2bde 100644
--- a/Userland/Libraries/LibJS/Runtime/Function.h
+++ b/Userland/Libraries/LibJS/Runtime/Function.h
@@ -47,6 +47,16 @@ public:
// Used as the outer environment when evaluating the code of the function.
virtual EnvironmentRecord* environment() { return nullptr; }
+ enum class ThisMode : u8 {
+ Lexical,
+ Strict,
+ Global,
+ };
+
+ // [[ThisMode]]
+ ThisMode this_mode() const { return m_this_mode; }
+ void set_this_mode(ThisMode this_mode) { m_this_mode = this_mode; }
+
protected:
virtual void visit_edges(Visitor&) override;
@@ -59,6 +69,7 @@ private:
Vector<Value> m_bound_arguments;
Value m_home_object;
ConstructorKind m_constructor_kind = ConstructorKind::Base;
+ ThisMode m_this_mode { ThisMode::Global };
};
}
diff --git a/Userland/Libraries/LibJS/Runtime/ScriptFunction.cpp b/Userland/Libraries/LibJS/Runtime/ScriptFunction.cpp
index 523b6cdbd3..633609d87b 100644
--- a/Userland/Libraries/LibJS/Runtime/ScriptFunction.cpp
+++ b/Userland/Libraries/LibJS/Runtime/ScriptFunction.cpp
@@ -61,6 +61,13 @@ ScriptFunction::ScriptFunction(GlobalObject& global_object, const FlyString& nam
, m_is_strict(is_strict)
, m_is_arrow_function(is_arrow_function)
{
+ // NOTE: This logic is from OrdinaryFunctionCreate, https://tc39.es/ecma262/#sec-ordinaryfunctioncreate
+ if (m_is_arrow_function)
+ set_this_mode(ThisMode::Lexical);
+ else if (m_is_strict)
+ set_this_mode(ThisMode::Strict);
+ else
+ set_this_mode(ThisMode::Global);
}
void ScriptFunction::initialize(GlobalObject& global_object)