diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-01-20 12:11:24 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-01-20 12:11:24 -0800 |
commit | 13548a538ae581411841506884c28f1be223079c (patch) | |
tree | 8e972980b9d30e19c91558b4200a28cdb0a2f9c6 /src/wasm-binary.h | |
parent | daf75cc0649ad6e615de98afdc10154a14af8e9b (diff) | |
download | binaryen-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.h | 9 |
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); |