mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-10-18 14:09:42 +00:00
This commit adds the toResizableBuffer() and toFixedLengthBuffer() methods to WebAssembly.Memory. This includes the necessary hook to HostResizeArrayBuffer. Some modifications to function signatures in LibWeb/WebAssembly/Memory.h were also made (changing the return type from WebIDL::ExceptionOr to JS::ThrowCompletionOr) to allow the use of some code in the aforementioned hook. Note: the hook for HostGrowSharedArrayBuffer isn't implemented, since LibJS doesn't seem to have complete support for growable SharedArrayBuffers; the relevant methods/getters don't even exist on the prototype, let alone HostGrowSharedArrayBuffer! This should help pass the WebAssembly.Memory WPT tests included in Interop 2025, except those pertaining to growable SharedArrayBuffers.
62 lines
1.9 KiB
C++
62 lines
1.9 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 <AK/Optional.h>
|
|
#include <LibGC/Ptr.h>
|
|
#include <LibJS/Forward.h>
|
|
#include <LibJS/Runtime/ArrayBuffer.h>
|
|
#include <LibWasm/AbstractMachine/AbstractMachine.h>
|
|
#include <LibWeb/Bindings/ExceptionOrUtils.h>
|
|
#include <LibWeb/Bindings/PlatformObject.h>
|
|
|
|
namespace Web::WebAssembly {
|
|
|
|
struct MemoryDescriptor {
|
|
u32 initial { 0 };
|
|
Optional<u32> maximum;
|
|
Optional<bool> shared;
|
|
};
|
|
|
|
class Memory : public Bindings::PlatformObject {
|
|
WEB_PLATFORM_OBJECT(Memory, Bindings::PlatformObject);
|
|
GC_DECLARE_ALLOCATOR(Memory);
|
|
|
|
enum class Shared {
|
|
No,
|
|
Yes,
|
|
};
|
|
|
|
public:
|
|
static WebIDL::ExceptionOr<GC::Ref<Memory>> construct_impl(JS::Realm&, MemoryDescriptor& descriptor);
|
|
|
|
JS::ThrowCompletionOr<u32> grow(u32 delta);
|
|
|
|
WebIDL::ExceptionOr<GC::Ref<JS::ArrayBuffer>> to_fixed_length_buffer();
|
|
WebIDL::ExceptionOr<GC::Ref<JS::ArrayBuffer>> to_resizable_buffer();
|
|
WebIDL::ExceptionOr<GC::Ref<JS::ArrayBuffer>> buffer() const;
|
|
|
|
Wasm::MemoryAddress address() const { return m_address; }
|
|
GC::Ptr<JS::ArrayBuffer> buffer_object() const { return m_buffer; }
|
|
|
|
private:
|
|
Memory(JS::Realm&, Wasm::MemoryAddress, Shared shared);
|
|
|
|
virtual void initialize(JS::Realm&) override;
|
|
virtual void visit_edges(Visitor&) override;
|
|
|
|
static void refresh_the_memory_buffer(JS::VM&, JS::Realm&, Wasm::MemoryAddress);
|
|
static GC::Ref<JS::ArrayBuffer> create_a_fixed_length_memory_buffer(JS::VM&, JS::Realm&, Wasm::MemoryAddress, Shared shared);
|
|
static JS::ThrowCompletionOr<GC::Ref<JS::ArrayBuffer>> create_a_resizable_memory_buffer(JS::VM&, JS::Realm&, Wasm::MemoryAddress, Shared shared, size_t max_size);
|
|
|
|
Wasm::MemoryAddress m_address;
|
|
Shared m_shared { Shared::No };
|
|
mutable GC::Ptr<JS::ArrayBuffer> m_buffer;
|
|
};
|
|
|
|
}
|