blob: 3f7cf53345b894ecbfc4113aaaba5e48e3dcbc7f [file]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
#pragma once
namespace Wasm
{
class WasmGlobal;
struct WasmConstLitNode;
}
namespace Js
{
class WebAssemblyModule;
class WebAssemblyTable;
class WebAssemblyMemory;
class WebAssemblyEnvironment
{
public:
WebAssemblyEnvironment(WebAssemblyModule* module);
Var* GetStartPtr() const { return (Var*)PointerValue(start); }
AsmJsScriptFunction* GetWasmFunction(uint32 index) const;
void SetWasmFunction(uint32 index, AsmJsScriptFunction* func);
void SetImportedFunction(uint32 index, Var importedFunc);
WebAssemblyTable* GetTable(uint32 index) const;
void SetTable(uint32 index, class WebAssemblyTable* table);
WebAssemblyMemory* GetMemory(uint32 index) const;
void SetMemory(uint32 index, WebAssemblyMemory* mem);
Wasm::WasmConstLitNode GetGlobalValue(Wasm::WasmGlobal* global) const;
void SetGlobalValue(class Wasm::WasmGlobal* global, Wasm::WasmConstLitNode cnst);
void CalculateOffsets(WebAssemblyTable* table, WebAssemblyMemory* memory);
uint32 GetElementSegmentOffset(uint32 index) const;
uint32 GetDataSegmentOffset(uint32 index) const;
private:
Field(WebAssemblyModule*) module;
Field(Field(Var)*) start;
Field(Field(Var)*) end;
// Precalculated pointer from ptr using the offsets
Field(Field(Var)*) memory;
Field(Field(Var)*) imports;
Field(Field(Var)*) functions;
Field(Field(Var)*) table;
Field(Field(Var)*) globals;
uint32* elementSegmentOffsets;
uint32* dataSegmentOffsets;
DebugOnly(bool offsetInitialized = false);
ArenaAllocator m_alloc;
private:
template<typename T> void CheckPtrIsValid(intptr_t ptr) const;
template<typename T> T* GetVarElement(Field(Var)* ptr, uint32 index, uint32 maxCount) const;
template<typename T> void SetVarElement(Field(Var)* ptr, T* val, uint32 index, uint32 maxCount);
template<typename T> T GetGlobalInternal(uint32 offset) const;
template<typename T> void SetGlobalInternal(uint32 offset, T val);
};
} // namespace Js