summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gen-s-parser.inc9
-rw-r--r--src/parser/parsers.h5
-rw-r--r--src/passes/Print.cpp9
-rw-r--r--src/wasm-s-parser.h1
-rw-r--r--src/wasm/wasm-s-parser.cpp15
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;