summaryrefslogtreecommitdiff
path: root/src/wasm-s-parser.h
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-03-07 17:03:38 -0800
committerAlon Zakai <alonzakai@gmail.com>2016-03-07 18:27:29 -0800
commit284ae677cca8794a464f9bf702e3ec6aace6c65b (patch)
treebe323dc8b38ebe8cfe758c7df8ad2865f3f2bd7d /src/wasm-s-parser.h
parentea3a9db4a071292d4e976ef36f4c197a9e8a5fea (diff)
downloadbinaryen-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.h54
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;
}