From 082dbe25b7377809b1b3dc429cb334fc80fac286 Mon Sep 17 00:00:00 2001 From: Thomas Lively Date: Fri, 9 Dec 2022 17:56:10 -0600 Subject: 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. --- src/wasm/wasm-s-parser.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'src/wasm/wasm-s-parser.cpp') diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp index 507cf3b6c..98f7c1e87 100644 --- a/src/wasm/wasm-s-parser.cpp +++ b/src/wasm/wasm-s-parser.cpp @@ -2783,13 +2783,25 @@ Expression* SExpressionWasmBuilder::makeRefTest(Element& s) { Expression* SExpressionWasmBuilder::makeRefCast(Element& s) { int i = 1; + std::optional nullability; if (s[0]->str().str != "ref.cast_static") { - if (s[i++]->str().str != "null") { - throw ParseException("ref.cast not yet supported. Use ref.cast null."); + nullability = NonNullable; + if (s[i]->str().str == "null") { + nullability = Nullable; + ++i; } } auto heapType = parseHeapType(*s[i++]); auto* ref = parseExpression(*s[i++]); + if (nullability && ref->type.isRef()) { + if (*nullability == NonNullable && ref->type.isNullable()) { + throw ParseException( + "ref.cast on nullable input not yet supported", s.line, s.col); + } else if (*nullability == Nullable && ref->type.isNonNullable()) { + throw ParseException( + "ref.cast null on non-nullable input not yet supported", s.line, s.col); + } + } return Builder(wasm).makeRefCast(ref, heapType, RefCast::Safe); } -- cgit v1.2.3