summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-11-04 13:30:53 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-11-04 13:30:53 -0800
commit2cf75357101099e9bb6c59ca2688ee244286686b (patch)
tree351c7bcbb703bd9a891df192bf2ac97d14a3d0ee
parent0b54b574ba7227dd7ab60ab32fb2b7947cdecc32 (diff)
downloadbinaryen-2cf75357101099e9bb6c59ca2688ee244286686b.tar.gz
binaryen-2cf75357101099e9bb6c59ca2688ee244286686b.tar.bz2
binaryen-2cf75357101099e9bb6c59ca2688ee244286686b.zip
parse function type
-rw-r--r--src/wasm-s-parser.h22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h
index 09c30ce92..9f9e98a1a 100644
--- a/src/wasm-s-parser.h
+++ b/src/wasm-s-parser.h
@@ -22,7 +22,8 @@ IString MODULE("module"),
MEMORY("memory"),
EXPORT("export"),
TABLE("table"),
- LOCAL("local");
+ LOCAL("local"),
+ TYPE("type");
//
// An element in an S-Expression: a list or a string
@@ -191,6 +192,7 @@ private:
if (id == MEMORY) return parseMemory(curr);
if (id == EXPORT) return parseExport(curr);
if (id == TABLE) return parseTable(curr);
+ if (id == TYPE) return parseType(curr);
std::cerr << "bad module element " << id.str << '\n';
abort();
}
@@ -553,6 +555,24 @@ private:
wasm.table.names.push_back(s[i]->str());
}
}
+
+ void parseType(Element& s) {
+ auto type = allocator.alloc<FunctionType>();
+ type->name = s[1]->str();
+ Element& func = *s[2];
+ assert(func.isList());
+ for (size_t i = 1; i < func.size(); i++) {
+ Element& curr = *func[i];
+ if (curr[0]->str() == PARAM) {
+ for (size_t j = 1; j < curr.size(); j++) {
+ type->params.push_back(stringToWasmType(curr[j]->str()));
+ }
+ } else if (curr[0]->str() == RESULT) {
+ type->result = stringToWasmType(curr[1]->str());
+ }
+ }
+ wasm.functionTypes[type->name] = type;
+ }
};
} // namespace wasm