WebAssemblyModule.h 7.8 KB

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