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.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp
index 8e74820a9..521060749 100644
--- a/src/wasm/wasm-s-parser.cpp
+++ b/src/wasm/wasm-s-parser.cpp
@@ -1503,6 +1503,9 @@ Expression* SExpressionWasmBuilder::makeSelect(Element& s) {
Expression* SExpressionWasmBuilder::makeDrop(Element& s) {
auto ret = allocator.alloc<Drop>();
ret->value = parseExpression(s[1]);
+ if (ret->value->type.isTuple()) {
+ throw SParseException("expected tuple.drop, found drop", s, *s[0]);
+ }
ret->finalize();
return ret;
}
@@ -2879,6 +2882,18 @@ Expression* SExpressionWasmBuilder::makeTupleExtract(Element& s) {
return ret;
}
+Expression* SExpressionWasmBuilder::makeTupleDrop(Element& s) {
+ size_t arity = std::stoll(s[1]->toString());
+ auto ret = allocator.alloc<Drop>();
+ ret->value = parseExpression(s[2]);
+ if (ret->value->type != Type::unreachable &&
+ ret->value->type.size() != arity) {
+ throw SParseException("unexpected tuple.drop arity", s, *s[1]);
+ }
+ ret->finalize();
+ return ret;
+}
+
Expression* SExpressionWasmBuilder::makeCallRef(Element& s, bool isReturn) {
HeapType sigType = parseHeapType(*s[1]);
std::vector<Expression*> operands;