diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-03-07 17:03:38 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-03-07 18:27:29 -0800 |
commit | 284ae677cca8794a464f9bf702e3ec6aace6c65b (patch) | |
tree | be323dc8b38ebe8cfe758c7df8ad2865f3f2bd7d /src/wasm-s-parser.h | |
parent | ea3a9db4a071292d4e976ef36f4c197a9e8a5fea (diff) | |
download | binaryen-284ae677cca8794a464f9bf702e3ec6aace6c65b.tar.gz binaryen-284ae677cca8794a464f9bf702e3ec6aace6c65b.tar.bz2 binaryen-284ae677cca8794a464f9bf702e3ec6aace6c65b.zip |
br_table, no more cases
Diffstat (limited to 'src/wasm-s-parser.h')
-rw-r--r-- | src/wasm-s-parser.h | 54 |
1 files changed, 20 insertions, 34 deletions
diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h index f3a28fd1a..5768f5dcf 100644 --- a/src/wasm-s-parser.h +++ b/src/wasm-s-parser.h @@ -558,7 +558,10 @@ public: switch (str[0]) { case 'b': { if (str[1] == 'l') return makeBlock(s); - if (str[1] == 'r') return makeBreak(s); + if (str[1] == 'r') { + if (str[3] == 't') return makeBreakTable(s); + return makeBreak(s); + } abort_on(str); } case 'c': { @@ -612,7 +615,6 @@ public: abort_on(str); } case 't': { - if (str[1] == 'a') return makeSwitch(s); // aka tableswitch if (str[1] == 'h') return makeThenOrElse(s); abort_on(str); } @@ -948,43 +950,27 @@ private: return ret; } - Expression* makeReturn(Element& s) { - auto ret = allocator.alloc<Return>(); - if (s.size() >= 2) { - ret->value = parseExpression(s[1]); - } - return ret; - } - - Expression* makeSwitch(Element& s) { + Expression* makeBreakTable(Element& s) { auto ret = allocator.alloc<Switch>(); size_t i = 1; - if (s[i]->isStr()) { - ret->name = s[i]->str(); - i++; - } else { - ret->name = getPrefixedName("switch"); + while (!s[i]->isList()) { + ret->targets.push_back(getLabel(*s[i++])); } - labelStack.push_back(ret->name); - ret->value = parseExpression(s[i]); - i++; - Element& table = *s[i]; - i++; - for (size_t j = 1; j < table.size(); j++) { - Element& curr = *table[j]; - ret->targets.push_back(getLabel(*curr[1])); + ret->default_ = ret->targets.back(); + ret->targets.pop_back(); + ret->condition = parseExpression(s[i++]); + if (i < s.size()) { + ret->value = ret->condition; + ret->condition = parseExpression(s[i++]); } - Element& curr = *s[i]; - ret->default_ = getLabel(*curr[1]); - i++; - for (; i < s.size(); i++) { - Element& curr = *s[i]; - assert(curr[0]->str() == CASE); - if (curr.size() < 2) onError(); - ret->cases.emplace_back(curr[1]->str(), makeMaybeBlock(curr, 2, curr.size())); + return ret; + } + + Expression* makeReturn(Element& s) { + auto ret = allocator.alloc<Return>(); + if (s.size() >= 2) { + ret->value = parseExpression(s[1]); } - ret->type = ret->cases.size() > 0 ? ret->cases[0].body->type : none; - labelStack.pop_back(); return ret; } |