| 
									
										
										
										
											2023-03-15 19:29:57 -04:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * 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>
 | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  | #include <LibGC/Ptr.h>
 | 
					
						
							| 
									
										
										
										
											2023-03-15 19:29:57 -04:00
										 |  |  | #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; | 
					
						
							| 
									
										
										
										
											2024-12-07 21:17:20 +01:00
										 |  |  |     Optional<bool> shared; | 
					
						
							| 
									
										
										
										
											2023-03-15 19:29:57 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Memory : public Bindings::PlatformObject { | 
					
						
							|  |  |  |     WEB_PLATFORM_OBJECT(Memory, Bindings::PlatformObject); | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  |     GC_DECLARE_ALLOCATOR(Memory); | 
					
						
							| 
									
										
										
										
											2023-03-15 19:29:57 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-07 21:17:20 +01:00
										 |  |  |     enum class Shared { | 
					
						
							|  |  |  |         No, | 
					
						
							|  |  |  |         Yes, | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-15 19:29:57 -04:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  |     static WebIDL::ExceptionOr<GC::Ref<Memory>> construct_impl(JS::Realm&, MemoryDescriptor& descriptor); | 
					
						
							| 
									
										
										
										
											2023-03-15 19:29:57 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-17 14:14:24 -07:00
										 |  |  |     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(); | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  |     WebIDL::ExceptionOr<GC::Ref<JS::ArrayBuffer>> buffer() const; | 
					
						
							| 
									
										
										
										
											2023-03-15 19:29:57 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Wasm::MemoryAddress address() const { return m_address; } | 
					
						
							| 
									
										
										
										
											2025-08-17 14:14:24 -07:00
										 |  |  |     GC::Ptr<JS::ArrayBuffer> buffer_object() const { return m_buffer; } | 
					
						
							| 
									
										
										
										
											2023-03-15 19:29:57 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2024-12-07 21:17:20 +01:00
										 |  |  |     Memory(JS::Realm&, Wasm::MemoryAddress, Shared shared); | 
					
						
							| 
									
										
										
										
											2023-03-15 19:29:57 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-07 08:41:28 +02:00
										 |  |  |     virtual void initialize(JS::Realm&) override; | 
					
						
							| 
									
										
										
										
											2024-04-05 15:22:02 +02:00
										 |  |  |     virtual void visit_edges(Visitor&) override; | 
					
						
							| 
									
										
										
										
											2023-03-15 19:29:57 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-18 21:13:58 -07:00
										 |  |  |     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); | 
					
						
							| 
									
										
										
										
											2025-08-17 14:14:24 -07:00
										 |  |  |     static JS::ThrowCompletionOr<GC::Ref<JS::ArrayBuffer>> create_a_resizable_memory_buffer(JS::VM&, JS::Realm&, Wasm::MemoryAddress, Shared shared, size_t max_size); | 
					
						
							| 
									
										
										
										
											2023-03-29 01:31:51 +03:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-15 19:29:57 -04:00
										 |  |  |     Wasm::MemoryAddress m_address; | 
					
						
							| 
									
										
										
										
											2024-12-07 21:17:20 +01:00
										 |  |  |     Shared m_shared { Shared::No }; | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  |     mutable GC::Ptr<JS::ArrayBuffer> m_buffer; | 
					
						
							| 
									
										
										
										
											2023-03-15 19:29:57 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |