diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-02-04 16:21:58 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-02-04 16:21:58 -0800 |
commit | 756b12bea5f313ba0f2811254e2826b30987f42f (patch) | |
tree | c02a0887fdc10bf2a16bca7ec0d0ce48d41d9936 | |
parent | f8c16d02b9ddb42a71424fe8a33e6c1d1f7a5f80 (diff) | |
parent | 0c0b6bab2ed651a92d36a74ddb737cb7e7f4c985 (diff) | |
download | binaryen-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.h | 25 |
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()); } |