JSWebAssemblyMemory.cpp [plain text]
#include "config.h"
#include "JSWebAssemblyMemory.h"
#if ENABLE(WEBASSEMBLY)
#include "JSCInlines.h"
#include "JSArrayBuffer.h"
#include "ArrayBuffer.h"
namespace JSC {
const ClassInfo JSWebAssemblyMemory::s_info = { "WebAssembly.Memory", &Base::s_info, 0, CREATE_METHOD_TABLE(JSWebAssemblyMemory) };
JSWebAssemblyMemory* JSWebAssemblyMemory::create(VM& vm, Structure* structure, std::unique_ptr<Wasm::Memory>&& memory)
{
auto* instance = new (NotNull, allocateCell<JSWebAssemblyMemory>(vm.heap)) JSWebAssemblyMemory(vm, structure, WTFMove(memory));
instance->finishCreation(vm);
return instance;
}
Structure* JSWebAssemblyMemory::createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype)
{
return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info());
}
JSWebAssemblyMemory::JSWebAssemblyMemory(VM& vm, Structure* structure, std::unique_ptr<Wasm::Memory>&& memory)
: Base(vm, structure)
, m_memory(WTFMove(memory))
{
}
JSArrayBuffer* JSWebAssemblyMemory::buffer(VM& vm, JSGlobalObject* globalObject)
{
if (m_bufferWrapper)
return m_bufferWrapper.get();
auto destructor = [] (void*) {
};
m_buffer = ArrayBuffer::createFromBytes(memory()->memory(), memory()->size(), WTFMove(destructor));
m_bufferWrapper.set(vm, this, JSArrayBuffer::create(vm, globalObject->m_arrayBufferStructure.get(), m_buffer.get()));
RELEASE_ASSERT(m_bufferWrapper);
return m_bufferWrapper.get();
}
void JSWebAssemblyMemory::finishCreation(VM& vm)
{
Base::finishCreation(vm);
ASSERT(inherits(info()));
}
void JSWebAssemblyMemory::destroy(JSCell* cell)
{
static_cast<JSWebAssemblyMemory*>(cell)->JSWebAssemblyMemory::~JSWebAssemblyMemory();
}
void JSWebAssemblyMemory::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
auto* thisObject = jsCast<JSWebAssemblyMemory*>(cell);
ASSERT_GC_OBJECT_INHERITS(thisObject, info());
Base::visitChildren(thisObject, visitor);
visitor.append(thisObject->m_bufferWrapper);
}
}
#endif // ENABLE(WEBASSEMBLY)