Encapsulate boxing caches marking them side-effect free.

Marking the cache operations as side-effect free allows the J2CL WASM pipeline to remove boxing code when the results are not used.

PiperOrigin-RevId: 399339138
Change-Id: Ia17efa779823ced63c2cd98f7abfbac4ae0f9688
diff --git a/user/super/com/google/gwt/emul/java/lang/Byte.java b/user/super/com/google/gwt/emul/java/lang/Byte.java
index bc87eed..d5f0f1f 100644
--- a/user/super/com/google/gwt/emul/java/lang/Byte.java
+++ b/user/super/com/google/gwt/emul/java/lang/Byte.java
@@ -32,6 +32,17 @@
   private static class BoxedValues {
     // Box all values according to JLS
     private static Byte[] boxedValues = new Byte[256];
+
+    // This method should be marked with @HasNoSideEffects but it seems to trigger a bug
+    // in the optimizing pipeling and breaks one test.
+    private static Byte get(byte b) {
+      int rebase = b + 128;
+      Byte result = BoxedValues.boxedValues[rebase];
+      if (result == null) {
+        result = BoxedValues.boxedValues[rebase] = new Byte(b);
+      }
+      return result;
+    }
   }
 
   public static int compare(byte x, byte y) {
@@ -60,12 +71,7 @@
   }
 
   public static Byte valueOf(byte b) {
-    int rebase = b + 128;
-    Byte result = BoxedValues.boxedValues[rebase];
-    if (result == null) {
-      result = BoxedValues.boxedValues[rebase] = new Byte(b);
-    }
-    return result;
+    return BoxedValues.get(b);
   }
 
   public static Byte valueOf(String s) throws NumberFormatException {
diff --git a/user/super/com/google/gwt/emul/java/lang/Character.java b/user/super/com/google/gwt/emul/java/lang/Character.java
index 3733f73..4b01e4d 100644
--- a/user/super/com/google/gwt/emul/java/lang/Character.java
+++ b/user/super/com/google/gwt/emul/java/lang/Character.java
@@ -19,6 +19,7 @@
 
 import java.io.Serializable;
 import javaemul.internal.NativeRegExp;
+import javaemul.internal.annotations.HasNoSideEffects;
 
 /**
  * Wraps a native <code>char</code> as an object.
@@ -104,6 +105,15 @@
   private static class BoxedValues {
     // Box values according to JLS - from \u0000 to \u007f
     private static Character[] boxedValues = new Character[128];
+
+    @HasNoSideEffects
+    private static Character get(char c) {
+      Character result = BoxedValues.boxedValues[c];
+      if (result == null) {
+        result = BoxedValues.boxedValues[c] = new Character(c);
+      }
+      return result;
+    }
   }
 
   public static final Class<Character> TYPE = Character.class;
@@ -426,11 +436,7 @@
 
   public static Character valueOf(char c) {
     if (c < 128) {
-      Character result = BoxedValues.boxedValues[c];
-      if (result == null) {
-        result = BoxedValues.boxedValues[c] = new Character(c);
-      }
-      return result;
+      return BoxedValues.get(c);
     }
     return new Character(c);
   }
diff --git a/user/super/com/google/gwt/emul/java/lang/Integer.java b/user/super/com/google/gwt/emul/java/lang/Integer.java
index 1e2f584..a56e31e 100644
--- a/user/super/com/google/gwt/emul/java/lang/Integer.java
+++ b/user/super/com/google/gwt/emul/java/lang/Integer.java
@@ -16,6 +16,7 @@
 package java.lang;
 
 import javaemul.internal.JsUtils;
+import javaemul.internal.annotations.HasNoSideEffects;
 
 /**
  * Wraps a primitive <code>int</code> as an object.
@@ -34,6 +35,16 @@
   private static class BoxedValues {
     // Box values according to JLS - between -128 and 127
     private static Integer[] boxedValues = new Integer[256];
+
+    @HasNoSideEffects
+    private static Integer get(int i) {
+      int rebase = i + 128;
+      Integer result = boxedValues[rebase];
+      if (result == null) {
+        result = boxedValues[rebase] = new Integer(i);
+      }
+      return result;
+    }
   }
 
   /**
@@ -233,12 +244,7 @@
 
   public static Integer valueOf(int i) {
     if (i > -129 && i < 128) {
-      int rebase = i + 128;
-      Integer result = BoxedValues.boxedValues[rebase];
-      if (result == null) {
-        result = BoxedValues.boxedValues[rebase] = new Integer(i);
-      }
-      return result;
+      return BoxedValues.get(i);
     }
     return new Integer(i);
   }
diff --git a/user/super/com/google/gwt/emul/java/lang/Long.java b/user/super/com/google/gwt/emul/java/lang/Long.java
index da22734..693efeb 100644
--- a/user/super/com/google/gwt/emul/java/lang/Long.java
+++ b/user/super/com/google/gwt/emul/java/lang/Long.java
@@ -16,6 +16,7 @@
 package java.lang;
 
 import javaemul.internal.LongUtils;
+import javaemul.internal.annotations.HasNoSideEffects;
 
 /** Wraps a primitive <code>long</code> as an object. */
 public final class Long extends Number implements Comparable<Long> {
@@ -24,6 +25,16 @@
   static class BoxedValues {
     // Box values according to JLS - between -128 and 127
     static Long[] boxedValues = new Long[256];
+
+    @HasNoSideEffects
+    private static Long get(long l) {
+      int rebase = (int) l + 128;
+      Long result = BoxedValues.boxedValues[rebase];
+      if (result == null) {
+        result = BoxedValues.boxedValues[rebase] = new Long(l);
+      }
+      return result;
+    }
   }
 
   public static final long MAX_VALUE = 0x7fffffffffffffffL;
@@ -206,16 +217,11 @@
     return String.valueOf(buf, cursor, bufLen - cursor);
   }
 
-  public static Long valueOf(long i) {
-    if (i > -129 && i < 128) {
-      int rebase = (int) i + 128;
-      Long result = BoxedValues.boxedValues[rebase];
-      if (result == null) {
-        result = BoxedValues.boxedValues[rebase] = new Long(i);
-      }
-      return result;
+  public static Long valueOf(long l) {
+    if (l > -129 && l < 128) {
+      return BoxedValues.get(l);
     }
-    return new Long(i);
+    return new Long(l);
   }
 
   public static Long valueOf(String s) throws NumberFormatException {
diff --git a/user/super/com/google/gwt/emul/java/lang/Short.java b/user/super/com/google/gwt/emul/java/lang/Short.java
index c42d03c..15e9b38 100644
--- a/user/super/com/google/gwt/emul/java/lang/Short.java
+++ b/user/super/com/google/gwt/emul/java/lang/Short.java
@@ -15,6 +15,8 @@
  */
 package java.lang;
 
+import javaemul.internal.annotations.HasNoSideEffects;
+
 /**
  * Wraps a primitive <code>short</code> as an object.
  */
@@ -32,6 +34,16 @@
   private static class BoxedValues {
     // Box values according to JLS - between -128 and 127
     private static Short[] boxedValues = new Short[256];
+
+    @HasNoSideEffects
+    private static Short get(short s) {
+      int rebase = s + 128;
+      Short result = BoxedValues.boxedValues[rebase];
+      if (result == null) {
+        result = BoxedValues.boxedValues[rebase] = new Short(s);
+      }
+      return result;
+    }
   }
 
   public static int compare(short x, short y) {
@@ -65,12 +77,7 @@
 
   public static Short valueOf(short s) {
     if (s > -129 && s < 128) {
-      int rebase = s + 128;
-      Short result = BoxedValues.boxedValues[rebase];
-      if (result == null) {
-        result = BoxedValues.boxedValues[rebase] = new Short(s);
-      }
-      return result;
+      return BoxedValues.get(s);
     }
     return new Short(s);
   }