#include "serializer.h" #include "isolate/functor_runners.h" #include "module/transferable.h" /** * This file is compiled *without* runtime type information, which matches the nodejs binary and * allows the serializer delegates to resolve correctly. */ using namespace v8; namespace ivm::detail { void SerializerDelegate::ThrowDataCloneError(Local message) { Isolate::GetCurrent()->ThrowException(Exception::TypeError(message)); } auto SerializerDelegate::GetSharedArrayBufferId( Isolate* /*isolate*/, Local shared_array_buffer) -> Maybe { auto result = Nothing(); detail::RunBarrier([&]() { transferables.emplace_back(std::make_unique(shared_array_buffer)); result = Just(transferables.size() - 1); }); return result; } auto SerializerDelegate::GetWasmModuleTransferId( Isolate* /*isolate*/, Local module) -> Maybe { auto result = Just(wasm_modules.size()); wasm_modules.emplace_back(module->GetCompiledModule()); return result; } auto SerializerDelegate::WriteHostObject(Isolate* /*isolate*/, Local object) -> Maybe { auto result = Nothing(); detail::RunBarrier([&]() { serializer->WriteUint32(transferables.size()); transferables.emplace_back(TransferOut(object)); result = Just(true); }); return result; } auto DeserializerDelegate::ReadHostObject(Isolate* /*isolate*/) -> MaybeLocal { MaybeLocal result; detail::RunBarrier([&]() { uint32_t ii; assert(deserializer->ReadUint32(&ii)); result = transferables[ii]->TransferIn().As(); }); return result; } auto DeserializerDelegate::GetSharedArrayBufferFromId( Isolate* /*isolate*/, uint32_t clone_id) -> MaybeLocal { MaybeLocal result; detail::RunBarrier([&]() { result = transferables[clone_id]->TransferIn().As(); }); return result; } auto DeserializerDelegate::GetWasmModuleFromId( Isolate* isolate, uint32_t transfer_id) -> MaybeLocal { MaybeLocal result; detail::RunBarrier([&]() { result = WasmModuleObject::FromCompiledModule(isolate, wasm_modules[transfer_id]); }); return result; } } // namespace ivm::detail