diff options
Diffstat (limited to 'src/wasm/wasm-s-parser.cpp')
-rw-r--r-- | src/wasm/wasm-s-parser.cpp | 15 |
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; |