diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gen-s-parser.inc | 9 | ||||
-rw-r--r-- | src/parser/parsers.h | 5 | ||||
-rw-r--r-- | src/passes/Print.cpp | 9 | ||||
-rw-r--r-- | src/wasm-s-parser.h | 1 | ||||
-rw-r--r-- | src/wasm/wasm-s-parser.cpp | 15 |
5 files changed, 38 insertions, 1 deletions
diff --git a/src/gen-s-parser.inc b/src/gen-s-parser.inc index 22c7a0c90..bc0a03dd3 100644 --- a/src/gen-s-parser.inc +++ b/src/gen-s-parser.inc @@ -3404,6 +3404,9 @@ switch (buf[0]) { goto parse_error; case 'u': { switch (buf[6]) { + case 'd': + if (op == "tuple.drop"sv) { return makeTupleDrop(s); } + goto parse_error; case 'e': if (op == "tuple.extract"sv) { return makeTupleExtract(s); } goto parse_error; @@ -8651,6 +8654,12 @@ switch (buf[0]) { goto parse_error; case 'u': { switch (buf[6]) { + case 'd': + if (op == "tuple.drop"sv) { + CHECK_ERR(makeTupleDrop(ctx, pos)); + return Ok{}; + } + goto parse_error; case 'e': if (op == "tuple.extract"sv) { CHECK_ERR(makeTupleExtract(ctx, pos)); diff --git a/src/parser/parsers.h b/src/parser/parsers.h index fdcfd6d0f..281980108 100644 --- a/src/parser/parsers.h +++ b/src/parser/parsers.h @@ -119,6 +119,7 @@ template<typename Ctx> Result<> makeThrow(Ctx&, Index); template<typename Ctx> Result<> makeRethrow(Ctx&, Index); template<typename Ctx> Result<> makeTupleMake(Ctx&, Index); template<typename Ctx> Result<> makeTupleExtract(Ctx&, Index); +template<typename Ctx> Result<> makeTupleDrop(Ctx&, Index); template<typename Ctx> Result<> makeCallRef(Ctx&, Index, bool isReturn); template<typename Ctx> Result<> makeRefI31(Ctx&, Index); template<typename Ctx> Result<> makeI31Get(Ctx&, Index, bool signed_); @@ -1473,6 +1474,10 @@ template<typename Ctx> Result<> makeTupleExtract(Ctx& ctx, Index pos) { return ctx.in.err("unimplemented instruction"); } +template<typename Ctx> Result<> makeTupleDrop(Ctx& ctx, Index pos) { + return ctx.in.err("unimplemented instruction"); +} + template<typename Ctx> Result<> makeCallRef(Ctx& ctx, Index pos, bool isReturn) { auto type = typeidx(ctx); diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp index 9a0a600f9..51909c6ff 100644 --- a/src/passes/Print.cpp +++ b/src/passes/Print.cpp @@ -1910,7 +1910,14 @@ struct PrintExpressionContents printResultType(curr->type); } } - void visitDrop(Drop* curr) { printMedium(o, "drop"); } + void visitDrop(Drop* curr) { + if (curr->value->type.isTuple()) { + printMedium(o, "tuple.drop "); + o << curr->value->type.size(); + } else { + printMedium(o, "drop"); + } + } void visitReturn(Return* curr) { printMedium(o, "return"); } void visitMemorySize(MemorySize* curr) { printMedium(o, "memory.size"); diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h index bbd07e3be..446f2a292 100644 --- a/src/wasm-s-parser.h +++ b/src/wasm-s-parser.h @@ -289,6 +289,7 @@ private: Expression* makeRethrow(Element& s); Expression* makeTupleMake(Element& s); Expression* makeTupleExtract(Element& s); + Expression* makeTupleDrop(Element& s); Expression* makeCallRef(Element& s, bool isReturn); Expression* makeRefI31(Element& s); Expression* makeI31Get(Element& s, bool signed_); 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; |