summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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());
}