WebAssemblyObject.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*
  2. * Copyright (c) 2021, Ali Mohammad Pur <mpfard@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <LibJS/Runtime/Object.h>
  8. #include <LibWasm/AbstractMachine/AbstractMachine.h>
  9. #include <LibWeb/Forward.h>
  10. #include <LibWeb/WebAssembly/WebAssemblyObjectPrototype.h>
  11. namespace Web::Bindings {
  12. class WebAssemblyObject final : public JS::Object {
  13. JS_OBJECT(WebAssemblyObject, JS::Object);
  14. public:
  15. explicit WebAssemblyObject(JS::GlobalObject&);
  16. virtual void initialize(JS::GlobalObject&) override;
  17. virtual ~WebAssemblyObject() override = default;
  18. struct CompiledWebAssemblyModule {
  19. explicit CompiledWebAssemblyModule(Wasm::Module&& module)
  20. : module(move(module))
  21. {
  22. }
  23. Wasm::Module module;
  24. };
  25. // FIXME: These should just be members of the module (instance) object,
  26. // but the module needs to stick around while its instance is alive
  27. // so ideally this would be a refcounted object, shared between
  28. // WebAssemblyModuleObject's and WebAssemblyInstantiatedModuleObject's.
  29. static NonnullOwnPtrVector<CompiledWebAssemblyModule> s_compiled_modules;
  30. static NonnullOwnPtrVector<Wasm::ModuleInstance> s_instantiated_modules;
  31. static Wasm::AbstractMachine s_abstract_machine;
  32. private:
  33. JS_DECLARE_NATIVE_FUNCTION(validate);
  34. JS_DECLARE_NATIVE_FUNCTION(compile);
  35. JS_DECLARE_NATIVE_FUNCTION(instantiate);
  36. };
  37. class WebAssemblyModuleObject final : public JS::Object {
  38. JS_OBJECT(WebAssemblyModuleObject, JS::Object);
  39. public:
  40. explicit WebAssemblyModuleObject(JS::GlobalObject&, size_t index);
  41. virtual ~WebAssemblyModuleObject() override = default;
  42. size_t index() const { return m_index; }
  43. const Wasm::Module& module() const { return WebAssemblyObject::s_compiled_modules.at(m_index).module; }
  44. private:
  45. size_t m_index { 0 };
  46. };
  47. class WebAssemblyInstanceObject final : public JS::Object {
  48. JS_OBJECT(WebAssemblyInstanceObject, JS::Object);
  49. public:
  50. explicit WebAssemblyInstanceObject(JS::GlobalObject&, size_t index);
  51. virtual void initialize(JS::GlobalObject&) override;
  52. virtual ~WebAssemblyInstanceObject() override = default;
  53. size_t index() const { return m_index; }
  54. Wasm::ModuleInstance& instance() const { return WebAssemblyObject::s_instantiated_modules.at(m_index); }
  55. void visit_edges(Cell::Visitor&) override;
  56. friend class WebAssemblyInstancePrototype;
  57. private:
  58. size_t m_index { 0 };
  59. JS::Object* m_exports_object { nullptr };
  60. };
  61. class WebAssemblyMemoryObject final : public JS::Object {
  62. JS_OBJECT(WebAssemblyModuleObject, JS::Object);
  63. public:
  64. explicit WebAssemblyMemoryObject(JS::GlobalObject&, Wasm::MemoryAddress);
  65. virtual void initialize(JS::GlobalObject&) override;
  66. virtual ~WebAssemblyMemoryObject() override = default;
  67. auto address() const { return m_address; }
  68. private:
  69. JS_DECLARE_NATIVE_FUNCTION(grow);
  70. JS_DECLARE_NATIVE_GETTER(buffer);
  71. Wasm::MemoryAddress m_address;
  72. };
  73. }