summaryrefslogtreecommitdiff
path: root/src/wasm/wasm-binary.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm/wasm-binary.cpp')
-rw-r--r--src/wasm/wasm-binary.cpp21
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);
}