Serenity Operating System
1/*
2 * Copyright (c) 2021-2022, Andreas Kling <kling@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#pragma once
8
9#include <AK/NonnullRefPtr.h>
10#include <LibJS/Heap/GCPtr.h>
11#include <LibJS/Heap/Handle.h>
12#include <LibJS/ParserError.h>
13#include <LibJS/Runtime/Realm.h>
14
15namespace JS {
16
17// 16.1.4 Script Records, https://tc39.es/ecma262/#sec-script-records
18class Script final : public Cell {
19 JS_CELL(Script, Cell);
20
21public:
22 struct HostDefined {
23 virtual ~HostDefined() = default;
24
25 virtual void visit_host_defined_self(Cell::Visitor&) = 0;
26 };
27
28 virtual ~Script() override;
29 static Result<NonnullGCPtr<Script>, Vector<ParserError>> parse(StringView source_text, Realm&, StringView filename = {}, HostDefined* = nullptr, size_t line_number_offset = 1);
30
31 Realm& realm() { return *m_realm; }
32 Program const& parse_node() const { return *m_parse_node; }
33
34 HostDefined* host_defined() const { return m_host_defined; }
35 StringView filename() const { return m_filename; }
36
37private:
38 Script(Realm&, StringView filename, NonnullRefPtr<Program>, HostDefined* = nullptr);
39
40 virtual void visit_edges(Cell::Visitor&) override;
41
42 GCPtr<Realm> m_realm; // [[Realm]]
43 NonnullRefPtr<Program> m_parse_node; // [[ECMAScriptCode]]
44
45 // Needed for potential lookups of modules.
46 DeprecatedString m_filename;
47 HostDefined* m_host_defined { nullptr }; // [[HostDefined]]
48};
49
50}