Use native regexp helper in all user emulated classes.

Change-Id: Ic4d20eecec33eb992ef010a1a55149e16b91b45a
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 e699e2c..36077fa 100644
--- a/user/super/com/google/gwt/emul/java/lang/Character.java
+++ b/user/super/com/google/gwt/emul/java/lang/Character.java
@@ -18,7 +18,8 @@
 import static javaemul.internal.InternalPreconditions.checkCriticalArgument;
 
 import java.io.Serializable;
-import java.lang.String.NativeRegExp;
+
+import javaemul.internal.NativeRegExp;
 
 /**
  * Wraps a native <code>char</code> as an object.
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 c1da463..d775032 100644
--- a/user/super/com/google/gwt/emul/java/lang/Number.java
+++ b/user/super/com/google/gwt/emul/java/lang/Number.java
@@ -18,6 +18,7 @@
 import java.io.Serializable;
 
 import javaemul.internal.JsUtils;
+import javaemul.internal.NativeRegExp;
 import jsinterop.annotations.JsMethod;
 
 /**
@@ -28,7 +29,7 @@
   /**
    * Stores a regular expression object to verify the format of float values.
    */
-  private static Object floatRegex;
+  private static NativeRegExp floatRegex;
 
   // CHECKSTYLE_OFF: A special need to use unusual identifiers to avoid
   // introducing name collisions.
@@ -341,17 +342,13 @@
     if (floatRegex == null) {
       floatRegex = createFloatRegex();
     }
-    return regexTest(floatRegex, str);
+    return floatRegex.test(str);
   }
 
-  private static native Object createFloatRegex() /*-{
+  private static native NativeRegExp createFloatRegex() /*-{
     return /^\s*[+-]?(NaN|Infinity|((\d+\.?\d*)|(\.\d+))([eE][+-]?\d+)?[dDfF]?)\s*$/;
   }-*/;
 
-  private static native boolean regexTest(Object regex, String value) /*-{
-    return regex.test(value);
-  }-*/;
-
   // CHECKSTYLE_ON
 
   public byte byteValue() {
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 c254a8a..d3c877e 100644
--- a/user/super/com/google/gwt/emul/java/lang/String.java
+++ b/user/super/com/google/gwt/emul/java/lang/String.java
@@ -29,6 +29,7 @@
 import javaemul.internal.EmulatedCharset;
 import javaemul.internal.HashCodes;
 import javaemul.internal.JsUtils;
+import javaemul.internal.NativeRegExp;
 import javaemul.internal.annotations.DoNotInline;
 import jsinterop.annotations.JsMethod;
 import jsinterop.annotations.JsPackage;
@@ -762,15 +763,6 @@
     public native String toUpperCase();
   }
 
-  @JsType(isNative = true, name = "RegExp", namespace = JsPackage.GLOBAL)
-  static class NativeRegExp {
-    public int lastIndex;
-    public NativeRegExp(String regex) { }
-    public NativeRegExp(String regex, String mode) { }
-    public native Object exec(String value);
-    public native boolean test(String value);
-  }
-
   // CHECKSTYLE_OFF: Utility Methods for unboxed String.
 
   @JsMethod(name = "$create")
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 a18d2f4..40098f3 100644
--- a/user/super/com/google/gwt/emul/java/math/BigDecimal.java
+++ b/user/super/com/google/gwt/emul/java/math/BigDecimal.java
@@ -39,6 +39,7 @@
 import java.io.Serializable;
 
 import javaemul.internal.JsUtils;
+import javaemul.internal.NativeRegExp;
 
 /**
  * This class represents immutable arbitrary precision decimal numbers. Each
@@ -138,7 +139,7 @@
   /**
    * Stores a regular expression object to verify the format of unscaled bigdecimal values.
    */
-  private static Object unscaledRegex;
+  private static NativeRegExp unscaledRegex;
 
   private static final int BI_SCALED_BY_ZERO_LENGTH = 11;
 
@@ -405,17 +406,13 @@
       unscaledRegex = createBigDecimalUnscaledRegex();
     }
 
-    return regexTest(unscaledRegex, str);
+    return unscaledRegex.test(str);
   }
 
-  private static native Object createBigDecimalUnscaledRegex() /*-{
+  private static native NativeRegExp createBigDecimalUnscaledRegex() /*-{
     return /^[+-]?\d*$/i;
   }-*/;
 
-  private static native boolean regexTest(Object regex, String value) /*-{
-    return regex.test(value);
-  }-*/;
-
   private static double parseUnscaled(String str) {
     return isValidBigUnscaledDecimal(str) ? JsUtils.parseInt(str, 10) : Double.NaN;
   }
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 fec0b4d..468e6fe 100644
--- a/user/super/com/google/gwt/emul/java/math/MathContext.java
+++ b/user/super/com/google/gwt/emul/java/math/MathContext.java
@@ -39,6 +39,8 @@
 
 import java.io.Serializable;
 
+import javaemul.internal.NativeRegExp;
+
 /**
  * Immutable objects describing settings such as rounding mode and digit
  * precision for the numerical operations provided by class {@link BigDecimal}.
@@ -140,15 +142,15 @@
   public MathContext(String val) {
     checkNotNull(val, "null string");
 
-    String[] extractedValues = parseValue(val);
+    Object[] extractedValues = (Object[]) createParseRegexp().exec(val);
     if (extractedValues == null || extractedValues.length != 3) {
       throw new IllegalArgumentException("bad string format");
     }
 
     try {
-      this.precision = Integer.parseInt(extractedValues[1]);
+      this.precision = Integer.parseInt((String) extractedValues[1]);
       // Can use RoundingMode.valueOf here because it is blacklisted in enum obfuscation.
-      this.roundingMode = RoundingMode.valueOf(extractedValues[2]);
+      this.roundingMode = RoundingMode.valueOf((String) extractedValues[2]);
     } catch (RuntimeException re) {
       // Ensure that we only throw IllegalArgumentException for any illegal value.
       throw new IllegalArgumentException("bad string format");
@@ -157,8 +159,8 @@
     checkCriticalArgument(this.precision >= 0, "Digits < 0");
   }
 
-  private static native String[] parseValue(String val) /*-{
-    return /^precision=(\d+)\ roundingMode=(\w+)$/.exec(val);
+  private static native NativeRegExp createParseRegexp() /*-{
+    return /^precision=(\d+)\ roundingMode=(\w+)$/;
   }-*/;
 
   /* Public Methods */
diff --git a/user/super/com/google/gwt/emul/java/nio/charset/Charset.java b/user/super/com/google/gwt/emul/java/nio/charset/Charset.java
index b332dfb..1c70857 100644
--- a/user/super/com/google/gwt/emul/java/nio/charset/Charset.java
+++ b/user/super/com/google/gwt/emul/java/nio/charset/Charset.java
@@ -23,6 +23,7 @@
 import java.util.TreeMap;
 
 import javaemul.internal.EmulatedCharset;
+import javaemul.internal.NativeRegExp;
 
 /**
  * A minimal emulation of {@link Charset}.
@@ -56,15 +57,15 @@
       return EmulatedCharset.UTF_8;
     }
 
-    if (!isLegalCharsetName(charsetName)) {
+    if (!createLegalCharsetNameRegex().test(charsetName)) {
       throw new IllegalCharsetNameException(charsetName);
     } else {
       throw new UnsupportedCharsetException(charsetName);
     }
   }
 
-  private static native boolean isLegalCharsetName(String name) /*-{
-    return /^[A-Za-z0-9][\w-:\.\+]*$/.test(name);
+  private static native NativeRegExp createLegalCharsetNameRegex() /*-{
+    return /^[A-Za-z0-9][\w-:\.\+]*$/;
   }-*/;
 
   private final String name;
diff --git a/user/super/com/google/gwt/emul/javaemul/internal/NativeRegExp.java b/user/super/com/google/gwt/emul/javaemul/internal/NativeRegExp.java
new file mode 100644
index 0000000..e536763
--- /dev/null
+++ b/user/super/com/google/gwt/emul/javaemul/internal/NativeRegExp.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2016 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package javaemul.internal;
+
+import jsinterop.annotations.JsPackage;
+import jsinterop.annotations.JsType;
+
+/**
+ * Simple class to work with native js regular expressions.
+ */
+@JsType(isNative = true, name = "RegExp", namespace = JsPackage.GLOBAL)
+public class NativeRegExp {
+  public int lastIndex;
+  public NativeRegExp(String regex) { }
+  public NativeRegExp(String regex, String mode) { }
+  public native Object exec(String value);
+  public native boolean test(String value);
+}