diff options
Diffstat (limited to 'src/wasm-binary.h')
-rw-r--r-- | src/wasm-binary.h | 37 |
1 files changed, 8 insertions, 29 deletions
diff --git a/src/wasm-binary.h b/src/wasm-binary.h index 993b4522d..8a03ca843 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -677,26 +677,17 @@ 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() + 1); - for (size_t i = 0; i < curr->cases.size(); i++) { - breakStack.push_back(curr->cases[i].name); - } - breakStack.push_back(curr->name); + o << int8_t(BinaryConsts::TableSwitch) << int16_t(curr->targets.size() + 1) << int8_t(curr->value != nullptr); for (auto target : curr->targets) { o << (int16_t)getBreakIndex(target); } o << (int16_t)getBreakIndex(curr->default_); - recurse(curr->value); + recurse(curr->condition); o << int8_t(BinaryConsts::EndMarker); - for (auto& c : curr->cases) { - recurse(c.body); + if (curr->value) { + recurse(curr->value); o << int8_t(BinaryConsts::EndMarker); } - breakStack.pop_back(); // name - for (size_t i = 0; i < curr->cases.size(); i++) { - breakStack.pop_back(); // case - } } void visitCall(Call *curr) { if (debug) std::cerr << "zz node: Call" << std::endl; @@ -1400,29 +1391,17 @@ public: } void visitSwitch(Switch *curr) { if (debug) std::cerr << "zz node: Switch" << std::endl; - auto numCases = getInt16(); auto numTargets = getInt16(); - for (auto i = 0; i < numCases; i++) { - Switch::Case c; - c.name = getNextLabel(); - curr->cases.push_back(c); - breakStack.push_back(c.name); - } - curr->name = getNextLabel(); - breakStack.push_back(curr->name); + auto hasValue = getInt8(); for (auto i = 0; i < numTargets - 1; i++) { curr->targets.push_back(getBreakName(getInt16())); } curr->default_ = getBreakName(getInt16()); processExpressions(); - curr->value = popExpression(); - for (auto i = 0; i < numCases; i++) { + curr->condition = popExpression(); + if (hasValue) { processExpressions(); - curr->cases[i].body = popExpression(); - } - breakStack.pop_back(); // name - for (size_t i = 0; i < curr->cases.size(); i++) { - breakStack.pop_back(); // case + curr->value = popExpression(); } } void visitCall(Call *curr, Name target) { |