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/VM.h
Line
Count
Source
1
/*
2
 * Copyright (c) 2020-2023, Andreas Kling <kling@serenityos.org>
3
 * Copyright (c) 2020-2023, Linus Groh <linusg@serenityos.org>
4
 * Copyright (c) 2021-2022, David Tuin <davidot@serenityos.org>
5
 * Copyright (c) 2023, networkException <networkexception@serenityos.org>
6
 *
7
 * SPDX-License-Identifier: BSD-2-Clause
8
 */
9
10
#pragma once
11
12
#include <AK/DeprecatedFlyString.h>
13
#include <AK/Function.h>
14
#include <AK/HashMap.h>
15
#include <AK/RefCounted.h>
16
#include <AK/StackInfo.h>
17
#include <AK/Variant.h>
18
#include <LibJS/CyclicModule.h>
19
#include <LibJS/Heap/Heap.h>
20
#include <LibJS/Heap/MarkedVector.h>
21
#include <LibJS/ModuleLoading.h>
22
#include <LibJS/Runtime/CommonPropertyNames.h>
23
#include <LibJS/Runtime/Completion.h>
24
#include <LibJS/Runtime/Error.h>
25
#include <LibJS/Runtime/ErrorTypes.h>
26
#include <LibJS/Runtime/ExecutionContext.h>
27
#include <LibJS/Runtime/Promise.h>
28
#include <LibJS/Runtime/Value.h>
29
30
namespace JS {
31
32
class Identifier;
33
struct BindingPattern;
34
35
enum class HandledByHost {
36
    Handled,
37
    Unhandled,
38
};
39
40
enum class EvalMode {
41
    Direct,
42
    Indirect
43
};
44
45
class VM : public RefCounted<VM> {
46
public:
47
    struct CustomData {
48
0
        virtual ~CustomData() = default;
49
50
        virtual void spin_event_loop_until(JS::SafeFunction<bool()> goal_condition) = 0;
51
    };
52
53
    static ErrorOr<NonnullRefPtr<VM>> create(OwnPtr<CustomData> = {});
54
    ~VM();
55
56
0
    Heap& heap() { return m_heap; }
57
0
    Heap const& heap() const { return m_heap; }
58
59
    Bytecode::Interpreter& bytecode_interpreter();
60
61
    void dump_backtrace() const;
62
63
    void gather_roots(HashMap<Cell*, HeapRoot>&);
64
65
#define __JS_ENUMERATE(SymbolName, snake_name)                  \
66
    NonnullGCPtr<Symbol> well_known_symbol_##snake_name() const \
67
0
    {                                                           \
68
0
        return *m_well_known_symbols.snake_name;                \
69
0
    }
Unexecuted instantiation: JS::VM::well_known_symbol_iterator() const
Unexecuted instantiation: JS::VM::well_known_symbol_async_iterator() const
Unexecuted instantiation: JS::VM::well_known_symbol_match() const
Unexecuted instantiation: JS::VM::well_known_symbol_match_all() const
Unexecuted instantiation: JS::VM::well_known_symbol_replace() const
Unexecuted instantiation: JS::VM::well_known_symbol_replace_all() const
Unexecuted instantiation: JS::VM::well_known_symbol_search() const
Unexecuted instantiation: JS::VM::well_known_symbol_split() const
Unexecuted instantiation: JS::VM::well_known_symbol_has_instance() const
Unexecuted instantiation: JS::VM::well_known_symbol_is_concat_spreadable() const
Unexecuted instantiation: JS::VM::well_known_symbol_unscopables() const
Unexecuted instantiation: JS::VM::well_known_symbol_species() const
Unexecuted instantiation: JS::VM::well_known_symbol_to_primitive() const
Unexecuted instantiation: JS::VM::well_known_symbol_to_string_tag() const
Unexecuted instantiation: JS::VM::well_known_symbol_dispose() const
70
    JS_ENUMERATE_WELL_KNOWN_SYMBOLS
71
#undef __JS_ENUMERATE
72
73
    HashMap<String, GCPtr<PrimitiveString>>& string_cache()
74
0
    {
75
0
        return m_string_cache;
76
0
    }
77
78
    HashMap<ByteString, GCPtr<PrimitiveString>>& byte_string_cache()
79
0
    {
80
0
        return m_byte_string_cache;
81
0
    }
82
83
    HashMap<Utf16String, GCPtr<PrimitiveString>>& utf16_string_cache()
84
0
    {
85
0
        return m_utf16_string_cache;
86
0
    }
87
88
0
    PrimitiveString& empty_string() { return *m_empty_string; }
89
90
    PrimitiveString& single_ascii_character_string(u8 character)
91
0
    {
92
0
        VERIFY(character < 0x80);
93
0
        return *m_single_ascii_character_strings[character];
94
0
    }
95
96
    // This represents the list of errors from ErrorTypes.h whose messages are used in contexts which
97
    // must not fail to allocate when they are used. For example, we cannot allocate when we raise an
98
    // out-of-memory error, thus we pre-allocate that error string at VM creation time.
99
    enum class ErrorMessage {
100
        OutOfMemory,
101
102
        // Keep this last:
103
        __Count,
104
    };
105
    String const& error_message(ErrorMessage) const;
106
107
    bool did_reach_stack_space_limit() const
108
0
    {
109
#if defined(AK_OS_MACOS) && defined(HAS_ADDRESS_SANITIZER)
110
        // We hit stack limits sooner on macOS 14 arm64 with ASAN enabled.
111
        return m_stack_info.size_free() < 96 * KiB;
112
#else
113
0
        return m_stack_info.size_free() < 32 * KiB;
114
0
#endif
115
0
    }
116
117
    // TODO: Rename this function instead of providing a second argument, now that the global object is no longer passed in.
118
    struct CheckStackSpaceLimitTag { };
119
120
    ThrowCompletionOr<void> push_execution_context(ExecutionContext& context, CheckStackSpaceLimitTag)
121
0
    {
122
        // Ensure we got some stack space left, so the next function call doesn't kill us.
123
0
        if (did_reach_stack_space_limit())
124
0
            return throw_completion<InternalError>(ErrorType::CallStackSizeExceeded);
125
0
        push_execution_context(context);
126
0
        return {};
127
0
    }
128
129
    void push_execution_context(ExecutionContext&);
130
    void pop_execution_context();
131
132
    // https://tc39.es/ecma262/#running-execution-context
133
    // At any point in time, there is at most one execution context per agent that is actually executing code.
134
    // This is known as the agent's running execution context.
135
    ExecutionContext& running_execution_context()
136
0
    {
137
0
        VERIFY(!m_execution_context_stack.is_empty());
138
0
        return *m_execution_context_stack.last();
139
0
    }
140
    ExecutionContext const& running_execution_context() const
141
0
    {
142
0
        VERIFY(!m_execution_context_stack.is_empty());
143
0
        return *m_execution_context_stack.last();
144
0
    }
145
146
    // https://tc39.es/ecma262/#execution-context-stack
147
    // The execution context stack is used to track execution contexts.
148
0
    Vector<ExecutionContext*> const& execution_context_stack() const { return m_execution_context_stack; }
149
0
    Vector<ExecutionContext*>& execution_context_stack() { return m_execution_context_stack; }
150
151
0
    Environment const* lexical_environment() const { return running_execution_context().lexical_environment; }
152
0
    Environment* lexical_environment() { return running_execution_context().lexical_environment; }
153
154
0
    Environment const* variable_environment() const { return running_execution_context().variable_environment; }
155
0
    Environment* variable_environment() { return running_execution_context().variable_environment; }
156
157
    // https://tc39.es/ecma262/#current-realm
158
    // The value of the Realm component of the running execution context is also called the current Realm Record.
159
0
    Realm const* current_realm() const { return running_execution_context().realm; }
160
0
    Realm* current_realm() { return running_execution_context().realm; }
161
162
    // https://tc39.es/ecma262/#active-function-object
163
    // The value of the Function component of the running execution context is also called the active function object.
164
0
    FunctionObject const* active_function_object() const { return running_execution_context().function; }
165
0
    FunctionObject* active_function_object() { return running_execution_context().function; }
166
167
    bool in_strict_mode() const;
168
169
    size_t argument_count() const
170
0
    {
171
0
        if (m_execution_context_stack.is_empty())
172
0
            return 0;
173
0
        return running_execution_context().arguments.size();
174
0
    }
175
176
    Value argument(size_t index) const
177
0
    {
178
0
        if (m_execution_context_stack.is_empty())
179
0
            return {};
180
0
        return running_execution_context().argument(index);
181
0
    }
182
183
    Value this_value() const
184
0
    {
185
0
        return running_execution_context().this_value;
186
0
    }
187
188
    ThrowCompletionOr<Value> resolve_this_binding();
189
190
0
    StackInfo const& stack_info() const { return m_stack_info; }
191
192
0
    HashMap<String, NonnullGCPtr<Symbol>> const& global_symbol_registry() const { return m_global_symbol_registry; }
193
0
    HashMap<String, NonnullGCPtr<Symbol>>& global_symbol_registry() { return m_global_symbol_registry; }
194
195
0
    u32 execution_generation() const { return m_execution_generation; }
196
0
    void finish_execution_generation() { ++m_execution_generation; }
197
198
    ThrowCompletionOr<Reference> resolve_binding(DeprecatedFlyString const&, Environment* = nullptr);
199
    ThrowCompletionOr<Reference> get_identifier_reference(Environment*, DeprecatedFlyString, bool strict, size_t hops = 0);
200
201
    // 5.2.3.2 Throw an Exception, https://tc39.es/ecma262/#sec-throw-an-exception
202
    template<typename T, typename... Args>
203
    Completion throw_completion(Args&&... args)
204
0
    {
205
0
        auto& realm = *current_realm();
206
0
        auto completion = T::create(realm, forward<Args>(args)...);
207
208
0
        return JS::throw_completion(completion);
209
0
    }
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::InternalError, AK::String>(AK::String&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::ReferenceError, AK::String>(AK::String&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String>(AK::String&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::InternalError, AK::StringView>(AK::StringView&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::InternalError, AK::String const&>(AK::String const&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::SyntaxError, AK::String>(AK::String&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::String>(AK::String&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::URIError, AK::String>(AK::String&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::SyntaxError, AK::ByteString>(AK::ByteString&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::StringView>(AK::StringView&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::EvalError, AK::StringView&>(AK::StringView&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::StringView&>(AK::StringView&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::ReferenceError, AK::StringView&>(AK::StringView&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::StringView&>(AK::StringView&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::URIError, AK::StringView&>(AK::StringView&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::ByteString>(AK::ByteString&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::ByteString&>(AK::ByteString&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::StringView>(AK::StringView&&)
210
211
    template<typename T>
212
    Completion throw_completion(ErrorType type)
213
0
    {
214
0
        return throw_completion<T>(String::from_utf8_without_validation(type.message().bytes()));
215
0
    }
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::InternalError>(JS::ErrorType)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError>(JS::ErrorType)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError>(JS::ErrorType)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::ReferenceError>(JS::ErrorType)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::URIError>(JS::ErrorType)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::SyntaxError>(JS::ErrorType)
216
217
    template<typename T, typename... Args>
218
    Completion throw_completion(ErrorType type, Args&&... args)
219
0
    {
220
0
        return throw_completion<T>(MUST(String::formatted(type.message(), forward<Args>(args)...)));
221
0
    }
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::ReferenceError, AK::DeprecatedFlyString const&>(JS::ErrorType, AK::DeprecatedFlyString const&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, JS::PropertyKey&, AK::String>(JS::ErrorType, JS::PropertyKey&, AK::String&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, JS::PropertyKey const&, JS::Value&, AK::Optional<AK::DeprecatedFlyString const&> const&>(JS::ErrorType, JS::PropertyKey const&, JS::Value&, AK::Optional<AK::DeprecatedFlyString const&> const&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, JS::PropertyKey const&, JS::Value&>(JS::ErrorType, JS::PropertyKey const&, JS::Value&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::Optional<AK::DeprecatedFlyString const&> const&, JS::Value&>(JS::ErrorType, AK::Optional<AK::DeprecatedFlyString const&> const&, JS::Value&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, JS::PropertyKey&, AK::String, AK::String>(JS::ErrorType, JS::PropertyKey&, AK::String&&, AK::String&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String, AK::StringView&, AK::ByteString const&>(JS::ErrorType, AK::String&&, AK::StringView&, AK::ByteString const&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String, AK::StringView&>(JS::ErrorType, AK::String&&, AK::StringView&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [18]>(JS::ErrorType, char const (&) [18])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, JS::Value&, JS::Value&, AK::DeprecatedFlyString const&>(JS::ErrorType, JS::Value&, JS::Value&, AK::DeprecatedFlyString const&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, JS::Value&, JS::Value&>(JS::ErrorType, JS::Value&, JS::Value&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::InternalError, AK::String>(JS::ErrorType, AK::String&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::DeprecatedFlyString const&, JS::Value&, AK::DeprecatedFlyString const&>(JS::ErrorType, AK::DeprecatedFlyString const&, JS::Value&, AK::DeprecatedFlyString const&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::DeprecatedFlyString const&, JS::Value&>(JS::ErrorType, AK::DeprecatedFlyString const&, JS::Value&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String>(JS::ErrorType, AK::String&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::ReferenceError, AK::String>(JS::ErrorType, AK::String&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::SyntaxError, AK::DeprecatedFlyString const&>(JS::ErrorType, AK::DeprecatedFlyString const&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::StringView>(JS::ErrorType, AK::StringView&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::DeprecatedFlyString const&>(JS::ErrorType, AK::DeprecatedFlyString const&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [6]>(JS::ErrorType, char const (&) [6])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, char const (&) [6]>(JS::ErrorType, char const (&) [6])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, JS::Value&>(JS::ErrorType, JS::Value&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, double&, unsigned long&>(JS::ErrorType, double&, unsigned long&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::ReferenceError, AK::DeprecatedFlyString&>(JS::ErrorType, AK::DeprecatedFlyString&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::DeprecatedFlyString&>(JS::ErrorType, AK::DeprecatedFlyString&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::StringView, AK::StringView>(JS::ErrorType, AK::StringView&&, AK::StringView&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [9]>(JS::ErrorType, char const (&) [9])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [15]>(JS::ErrorType, char const (&) [15])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String, AK::String>(JS::ErrorType, AK::String&&, AK::String&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [10]>(JS::ErrorType, char const (&) [10])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, unsigned long&, unsigned long>(JS::ErrorType, unsigned long&, unsigned long&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [23]>(JS::ErrorType, char const (&) [23])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [26]>(JS::ErrorType, char const (&) [26])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [38]>(JS::ErrorType, char const (&) [38])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, unsigned long&>(JS::ErrorType, unsigned long&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, char const (&) [13]>(JS::ErrorType, char const (&) [13])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, unsigned long&, unsigned long const&>(JS::ErrorType, unsigned long&, unsigned long const&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, unsigned long const&>(JS::ErrorType, unsigned long const&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, JS::Value, JS::Value>(JS::ErrorType, JS::Value&&, JS::Value&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, JS::Value&, JS::Value>(JS::ErrorType, JS::Value&, JS::Value&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, JS::PropertyKey&>(JS::ErrorType, JS::PropertyKey&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [7]>(JS::ErrorType, char const (&) [7])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::StringView>(JS::ErrorType, AK::StringView&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::String&>(JS::ErrorType, AK::String&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::String&, AK::DeprecatedFlyString const&>(JS::ErrorType, AK::String&, AK::DeprecatedFlyString const&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, JS::Value&, int&, int&>(JS::ErrorType, JS::Value&, int&, int&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [8]>(JS::ErrorType, char const (&) [8])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, unsigned long&, unsigned int&>(JS::ErrorType, unsigned long&, unsigned int&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String, JS::PropertyKey&>(JS::ErrorType, AK::String&&, JS::PropertyKey&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, unsigned long&, unsigned long&>(JS::ErrorType, unsigned long&, unsigned long&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, JS::PropertyKey&>(JS::ErrorType, JS::PropertyKey&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [5]>(JS::ErrorType, char const (&) [5])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::ByteString&>(JS::ErrorType, AK::ByteString&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, JS::Value&, AK::StringView>(JS::ErrorType, JS::Value&, AK::StringView&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::String&, JS::PropertyKey&>(JS::ErrorType, AK::String&, JS::PropertyKey&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, JS::PropertyKey const&, AK::StringView>(JS::ErrorType, JS::PropertyKey const&, AK::StringView&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::InternalError, AK::StringView>(JS::ErrorType, AK::StringView&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::StringView&, AK::StringView>(JS::ErrorType, AK::StringView&, AK::StringView&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::StringView&>(JS::ErrorType, AK::StringView&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, JS::PropertyKey&, JS::Value&>(JS::ErrorType, JS::PropertyKey&, JS::Value&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, JS::Value&>(JS::ErrorType, JS::Value&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [20]>(JS::ErrorType, char const (&) [20])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [16]>(JS::ErrorType, char const (&) [16])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, JS::Value&, JS::PropertyKey const&>(JS::ErrorType, JS::Value&, JS::PropertyKey const&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [12]>(JS::ErrorType, char const (&) [12])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, int&>(JS::ErrorType, int&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, int&, int&>(JS::ErrorType, int&, int&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, int&, AK::StringView>(JS::ErrorType, int&, AK::StringView&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::StringView, AK::StringView, JS::Value&>(JS::ErrorType, AK::StringView&&, AK::StringView&&, JS::Value&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [17]>(JS::ErrorType, char const (&) [17])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [24]>(JS::ErrorType, char const (&) [24])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::DeprecatedFlyString const&, AK::StringView>(JS::ErrorType, AK::DeprecatedFlyString const&, AK::StringView&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, unsigned long&, unsigned int>(JS::ErrorType, unsigned long&, unsigned int&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::ByteString>(JS::ErrorType, AK::ByteString&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [22]>(JS::ErrorType, char const (&) [22])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [7], char const (&) [7]>(JS::ErrorType, char const (&) [7], char const (&) [7])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [33]>(JS::ErrorType, char const (&) [33])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [32]>(JS::ErrorType, char const (&) [32])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [4]>(JS::ErrorType, char const (&) [4])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [7], AK::String>(JS::ErrorType, char const (&) [7], AK::String&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [8], AK::String>(JS::ErrorType, char const (&) [8], AK::String&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::ReferenceError, AK::ByteString>(JS::ErrorType, AK::ByteString&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::SyntaxError, AK::ByteString>(JS::ErrorType, AK::ByteString&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [39]>(JS::ErrorType, char const (&) [39])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [31]>(JS::ErrorType, char const (&) [31])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::ByteString const&>(JS::ErrorType, AK::ByteString const&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, char const (&) [20]>(JS::ErrorType, char const (&) [20])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::String>(JS::ErrorType, AK::String&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [13], char const (&) [33]>(JS::ErrorType, char const (&) [13], char const (&) [33])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, char const (&) [9]>(JS::ErrorType, char const (&) [9])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, char const (&) [7]>(JS::ErrorType, char const (&) [7])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::StringView, AK::DeprecatedFlyString const&>(JS::ErrorType, AK::StringView&&, AK::DeprecatedFlyString const&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::DeprecatedFlyString const&, AK::DeprecatedFlyString const&>(JS::ErrorType, AK::DeprecatedFlyString const&, AK::DeprecatedFlyString const&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, double&, char const (&) [18]>(JS::ErrorType, double&, char const (&) [18])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, unsigned long&, char const (&) [18]>(JS::ErrorType, unsigned long&, char const (&) [18])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::String&, AK::StringView>(JS::ErrorType, AK::String&, AK::StringView&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::ByteString>(JS::ErrorType, AK::ByteString&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [21]>(JS::ErrorType, char const (&) [21])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::StringView const&>(JS::ErrorType, AK::StringView const&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::StringView&, AK::StringView, AK::StringView>(JS::ErrorType, AK::StringView&, AK::StringView&&, AK::StringView&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String const&>(JS::ErrorType, AK::String const&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::String&, AK::String&>(JS::ErrorType, AK::String&, AK::String&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::String const&>(JS::ErrorType, AK::String const&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [19]>(JS::ErrorType, char const (&) [19])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::DeprecatedFlyString&, AK::DeprecatedFlyString&>(JS::ErrorType, AK::DeprecatedFlyString&, AK::DeprecatedFlyString&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::DeprecatedFlyString&, AK::ByteString&>(JS::ErrorType, AK::DeprecatedFlyString&, AK::ByteString&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::DeprecatedFlyString&, AK::StringView&>(JS::ErrorType, AK::DeprecatedFlyString&, AK::StringView&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::StringView&, JS::Value&>(JS::ErrorType, AK::StringView&, JS::Value&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, char const (&) [15]>(JS::ErrorType, char const (&) [15])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, char const (&) [8], char const (&) [41]>(JS::ErrorType, char const (&) [8], char const (&) [41])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, char const (&) [8], char const (&) [42]>(JS::ErrorType, char const (&) [8], char const (&) [42])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::StringView, AK::StringView>(JS::ErrorType, AK::StringView&&, AK::StringView&&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [18], char const (&) [18]>(JS::ErrorType, char const (&) [18], char const (&) [18])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, char const (&) [5], double&>(JS::ErrorType, char const (&) [5], double&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, char const (&) [7], double&>(JS::ErrorType, char const (&) [7], double&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, char const (&) [6], double&>(JS::ErrorType, char const (&) [6], double&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::DeprecatedFlyString const&, char const (&) [13]>(JS::ErrorType, AK::DeprecatedFlyString const&, char const (&) [13])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [17], char const (&) [18]>(JS::ErrorType, char const (&) [17], char const (&) [18])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [19], char const (&) [18]>(JS::ErrorType, char const (&) [19], char const (&) [18])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [23], char const (&) [18]>(JS::ErrorType, char const (&) [23], char const (&) [18])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [24], char const (&) [18]>(JS::ErrorType, char const (&) [24], char const (&) [18])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [25], char const (&) [7]>(JS::ErrorType, char const (&) [25], char const (&) [7])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, char const (&) [25], char const (&) [16]>(JS::ErrorType, char const (&) [25], char const (&) [16])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, AK::StringView, unsigned int&, unsigned long&>(JS::ErrorType, AK::StringView&&, unsigned int&, unsigned long&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, unsigned long&, unsigned int, unsigned long&>(JS::ErrorType, unsigned long&, unsigned int&&, unsigned long&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [11]>(JS::ErrorType, char const (&) [11])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, char const (&) [12]>(JS::ErrorType, char const (&) [12])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::StringView&>(JS::ErrorType, AK::StringView&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, char const (&) [14]>(JS::ErrorType, char const (&) [14])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, char const (&) [18]>(JS::ErrorType, char const (&) [18])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::RangeError, double&>(JS::ErrorType, double&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String, AK::ByteString&>(JS::ErrorType, AK::String&&, AK::ByteString&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [10], char const (&) [7]>(JS::ErrorType, char const (&) [10], char const (&) [7])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [5], char const (&) [7]>(JS::ErrorType, char const (&) [5], char const (&) [7])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::SyntaxError, JS::Value&>(JS::ErrorType, JS::Value&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::InternalError, AK::DeprecatedFlyString const&>(JS::ErrorType, AK::DeprecatedFlyString const&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::SyntaxError, AK::Optional<AK::DeprecatedFlyString>&>(JS::ErrorType, AK::Optional<AK::DeprecatedFlyString>&)
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [14]>(JS::ErrorType, char const (&) [14])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [13]>(JS::ErrorType, char const (&) [13])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::InternalError, char const (&) [21]>(JS::ErrorType, char const (&) [21])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::InternalError, char const (&) [25]>(JS::ErrorType, char const (&) [25])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String&, char const (&) [21]>(JS::ErrorType, AK::String&, char const (&) [21])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [25]>(JS::ErrorType, char const (&) [25])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [7], char const (&) [2]>(JS::ErrorType, char const (&) [7], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [9], char const (&) [2]>(JS::ErrorType, char const (&) [9], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String&, char const (&) [15]>(JS::ErrorType, AK::String&, char const (&) [15])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [27]>(JS::ErrorType, char const (&) [27])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String&, char const (&) [13]>(JS::ErrorType, AK::String&, char const (&) [13])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String&, char const (&) [19]>(JS::ErrorType, AK::String&, char const (&) [19])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String&, char const (&) [14]>(JS::ErrorType, AK::String&, char const (&) [14])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String&, char const (&) [12]>(JS::ErrorType, AK::String&, char const (&) [12])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String&, char const (&) [16]>(JS::ErrorType, AK::String&, char const (&) [16])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String&, char const (&) [18]>(JS::ErrorType, AK::String&, char const (&) [18])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String&, char const (&) [9]>(JS::ErrorType, AK::String&, char const (&) [9])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [15], char const (&) [2]>(JS::ErrorType, char const (&) [15], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [8], char const (&) [2]>(JS::ErrorType, char const (&) [8], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [5], char const (&) [2]>(JS::ErrorType, char const (&) [5], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [12], char const (&) [2]>(JS::ErrorType, char const (&) [12], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [10], char const (&) [2]>(JS::ErrorType, char const (&) [10], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [11], char const (&) [2]>(JS::ErrorType, char const (&) [11], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String&, char const (&) [10]>(JS::ErrorType, AK::String&, char const (&) [10])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String&, char const (&) [20]>(JS::ErrorType, AK::String&, char const (&) [20])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [14], char const (&) [2]>(JS::ErrorType, char const (&) [14], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [23], char const (&) [2]>(JS::ErrorType, char const (&) [23], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [16], char const (&) [2]>(JS::ErrorType, char const (&) [16], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [28], char const (&) [2]>(JS::ErrorType, char const (&) [28], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [18], char const (&) [2]>(JS::ErrorType, char const (&) [18], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [17], char const (&) [2]>(JS::ErrorType, char const (&) [17], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [2]>(JS::ErrorType, char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [19], char const (&) [2]>(JS::ErrorType, char const (&) [19], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String&, char const (&) [22]>(JS::ErrorType, AK::String&, char const (&) [22])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [13], char const (&) [2]>(JS::ErrorType, char const (&) [13], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [22], char const (&) [2]>(JS::ErrorType, char const (&) [22], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [20], char const (&) [2]>(JS::ErrorType, char const (&) [20], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [4], char const (&) [2]>(JS::ErrorType, char const (&) [4], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String&, char const (&) [11]>(JS::ErrorType, AK::String&, char const (&) [11])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [6], char const (&) [2]>(JS::ErrorType, char const (&) [6], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [21], char const (&) [2]>(JS::ErrorType, char const (&) [21], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [3]>(JS::ErrorType, char const (&) [3])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String&, char const (&) [23]>(JS::ErrorType, AK::String&, char const (&) [23])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String&, char const (&) [25]>(JS::ErrorType, AK::String&, char const (&) [25])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [36]>(JS::ErrorType, char const (&) [36])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String&, char const (&) [26]>(JS::ErrorType, AK::String&, char const (&) [26])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [34]>(JS::ErrorType, char const (&) [34])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [34], char const (&) [2]>(JS::ErrorType, char const (&) [34], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String&, char const (&) [28]>(JS::ErrorType, AK::String&, char const (&) [28])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [1]>(JS::ErrorType, char const (&) [1])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [24], char const (&) [2]>(JS::ErrorType, char const (&) [24], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [26], char const (&) [2]>(JS::ErrorType, char const (&) [26], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [27], char const (&) [2]>(JS::ErrorType, char const (&) [27], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [29]>(JS::ErrorType, char const (&) [29])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [28]>(JS::ErrorType, char const (&) [28])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, char const (&) [29], char const (&) [2]>(JS::ErrorType, char const (&) [29], char const (&) [2])
Unexecuted instantiation: JS::Completion JS::VM::throw_completion<JS::TypeError, AK::String&, char const (&) [17]>(JS::ErrorType, AK::String&, char const (&) [17])
222
223
    Value get_new_target();
224
225
    Object* get_import_meta();
226
227
    Object& get_global_object();
228
229
    CommonPropertyNames names;
230
    struct {
231
        GCPtr<PrimitiveString> number;
232
        GCPtr<PrimitiveString> undefined;
233
        GCPtr<PrimitiveString> object;
234
        GCPtr<PrimitiveString> string;
235
        GCPtr<PrimitiveString> symbol;
236
        GCPtr<PrimitiveString> boolean;
237
        GCPtr<PrimitiveString> bigint;
238
        GCPtr<PrimitiveString> function;
239
    } typeof_strings;
240
241
    void run_queued_promise_jobs();
242
    void enqueue_promise_job(NonnullGCPtr<HeapFunction<ThrowCompletionOr<Value>()>> job, Realm*);
243
244
    void run_queued_finalization_registry_cleanup_jobs();
245
    void enqueue_finalization_registry_cleanup_job(FinalizationRegistry&);
246
247
    void promise_rejection_tracker(Promise&, Promise::RejectionOperation) const;
248
249
    Function<void()> on_call_stack_emptied;
250
    Function<void(Promise&)> on_promise_unhandled_rejection;
251
    Function<void(Promise&)> on_promise_rejection_handled;
252
    Function<void(Object const&, PropertyKey const&)> on_unimplemented_property_access;
253
254
0
    CustomData* custom_data() { return m_custom_data; }
255
256
    void save_execution_context_stack();
257
    void clear_execution_context_stack();
258
    void restore_execution_context_stack();
259
260
    // Do not call this method unless you are sure this is the only and first module to be loaded in this vm.
261
    ThrowCompletionOr<void> link_and_eval_module(Badge<Bytecode::Interpreter>, SourceTextModule& module);
262
263
    ScriptOrModule get_active_script_or_module() const;
264
265
    // NOTE: The host defined implementation described in the web spec https://html.spec.whatwg.org/multipage/webappapis.html#hostloadimportedmodule
266
    //       currently references proposal-import-attributes.
267
    //       Our implementation of this proposal is outdated however, as such we try to adapt the proposal and living standard
268
    //       to match our implementation for now.
269
    // 16.2.1.8 HostLoadImportedModule ( referrer, moduleRequest, hostDefined, payload ), https://tc39.es/proposal-import-attributes/#sec-HostLoadImportedModule
270
    Function<void(ImportedModuleReferrer, ModuleRequest const&, GCPtr<GraphLoadingState::HostDefined>, ImportedModulePayload)> host_load_imported_module;
271
272
    Function<HashMap<PropertyKey, Value>(SourceTextModule&)> host_get_import_meta_properties;
273
    Function<void(Object*, SourceTextModule const&)> host_finalize_import_meta;
274
275
    Function<Vector<ByteString>()> host_get_supported_import_attributes;
276
277
0
    void set_dynamic_imports_allowed(bool value) { m_dynamic_imports_allowed = value; }
278
279
    Function<void(Promise&, Promise::RejectionOperation)> host_promise_rejection_tracker;
280
    Function<ThrowCompletionOr<Value>(JobCallback&, Value, ReadonlySpan<Value>)> host_call_job_callback;
281
    Function<void(FinalizationRegistry&)> host_enqueue_finalization_registry_cleanup_job;
282
    Function<void(NonnullGCPtr<HeapFunction<ThrowCompletionOr<Value>()>>, Realm*)> host_enqueue_promise_job;
283
    Function<JS::NonnullGCPtr<JobCallback>(FunctionObject&)> host_make_job_callback;
284
    Function<ThrowCompletionOr<void>(Realm&, ReadonlySpan<String>, StringView, EvalMode)> host_ensure_can_compile_strings;
285
    Function<ThrowCompletionOr<void>(Object&)> host_ensure_can_add_private_element;
286
    Function<ThrowCompletionOr<HandledByHost>(ArrayBuffer&, size_t)> host_resize_array_buffer;
287
    Function<void(StringView)> host_unrecognized_date_string;
288
    Function<ThrowCompletionOr<void>(Realm&, NonnullOwnPtr<ExecutionContext>, ShadowRealm&)> host_initialize_shadow_realm;
289
290
    Vector<StackTraceElement> stack_trace() const;
291
292
private:
293
    using ErrorMessages = AK::Array<String, to_underlying(ErrorMessage::__Count)>;
294
295
    struct WellKnownSymbols {
296
#define __JS_ENUMERATE(SymbolName, snake_name) \
297
    GCPtr<Symbol> snake_name;
298
        JS_ENUMERATE_WELL_KNOWN_SYMBOLS
299
#undef __JS_ENUMERATE
300
    };
301
302
    VM(OwnPtr<CustomData>, ErrorMessages);
303
304
    void load_imported_module(ImportedModuleReferrer, ModuleRequest const&, GCPtr<GraphLoadingState::HostDefined>, ImportedModulePayload);
305
    ThrowCompletionOr<void> link_and_eval_module(CyclicModule&);
306
307
0
    void set_well_known_symbols(WellKnownSymbols well_known_symbols) { m_well_known_symbols = move(well_known_symbols); }
308
309
    HashMap<String, GCPtr<PrimitiveString>> m_string_cache;
310
    HashMap<ByteString, GCPtr<PrimitiveString>> m_byte_string_cache;
311
    HashMap<Utf16String, GCPtr<PrimitiveString>> m_utf16_string_cache;
312
313
    Heap m_heap;
314
315
    Vector<ExecutionContext*> m_execution_context_stack;
316
317
    Vector<Vector<ExecutionContext*>> m_saved_execution_context_stacks;
318
319
    StackInfo m_stack_info;
320
321
    // GlobalSymbolRegistry, https://tc39.es/ecma262/#table-globalsymbolregistry-record-fields
322
    HashMap<String, NonnullGCPtr<Symbol>> m_global_symbol_registry;
323
324
    Vector<NonnullGCPtr<HeapFunction<ThrowCompletionOr<Value>()>>> m_promise_jobs;
325
326
    Vector<GCPtr<FinalizationRegistry>> m_finalization_registry_cleanup_jobs;
327
328
    GCPtr<PrimitiveString> m_empty_string;
329
    GCPtr<PrimitiveString> m_single_ascii_character_strings[128] {};
330
    ErrorMessages m_error_messages;
331
332
    struct StoredModule {
333
        ImportedModuleReferrer referrer;
334
        ByteString filename;
335
        ByteString type;
336
        Handle<Module> module;
337
        bool has_once_started_linking { false };
338
    };
339
340
    StoredModule* get_stored_module(ImportedModuleReferrer const& script_or_module, ByteString const& filename, ByteString const& type);
341
342
    Vector<StoredModule> m_loaded_modules;
343
344
    WellKnownSymbols m_well_known_symbols;
345
346
    u32 m_execution_generation { 0 };
347
348
    OwnPtr<CustomData> m_custom_data;
349
350
    OwnPtr<Bytecode::Interpreter> m_bytecode_interpreter;
351
352
    bool m_dynamic_imports_allowed { false };
353
};
354
355
template<typename GlobalObjectType, typename... Args>
356
[[nodiscard]] static NonnullOwnPtr<ExecutionContext> create_simple_execution_context(VM& vm, Args&&... args)
357
0
{
358
0
    auto root_execution_context = MUST(Realm::initialize_host_defined_realm(
359
0
        vm,
360
0
        [&](Realm& realm_) -> GlobalObject* {
361
0
            return vm.heap().allocate_without_realm<GlobalObjectType>(realm_, forward<Args>(args)...);
362
0
        },
363
0
        nullptr));
364
0
    return root_execution_context;
365
0
}
366
367
}