summaryrefslogtreecommitdiff
path: root/src/wasm-binary.h
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-01-20 12:11:24 -0800
committerAlon Zakai <alonzakai@gmail.com>2016-01-20 12:11:24 -0800
commit13548a538ae581411841506884c28f1be223079c (patch)
tree8e972980b9d30e19c91558b4200a28cdb0a2f9c6 /src/wasm-binary.h
parentdaf75cc0649ad6e615de98afdc10154a14af8e9b (diff)
downloadbinaryen-13548a538ae581411841506884c28f1be223079c.tar.gz
binaryen-13548a538ae581411841506884c28f1be223079c.tar.bz2
binaryen-13548a538ae581411841506884c28f1be223079c.zip
fix switch default in binary format #123
Diffstat (limited to 'src/wasm-binary.h')
-rw-r--r--src/wasm-binary.h9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/wasm-binary.h b/src/wasm-binary.h
index e7b96a49a..358abe25f 100644
--- a/src/wasm-binary.h
+++ b/src/wasm-binary.h
@@ -616,14 +616,18 @@ public:
void visitSwitch(Switch *curr) {
if (debug) std::cerr << "zz node: Switch" << std::endl;
o << int8_t(BinaryConsts::TableSwitch) << int16_t(curr->cases.size())
- << int16_t(curr->targets.size());
+ << int16_t(curr->targets.size() + 1);
std::map<Name, int16_t> mapping; // target name => index in cases
for (size_t i = 0; i < curr->cases.size(); i++) {
mapping[curr->cases[i].name] = i;
}
+ if (mapping.find(curr->default_) == mapping.end()) {
+ mapping[curr->default_] = curr->cases.size();
+ }
for (auto target : curr->targets) {
o << mapping[target];
}
+ o << mapping[curr->default_];
breakStack.push_back(curr->name);
recurse(curr->value);
for (auto& c : curr->cases) {
@@ -1285,9 +1289,10 @@ public:
}
return caseLabels[index];
};
- for (auto i = 0; i < numTargets; i++) {
+ for (auto i = 0; i < numTargets - 1; i++) {
curr->targets.push_back(getCaseLabel(getInt16()));
}
+ curr->default_ = getCaseLabel(getInt16());
curr->name = getNextLabel();
breakStack.push_back(curr->name);
readExpression(curr->value);