Coverage Report

Created: 2025-11-16 07:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}