summaryrefslogtreecommitdiff
path: root/src/wasm/wasm-binary.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm/wasm-binary.cpp')
-rw-r--r--src/wasm/wasm-binary.cpp30
1 files changed, 16 insertions, 14 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp
index 91309c906..133272a67 100644
--- a/src/wasm/wasm-binary.cpp
+++ b/src/wasm/wasm-binary.cpp
@@ -7034,14 +7034,10 @@ bool WasmBinaryBuilder::maybeVisitBrOn(Expression*& out, uint32_t code) {
case BinaryConsts::BrOnNonNull:
op = BrOnNonNull;
break;
- case BinaryConsts::BrOnCastStatic:
case BinaryConsts::BrOnCast:
- case BinaryConsts::BrOnCastNull:
op = BrOnCast;
break;
- case BinaryConsts::BrOnCastStaticFail:
case BinaryConsts::BrOnCastFail:
- case BinaryConsts::BrOnCastFailNull:
op = BrOnCastFail;
break;
case BinaryConsts::BrOnFunc:
@@ -7063,18 +7059,24 @@ bool WasmBinaryBuilder::maybeVisitBrOn(Expression*& out, uint32_t code) {
default:
return false;
}
- auto name = getBreakTarget(getU32LEB()).name;
- if (castType == Type::none && (op == BrOnCast || op == BrOnCastFail)) {
- auto nullability = (code == BinaryConsts::BrOnCastNull ||
- code == BinaryConsts::BrOnCastFailNull)
- ? Nullable
- : NonNullable;
- bool legacy = code == BinaryConsts::BrOnCastStatic ||
- code == BinaryConsts::BrOnCastStaticFail;
- auto type = legacy ? getIndexedHeapType() : getHeapType();
- castType = Type(type, nullability);
+ uint8_t flags = 0;
+ if (op == BrOnCast || op == BrOnCastFail) {
+ flags = getInt8();
}
+ auto name = getBreakTarget(getU32LEB()).name;
auto* ref = popNonVoidExpression();
+ if (op == BrOnCast || op == BrOnCastFail) {
+ auto inputNullability = (flags & 1) ? Nullable : NonNullable;
+ auto castNullability = (flags & 2) ? Nullable : NonNullable;
+ auto inputHeapType = getHeapType();
+ auto castHeapType = getHeapType();
+ auto inputType = Type(inputHeapType, inputNullability);
+ castType = Type(castHeapType, castNullability);
+ if (!Type::isSubType(ref->type, inputType)) {
+ throwError(std::string("Invalid reference type for ") +
+ ((op == BrOnCast) ? "br_on_cast" : "br_on_cast_fail"));
+ }
+ }
out = Builder(wasm).makeBrOn(op, name, ref, castType);
return true;
}