diff options
Diffstat (limited to 'src/wasm')
-rw-r--r-- | src/wasm/wasm-binary.cpp | 7 | ||||
-rw-r--r-- | src/wasm/wasm-s-parser.cpp | 8 | ||||
-rw-r--r-- | src/wasm/wasm-stack.cpp | 6 |
3 files changed, 17 insertions, 4 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 60a4bad77..9cd7e79a7 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -6712,10 +6712,13 @@ bool WasmBinaryBuilder::maybeVisitRefCast(Expression*& out, uint32_t code) { auto* ref = popNonVoidExpression(); out = Builder(wasm).makeRefCast(ref, rtt); return true; - } else if (code == BinaryConsts::RefCastStatic) { + } else if (code == BinaryConsts::RefCastStatic || + code == BinaryConsts::RefCastNopStatic) { auto intendedType = getIndexedHeapType(); auto* ref = popNonVoidExpression(); - out = Builder(wasm).makeRefCast(ref, intendedType); + auto safety = + code == BinaryConsts::RefCastNopStatic ? RefCast::Unsafe : RefCast::Safe; + out = Builder(wasm).makeRefCast(ref, intendedType, safety); return true; } return false; diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp index 02da4f909..8680ff8cc 100644 --- a/src/wasm/wasm-s-parser.cpp +++ b/src/wasm/wasm-s-parser.cpp @@ -2702,7 +2702,13 @@ Expression* SExpressionWasmBuilder::makeRefCast(Element& s) { Expression* SExpressionWasmBuilder::makeRefCastStatic(Element& s) { auto heapType = parseHeapType(*s[1]); auto* ref = parseExpression(*s[2]); - return Builder(wasm).makeRefCast(ref, heapType); + return Builder(wasm).makeRefCast(ref, heapType, RefCast::Safe); +} + +Expression* SExpressionWasmBuilder::makeRefCastNopStatic(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) { diff --git a/src/wasm/wasm-stack.cpp b/src/wasm/wasm-stack.cpp index 8afeb6779..8588a049f 100644 --- a/src/wasm/wasm-stack.cpp +++ b/src/wasm/wasm-stack.cpp @@ -2051,7 +2051,11 @@ void BinaryInstWriter::visitRefCast(RefCast* curr) { if (curr->rtt) { o << U32LEB(BinaryConsts::RefCast); } else { - o << U32LEB(BinaryConsts::RefCastStatic); + if (curr->safety == RefCast::Unsafe) { + o << U32LEB(BinaryConsts::RefCastNopStatic); + } else { + o << U32LEB(BinaryConsts::RefCastStatic); + } parent.writeIndexedHeapType(curr->intendedType); } } |