#include "config.h"
#include "WasmInstance.h"
#if ENABLE(WEBASSEMBLY)
#include "Register.h"
#include "WasmModuleInformation.h"
#include <wtf/CheckedArithmetic.h>
namespace JSC { namespace Wasm {
namespace {
size_t globalMemoryByteSize(Module& module)
{
return (Checked<size_t>(module.moduleInformation().globals.size()) * sizeof(Register)).unsafeGet();
}
}
Instance::Instance(Context* context, Ref<Module>&& module, EntryFrame** pointerToTopEntryFrame, void** pointerToActualStackLimit, StoreTopCallFrameCallback&& storeTopCallFrame)
: m_context(context)
, m_module(WTFMove(module))
, m_globals(MallocPtr<uint64_t>::malloc(globalMemoryByteSize(m_module.get())))
, m_pointerToTopEntryFrame(pointerToTopEntryFrame)
, m_pointerToActualStackLimit(pointerToActualStackLimit)
, m_storeTopCallFrame(WTFMove(storeTopCallFrame))
, m_numImportFunctions(m_module->moduleInformation().importFunctionCount())
{
for (unsigned i = 0; i < m_numImportFunctions; ++i)
new (importFunctionInfo(i)) ImportFunctionInfo();
}
Ref<Instance> Instance::create(Context* context, Ref<Module>&& module, EntryFrame** pointerToTopEntryFrame, void** pointerToActualStackLimit, StoreTopCallFrameCallback&& storeTopCallFrame)
{
return adoptRef(*new (NotNull, fastMalloc(allocationSize(module->moduleInformation().importFunctionCount()))) Instance(context, WTFMove(module), pointerToTopEntryFrame, pointerToActualStackLimit, WTFMove(storeTopCallFrame)));
}
Instance::~Instance() { }
size_t Instance::extraMemoryAllocated() const
{
return globalMemoryByteSize(m_module.get()) + allocationSize(m_numImportFunctions);
}
} }
#endif // ENABLE(WEBASSEMBLY)