Make Boolean, Double and String compatible with j2cl.

Change-Id: Ic3e094041dd620084b547dc945357c36de6cf072
diff --git a/dev/core/super/javaemul/internal/ArrayStamper.java b/dev/core/super/javaemul/internal/ArrayStamper.java
index a6a9ed2..5c3d828 100644
--- a/dev/core/super/javaemul/internal/ArrayStamper.java
+++ b/dev/core/super/javaemul/internal/ArrayStamper.java
@@ -18,7 +18,7 @@
 /**
  * A utility to provide array stamping. Provided as a separate class to simplify super-source.
  */
-class ArrayStamper {
+public class ArrayStamper {
   public static native <T> T[] stampJavaTypeInfo(Object array, T[] referenceType) /*-{
     return @com.google.gwt.lang.Array::stampJavaTypeInfo(*)(array, referenceType);
   }-*/;
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 9d4a1a4..a97f813 100644
--- a/user/super/com/google/gwt/emul/java/lang/Boolean.java
+++ b/user/super/com/google/gwt/emul/java/lang/Boolean.java
@@ -15,6 +15,8 @@
  */
 package java.lang;
 
+import static javaemul.internal.InternalPreconditions.checkNotNull;
+
 import java.io.Serializable;
 
 /**
@@ -88,19 +90,23 @@
     $createBoolean(s);
   }
 
-  public native boolean booleanValue() /*-{
-    return @javaemul.internal.InternalPreconditions::checkNotNull(Ljava/lang/Object;)(this);
+  public boolean booleanValue() {
+    return unsafeCast(checkNotNull(this));
+  }
+
+  private native boolean unsafeCast(Object value) /*-{
+    return value;
   }-*/;
 
   @Override
   public int compareTo(Boolean b) {
     return compare(booleanValue(), b.booleanValue());
-  };
+  }
 
   @Override
-  public native boolean equals(Object o) /*-{
-    return this === o;
-  }-*/;
+  public boolean equals(Object o) {
+    return checkNotNull(this) == o;
+  }
 
   @Override
   public int hashCode() {
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 2151657..7808fe9 100644
--- a/user/super/com/google/gwt/emul/java/lang/Double.java
+++ b/user/super/com/google/gwt/emul/java/lang/Double.java
@@ -15,6 +15,8 @@
  */
 package java.lang;
 
+import static javaemul.internal.InternalPreconditions.checkNotNull;
+
 import javaemul.internal.JsUtils;
 
 /**
@@ -304,14 +306,18 @@
   }
 
   @Override
-  public native double doubleValue() /*-{
-    return @javaemul.internal.InternalPreconditions::checkNotNull(Ljava/lang/Object;)(this);
+  public double doubleValue() {
+    return unsafeCast(checkNotNull(this));
+  }
+
+  private native double unsafeCast(Object instance) /*-{
+    return instance;
   }-*/;
 
   @Override
-  public native boolean equals(Object o) /*-{
-    return this === o;
-  }-*/;
+  public boolean equals(Object o) {
+    return checkNotNull(this) == o;
+  }
 
   @Override
   public float floatValue() {
diff --git a/user/super/com/google/gwt/emul/java/lang/String.java b/user/super/com/google/gwt/emul/java/lang/String.java
index 75cf4ab..6bf9e92 100644
--- a/user/super/com/google/gwt/emul/java/lang/String.java
+++ b/user/super/com/google/gwt/emul/java/lang/String.java
@@ -26,6 +26,7 @@
 import java.util.Locale;
 
 import javaemul.internal.ArrayHelper;
+import javaemul.internal.ArrayStamper;
 import javaemul.internal.EmulatedCharset;
 import javaemul.internal.HashCodes;
 import javaemul.internal.annotations.DoNotInline;
@@ -157,13 +158,6 @@
 
   // CHECKSTYLE_OFF: This class has special needs.
 
-  /**
-   * @skip
-   */
-  static String[] __createArray(int numElements) {
-    return new String[numElements];
-  }
-
   static native String __substr(String str, int beginIndex, int len) /*-{
     return str.substr(beginIndex, len);
   }-*/;
@@ -175,7 +169,7 @@
    *
    * @skip
    */
-  static String __translateReplaceString(String replaceStr) {
+  private static String translateReplaceString(String replaceStr) {
     int pos = 0;
     while (0 <= (pos = replaceStr.indexOf("\\", pos))) {
       if (replaceStr.charAt(pos + 1) == '$') {
@@ -188,8 +182,6 @@
     return replaceStr;
   }
 
- 
-
   // CHECKSTYLE_ON
 
   private static native int compareTo(String thisStr, String otherStr) /*-{
@@ -532,13 +524,19 @@
     return regionMatches(false, toffset, other, ooffset, len);
   }
 
-  public native String replace(char from, char to) /*-{
+  public String replace(char from, char to) {
     // Translate 'from' into unicode escape sequence (\\u and a four-digit hexadecimal number).
     // Escape sequence replacement is used instead of a string literal replacement
     // in order to escape regexp special characters (e.g. '.').
-    var hex = @java.lang.Integer::toHexString(I)(from);
-    var regex = "\\u" + "0000".substring(hex.length) + hex;
-    return this.replace(RegExp(regex, "g"), String.fromCharCode(to));
+    String hex = Integer.toHexString(from);
+    String regex = "\\u" + "0000".substring(hex.length()) + hex;
+    Object jsRegEx = createRegEx(regex, "g");
+    String replace = fromCharCode(to);
+    return replace(jsRegEx, replace);
+  }
+
+  private native String fromCharCode(char to) /*-{
+    return String.fromCharCode(to);
   }-*/;
 
   public String replace(CharSequence from, CharSequence to) {
@@ -565,10 +563,11 @@
    *
    * TODO(jat): properly handle Java regex syntax
    */
-  public native String replaceAll(String regex, String replace) /*-{
-    replace = @java.lang.String::__translateReplaceString(Ljava/lang/String;)(replace);
-    return this.replace(RegExp(regex, "g"), replace);
-  }-*/;
+  public String replaceAll(String regex, String replace) {
+    replace = translateReplaceString(replace);
+    Object jsRegEx = createRegEx(regex, "g");
+    return replace(jsRegEx, replace);
+  }
 
   /**
    * Regular expressions vary from the standard implementation. The
@@ -578,9 +577,18 @@
    *
    * TODO(jat): properly handle Java regex syntax
    */
-  public native String replaceFirst(String regex, String replace) /*-{
-    replace = @java.lang.String::__translateReplaceString(Ljava/lang/String;)(replace);
-    return this.replace(RegExp(regex), replace);
+  public String replaceFirst(String regex, String replace) {
+    replace = translateReplaceString(replace);
+    Object jsRegEx = createRegEx(regex, "");
+    return replace(jsRegEx, replace);
+  }
+
+  private native Object createRegEx(String regex, String mode) /*-{
+    return RegExp(regex, mode);
+  }-*/;
+
+  private native String replace(Object regex, String replace) /*-{
+    return this.replace(regex, replace);
   }-*/;
 
   /**
@@ -601,7 +609,13 @@
    *
    * TODO(jat): properly handle Java regex syntax
    */
-  public native String[] split(String regex, int maxMatch) /*-{
+  public String[] split(String regex, int maxMatch) {
+    String[] jsArrayString = split0(regex, maxMatch);
+    ArrayStamper.stampJavaTypeInfo(jsArrayString, new String[0]);
+    return jsArrayString;
+  }
+
+  public native String[] split0(String regex, int maxMatch) /*-{
     // The compiled regular expression created from the string
     var compiled = new RegExp(regex, "g");
     // the Javascipt array to hold the matches prior to conversion
@@ -648,11 +662,7 @@
         out.splice(lastNonEmpty, out.length - lastNonEmpty);
       }
     }
-    var jr = @java.lang.String::__createArray(I)(out.length);
-    for ( var i = 0; i < out.length; ++i) {
-      jr[i] = out[i];
-    }
-    return jr;
+    return out;
   }-*/;
 
   public boolean startsWith(String prefix) {