/src/serenity/Userland/Libraries/LibJS/Runtime/FunctionEnvironment.h
Line | Count | Source |
1 | | /* |
2 | | * Copyright (c) 2021, Andreas Kling <kling@serenityos.org> |
3 | | * |
4 | | * SPDX-License-Identifier: BSD-2-Clause |
5 | | */ |
6 | | |
7 | | #pragma once |
8 | | |
9 | | #include <LibJS/Runtime/Completion.h> |
10 | | #include <LibJS/Runtime/DeclarativeEnvironment.h> |
11 | | |
12 | | namespace JS { |
13 | | |
14 | | class FunctionEnvironment final : public DeclarativeEnvironment { |
15 | | JS_ENVIRONMENT(FunctionEnvironment, DeclarativeEnvironment); |
16 | | JS_DECLARE_ALLOCATOR(FunctionEnvironment); |
17 | | |
18 | | public: |
19 | | enum class ThisBindingStatus : u8 { |
20 | | Lexical, |
21 | | Initialized, |
22 | | Uninitialized, |
23 | | }; |
24 | | |
25 | | virtual ~FunctionEnvironment() override = default; |
26 | | |
27 | 0 | ThisBindingStatus this_binding_status() const { return m_this_binding_status; } |
28 | 0 | void set_this_binding_status(ThisBindingStatus status) { m_this_binding_status = status; } |
29 | | |
30 | 0 | ECMAScriptFunctionObject& function_object() { return *m_function_object; } |
31 | 0 | ECMAScriptFunctionObject const& function_object() const { return *m_function_object; } |
32 | 0 | void set_function_object(ECMAScriptFunctionObject& function) { m_function_object = &function; } |
33 | | |
34 | 0 | Value new_target() const { return m_new_target; } |
35 | | void set_new_target(Value new_target) |
36 | 0 | { |
37 | 0 | VERIFY(!new_target.is_empty()); |
38 | 0 | m_new_target = new_target; |
39 | 0 | } |
40 | | |
41 | | // Abstract operations |
42 | | ThrowCompletionOr<Value> get_super_base() const; |
43 | | bool has_super_binding() const; |
44 | | virtual bool has_this_binding() const override; |
45 | | virtual ThrowCompletionOr<Value> get_this_binding(VM&) const override; |
46 | | ThrowCompletionOr<Value> bind_this_value(VM&, Value); |
47 | | |
48 | | private: |
49 | | explicit FunctionEnvironment(Environment* parent_environment); |
50 | | |
51 | 0 | virtual bool is_function_environment() const override { return true; } |
52 | | virtual void visit_edges(Visitor&) override; |
53 | | |
54 | | Value m_this_value; // [[ThisValue]] |
55 | | ThisBindingStatus m_this_binding_status { ThisBindingStatus::Uninitialized }; // [[ThisBindingStatus]] |
56 | | GCPtr<ECMAScriptFunctionObject> m_function_object; // [[FunctionObject]] |
57 | | Value m_new_target { js_undefined() }; // [[NewTarget]] |
58 | | }; |
59 | | |
60 | | template<> |
61 | 0 | inline bool Environment::fast_is<FunctionEnvironment>() const { return is_function_environment(); } |
62 | | |
63 | | } |