WebAssemblyModule.h 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #pragma once
  6. #ifdef ENABLE_WASM
  7. #include "../WasmReader/WasmParseTree.h"
  8. namespace Wasm
  9. {
  10. class WasmSignature;
  11. class WasmFunctionInfo;
  12. class WasmBinaryReader;
  13. class WasmDataSegment;
  14. class WasmElementSegment;
  15. class WasmGlobal;
  16. struct WasmImport;
  17. struct WasmExport;
  18. struct CustomSection;
  19. }
  20. namespace Js
  21. {
  22. class WebAssemblyModule : public DynamicObject
  23. {
  24. protected:
  25. DEFINE_VTABLE_CTOR(WebAssemblyModule, DynamicObject);
  26. DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(WebAssemblyModule);
  27. public:
  28. class EntryInfo
  29. {
  30. public:
  31. static FunctionInfo NewInstance;
  32. static FunctionInfo Exports;
  33. static FunctionInfo Imports;
  34. static FunctionInfo CustomSections;
  35. };
  36. static Var NewInstance(RecyclableObject* function, CallInfo callInfo, ...);
  37. static Var EntryExports(RecyclableObject* function, CallInfo callInfo, ...);
  38. static Var EntryImports(RecyclableObject* function, CallInfo callInfo, ...);
  39. static Var EntryCustomSections(RecyclableObject* function, CallInfo callInfo, ...);
  40. static bool Is(Var aValue);
  41. static WebAssemblyModule * FromVar(Var aValue);
  42. static WebAssemblyModule * CreateModule(
  43. ScriptContext* scriptContext,
  44. class WebAssemblySource* src);
  45. static bool ValidateModule(
  46. ScriptContext* scriptContext,
  47. class WebAssemblySource* src);
  48. public:
  49. WebAssemblyModule(Js::ScriptContext* scriptContext, const byte* binaryBuffer, uint binaryBufferLength, DynamicType * type);
  50. const byte* GetBinaryBuffer() const { return m_binaryBuffer; }
  51. uint GetBinaryBufferLength() const { return m_binaryBufferLength; }
  52. // The index used by those methods is the function index as describe by the WebAssembly design, ie: imports first then wasm functions
  53. uint32 GetMaxFunctionIndex() const;
  54. Wasm::FunctionIndexTypes::Type GetFunctionIndexType(uint32 funcIndex) const;
  55. void InitializeMemory(uint32 minSize, uint32 maxSize);
  56. WebAssemblyMemory * CreateMemory() const;
  57. bool HasMemory() const { return m_hasMemory; }
  58. bool HasMemoryImport() const { return m_memImport != nullptr; }
  59. uint32 GetMemoryInitSize() const { return m_memoryInitSize; }
  60. uint32 GetMemoryMaxSize() const { return m_memoryMaxSize; }
  61. Wasm::WasmSignature * GetSignatures() const;
  62. Wasm::WasmSignature* GetSignature(uint32 index) const;
  63. void SetSignatureCount(uint32 count);
  64. uint32 GetSignatureCount() const;
  65. uint32 GetEquivalentSignatureId(uint32 sigId) const;
  66. void InitializeTable(uint32 minEntries, uint32 maxEntries);
  67. WebAssemblyTable * CreateTable() const;
  68. bool HasTable() const { return m_hasTable; }
  69. bool HasTableImport() const { return m_tableImport != nullptr; }
  70. bool IsValidTableImport(const WebAssemblyTable * table) const;
  71. uint GetWasmFunctionCount() const;
  72. Wasm::WasmFunctionInfo* AddWasmFunctionInfo(Wasm::WasmSignature* funsig);
  73. Wasm::WasmFunctionInfo* GetWasmFunctionInfo(uint index) const;
  74. void SwapWasmFunctionInfo(uint i1, uint i2);
  75. #if ENABLE_DEBUG_CONFIG_OPTIONS
  76. void AttachCustomInOutTracingReader(Wasm::WasmFunctionInfo* func, uint callIndex);
  77. #endif
  78. void AllocateFunctionExports(uint32 entries);
  79. uint GetExportCount() const { return m_exportCount; }
  80. void SetExport(uint32 iExport, uint32 funcIndex, const char16* exportName, uint32 nameLength, Wasm::ExternalKinds::ExternalKind kind);
  81. Wasm::WasmExport* GetExport(uint32 iExport) const;
  82. uint32 GetImportCount() const;
  83. Wasm::WasmImport* GetImport(uint32 i) const;
  84. void AddFunctionImport(uint32 sigId, const char16* modName, uint32 modNameLen, const char16* fnName, uint32 fnNameLen);
  85. void AddGlobalImport(const char16* modName, uint32 modNameLen, const char16* importName, uint32 importNameLen);
  86. void AddMemoryImport(const char16* modName, uint32 modNameLen, const char16* importName, uint32 importNameLen);
  87. void AddTableImport(const char16* modName, uint32 modNameLen, const char16* importName, uint32 importNameLen);
  88. uint32 GetImportedFunctionCount() const { return m_importedFunctionCount; }
  89. uint GetOffsetFromInit(const Wasm::WasmNode& initExpr, const class WebAssemblyEnvironment* env) const;
  90. void ValidateInitExportForOffset(const Wasm::WasmNode& initExpr) const;
  91. void AddGlobal(Wasm::GlobalReferenceTypes::Type refType, Wasm::WasmTypes::WasmType type, bool isMutable, Wasm::WasmNode init);
  92. uint32 GetGlobalCount() const;
  93. Wasm::WasmGlobal* GetGlobal(uint32 index) const;
  94. void AllocateDataSegs(uint32 count);
  95. void SetDataSeg(Wasm::WasmDataSegment* seg, uint32 index);
  96. Wasm::WasmDataSegment* GetDataSeg(uint32 index) const;
  97. uint32 GetDataSegCount() const { return m_datasegCount; }
  98. void AllocateElementSegs(uint32 count);
  99. void SetElementSeg(Wasm::WasmElementSegment* seg, uint32 index);
  100. Wasm::WasmElementSegment* GetElementSeg(uint32 index) const;
  101. uint32 GetElementSegCount() const { return m_elementsegCount; }
  102. void SetStartFunction(uint32 i);
  103. uint32 GetStartFunction() const;
  104. uint32 GetModuleEnvironmentSize() const;
  105. // elements at known offsets
  106. static uint GetMemoryOffset() { return 0; }
  107. static uint GetImportFuncOffset() { return GetMemoryOffset() + 1; }
  108. // elements at instance dependent offsets
  109. uint GetFuncOffset() const { return GetImportFuncOffset() + GetImportedFunctionCount(); }
  110. uint GetTableEnvironmentOffset() const { return GetFuncOffset() + GetWasmFunctionCount(); }
  111. uint GetGlobalOffset() const { return GetTableEnvironmentOffset() + 1; }
  112. uint GetOffsetForGlobal(Wasm::WasmGlobal* global) const;
  113. uint AddGlobalByteSizeToOffset(Wasm::WasmTypes::WasmType type, uint32 offset) const;
  114. uint GetGlobalsByteSize() const;
  115. void AddCustomSection(Wasm::CustomSection customSection);
  116. uint32 GetCustomSectionCount() const;
  117. Wasm::CustomSection GetCustomSection(uint32 index) const;
  118. Wasm::WasmBinaryReader* GetReader() const { return m_reader; }
  119. virtual void Finalize(bool isShutdown) override;
  120. virtual void Dispose(bool isShutdown) override;
  121. virtual void Mark(Recycler * recycler) override;
  122. private:
  123. static JavascriptString * GetExternalKindString(ScriptContext * scriptContext, Wasm::ExternalKinds::ExternalKind kind);
  124. Field(bool) m_hasTable;
  125. Field(bool) m_hasMemory;
  126. // The binary buffer is recycler allocated, tied the lifetime of the buffer to the module
  127. Field(const byte*) m_binaryBuffer;
  128. Field(uint) m_binaryBufferLength;
  129. Field(uint32) m_memoryInitSize;
  130. Field(uint32) m_memoryMaxSize;
  131. Field(uint32) m_tableInitSize;
  132. Field(uint32) m_tableMaxSize;
  133. Field(Wasm::WasmSignature*) m_signatures;
  134. Field(uint32*) m_indirectfuncs;
  135. Field(Wasm::WasmElementSegment**) m_elementsegs;
  136. typedef JsUtil::List<Wasm::WasmFunctionInfo*, Recycler> WasmFunctionInfosList;
  137. Field(WasmFunctionInfosList*) m_functionsInfo;
  138. Field(Wasm::WasmExport*) m_exports;
  139. typedef JsUtil::List<Wasm::WasmImport*, ArenaAllocator> WasmImportsList;
  140. Field(WasmImportsList*) m_imports;
  141. Field(Wasm::WasmImport*) m_memImport;
  142. Field(Wasm::WasmImport*) m_tableImport;
  143. Field(uint32) m_importedFunctionCount;
  144. Field(Wasm::WasmDataSegment**) m_datasegs;
  145. Field(Wasm::WasmBinaryReader*) m_reader;
  146. Field(uint32*) m_equivalentSignatureMap;
  147. typedef JsUtil::List<Wasm::CustomSection, ArenaAllocator> CustomSectionsList;
  148. Field(CustomSectionsList*) m_customSections;
  149. Field(uint) m_globalCounts[Wasm::WasmTypes::Limit];
  150. typedef JsUtil::List<Wasm::WasmGlobal*, ArenaAllocator> WasmGlobalsList;
  151. Field(WasmGlobalsList *) m_globals;
  152. Field(uint) m_signaturesCount;
  153. Field(uint) m_exportCount;
  154. Field(uint32) m_datasegCount;
  155. Field(uint32) m_elementsegCount;
  156. Field(uint32) m_startFuncIndex;
  157. FieldNoBarrier(ArenaAllocator*) m_alloc;
  158. };
  159. } // namespace Js
  160. #endif