summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-02-04 16:21:58 -0800
committerAlon Zakai <alonzakai@gmail.com>2016-02-04 16:21:58 -0800
commit756b12bea5f313ba0f2811254e2826b30987f42f (patch)
treec02a0887fdc10bf2a16bca7ec0d0ce48d41d9936
parentf8c16d02b9ddb42a71424fe8a33e6c1d1f7a5f80 (diff)
parent0c0b6bab2ed651a92d36a74ddb737cb7e7f4c985 (diff)
downloadbinaryen-756b12bea5f313ba0f2811254e2826b30987f42f.tar.gz
binaryen-756b12bea5f313ba0f2811254e2826b30987f42f.tar.bz2
binaryen-756b12bea5f313ba0f2811254e2826b30987f42f.zip
Merge pull request #174 from mbebenita/fix-import
Fix import parsing.
-rw-r--r--src/wasm-s-parser.h25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h
index 510a976a8..1c704ac74 100644
--- a/src/wasm-s-parser.h
+++ b/src/wasm-s-parser.h
@@ -223,6 +223,7 @@ class SExpressionWasmBuilder {
MixedArena& allocator;
std::function<void ()> onError;
int functionCounter;
+ int importCounter;
std::map<Name, WasmType> functionTypes; // we need to know function return types before we parse their contents
bool debug;
@@ -981,13 +982,19 @@ private:
void parseImport(Element& s) {
auto im = allocator.alloc<Import>();
- im->name = s[1]->str();
- im->module = s[2]->str();
- if (!s[3]->isStr()) onError();
- im->base = s[3]->str();
+ size_t i = 1;
+ if (s.size() > 3 && s[3]->isStr()) {
+ im->name = s[i++]->str();
+ } else {
+ im->name = Name::fromInt(importCounter);
+ }
+ importCounter++;
+ im->module = s[i++]->str();
+ if (!s[i]->isStr()) onError();
+ im->base = s[i++]->str();
FunctionType type;
- if (s.size() > 4) {
- Element& params = *s[4];
+ if (s.size() > i) {
+ Element& params = *s[i];
IString id = params[0]->str();
if (id == PARAM) {
for (size_t i = 1; i < params.size(); i++) {
@@ -997,13 +1004,13 @@ private:
type.result = stringToWasmType(params[1]->str());
} else if (id == TYPE) {
IString name = params[1]->str();
- assert(wasm.functionTypesMap.find(name) != wasm.functionTypesMap.end());
+ if (wasm.functionTypesMap.find(name) == wasm.functionTypesMap.end()) onError();
type = *wasm.functionTypesMap[name];
} else {
onError();
}
- if (s.size() > 5) {
- Element& result = *s[5];
+ if (s.size() > i+1) {
+ Element& result = *s[i+1];
assert(result[0]->str() == RESULT);
type.result = stringToWasmType(result[1]->str());
}