diff options
Diffstat (limited to 'src/wasm/wasm-s-parser.cpp')
-rw-r--r-- | src/wasm/wasm-s-parser.cpp | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp index 98a6cb827..a1ec5f134 100644 --- a/src/wasm/wasm-s-parser.cpp +++ b/src/wasm/wasm-s-parser.cpp @@ -3197,7 +3197,7 @@ void SExpressionWasmBuilder::parseTable(Element& s, bool preParseImport) { table->module = inner[1]->str(); table->base = inner[2]->str(); i++; - } else { + } else if (!elementStartsWith(inner, REF)) { throw ParseException("invalid table", inner.line, inner.col); } } @@ -3208,15 +3208,13 @@ void SExpressionWasmBuilder::parseTable(Element& s, bool preParseImport) { table->initial = atoi(s[i++]->c_str()); hasExplicitLimit = true; } - if (s[i]->isStr() && String::isNumber(s[i]->c_str())) { table->max = atoi(s[i++]->c_str()); } - if (!s[i]->isStr() || s[i]->str() != FUNCREF) { - throw ParseException("Expected funcref"); - } else { - i += 1; + table->type = elementToType(*s[i++]); + if (!table->type.isRef()) { + throw ParseException("Only reference types are valid for tables"); } if (i < s.size() && s[i]->isList()) { @@ -3242,14 +3240,16 @@ void SExpressionWasmBuilder::parseTable(Element& s, bool preParseImport) { } // parses an elem segment -// elem ::= (elem (expr) vec(funcidx)) -// | (elem (offset (expr)) func vec(funcidx)) -// | (elem (table tableidx) (offset (expr)) func vec(funcidx)) -// | (elem func vec(funcidx)) -// | (elem declare func vec(funcidx)) +// elem ::= (elem (table tableidx)? (offset (expr)) reftype vec(item (expr))) +// | (elem reftype vec(item (expr))) +// | (elem declare reftype vec(item (expr))) // // abbreviation: // (offset (expr)) ≡ (expr) +// (item (expr)) ≡ (expr) +// ϵ ≡ (table 0) +// +// funcref vec(ref.func) ≡ func vec(funcidx) // (elem (expr) vec(funcidx)) ≡ (elem (table 0) (offset (expr)) func // vec(funcidx)) // @@ -3280,7 +3280,7 @@ void SExpressionWasmBuilder::parseElem(Element& s, Table* table) { auto segment = std::make_unique<ElementSegment>(); segment->setName(name, hasExplicitName); - if (s[i]->isList()) { + if (s[i]->isList() && !elementStartsWith(s[i], REF)) { // Optional (table <tableidx>) if (elementStartsWith(s[i], TABLE)) { auto& inner = *s[i++]; @@ -3303,11 +3303,15 @@ void SExpressionWasmBuilder::parseElem(Element& s, Table* table) { } else if (s[i]->isStr() && s[i]->str() == FUNC) { usesExpressions = false; i += 1; - } else if (s[i]->isStr() && s[i]->str() == FUNCREF) { + } else { + segment->type = elementToType(*s[i]); usesExpressions = true; i += 1; - } else { - throw ParseException("expected func or funcref."); + + if (!segment->type.isFunction()) { + throw ParseException( + "Invalid type for an element segment.", s.line, s.col); + } } } |