diff options
Diffstat (limited to 'src/wasm/wasm-binary.cpp')
-rw-r--r-- | src/wasm/wasm-binary.cpp | 60 |
1 files changed, 33 insertions, 27 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index df2bc8eba..14a72bcb4 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -789,32 +789,6 @@ void WasmBinaryWriter::writeNames() { } } - // elem names - { - std::vector<std::pair<Index, ElementSegment*>> elemsWithNames; - Index checked = 0; - for (auto& curr : wasm->elementSegments) { - if (curr->hasExplicitName) { - elemsWithNames.push_back({checked, curr.get()}); - } - checked++; - } - assert(checked == indexes.elemIndexes.size()); - - if (elemsWithNames.size() > 0) { - auto substart = - startSubsection(BinaryConsts::UserSections::Subsection::NameElem); - o << U32LEB(elemsWithNames.size()); - - for (auto& indexedElem : elemsWithNames) { - o << U32LEB(indexedElem.first); - writeEscapedName(indexedElem.second->name.str); - } - - finishSubsection(substart); - } - } - // memory names if (wasm->memory.exists && wasm->memory.hasExplicitName) { auto substart = @@ -849,7 +823,33 @@ void WasmBinaryWriter::writeNames() { } } - // memory names + // elem segment names + { + std::vector<std::pair<Index, ElementSegment*>> elemsWithNames; + Index checked = 0; + for (auto& curr : wasm->elementSegments) { + if (curr->hasExplicitName) { + elemsWithNames.push_back({checked, curr.get()}); + } + checked++; + } + assert(checked == indexes.elemIndexes.size()); + + if (elemsWithNames.size() > 0) { + auto substart = + startSubsection(BinaryConsts::UserSections::Subsection::NameElem); + o << U32LEB(elemsWithNames.size()); + + for (auto& indexedElem : elemsWithNames) { + o << U32LEB(indexedElem.first); + writeEscapedName(indexedElem.second->name.str); + } + + finishSubsection(substart); + } + } + + // data segment names if (wasm->memory.exists) { Index count = 0; for (auto& seg : wasm->memory.segments) { @@ -2942,8 +2942,14 @@ private: void WasmBinaryBuilder::readNames(size_t payloadLen) { BYN_TRACE("== readNames\n"); auto sectionPos = pos; + uint32_t lastType = 0; while (pos < sectionPos + payloadLen) { auto nameType = getU32LEB(); + if (lastType && nameType <= lastType) { + std::cerr << "warning: out-of-order name subsection: " << nameType + << std::endl; + } + lastType = nameType; auto subsectionSize = getU32LEB(); auto subsectionPos = pos; if (nameType == BinaryConsts::UserSections::Subsection::NameModule) { |