diff options
Diffstat (limited to 'src/wasm/wasm-binary.cpp')
-rw-r--r-- | src/wasm/wasm-binary.cpp | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index c36789828..3b8649d29 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -376,14 +376,25 @@ void WasmBinaryWriter::writeGlobals() { } BYN_TRACE("== writeglobals\n"); auto start = startSection(BinaryConsts::Section::Global); - auto num = importInfo->getNumDefinedGlobals(); + // Count and emit the total number of globals after tuple globals have been + // expanded into their constituent parts. + Index num = 0; + ModuleUtils::iterDefinedGlobals( + *wasm, [&num](Global* global) { num += global->type.size(); }); o << U32LEB(num); ModuleUtils::iterDefinedGlobals(*wasm, [&](Global* global) { BYN_TRACE("write one\n"); - o << binaryType(global->type); - o << U32LEB(global->mutable_); - writeExpression(global->init); - o << int8_t(BinaryConsts::End); + const auto& types = global->type.expand(); + for (size_t i = 0; i < types.size(); ++i) { + o << binaryType(types[i]); + o << U32LEB(global->mutable_); + if (types.size() == 1) { + writeExpression(global->init); + } else { + writeExpression(global->init->cast<TupleMake>()->operands[i]); + } + o << int8_t(BinaryConsts::End); + } }); finishSection(start); } |