summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-11-18 10:10:30 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-11-18 10:10:30 -0800
commit50876c7e6893b4b86d72767dc93e3565fcb0afb9 (patch)
tree7d058a2322ba7e22c76f681075f02150079b3773
parentc988fb1a8b66f4c2241e98cbabc2068c968d6003 (diff)
downloadbinaryen-50876c7e6893b4b86d72767dc93e3565fcb0afb9.tar.gz
binaryen-50876c7e6893b4b86d72767dc93e3565fcb0afb9.tar.bz2
binaryen-50876c7e6893b4b86d72767dc93e3565fcb0afb9.zip
set call types in a post-pass in s-parser
-rw-r--r--src/wasm-s-parser.h7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h
index 2e01bfc5f..9819c4a60 100644
--- a/src/wasm-s-parser.h
+++ b/src/wasm-s-parser.h
@@ -236,6 +236,7 @@ class SExpressionWasmBuilder {
MixedArena allocator;
std::function<void ()> onError;
int functionCounter;
+ std::vector<Call*> calls; // we only know call types afterwards, so we set their type in a post-pass
public:
// Assumes control of and modifies the input.
@@ -244,6 +245,11 @@ public:
for (unsigned i = 1; i < module.size(); i++) {
parseModuleElement(*module[i]);
}
+ // post-pass, fix up call types
+ for (auto call : calls) {
+ call->type = wasm.functionsMap[call->target]->result;
+ }
+ calls.clear();
}
private:
@@ -949,6 +955,7 @@ private:
Expression* makeCall(Element& s) {
auto ret = allocator.alloc<Call>();
+ calls.push_back(ret);
ret->target = s[1]->str();
parseCallOperands(s, 2, ret);
return ret;