/* static */ const uint8_t* Module::deserialize(const uint8_t* cursor, SharedModule* module, Metadata* maybeMetadata) { Bytes code; cursor = DeserializePodVector(cursor, &code); if (!cursor) return nullptr; LinkData linkData; cursor = linkData.deserialize(cursor); if (!cursor) return nullptr; ImportVector imports; cursor = DeserializeVector(cursor, &imports); if (!cursor) return nullptr; ExportVector exports; cursor = DeserializeVector(cursor, &exports); if (!cursor) return nullptr; DataSegmentVector dataSegments; cursor = DeserializePodVector(cursor, &dataSegments); if (!cursor) return nullptr; ElemSegmentVector elemSegments; cursor = DeserializeVector(cursor, &elemSegments); if (!cursor) return nullptr; MutableMetadata metadata; if (maybeMetadata) { metadata = maybeMetadata; } else { metadata = js_new<Metadata>(); if (!metadata) return nullptr; } cursor = metadata->deserialize(cursor); if (!cursor) return nullptr; MOZ_RELEASE_ASSERT(!!maybeMetadata == metadata->isAsmJS()); MutableBytes bytecode = js_new<ShareableBytes>(); if (!bytecode) return nullptr; cursor = DeserializePodVector(cursor, &bytecode->bytes); if (!cursor) return nullptr; *module = js_new<Module>(Move(code), Move(linkData), Move(imports), Move(exports), Move(dataSegments), Move(elemSegments), *metadata, *bytecode); if (!*module) return nullptr; return cursor; }
/* static */ SharedModule Module::deserialize(const uint8_t* bytecodeBegin, size_t bytecodeSize, const uint8_t* compiledBegin, size_t compiledSize, Metadata* maybeMetadata) { MutableBytes bytecode = js_new<ShareableBytes>(); if (!bytecode || !bytecode->bytes.initLengthUninitialized(bytecodeSize)) return nullptr; memcpy(bytecode->bytes.begin(), bytecodeBegin, bytecodeSize); Assumptions assumptions; const uint8_t* cursor = assumptions.deserialize(compiledBegin, compiledSize); if (!cursor) return nullptr; Bytes code; cursor = DeserializePodVector(cursor, &code); if (!cursor) return nullptr; LinkData linkData; cursor = linkData.deserialize(cursor); if (!cursor) return nullptr; ImportVector imports; cursor = DeserializeVector(cursor, &imports); if (!cursor) return nullptr; ExportVector exports; cursor = DeserializeVector(cursor, &exports); if (!cursor) return nullptr; DataSegmentVector dataSegments; cursor = DeserializePodVector(cursor, &dataSegments); if (!cursor) return nullptr; ElemSegmentVector elemSegments; cursor = DeserializeVector(cursor, &elemSegments); if (!cursor) return nullptr; MutableMetadata metadata; if (maybeMetadata) { metadata = maybeMetadata; } else { metadata = js_new<Metadata>(); if (!metadata) return nullptr; } cursor = metadata->deserialize(cursor); if (!cursor) return nullptr; MOZ_RELEASE_ASSERT(cursor == compiledBegin + compiledSize); MOZ_RELEASE_ASSERT(!!maybeMetadata == metadata->isAsmJS()); return js_new<Module>(Move(assumptions), Move(code), Move(linkData), Move(imports), Move(exports), Move(dataSegments), Move(elemSegments), *metadata, *bytecode); }