summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-03-07 15:39:25 -0800
committerAlon Zakai <alonzakai@gmail.com>2016-03-07 15:39:25 -0800
commit029bf12684e9b1a659614cb6a99e9f49a2959ad5 (patch)
tree412d1d452881821cb41e942f949b1cef43f3e012
parent1a3a0d839ce0e8f7cc523694f40142eea656331a (diff)
downloadbinaryen-029bf12684e9b1a659614cb6a99e9f49a2959ad5.tar.gz
binaryen-029bf12684e9b1a659614cb6a99e9f49a2959ad5.tar.bz2
binaryen-029bf12684e9b1a659614cb6a99e9f49a2959ad5.zip
parse then and else
-rw-r--r--src/wasm-s-parser.h19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h
index a00e995f5..d10dd2bff 100644
--- a/src/wasm-s-parser.h
+++ b/src/wasm-s-parser.h
@@ -569,6 +569,10 @@ public:
}
abort_on(str);
}
+ case 'e': {
+ if (str[1] == 'l') return makeThenOrElse(s);
+ abort_on(str);
+ }
case 'g': {
if (str[1] == 'e') return makeGetLocal(s);
if (str[1] == 'r') return makeHost(s, HostOp::GrowMemory);
@@ -609,6 +613,7 @@ public:
}
case 't': {
if (str[1] == 'a') return makeSwitch(s); // aka tableswitch
+ if (str[1] == 'h') return makeThenOrElse(s);
abort_on(str);
}
case 'u': {
@@ -705,6 +710,20 @@ private:
return ret;
}
+ // Similar to block, but the label is handled by the enclosing if (since there might not be a then or else, ick)
+ Expression* makeThenOrElse(Element& s) {
+ auto ret = allocator.alloc<Block>();
+ size_t i = 1;
+ if (s[1]->isStr()) {
+ i++;
+ }
+ for (; i < s.size(); i++) {
+ ret->list.push_back(parseExpression(s[i]));
+ }
+ ret->finalize();
+ return ret;
+ }
+
Expression* makeConst(Element& s, WasmType type) {
auto ret = parseConst(s[1]->str(), type, allocator);
if (!ret) onError();