summaryrefslogtreecommitdiff
path: root/src/wasm-s-parser.h
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-11-06 19:33:20 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-11-06 19:33:20 -0800
commit54cc7b3916c61a0fefd66455ed6de7efe6d317bd (patch)
treeaca53f0e23129b7596bb5163abf03b2d56f70a17 /src/wasm-s-parser.h
parentc66aca505a96c5e043bc00aa6311101de9339854 (diff)
downloadbinaryen-54cc7b3916c61a0fefd66455ed6de7efe6d317bd.tar.gz
binaryen-54cc7b3916c61a0fefd66455ed6de7efe6d317bd.tar.bz2
binaryen-54cc7b3916c61a0fefd66455ed6de7efe6d317bd.zip
fake return
Diffstat (limited to 'src/wasm-s-parser.h')
-rw-r--r--src/wasm-s-parser.h23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h
index 1ed23b190..b9556bb3b 100644
--- a/src/wasm-s-parser.h
+++ b/src/wasm-s-parser.h
@@ -33,7 +33,8 @@ IString MODULE("module"),
INFINITY_("infinity"),
NEG_INFINITY("-infinity"),
NAN_("nan"),
- NEG_NAN("-nan");
+ NEG_NAN("-nan"),
+ FAKE_RETURN("fake_return_waka123");
//
// An element in an S-Expression: a list or a string
@@ -540,6 +541,10 @@ public:
if (str[1] == 'e') return makeSetLocal(s);
abort_on(str);
}
+ case 'r': {
+ if (str[1] == 'e') return makeReturn(s);
+ abort_on(str);
+ }
default: abort_on(str);
}
}
@@ -874,6 +879,22 @@ private:
return ret;
}
+ Expression* makeReturn(Element& s) {
+ // return will likely not remain in wasm, but is in the testcases, for now. fake it
+ Block *temp;
+ if (!(currFunction->body && (temp = currFunction->body->dyn_cast<Block>()) && temp->name == FAKE_RETURN)) {
+ Expression* old = currFunction->body;
+ temp = allocator.alloc<Block>();
+ temp->name = FAKE_RETURN;
+ if (old) temp->list.push_back(old);
+ currFunction->body = temp;
+ }
+ auto ret = allocator.alloc<Break>();
+ ret->name = FAKE_RETURN;
+ ret->value = parseExpression(s[1]);
+ return ret;
+ }
+
void parseMemory(Element& s) {
wasm.memory.initial = atoi(s[1]->c_str());
if (s.size() == 2) return;