/* * Copyright (c) 2025, Glenn Skrzypczak * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include namespace Web::WebAssembly { // 16.2.1.6 Source Text Module Records, https://tc39.es/ecma262/#sec-source-text-module-records class WebAssemblyModule final : public JS::CyclicModule { GC_CELL(WebAssemblyModule, JS::CyclicModule); GC_DECLARE_ALLOCATOR(WebAssemblyModule); public: virtual ~WebAssemblyModule() override; static JS::ThrowCompletionOr> parse(ByteBuffer bytes, JS::Realm&, StringView filename = {}, JS::Script::HostDefined* host_defined = nullptr); Vector export_name_list(); virtual Vector get_exported_names(JS::VM& vm, HashTable& export_star_set) override; virtual JS::ResolvedBinding resolve_export(JS::VM& vm, Utf16FlyString const& export_name, Vector resolve_set = {}) override; protected: virtual JS::ThrowCompletionOr initialize_environment(JS::VM& vm) override; virtual JS::ThrowCompletionOr execute_module(JS::VM& vm, GC::Ptr capability) override; private: WebAssemblyModule(JS::Realm&, StringView filename, WebAssembly::Module& module_source, JS::Script::HostDefined* host_defined, Vector requested_modules); virtual void visit_edges(Cell::Visitor&) override; GC::Ptr m_instance; // [[Instance]] GC::Ref m_module_source; // [[ModuleSource]] GC::Ptr m_module_record; // [[ModuleRecord]] Optional> m_cached_export_name_list; }; }