diff options
Diffstat (limited to 'Userland/Libraries/LibJS/Runtime/FunctionObject.h')
-rw-r--r-- | Userland/Libraries/LibJS/Runtime/FunctionObject.h | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/Userland/Libraries/LibJS/Runtime/FunctionObject.h b/Userland/Libraries/LibJS/Runtime/FunctionObject.h new file mode 100644 index 0000000000..66637bcec6 --- /dev/null +++ b/Userland/Libraries/LibJS/Runtime/FunctionObject.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2020-2021, Andreas Kling <kling@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include <AK/String.h> +#include <LibJS/Runtime/Object.h> + +namespace JS { + +class FunctionObject : public Object { + JS_OBJECT(Function, Object); + +public: + enum class ConstructorKind { + Base, + Derived, + }; + + virtual ~FunctionObject(); + virtual void initialize(GlobalObject&) override { } + + virtual Value call() = 0; + virtual Value construct(FunctionObject& new_target) = 0; + virtual const FlyString& name() const = 0; + virtual FunctionEnvironmentRecord* create_environment_record(FunctionObject&) = 0; + + BoundFunction* bind(Value bound_this_value, Vector<Value> arguments); + + Value bound_this() const { return m_bound_this; } + + const Vector<Value>& bound_arguments() const { return m_bound_arguments; } + + Value home_object() const { return m_home_object; } + void set_home_object(Value home_object) { m_home_object = home_object; } + + ConstructorKind constructor_kind() const { return m_constructor_kind; }; + void set_constructor_kind(ConstructorKind constructor_kind) { m_constructor_kind = constructor_kind; } + + virtual bool is_strict_mode() const { return false; } + + // [[Environment]] + // The Environment Record that the function was closed over. + // 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; + + explicit FunctionObject(Object& prototype); + FunctionObject(Value bound_this, Vector<Value> bound_arguments, Object& prototype); + +private: + virtual bool is_function() const override { return true; } + Value m_bound_this; + Vector<Value> m_bound_arguments; + Value m_home_object; + ConstructorKind m_constructor_kind = ConstructorKind::Base; + ThisMode m_this_mode { ThisMode::Global }; +}; + +} |