diff options
author | Thomas Lively <tlively@google.com> | 2022-12-09 17:56:10 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-09 23:56:10 +0000 |
commit | 082dbe25b7377809b1b3dc429cb334fc80fac286 (patch) | |
tree | 62478deb4383c8f78ca648fd6ea8629494a9a113 /src/passes/Print.cpp | |
parent | 48959ab5a74d849e9782f54b3535c6fca69d51d7 (diff) | |
download | binaryen-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/passes/Print.cpp')
-rw-r--r-- | src/passes/Print.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp index d700f85f3..68a2d16dc 100644 --- a/src/passes/Print.cpp +++ b/src/passes/Print.cpp @@ -2116,7 +2116,12 @@ struct PrintExpressionContents if (curr->safety == RefCast::Unsafe) { printMedium(o, "ref.cast_nop "); } else { - printMedium(o, "ref.cast null "); + // Emulate legacy polymorphic behavior for now. + if (curr->ref->type.isNullable()) { + printMedium(o, "ref.cast null "); + } else { + printMedium(o, "ref.cast "); + } } printHeapType(o, curr->intendedType, wasm); } |