Reduce JSNI on String and MathContext

Change-Id: If79a6884ffa5236ab9f1b6f6a3b2ece9668f8b81
Review-Link: https://gwt-review.googlesource.com/#/c/18300/
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 7db2125..4c927f1 100644
--- a/user/super/com/google/gwt/emul/java/lang/String.java
+++ b/user/super/com/google/gwt/emul/java/lang/String.java
@@ -349,13 +349,9 @@
   }
 
   private NativeString asNativeString() {
-    return toNative(this);
+    return JsUtils.uncheckedCast(this);
   }
 
-  private static native NativeString toNative(String str) /*-{
-    return str;
-  }-*/;
-
   @Override
   public char charAt(int index) {
     return asNativeString().charCodeAt(index);
@@ -592,13 +588,9 @@
     return asNativeString().replace(jsRegEx, replace);
   }
 
-  private static native int getMatchIndex(Object matchObject) /*-{
-    return matchObject.index;
-  }-*/;
-
-  private static native int getMatchLength(Object matchObject, int index) /*-{
-    return matchObject[index].length;
-  }-*/;
+  private static int getMatchIndex(String[] matchObject) {
+    return JsUtils.getIntProperty(matchObject, "index");
+  }
 
   /**
    * Regular expressions vary from the standard implementation. The
@@ -635,14 +627,14 @@
     while (true) {
       // None of the information in the match returned are useful as we have no
       // subgroup handling
-      Object matchObj = compiled.exec(trail);
+      String[] matchObj = compiled.exec(trail);
       if (matchObj == null || trail == "" || (count == (maxMatch - 1) && maxMatch > 0)) {
         out[count] = trail;
         break;
       } else {
         out[count] = trail.substring(0, getMatchIndex(matchObj));
-        trail = trail.substring(
-            getMatchIndex(matchObj) + getMatchLength(matchObj, 0), trail.length());
+        trail =
+            trail.substring(getMatchIndex(matchObj) + matchObj[0].length(), trail.length());
         // Force the compiled pattern to reset internal state
         compiled.lastIndex = 0;
         // Only one zero length match per character to ensure termination
diff --git a/user/super/com/google/gwt/emul/java/math/MathContext.java b/user/super/com/google/gwt/emul/java/math/MathContext.java
index 468e6fe..0f5d2a2 100644
--- a/user/super/com/google/gwt/emul/java/math/MathContext.java
+++ b/user/super/com/google/gwt/emul/java/math/MathContext.java
@@ -142,15 +142,15 @@
   public MathContext(String val) {
     checkNotNull(val, "null string");
 
-    Object[] extractedValues = (Object[]) createParseRegexp().exec(val);
+    String[] extractedValues = createParseRegexp().exec(val);
     if (extractedValues == null || extractedValues.length != 3) {
       throw new IllegalArgumentException("bad string format");
     }
 
     try {
-      this.precision = Integer.parseInt((String) extractedValues[1]);
+      this.precision = Integer.parseInt(extractedValues[1]);
       // Can use RoundingMode.valueOf here because it is blacklisted in enum obfuscation.
-      this.roundingMode = RoundingMode.valueOf((String) extractedValues[2]);
+      this.roundingMode = RoundingMode.valueOf(extractedValues[2]);
     } catch (RuntimeException re) {
       // Ensure that we only throw IllegalArgumentException for any illegal value.
       throw new IllegalArgumentException("bad string format");
diff --git a/user/super/com/google/gwt/emul/javaemul/internal/NativeRegExp.java b/user/super/com/google/gwt/emul/javaemul/internal/NativeRegExp.java
index 6f7ca76..0d3457c 100644
--- a/user/super/com/google/gwt/emul/javaemul/internal/NativeRegExp.java
+++ b/user/super/com/google/gwt/emul/javaemul/internal/NativeRegExp.java
@@ -25,6 +25,6 @@
   public int lastIndex;
   public NativeRegExp(String regex) { }
   public NativeRegExp(String regex, String mode) { }
-  public native Object exec(String value);
+  public native String[] exec(String value);
   public native boolean test(String value);
 }