mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2026-04-18 18:00:31 +00:00
Now that initialize_environment() uses pre-computed data and execute_module() caches its executable / uses TLA shared data, we can drop the AST reference after it's no longer needed. For TLA modules, the AST is dropped immediately after constructing the SharedFunctionInstanceData (which takes its own ref). For non-TLA modules, the AST is dropped after the first bytecode compilation. Also remove the m_default_export field (replaced by the pre-computed m_default_export_binding_name) and extract default export info in parse() instead of the constructor.
73 lines
3.3 KiB
C++
73 lines
3.3 KiB
C++
/*
|
|
* Copyright (c) 2021-2023, Andreas Kling <andreas@ladybird.org>
|
|
* Copyright (c) 2022, David Tuin <davidot@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <LibJS/CyclicModule.h>
|
|
#include <LibJS/Export.h>
|
|
#include <LibJS/Forward.h>
|
|
#include <LibJS/Runtime/ExecutionContext.h>
|
|
|
|
namespace JS {
|
|
|
|
// 16.2.1.6 Source Text Module Records, https://tc39.es/ecma262/#sec-source-text-module-records
|
|
class JS_API SourceTextModule final : public CyclicModule {
|
|
GC_CELL(SourceTextModule, CyclicModule);
|
|
GC_DECLARE_ALLOCATOR(SourceTextModule);
|
|
|
|
public:
|
|
virtual ~SourceTextModule() override;
|
|
|
|
static Result<GC::Ref<SourceTextModule>, Vector<ParserError>> parse(StringView source_text, Realm&, StringView filename = {}, Script::HostDefined* host_defined = nullptr);
|
|
|
|
Program const* parse_node() const { return m_ecmascript_code; }
|
|
|
|
virtual Vector<Utf16FlyString> get_exported_names(VM& vm, HashTable<Module const*>& export_star_set) override;
|
|
virtual ResolvedBinding resolve_export(VM& vm, Utf16FlyString const& export_name, Vector<ResolvedBinding> resolve_set = {}) override;
|
|
|
|
Object* import_meta() { return m_import_meta; }
|
|
void set_import_meta(Badge<VM>, Object* import_meta) { m_import_meta = import_meta; }
|
|
|
|
protected:
|
|
virtual ThrowCompletionOr<void> initialize_environment(VM& vm) override;
|
|
virtual ThrowCompletionOr<void> execute_module(VM& vm, GC::Ptr<PromiseCapability> capability) override;
|
|
|
|
private:
|
|
SourceTextModule(Realm&, StringView filename, Script::HostDefined* host_defined, bool has_top_level_await, NonnullRefPtr<Program> body, Vector<ModuleRequest> requested_modules, Vector<ImportEntry> import_entries, Vector<ExportEntry> local_export_entries, Vector<ExportEntry> indirect_export_entries, Vector<ExportEntry> star_export_entries, Optional<Utf16FlyString> default_export_binding_name);
|
|
|
|
virtual void visit_edges(Cell::Visitor&) override;
|
|
|
|
RefPtr<Program> m_ecmascript_code; // [[ECMAScriptCode]]
|
|
NonnullOwnPtr<ExecutionContext> m_execution_context; // [[Context]]
|
|
GC::Ptr<Object> m_import_meta; // [[ImportMeta]]
|
|
Vector<ImportEntry> m_import_entries; // [[ImportEntries]]
|
|
Vector<ExportEntry> m_local_export_entries; // [[LocalExportEntries]]
|
|
Vector<ExportEntry> m_indirect_export_entries; // [[IndirectExportEntries]]
|
|
Vector<ExportEntry> m_star_export_entries; // [[StarExportEntries]]
|
|
|
|
// Pre-computed module declaration instantiation data.
|
|
// These are extracted from the AST at construction time so that
|
|
// initialize_environment() can run without walking the AST.
|
|
struct FunctionToInitialize {
|
|
GC::Ref<SharedFunctionInstanceData> shared_data;
|
|
Utf16FlyString name;
|
|
};
|
|
struct LexicalBinding {
|
|
Utf16FlyString name;
|
|
bool is_constant { false };
|
|
i32 function_index { -1 }; // index into m_functions_to_initialize, -1 if not a function
|
|
};
|
|
Vector<Utf16FlyString> m_var_declared_names;
|
|
Vector<LexicalBinding> m_lexical_bindings;
|
|
Vector<FunctionToInitialize> m_functions_to_initialize;
|
|
Optional<Utf16FlyString> m_default_export_binding_name;
|
|
|
|
GC::Ptr<Bytecode::Executable> m_executable;
|
|
GC::Ptr<SharedFunctionInstanceData> m_tla_shared_data;
|
|
};
|
|
|
|
}
|