diff options
author | Alon Zakai <alonzakai@gmail.com> | 2015-11-04 13:50:35 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2015-11-04 13:50:35 -0800 |
commit | 240e35cdc436d705bc2ec6bbda0719944a34cc6e (patch) | |
tree | cefc42837814403898abdb7e2cda39d2b2c53227 | |
parent | af7374115dc89eda2365778ece51e71259b24745 (diff) | |
download | binaryen-240e35cdc436d705bc2ec6bbda0719944a34cc6e.tar.gz binaryen-240e35cdc436d705bc2ec6bbda0719944a34cc6e.tar.bz2 binaryen-240e35cdc436d705bc2ec6bbda0719944a34cc6e.zip |
parse calls
-rw-r--r-- | src/wasm-s-parser.h | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h index 9c98975e6..26acf9bb3 100644 --- a/src/wasm-s-parser.h +++ b/src/wasm-s-parser.h @@ -23,7 +23,10 @@ IString MODULE("module"), EXPORT("export"), TABLE("table"), LOCAL("local"), - TYPE("type"); + TYPE("type"), + CALL("call"), + CALL_IMPORT("call_import"), + CALL_INDIRECT("call_indirect"); // // An element in an S-Expression: a list or a string @@ -359,6 +362,14 @@ private: if (str[1] == 'r') return makeBreak(s); abort_on(str); } + case 'c': { + if (str[1] == 'a') { + if (id == CALL) return makeCall(s); + if (id == CALL_IMPORT) return makeCallImport(s); + if (id == CALL_INDIRECT) return makeCallIndirect(s); + } + abort_on(str); + } case 'g': { if (str[1] == 'e') return makeGetLocal(s); abort_on(str); @@ -549,6 +560,38 @@ private: return ret; } + Expression* makeCall(Element& s) { + auto ret = allocator.alloc<Call>(); + ret->target = s[1]->str(); + parseCallOperands(s, 2, ret); + return ret; + } + + Expression* makeCallImport(Element& s) { + auto ret = allocator.alloc<CallImport>(); + ret->target = s[1]->str(); + parseCallOperands(s, 2, ret); + return ret; + } + + Expression* makeCallIndirect(Element& s) { + auto ret = allocator.alloc<CallIndirect>(); + IString type = s[1]->str(); + assert(wasm.functionTypes.find(type) != wasm.functionTypes.end()); + ret->type = wasm.functionTypes[type]; + ret->target = parseExpression(s[2]); + parseCallOperands(s, 3, ret); + return ret; + } + + template<class T> + void parseCallOperands(Element& s, size_t i, T* call) { + while (i < s.size()) { + call->operands.push_back(parseExpression(s[i])); + i++; + } + } + Expression* makeBreak(Element& s) { auto ret = allocator.alloc<Break>(); ret->name = s[1]->str(); |