diff options
Diffstat (limited to 'src/wasm/wasm-binary.cpp')
-rw-r--r-- | src/wasm/wasm-binary.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index b351a46e5..f3642203d 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -58,6 +58,7 @@ void WasmBinaryWriter::write() { writeExports(); writeStart(); writeTableElements(); + writeDataCount(); writeFunctions(); writeDataSegments(); if (debugInfo) writeNames(); @@ -312,6 +313,15 @@ void WasmBinaryWriter::writeExports() { finishSection(start); } +void WasmBinaryWriter::writeDataCount() { + if (!wasm->features.hasBulkMemory() || !wasm->memory.segments.size()) { + return; + } + auto start = startSection(BinaryConsts::Section::DataCount); + o << U32LEB(wasm->memory.segments.size()); + finishSection(start); +} + void WasmBinaryWriter::writeDataSegments() { if (wasm->memory.segments.size() == 0) return; if (wasm->memory.segments.size() > WebLimitations::MaxDataSegments) { @@ -657,6 +667,7 @@ void WasmBinaryBuilder::read() { break; } case BinaryConsts::Section::Data: readDataSegments(); break; + case BinaryConsts::Section::DataCount: readDataCount(); break; case BinaryConsts::Section::Table: readFunctionTableDeclaration(); break; default: { readUserSection(payloadLen); @@ -673,6 +684,7 @@ void WasmBinaryBuilder::read() { } } + validateBinary(); processFunctions(); } @@ -1457,6 +1469,12 @@ Name WasmBinaryBuilder::getGlobalName(Index index) { return mappedGlobals[index]; } +void WasmBinaryBuilder::validateBinary() { + if (hasDataCount && wasm.memory.segments.size() != dataCount) { + throwError("Number of segments does not agree with DataCount section"); + } +} + void WasmBinaryBuilder::processFunctions() { for (auto* func : functions) { wasm.addFunction(func); @@ -1504,6 +1522,12 @@ void WasmBinaryBuilder::processFunctions() { wasm.updateMaps(); } +void WasmBinaryBuilder::readDataCount() { + if (debug) std::cerr << "== readDataCount" << std::endl; + hasDataCount = true; + dataCount = getU32LEB(); +} + void WasmBinaryBuilder::readDataSegments() { if (debug) std::cerr << "== readDataSegments" << std::endl; auto num = getU32LEB(); |