From b3ff9e233cef3e67e495476da14f13250a56c5e9 Mon Sep 17 00:00:00 2001 From: Googler Date: Wed, 20 Dec 2023 16:30:02 -0800 Subject: [PATCH] [Wasm] Add tests for jsenum boxing with partial inlining to check boxing around cases such as `checkNotNull` PiperOrigin-RevId: 592687191 --- .../j2cl/integration/java/jsenum/Main.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/transpiler/javatests/com/google/j2cl/integration/java/jsenum/Main.java b/transpiler/javatests/com/google/j2cl/integration/java/jsenum/Main.java index b9995eb606..abbefcd076 100644 --- a/transpiler/javatests/com/google/j2cl/integration/java/jsenum/Main.java +++ b/transpiler/javatests/com/google/j2cl/integration/java/jsenum/Main.java @@ -19,6 +19,7 @@ import static com.google.j2cl.integration.testing.Asserts.assertFalse; import static com.google.j2cl.integration.testing.Asserts.assertThrows; import static com.google.j2cl.integration.testing.Asserts.assertThrowsClassCastException; +import static com.google.j2cl.integration.testing.Asserts.assertThrowsNullPointerException; import static com.google.j2cl.integration.testing.Asserts.assertTrue; import static com.google.j2cl.integration.testing.Asserts.assertUnderlyingTypeEquals; import static com.google.j2cl.integration.testing.Asserts.fail; @@ -72,6 +73,7 @@ public static void main(String... args) { testAutoBoxing_intersectionCasts(); testSpecializedSuperType(); testSpecializedSuperTypeUnderlyingType(); + testBoxingPartialInlining(); } @Wasm("nop") // TODO(b/288145698): Support native JsEnum. @@ -925,4 +927,23 @@ private static Object passThrough(Object o) { assertTrue(o instanceof String || o instanceof Double || o instanceof Boolean); return o; } + + private static void testBoxingPartialInlining() { + // TODO(b/315214896) Check the size difference to see if cases such as these take advantage of + // partial inlining in Wasm to turn this into a simple null check, avoiding boxing. + PlainJsEnum nonnullJsEnum = PlainJsEnum.ONE; + checkNotNull(nonnullJsEnum); + // Use the local so it doesn't get removed. + assertTrue(nonnullJsEnum == PlainJsEnum.ONE); + + PlainJsEnum nullJsEnum = null; + assertThrowsNullPointerException(() -> checkNotNull(nullJsEnum)); + assertTrue(nullJsEnum == null); + } + + private static void checkNotNull(Object obj) { + if (obj == null) { + throw new NullPointerException(); + } + } }