diff options
author | Thomas Lively <tlively@google.com> | 2022-12-07 16:06:53 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-07 14:06:53 -0800 |
commit | c79548b93a81ccf7609413da1345a7570c51b9ba (patch) | |
tree | 7783fbf6610383fb76fe312fe3c125860428b779 /src | |
parent | 5a8d09bfe725f321b022187e294991db3ffaa417 (diff) | |
download | binaryen-c79548b93a81ccf7609413da1345a7570c51b9ba.tar.gz binaryen-c79548b93a81ccf7609413da1345a7570c51b9ba.tar.bz2 binaryen-c79548b93a81ccf7609413da1345a7570c51b9ba.zip |
Add standard versions of WasmGC casts (#5331)
We previously supported only the non-standard cast instructions introduced when
we were experimenting with nominal types. Parse the names and opcodes of their
standard counterparts and switch to emitting the standard names and opcodes.
Port all of the tests to use the standard instructions, but add additional tests
showing that the non-standard versions are still parsed correctly.
Diffstat (limited to 'src')
-rw-r--r-- | src/gen-s-parser.inc | 134 | ||||
-rw-r--r-- | src/passes/Print.cpp | 10 | ||||
-rw-r--r-- | src/wasm-binary.h | 10 | ||||
-rw-r--r-- | src/wasm-builder.h | 24 | ||||
-rw-r--r-- | src/wasm-s-parser.h | 11 | ||||
-rw-r--r-- | src/wasm/wasm-binary.cpp | 19 | ||||
-rw-r--r-- | src/wasm/wasm-s-parser.cpp | 39 | ||||
-rw-r--r-- | src/wasm/wasm-stack.cpp | 10 | ||||
-rw-r--r-- | src/wasm/wat-parser.cpp | 37 |
9 files changed, 158 insertions, 136 deletions
diff --git a/src/gen-s-parser.inc b/src/gen-s-parser.inc index 929634c6c..dc5dae035 100644 --- a/src/gen-s-parser.inc +++ b/src/gen-s-parser.inc @@ -45,7 +45,7 @@ switch (op[0]) { case 'n': { switch (op[9]) { case '\0': - if (op == "array.new"sv) { return makeArrayNewStatic(s, false); } + if (op == "array.new"sv) { return makeArrayNew(s, false); } goto parse_error; case '_': { switch (op[10]) { @@ -55,7 +55,7 @@ switch (op[0]) { if (op == "array.new_data"sv) { return makeArrayNewSeg(s, NewData); } goto parse_error; case 'e': - if (op == "array.new_default"sv) { return makeArrayNewStatic(s, true); } + if (op == "array.new_default"sv) { return makeArrayNew(s, true); } goto parse_error; default: goto parse_error; } @@ -111,10 +111,10 @@ switch (op[0]) { case 's': { switch (op[17]) { case '\0': - if (op == "br_on_cast_static"sv) { return makeBrOnStatic(s, BrOnCast); } + if (op == "br_on_cast_static"sv) { return makeBrOn(s, BrOnCast); } goto parse_error; case '_': - if (op == "br_on_cast_static_fail"sv) { return makeBrOnStatic(s, BrOnCastFail); } + if (op == "br_on_cast_static_fail"sv) { return makeBrOn(s, BrOnCastFail); } goto parse_error; default: goto parse_error; } @@ -3016,13 +3016,29 @@ switch (op[0]) { } } case 'c': { - switch (op[9]) { - case 'n': - if (op == "ref.cast_nop_static"sv) { return makeRefCastNopStatic(s); } - goto parse_error; - case 's': - if (op == "ref.cast_static"sv) { return makeRefCastStatic(s); } + switch (op[8]) { + case '\0': + if (op == "ref.cast"sv) { return makeRefCast(s); } goto parse_error; + case '_': { + switch (op[9]) { + case 'n': { + switch (op[12]) { + case '\0': + if (op == "ref.cast_nop"sv) { return makeRefCastNop(s); } + goto parse_error; + case '_': + if (op == "ref.cast_nop_static"sv) { return makeRefCastNop(s); } + goto parse_error; + default: goto parse_error; + } + } + case 's': + if (op == "ref.cast_static"sv) { return makeRefCast(s); } + goto parse_error; + default: goto parse_error; + } + } default: goto parse_error; } } @@ -3052,9 +3068,17 @@ switch (op[0]) { case 'n': if (op == "ref.null"sv) { return makeRefNull(s); } goto parse_error; - case 't': - if (op == "ref.test_static"sv) { return makeRefTestStatic(s); } - goto parse_error; + case 't': { + switch (op[8]) { + case '\0': + if (op == "ref.test"sv) { return makeRefTest(s); } + goto parse_error; + case '_': + if (op == "ref.test_static"sv) { return makeRefTest(s); } + goto parse_error; + default: goto parse_error; + } + } default: goto parse_error; } } @@ -3295,10 +3319,10 @@ switch (op[0]) { case 'n': { switch (op[10]) { case '\0': - if (op == "struct.new"sv) { return makeStructNewStatic(s, false); } + if (op == "struct.new"sv) { return makeStructNew(s, false); } goto parse_error; case '_': - if (op == "struct.new_default"sv) { return makeStructNewStatic(s, true); } + if (op == "struct.new_default"sv) { return makeStructNew(s, true); } goto parse_error; default: goto parse_error; } @@ -3613,7 +3637,7 @@ switch (op[0]) { switch (op[9]) { case '\0': if (op == "array.new"sv) { - auto ret = makeArrayNewStatic(ctx, pos, false); + auto ret = makeArrayNew(ctx, pos, false); CHECK_ERR(ret); return *ret; } @@ -3631,7 +3655,7 @@ switch (op[0]) { goto parse_error; case 'e': if (op == "array.new_default"sv) { - auto ret = makeArrayNewStatic(ctx, pos, true); + auto ret = makeArrayNew(ctx, pos, true); CHECK_ERR(ret); return *ret; } @@ -3723,14 +3747,14 @@ switch (op[0]) { switch (op[17]) { case '\0': if (op == "br_on_cast_static"sv) { - auto ret = makeBrOnStatic(ctx, pos, BrOnCast); + auto ret = makeBrOn(ctx, pos, BrOnCast); CHECK_ERR(ret); return *ret; } goto parse_error; case '_': if (op == "br_on_cast_static_fail"sv) { - auto ret = makeBrOnStatic(ctx, pos, BrOnCastFail); + auto ret = makeBrOn(ctx, pos, BrOnCastFail); CHECK_ERR(ret); return *ret; } @@ -8607,21 +8631,45 @@ switch (op[0]) { } } case 'c': { - switch (op[9]) { - case 'n': - if (op == "ref.cast_nop_static"sv) { - auto ret = makeRefCastNopStatic(ctx, pos); + switch (op[8]) { + case '\0': + if (op == "ref.cast"sv) { + auto ret = makeRefCast(ctx, pos); CHECK_ERR(ret); return *ret; } goto parse_error; - case 's': - if (op == "ref.cast_static"sv) { - auto ret = makeRefCastStatic(ctx, pos); - CHECK_ERR(ret); - return *ret; + case '_': { + switch (op[9]) { + case 'n': { + switch (op[12]) { + case '\0': + if (op == "ref.cast_nop"sv) { + auto ret = makeRefCastNop(ctx, pos); + CHECK_ERR(ret); + return *ret; + } + goto parse_error; + case '_': + if (op == "ref.cast_nop_static"sv) { + auto ret = makeRefCastNop(ctx, pos); + CHECK_ERR(ret); + return *ret; + } + goto parse_error; + default: goto parse_error; + } + } + case 's': + if (op == "ref.cast_static"sv) { + auto ret = makeRefCast(ctx, pos); + CHECK_ERR(ret); + return *ret; + } + goto parse_error; + default: goto parse_error; } - goto parse_error; + } default: goto parse_error; } } @@ -8679,13 +8727,25 @@ switch (op[0]) { return *ret; } goto parse_error; - case 't': - if (op == "ref.test_static"sv) { - auto ret = makeRefTestStatic(ctx, pos); - CHECK_ERR(ret); - return *ret; + case 't': { + switch (op[8]) { + case '\0': + if (op == "ref.test"sv) { + auto ret = makeRefTest(ctx, pos); + CHECK_ERR(ret); + return *ret; + } + goto parse_error; + case '_': + if (op == "ref.test_static"sv) { + auto ret = makeRefTest(ctx, pos); + CHECK_ERR(ret); + return *ret; + } + goto parse_error; + default: goto parse_error; } - goto parse_error; + } default: goto parse_error; } } @@ -9067,14 +9127,14 @@ switch (op[0]) { switch (op[10]) { case '\0': if (op == "struct.new"sv) { - auto ret = makeStructNewStatic(ctx, pos, false); + auto ret = makeStructNew(ctx, pos, false); CHECK_ERR(ret); return *ret; } goto parse_error; case '_': if (op == "struct.new_default"sv) { - auto ret = makeStructNewStatic(ctx, pos, true); + auto ret = makeStructNew(ctx, pos, true); CHECK_ERR(ret); return *ret; } diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp index 16b036693..d700f85f3 100644 --- a/src/passes/Print.cpp +++ b/src/passes/Print.cpp @@ -2109,14 +2109,14 @@ struct PrintExpressionContents printHeapType(o, curr->target->type.getHeapType(), wasm); } void visitRefTest(RefTest* curr) { - printMedium(o, "ref.test_static "); + printMedium(o, "ref.test "); printHeapType(o, curr->intendedType, wasm); } void visitRefCast(RefCast* curr) { if (curr->safety == RefCast::Unsafe) { - printMedium(o, "ref.cast_nop_static "); + printMedium(o, "ref.cast_nop "); } else { - printMedium(o, "ref.cast_static "); + printMedium(o, "ref.cast null "); } printHeapType(o, curr->intendedType, wasm); } @@ -2130,13 +2130,13 @@ struct PrintExpressionContents printMedium(o, "br_on_non_null "); break; case BrOnCast: - printMedium(o, "br_on_cast_static "); + printMedium(o, "br_on_cast "); printName(curr->name, o); o << ' '; printHeapType(o, curr->intendedType, wasm); return; case BrOnCastFail: - printMedium(o, "br_on_cast_static_fail "); + printMedium(o, "br_on_cast_fail "); printName(curr->name, o); o << ' '; printHeapType(o, curr->intendedType, wasm); diff --git a/src/wasm-binary.h b/src/wasm-binary.h index 1ca136f07..55370da26 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -1117,11 +1117,19 @@ enum ASTNodes { I31New = 0x20, I31GetS = 0x21, I31GetU = 0x22, + RefTest = 0x40, + // TODO: RefTestNull + RefCastNull = 0x49, + // TODO: RefCastNull + BrOnCast = 0x42, + // TODO: BrOnCastNull + BrOnCastFail = 0x43, + // TODO: BrOnCastFailNull RefTestStatic = 0x44, RefCastStatic = 0x45, BrOnCastStatic = 0x46, BrOnCastStaticFail = 0x47, - RefCastNopStatic = 0x48, + RefCastNop = 0x48, RefIsFunc = 0x50, RefIsData = 0x51, RefIsI31 = 0x52, diff --git a/src/wasm-builder.h b/src/wasm-builder.h index a29867e55..ff834013d 100644 --- a/src/wasm-builder.h +++ b/src/wasm-builder.h @@ -1320,30 +1320,6 @@ public: } }; -// This class adds methods that first inspect the input. They may not have fully -// comprehensive error checking, when that can be left to the validator; the -// benefit of the validate* methods is that they can share code between the -// text and binary format parsers, for handling certain situations in the -// input which preclude even creating valid IR, which the validator depends -// on. -class ValidatingBuilder : public Builder { - size_t line = -1, col = -1; - -public: - ValidatingBuilder(Module& wasm, size_t line) : Builder(wasm), line(line) {} - ValidatingBuilder(Module& wasm, size_t line, size_t col) - : Builder(wasm), line(line), col(col) {} - - Expression* validateAndMakeBrOn(BrOnOp op, Name name, Expression* ref) { - if (op == BrOnNull) { - if (!ref->type.isRef() && ref->type != Type::unreachable) { - throw ParseException("Invalid ref for br_on_null", line, col); - } - } - return makeBrOn(op, name, ref); - } -}; - } // namespace wasm #endif // wasm_wasm_builder_h diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h index 524bc5a3c..23eed7923 100644 --- a/src/wasm-s-parser.h +++ b/src/wasm-s-parser.h @@ -283,16 +283,15 @@ private: Expression* makeCallRef(Element& s, bool isReturn); Expression* makeI31New(Element& s); Expression* makeI31Get(Element& s, bool signed_); - Expression* makeRefTestStatic(Element& s); - Expression* makeRefCastStatic(Element& s); - Expression* makeRefCastNopStatic(Element& s); + Expression* makeRefTest(Element& s); + Expression* makeRefCast(Element& s); + Expression* makeRefCastNop(Element& s); Expression* makeBrOn(Element& s, BrOnOp op); - Expression* makeBrOnStatic(Element& s, BrOnOp op); - Expression* makeStructNewStatic(Element& s, bool default_); + Expression* makeStructNew(Element& s, bool default_); Index getStructIndex(Element& type, Element& field); Expression* makeStructGet(Element& s, bool signed_ = false); Expression* makeStructSet(Element& s); - Expression* makeArrayNewStatic(Element& s, bool default_); + Expression* makeArrayNew(Element& s, bool default_); Expression* makeArrayNewSeg(Element& s, ArrayNewSegOp op); Expression* makeArrayInitStatic(Element& s); Expression* makeArrayGet(Element& s, bool signed_ = false); diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index d7a424695..7b2922d3c 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -6893,7 +6893,7 @@ bool WasmBinaryBuilder::maybeVisitI31Get(Expression*& out, uint32_t code) { } bool WasmBinaryBuilder::maybeVisitRefTest(Expression*& out, uint32_t code) { - if (code == BinaryConsts::RefTestStatic) { + if (code == BinaryConsts::RefTestStatic || code == BinaryConsts::RefTest) { auto intendedType = getIndexedHeapType(); auto* ref = popNonVoidExpression(); out = Builder(wasm).makeRefTest(ref, intendedType); @@ -6904,11 +6904,11 @@ bool WasmBinaryBuilder::maybeVisitRefTest(Expression*& out, uint32_t code) { bool WasmBinaryBuilder::maybeVisitRefCast(Expression*& out, uint32_t code) { if (code == BinaryConsts::RefCastStatic || - code == BinaryConsts::RefCastNopStatic) { + code == BinaryConsts::RefCastNull || code == BinaryConsts::RefCastNop) { auto intendedType = getIndexedHeapType(); auto* ref = popNonVoidExpression(); auto safety = - code == BinaryConsts::RefCastNopStatic ? RefCast::Unsafe : RefCast::Safe; + code == BinaryConsts::RefCastNop ? RefCast::Unsafe : RefCast::Safe; out = Builder(wasm).makeRefCast(ref, intendedType, safety); return true; } @@ -6925,9 +6925,11 @@ bool WasmBinaryBuilder::maybeVisitBrOn(Expression*& out, uint32_t code) { op = BrOnNonNull; break; case BinaryConsts::BrOnCastStatic: + case BinaryConsts::BrOnCast: op = BrOnCast; break; case BinaryConsts::BrOnCastStaticFail: + case BinaryConsts::BrOnCastFail: op = BrOnCastFail; break; case BinaryConsts::BrOnFunc: @@ -6952,15 +6954,12 @@ bool WasmBinaryBuilder::maybeVisitBrOn(Expression*& out, uint32_t code) { return false; } auto name = getBreakTarget(getU32LEB()).name; - if (code == BinaryConsts::BrOnCastStatic || - code == BinaryConsts::BrOnCastStaticFail) { - auto intendedType = getIndexedHeapType(); - auto* ref = popNonVoidExpression(); - out = Builder(wasm).makeBrOn(op, name, ref, intendedType); - return true; + HeapType intendedType; + if (op == BrOnCast || op == BrOnCastFail) { + intendedType = getIndexedHeapType(); } auto* ref = popNonVoidExpression(); - out = ValidatingBuilder(wasm, pos).validateAndMakeBrOn(op, name, ref); + out = Builder(wasm).makeBrOn(op, name, ref, intendedType); return true; } diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp index 7bdbc69c6..ee9fdde72 100644 --- a/src/wasm/wasm-s-parser.cpp +++ b/src/wasm/wasm-s-parser.cpp @@ -2775,40 +2775,42 @@ Expression* SExpressionWasmBuilder::makeI31Get(Element& s, bool signed_) { return ret; } -Expression* SExpressionWasmBuilder::makeRefTestStatic(Element& s) { +Expression* SExpressionWasmBuilder::makeRefTest(Element& s) { auto heapType = parseHeapType(*s[1]); auto* ref = parseExpression(*s[2]); return Builder(wasm).makeRefTest(ref, heapType); } -Expression* SExpressionWasmBuilder::makeRefCastStatic(Element& s) { - auto heapType = parseHeapType(*s[1]); - auto* ref = parseExpression(*s[2]); +Expression* SExpressionWasmBuilder::makeRefCast(Element& s) { + int i = 1; + if (s[0]->str().str != "ref.cast_static") { + if (s[i++]->str().str != "null") { + throw ParseException("ref.cast not yet supported. Use ref.cast null."); + } + } + auto heapType = parseHeapType(*s[i++]); + auto* ref = parseExpression(*s[i++]); return Builder(wasm).makeRefCast(ref, heapType, RefCast::Safe); } -Expression* SExpressionWasmBuilder::makeRefCastNopStatic(Element& s) { +Expression* SExpressionWasmBuilder::makeRefCastNop(Element& s) { auto heapType = parseHeapType(*s[1]); auto* ref = parseExpression(*s[2]); return Builder(wasm).makeRefCast(ref, heapType, RefCast::Unsafe); } Expression* SExpressionWasmBuilder::makeBrOn(Element& s, BrOnOp op) { - auto name = getLabel(*s[1]); - auto* ref = parseExpression(*s[2]); - return ValidatingBuilder(wasm, s.line, s.col) - .validateAndMakeBrOn(op, name, ref); -} - -Expression* SExpressionWasmBuilder::makeBrOnStatic(Element& s, BrOnOp op) { - auto name = getLabel(*s[1]); - auto heapType = parseHeapType(*s[2]); - auto* ref = parseExpression(*s[3]); + int i = 1; + auto name = getLabel(*s[i++]); + HeapType heapType; + if (op == BrOnCast || op == BrOnCastFail) { + heapType = parseHeapType(*s[i++]); + } + auto* ref = parseExpression(*s[i]); return Builder(wasm).makeBrOn(op, name, ref, heapType); } -Expression* SExpressionWasmBuilder::makeStructNewStatic(Element& s, - bool default_) { +Expression* SExpressionWasmBuilder::makeStructNew(Element& s, bool default_) { auto heapType = parseHeapType(*s[1]); auto numOperands = s.size() - 2; if (default_ && numOperands > 0) { @@ -2865,8 +2867,7 @@ Expression* SExpressionWasmBuilder::makeStructSet(Element& s) { return Builder(wasm).makeStructSet(index, ref, value); } -Expression* SExpressionWasmBuilder::makeArrayNewStatic(Element& s, - bool default_) { +Expression* SExpressionWasmBuilder::makeArrayNew(Element& s, bool default_) { auto heapType = parseHeapType(*s[1]); Expression* init = nullptr; size_t i = 2; diff --git a/src/wasm/wasm-stack.cpp b/src/wasm/wasm-stack.cpp index daeac60d6..1f477a10c 100644 --- a/src/wasm/wasm-stack.cpp +++ b/src/wasm/wasm-stack.cpp @@ -2025,16 +2025,16 @@ void BinaryInstWriter::visitCallRef(CallRef* curr) { void BinaryInstWriter::visitRefTest(RefTest* curr) { o << int8_t(BinaryConsts::GCPrefix); - o << U32LEB(BinaryConsts::RefTestStatic); + o << U32LEB(BinaryConsts::RefTest); parent.writeIndexedHeapType(curr->intendedType); } void BinaryInstWriter::visitRefCast(RefCast* curr) { o << int8_t(BinaryConsts::GCPrefix); if (curr->safety == RefCast::Unsafe) { - o << U32LEB(BinaryConsts::RefCastNopStatic); + o << U32LEB(BinaryConsts::RefCastNop); } else { - o << U32LEB(BinaryConsts::RefCastStatic); + o << U32LEB(BinaryConsts::RefCastNull); } parent.writeIndexedHeapType(curr->intendedType); } @@ -2049,11 +2049,11 @@ void BinaryInstWriter::visitBrOn(BrOn* curr) { break; case BrOnCast: o << int8_t(BinaryConsts::GCPrefix); - o << U32LEB(BinaryConsts::BrOnCastStatic); + o << U32LEB(BinaryConsts::BrOnCast); break; case BrOnCastFail: o << int8_t(BinaryConsts::GCPrefix); - o << U32LEB(BinaryConsts::BrOnCastStaticFail); + o << U32LEB(BinaryConsts::BrOnCastFail); break; case BrOnFunc: o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::BrOnFunc); diff --git a/src/wasm/wat-parser.cpp b/src/wasm/wat-parser.cpp index 3f52e6fe6..c3fd2bc4b 100644 --- a/src/wasm/wat-parser.cpp +++ b/src/wasm/wat-parser.cpp @@ -2016,24 +2016,20 @@ template<typename Ctx> Result<typename Ctx::InstrT> makeI31New(Ctx&, Index); template<typename Ctx> Result<typename Ctx::InstrT> makeI31Get(Ctx&, Index, bool signed_); template<typename Ctx> Result<typename Ctx::InstrT> makeRefTest(Ctx&, Index); -template<typename Ctx> -Result<typename Ctx::InstrT> makeRefTestStatic(Ctx&, Index); +template<typename Ctx> Result<typename Ctx::InstrT> makeRefTest(Ctx&, Index); template<typename Ctx> Result<typename Ctx::InstrT> makeRefCast(Ctx&, Index); -template<typename Ctx> -Result<typename Ctx::InstrT> makeRefCastStatic(Ctx&, Index); -template<typename Ctx> -Result<typename Ctx::InstrT> makeRefCastNopStatic(Ctx&, Index); +template<typename Ctx> Result<typename Ctx::InstrT> makeRefCastNop(Ctx&, Index); template<typename Ctx> Result<typename Ctx::InstrT> makeBrOn(Ctx&, Index, BrOnOp op); template<typename Ctx> -Result<typename Ctx::InstrT> makeBrOnStatic(Ctx&, Index, BrOnOp op); +Result<typename Ctx::InstrT> makeBrOn(Ctx&, Index, BrOnOp op); template<typename Ctx> -Result<typename Ctx::InstrT> makeStructNewStatic(Ctx&, Index, bool default_); +Result<typename Ctx::InstrT> makeStructNew(Ctx&, Index, bool default_); template<typename Ctx> Result<typename Ctx::InstrT> makeStructGet(Ctx&, Index, bool signed_ = false); template<typename Ctx> Result<typename Ctx::InstrT> makeStructSet(Ctx&, Index); template<typename Ctx> -Result<typename Ctx::InstrT> makeArrayNewStatic(Ctx&, Index, bool default_); +Result<typename Ctx::InstrT> makeArrayNew(Ctx&, Index, bool default_); template<typename Ctx> Result<typename Ctx::InstrT> makeArrayNewSeg(Ctx&, Index, ArrayNewSegOp op); template<typename Ctx> @@ -2972,22 +2968,12 @@ Result<typename Ctx::InstrT> makeRefTest(Ctx& ctx, Index pos) { } template<typename Ctx> -Result<typename Ctx::InstrT> makeRefTestStatic(Ctx& ctx, Index pos) { - return ctx.in.err("unimplemented instruction"); -} - -template<typename Ctx> Result<typename Ctx::InstrT> makeRefCast(Ctx& ctx, Index pos) { return ctx.in.err("unimplemented instruction"); } template<typename Ctx> -Result<typename Ctx::InstrT> makeRefCastStatic(Ctx& ctx, Index pos) { - return ctx.in.err("unimplemented instruction"); -} - -template<typename Ctx> -Result<typename Ctx::InstrT> makeRefCastNopStatic(Ctx& ctx, Index pos) { +Result<typename Ctx::InstrT> makeRefCastNop(Ctx& ctx, Index pos) { return ctx.in.err("unimplemented instruction"); } @@ -2997,13 +2983,7 @@ Result<typename Ctx::InstrT> makeBrOn(Ctx& ctx, Index pos, BrOnOp op) { } template<typename Ctx> -Result<typename Ctx::InstrT> makeBrOnStatic(Ctx& ctx, Index pos, BrOnOp op) { - return ctx.in.err("unimplemented instruction"); -} - -template<typename Ctx> -Result<typename Ctx::InstrT> -makeStructNewStatic(Ctx& ctx, Index pos, bool default_) { +Result<typename Ctx::InstrT> makeStructNew(Ctx& ctx, Index pos, bool default_) { auto type = typeidx(ctx); CHECK_ERR(type); if (default_) { @@ -3031,8 +3011,7 @@ Result<typename Ctx::InstrT> makeStructSet(Ctx& ctx, Index pos) { } template<typename Ctx> -Result<typename Ctx::InstrT> -makeArrayNewStatic(Ctx& ctx, Index pos, bool default_) { +Result<typename Ctx::InstrT> makeArrayNew(Ctx& ctx, Index pos, bool default_) { return ctx.in.err("unimplemented instruction"); } |