ladybird/Libraries/LibWeb/WebAssembly/Module.h
Shannon Booth 97abc707c7 LibWeb/Bindings: Generate buffer typedefs as variants
Represent BufferSource and ArrayBufferView as ordinary IDL typedefs over
their underlying union types, instead of special casing in the IDL
generator. This allows the union conversion/return machinery handle
these types consistently with other typedefs, which removes buffer
specific paths from the IDL generator.

This necessitates changing the WebIDL::BufferSource and
WebIDL::ArrayBufferView classes as views over these variants. This
replaces the old GC backed BufferableObject wrapper structure and
provide convenience helpers to determine things such as the byte length,
byte offset, backing buffer, and typed-array APIs.
2026-05-30 11:22:08 +02:00

59 lines
1.7 KiB
C++

/*
* Copyright (c) 2021, Ali Mohammad Pur <mpfard@serenityos.org>
* Copyright (c) 2023, Tim Flynn <trflynn89@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <LibGC/Ptr.h>
#include <LibGC/Root.h>
#include <LibJS/Forward.h>
#include <LibJS/Runtime/Array.h>
#include <LibWasm/Types.h>
#include <LibWeb/Bindings/ExceptionOrUtils.h>
#include <LibWeb/Bindings/PlatformObject.h>
#include <LibWeb/WebAssembly/WebAssembly.h>
namespace Web::Bindings {
enum class ImportExportKind : u8;
}
namespace Web::WebAssembly {
// FIXME: This should really be generated by the IDL generator.
struct ModuleImportDescriptor {
String module;
String name;
Bindings::ImportExportKind kind;
};
struct ModuleExportDescriptor {
String name;
Bindings::ImportExportKind kind;
};
class Module : public Bindings::PlatformObject {
WEB_PLATFORM_OBJECT(Module, Bindings::PlatformObject);
GC_DECLARE_ALLOCATOR(Module);
public:
static WebIDL::ExceptionOr<GC::Ref<Module>> construct_impl(JS::Realm&, WebIDL::BufferSource bytes);
static WebIDL::ExceptionOr<Vector<ModuleImportDescriptor>> imports(JS::VM&, GC::Ref<Module>);
static WebIDL::ExceptionOr<Vector<ModuleExportDescriptor>> exports(JS::VM&, GC::Ref<Module>);
static WebIDL::ExceptionOr<GC::RootVector<GC::Ref<JS::ArrayBuffer>>> custom_sections(JS::VM&, GC::Ref<Module>, String section_name);
NonnullRefPtr<Detail::CompiledWebAssemblyModule> compiled_module() const { return m_compiled_module; }
private:
Module(JS::Realm&, NonnullRefPtr<Detail::CompiledWebAssemblyModule>);
virtual void initialize(JS::Realm&) override;
NonnullRefPtr<Detail::CompiledWebAssemblyModule> m_compiled_module;
};
}