Removes most of the remaining JSNI in JRE

Change-Id: I03cafe1d203f6a330c1ba769390155e19055801e
Review-Link: https://gwt-review.googlesource.com/#/c/18642/
diff --git a/dev/core/test/com/google/gwt/dev/CompilerTest.java b/dev/core/test/com/google/gwt/dev/CompilerTest.java
index a9d6465..bb342f2 100644
--- a/dev/core/test/com/google/gwt/dev/CompilerTest.java
+++ b/dev/core/test/com/google/gwt/dev/CompilerTest.java
@@ -2747,7 +2747,9 @@
         "java.lang.Double",
         "java.lang.HasCharSequenceTypeMarker",
         "java.lang.HasComparableTypeMarker",
+        "java.lang.Integer$NativeNumber",
         "java.lang.Number",
+        "java.lang.Number$JavaLangNumber",
         "java.lang.String",
         "java.lang.String$NativeFunction",
         "java.lang.String$NativeString",
diff --git a/user/super/com/google/gwt/emul/java/lang/Boolean.java b/user/super/com/google/gwt/emul/java/lang/Boolean.java
index ec3e351..af7a3ae 100644
--- a/user/super/com/google/gwt/emul/java/lang/Boolean.java
+++ b/user/super/com/google/gwt/emul/java/lang/Boolean.java
@@ -114,17 +114,13 @@
 
   // CHECKSTYLE_OFF: Utility Methods for unboxed Boolean.
   protected static Boolean $create(boolean x) {
-    return createNative(x);
+    return JsUtils.uncheckedCast(x);
   }
 
   protected static Boolean $create(String x) {
-    return createNative(Boolean.parseBoolean(x));
+    return JsUtils.uncheckedCast(Boolean.parseBoolean(x));
   }
 
-  private static native Boolean createNative(boolean x) /*-{
-    return x;
-  }-*/;
-
   @JsMethod
   protected static boolean $isInstance(Object instance) {
     return "boolean".equals(JsUtils.typeOf(instance));
diff --git a/user/super/com/google/gwt/emul/java/lang/Double.java b/user/super/com/google/gwt/emul/java/lang/Double.java
index f41d44b..a30c839 100644
--- a/user/super/com/google/gwt/emul/java/lang/Double.java
+++ b/user/super/com/google/gwt/emul/java/lang/Double.java
@@ -379,17 +379,13 @@
 
   // CHECKSTYLE_OFF: Utility Methods for unboxed Double.
   protected static Double $create(double x) {
-    return createNative(x);
+    return JsUtils.uncheckedCast(x);
   }
 
   protected static Double $create(String s) {
-    return createNative(Double.parseDouble(s));
+    return JsUtils.uncheckedCast(Double.parseDouble(s));
   }
 
-  private static native Double createNative(double x) /*-{
-    return x;
-  }-*/;
-
   @JsMethod
   protected static boolean $isInstance(Object instance) {
     return "number".equals(JsUtils.typeOf(instance));
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 bda0338..a549b93 100644
--- a/user/super/com/google/gwt/emul/java/lang/Integer.java
+++ b/user/super/com/google/gwt/emul/java/lang/Integer.java
@@ -15,6 +15,9 @@
  */
 package java.lang;
 
+import javaemul.internal.JsUtils;
+import jsinterop.annotations.JsType;
+
 /**
  * Wraps a primitive <code>int</code> as an object.
  */
@@ -206,17 +209,25 @@
   }
 
   public static String toBinaryString(int value) {
-    return toUnsignedRadixString(value, 2);
+    return toUnsignedString(value, 2);
   }
 
   public static String toHexString(int value) {
-    return toUnsignedRadixString(value, 16);
+    return toUnsignedString(value, 16);
   }
 
   public static String toOctalString(int value) {
-    return toUnsignedRadixString(value, 8);
+    return toUnsignedString(value, 8);
   }
 
+  private static String toUnsignedString(int value, int radix) {
+    return toRadixString(toUnsigned(value), radix);
+  }
+
+  private static native int toUnsigned(int value) /*-{
+    return (value >>> 0);
+  }-*/;
+
   public static String toString(int value) {
     return String.valueOf(value);
   }
@@ -228,6 +239,16 @@
     return toRadixString(value, radix);
   }
 
+  private static String toRadixString(double value, int radix) {
+    NativeNumber number = JsUtils.uncheckedCast(value);
+    return number.toString(radix);
+  }
+
+  @JsType(isNative = true, name = "Number", namespace = "<window>")
+  private interface NativeNumber {
+    String toString(int radix);
+  }
+
   public static Integer valueOf(int i) {
     if (i > -129 && i < 128) {
       int rebase = i + 128;
@@ -249,15 +270,6 @@
     return Integer.valueOf(Integer.parseInt(s, radix));
   }
 
-  private static native String toRadixString(int value, int radix) /*-{
-    return value.toString(radix);
-  }-*/;
-
-  private static native String toUnsignedRadixString(int value, int radix) /*-{
-    // ">>> 0" converts the value to unsigned number.
-    return (value >>> 0).toString(radix);
-  }-*/;
-
   private final transient int value;
 
   public Integer(int value) {
diff --git a/user/super/com/google/gwt/emul/java/lang/Number.java b/user/super/com/google/gwt/emul/java/lang/Number.java
index 2e1e955..e487b9b 100644
--- a/user/super/com/google/gwt/emul/java/lang/Number.java
+++ b/user/super/com/google/gwt/emul/java/lang/Number.java
@@ -19,7 +19,9 @@
 
 import javaemul.internal.JsUtils;
 import javaemul.internal.NativeRegExp;
+
 import jsinterop.annotations.JsMethod;
+import jsinterop.annotations.JsType;
 
 /**
  * Abstract base class for numeric wrapper classes.
@@ -127,16 +129,14 @@
     }
   }
 
+  @JsType(isNative = true, name = "Number$impl", namespace = "java.lang")
+  private static class JavaLangNumber { }
+
   @JsMethod
   private static boolean $isInstance(Object instance) {
-    return "number".equals(JsUtils.typeOf(instance)) || instanceOfJavaLangNumber(instance);
+    return "number".equals(JsUtils.typeOf(instance)) || instance instanceof JavaLangNumber;
   }
 
-  private static native boolean instanceOfJavaLangNumber(Object instance) /*-{
-    // Note: The instanceof Number here refers to java.lang.Number in j2cl.
-    return instance instanceof Number;
-  }-*/;
-
   /**
    * @skip
    *
diff --git a/user/super/com/google/gwt/emul/java/math/BigDecimal.java b/user/super/com/google/gwt/emul/java/math/BigDecimal.java
index dfb608c..52e44f1 100644
--- a/user/super/com/google/gwt/emul/java/math/BigDecimal.java
+++ b/user/super/com/google/gwt/emul/java/math/BigDecimal.java
@@ -41,6 +41,8 @@
 import javaemul.internal.JsUtils;
 import javaemul.internal.NativeRegExp;
 
+import jsinterop.annotations.JsType;
+
 /**
  * This class represents immutable arbitrary precision decimal numbers. Each
  * {@code BigDecimal} instance is represented with a unscaled arbitrary
@@ -491,13 +493,18 @@
    * Convert a double to a string with {@code digits} precision.  The resulting
    * string may still be in exponential notation.
    *
-   * @param d double value
    * @param digits number of digits of precision to include
    * @return non-localized string representation of {@code d}
    */
-  private static native String toPrecision(double d, int digits) /*-{
-    return d.toPrecision(digits);
-  }-*/;
+  private static String toPrecision(double value, int digits) {
+    NativeNumber number = JsUtils.uncheckedCast(value);
+    return number.toPrecision(digits);
+  }
+
+  @JsType(isNative = true, name = "Number", namespace = "<window>")
+  private interface NativeNumber {
+    String toPrecision(int digits);
+  }
 
   private static BigDecimal valueOf(double smallValue, double scale) {
     return new BigDecimal(smallValue, scale);
diff --git a/user/super/com/google/gwt/emul/javaemul/internal/JsUtils.java b/user/super/com/google/gwt/emul/javaemul/internal/JsUtils.java
index ad2abff..e569add 100644
--- a/user/super/com/google/gwt/emul/javaemul/internal/JsUtils.java
+++ b/user/super/com/google/gwt/emul/javaemul/internal/JsUtils.java
@@ -15,6 +15,7 @@
  */
 package javaemul.internal;
 
+import javaemul.internal.annotations.DoNotAutobox;
 import javaemul.internal.annotations.UncheckedCast;
 import jsinterop.annotations.JsMethod;
 import jsinterop.annotations.JsProperty;
@@ -56,7 +57,7 @@
   }-*/;
 
   @UncheckedCast
-  public static native <T> T uncheckedCast(Object o) /*-{
+  public static native <T> T uncheckedCast(@DoNotAutobox Object o) /*-{
     return o;
   }-*/;
 
diff --git a/user/test/com/google/gwt/emultest/java/lang/IntegerTest.java b/user/test/com/google/gwt/emultest/java/lang/IntegerTest.java
index d02a8e8..4f93f55 100644
--- a/user/test/com/google/gwt/emultest/java/lang/IntegerTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/IntegerTest.java
@@ -292,18 +292,20 @@
     assertEquals("-2147483648", Integer.toString(Integer.MIN_VALUE));
     assertEquals("0", Integer.toString(0));
 
-    assertEquals("17777777777", Integer.toString(2147483647, 8));
-    assertEquals("7fffffff", Integer.toString(2147483647, 16));
-    assertEquals("1111111111111111111111111111111", Integer.toString(2147483647, 2));
-    assertEquals("2147483647", Integer.toString(2147483647, 10));
-    assertEquals("-17777777777", Integer.toString(-2147483647, 8));
-    assertEquals("-7fffffff", Integer.toString(-2147483647, 16));
-    assertEquals("-1111111111111111111111111111111", Integer.toString(-2147483647, 2));
-    assertEquals("-2147483647", Integer.toString(-2147483647, 10));
-    assertEquals("-20000000000", Integer.toString(-2147483648, 8));
-    assertEquals("-80000000", Integer.toString(-2147483648, 16));
-    assertEquals("-10000000000000000000000000000000", Integer.toString(-2147483648, 2));
-    assertEquals("-2147483648", Integer.toString(-2147483648, 10));
+    assertEquals("7fffffff", Integer.toString(Integer.MAX_VALUE, 16));
+    assertEquals("2147483647", Integer.toString(Integer.MAX_VALUE, 10));
+    assertEquals("17777777777", Integer.toString(Integer.MAX_VALUE, 8));
+    assertEquals("1111111111111111111111111111111", Integer.toString(Integer.MAX_VALUE, 2));
+
+    assertEquals("-7fffffff", Integer.toString(-Integer.MAX_VALUE, 16));
+    assertEquals("-2147483647", Integer.toString(-Integer.MAX_VALUE, 10));
+    assertEquals("-17777777777", Integer.toString(-Integer.MAX_VALUE, 8));
+    assertEquals("-1111111111111111111111111111111", Integer.toString(-Integer.MAX_VALUE, 2));
+
+    assertEquals("-80000000", Integer.toString(Integer.MIN_VALUE, 16));
+    assertEquals("-2147483648", Integer.toString(Integer.MIN_VALUE, 10));
+    assertEquals("-20000000000", Integer.toString(Integer.MIN_VALUE, 8));
+    assertEquals("-10000000000000000000000000000000", Integer.toString(Integer.MIN_VALUE, 2));
   }
 
   public void testValueOf() {