summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibWeb/WebAssembly/WebAssemblyMemoryConstructor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Userland/Libraries/LibWeb/WebAssembly/WebAssemblyMemoryConstructor.cpp')
-rw-r--r--Userland/Libraries/LibWeb/WebAssembly/WebAssemblyMemoryConstructor.cpp79
1 files changed, 79 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/WebAssembly/WebAssemblyMemoryConstructor.cpp b/Userland/Libraries/LibWeb/WebAssembly/WebAssemblyMemoryConstructor.cpp
new file mode 100644
index 0000000000..4a8ce4a786
--- /dev/null
+++ b/Userland/Libraries/LibWeb/WebAssembly/WebAssemblyMemoryConstructor.cpp
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2021, Ali Mohammad Pur <mpfard@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <LibJS/Heap/Heap.h>
+#include <LibJS/Runtime/GlobalObject.h>
+#include <LibWeb/Bindings/WindowObject.h>
+#include <LibWeb/WebAssembly/WebAssemblyMemoryConstructor.h>
+#include <LibWeb/WebAssembly/WebAssemblyMemoryPrototype.h>
+#include <LibWeb/WebAssembly/WebAssemblyObject.h>
+
+namespace Web::Bindings {
+
+WebAssemblyMemoryConstructor::WebAssemblyMemoryConstructor(JS::GlobalObject& global_object)
+ : NativeFunction(*global_object.function_prototype())
+{
+}
+
+WebAssemblyMemoryConstructor::~WebAssemblyMemoryConstructor()
+{
+}
+
+JS::Value WebAssemblyMemoryConstructor::call()
+{
+ vm().throw_exception<JS::TypeError>(global_object(), JS::ErrorType::ConstructorWithoutNew, "WebAssemblyMemory");
+ return {};
+}
+
+JS::Value WebAssemblyMemoryConstructor::construct(Function&)
+{
+ auto& vm = this->vm();
+ auto& global_object = this->global_object();
+
+ auto descriptor = vm.argument(0).to_object(global_object);
+ if (vm.exception())
+ return {};
+
+ auto initial_value = descriptor->get_own_property("initial", {}, JS::AllowSideEffects::No);
+ auto maximum_value = descriptor->get_own_property("maximum", {}, JS::AllowSideEffects::No);
+
+ if (initial_value.is_empty()) {
+ vm.throw_exception<JS::TypeError>(global_object, JS::ErrorType::NotA, "Number");
+ return {};
+ }
+
+ auto initial = initial_value.to_u32(global_object);
+ if (vm.exception())
+ return {};
+
+ Optional<u32> maximum;
+
+ if (!maximum_value.is_empty()) {
+ maximum = maximum_value.to_u32(global_object);
+ if (vm.exception())
+ return {};
+ }
+
+ auto address = WebAssemblyObject::s_abstract_machine.store().allocate(Wasm::MemoryType { Wasm::Limits { initial, maximum } });
+ if (!address.has_value()) {
+ vm.throw_exception<JS::TypeError>(global_object, "Wasm Memory allocation failed");
+ return {};
+ }
+
+ return vm.heap().allocate<WebAssemblyMemoryObject>(global_object, global_object, *address);
+}
+
+void WebAssemblyMemoryConstructor::initialize(JS::GlobalObject& global_object)
+{
+ auto& vm = this->vm();
+ auto& window = static_cast<WindowObject&>(global_object);
+
+ NativeFunction::initialize(global_object);
+ define_property(vm.names.prototype, &window.ensure_web_prototype<WebAssemblyMemoryPrototype>("WebAssembly.Memory"));
+ define_property(vm.names.length, JS::Value(1), JS::Attribute::Configurable);
+}
+
+}