summaryrefslogtreecommitdiff
path: root/src/wasm/wasm-stack.cpp
diff options
context:
space:
mode:
authorThomas Lively <tlively@google.com>2022-12-09 17:56:10 -0600
committerGitHub <noreply@github.com>2022-12-09 23:56:10 +0000
commit082dbe25b7377809b1b3dc429cb334fc80fac286 (patch)
tree62478deb4383c8f78ca648fd6ea8629494a9a113 /src/wasm/wasm-stack.cpp
parent48959ab5a74d849e9782f54b3535c6fca69d51d7 (diff)
downloadbinaryen-082dbe25b7377809b1b3dc429cb334fc80fac286.tar.gz
binaryen-082dbe25b7377809b1b3dc429cb334fc80fac286.tar.bz2
binaryen-082dbe25b7377809b1b3dc429cb334fc80fac286.zip
Use non-nullable ref.cast for non-nullable input (#5335)
We switched from emitting the legacy `ref.cast_static` instruction to emitting `ref.cast null` in #5331, but that wasn't quite correct. The legacy instruction had polymorphic typing so that its output type was nullable if and only if its input type was nullable. In contrast, `ref.cast null` always has a a nullable output type. Fix our output by instead emitting non-nullable `ref.cast` if the output should be non-nullable. Parse `ref.cast` in binary and text forms as well. Since the IR can only represent the legacy polymorphic semantics, disallow unsupported casts from nullable to non-nullable references or vice versa for now.
Diffstat (limited to 'src/wasm/wasm-stack.cpp')
-rw-r--r--src/wasm/wasm-stack.cpp10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/wasm/wasm-stack.cpp b/src/wasm/wasm-stack.cpp
index c4b9598c7..db40a5980 100644
--- a/src/wasm/wasm-stack.cpp
+++ b/src/wasm/wasm-stack.cpp
@@ -2033,10 +2033,16 @@ void BinaryInstWriter::visitRefCast(RefCast* curr) {
o << int8_t(BinaryConsts::GCPrefix);
if (curr->safety == RefCast::Unsafe) {
o << U32LEB(BinaryConsts::RefCastNop);
+ parent.writeIndexedHeapType(curr->intendedType);
} else {
- o << U32LEB(BinaryConsts::RefCastNull);
+ // Emulate legacy polymorphic behavior for now.
+ if (curr->ref->type.isNullable()) {
+ o << U32LEB(BinaryConsts::RefCastNull);
+ } else {
+ o << U32LEB(BinaryConsts::RefCast);
+ }
+ parent.writeHeapType(curr->intendedType);
}
- parent.writeHeapType(curr->intendedType);
}
void BinaryInstWriter::visitBrOn(BrOn* curr) {