summaryrefslogtreecommitdiff
path: root/src/wasm/wasm-s-parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm/wasm-s-parser.cpp')
-rw-r--r--src/wasm/wasm-s-parser.cpp34
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);
+ }
}
}