diff options
Diffstat (limited to 'src/wasm/wasm-binary.cpp')
-rw-r--r-- | src/wasm/wasm-binary.cpp | 43 |
1 files changed, 31 insertions, 12 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index dad6f9320..e1ff43988 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -6419,23 +6419,33 @@ bool WasmBinaryBuilder::maybeVisitI31Get(Expression*& out, uint32_t code) { } bool WasmBinaryBuilder::maybeVisitRefTest(Expression*& out, uint32_t code) { - if (code != BinaryConsts::RefTest) { - return false; + if (code == BinaryConsts::RefTest) { + auto* rtt = popNonVoidExpression(); + auto* ref = popNonVoidExpression(); + out = Builder(wasm).makeRefTest(ref, rtt); + return true; + } else if (code == BinaryConsts::RefTestStatic) { + auto intendedType = getIndexedHeapType(); + auto* ref = popNonVoidExpression(); + out = Builder(wasm).makeRefTest(ref, intendedType); + return true; } - auto* rtt = popNonVoidExpression(); - auto* ref = popNonVoidExpression(); - out = Builder(wasm).makeRefTest(ref, rtt); - return true; + return false; } bool WasmBinaryBuilder::maybeVisitRefCast(Expression*& out, uint32_t code) { - if (code != BinaryConsts::RefCast) { - return false; + if (code == BinaryConsts::RefCast) { + auto* rtt = popNonVoidExpression(); + auto* ref = popNonVoidExpression(); + out = Builder(wasm).makeRefCast(ref, rtt); + return true; + } else if (code == BinaryConsts::RefCastStatic) { + auto intendedType = getIndexedHeapType(); + auto* ref = popNonVoidExpression(); + out = Builder(wasm).makeRefCast(ref, intendedType); + return true; } - auto* rtt = popNonVoidExpression(); - auto* ref = popNonVoidExpression(); - out = Builder(wasm).makeRefCast(ref, rtt); - return true; + return false; } bool WasmBinaryBuilder::maybeVisitBrOn(Expression*& out, uint32_t code) { @@ -6448,9 +6458,11 @@ bool WasmBinaryBuilder::maybeVisitBrOn(Expression*& out, uint32_t code) { op = BrOnNonNull; break; case BinaryConsts::BrOnCast: + case BinaryConsts::BrOnCastStatic: op = BrOnCast; break; case BinaryConsts::BrOnCastFail: + case BinaryConsts::BrOnCastStaticFail: op = BrOnCastFail; break; case BinaryConsts::BrOnFunc: @@ -6475,6 +6487,13 @@ 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; + } Expression* rtt = nullptr; if (op == BrOnCast || op == BrOnCastFail) { rtt = popNonVoidExpression(); |