Avoid interning JS regexps.

JavaScript regexes are stateful, methods like RegExp.test(...) keep
track of the current match status in the regexp.

Bug: issue 8865.
Change-Id: I66ca84ad4363a8aa8f4c122d3e8e54b6f02bca49
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsRegExp.java b/dev/core/src/com/google/gwt/dev/js/ast/JsRegExp.java
index 89d3fcf..5a5be32 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsRegExp.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsRegExp.java
@@ -81,7 +81,9 @@
 
   @Override
   public boolean isInternable() {
-    return true;
+    // JavaScript regexes are stateful, methods like RegExp.test(...) keep track of
+    // the current match status in the regexp.
+    return false;
   }
 
   public void setFlags(String suffix) {
diff --git a/dev/core/test/com/google/gwt/dev/js/JsLiteralInternerTest.java b/dev/core/test/com/google/gwt/dev/js/JsLiteralInternerTest.java
index 49da0a8..c6e631e 100644
--- a/dev/core/test/com/google/gwt/dev/js/JsLiteralInternerTest.java
+++ b/dev/core/test/com/google/gwt/dev/js/JsLiteralInternerTest.java
@@ -82,11 +82,10 @@
         String.format("var $intern_0=%1$s;var x=$intern_0,y=$intern_0+%2$s,z=%3$s;", AS_STRING,
             BS_STRING, CS_STRING));
 
-    // Regexes
+    // Regexes are not internalizable.
     checkTranslation(
         String.format("var x = %1$s, y = %1$s + %2$s, z = %3$s;", AS_REGEX, BS_REGEX, CS_REGEX),
-        String.format("var $intern_0=%1$s;var x=$intern_0,y=$intern_0+%2$s,z=%3$s;", AS_REGEX,
-            BS_REGEX, CS_REGEX));
+        String.format("var x=%1$s,y=%1$s+%2$s,z=%3$s;", AS_REGEX, BS_REGEX, CS_REGEX));
 
     // Arrays
     checkTranslation(
diff --git a/user/test/com/google/gwt/dev/jjs/test/CompilerMiscRegressionTest.java b/user/test/com/google/gwt/dev/jjs/test/CompilerMiscRegressionTest.java
index 35a4c42..ec62c9a 100644
--- a/user/test/com/google/gwt/dev/jjs/test/CompilerMiscRegressionTest.java
+++ b/user/test/com/google/gwt/dev/jjs/test/CompilerMiscRegressionTest.java
@@ -239,6 +239,20 @@
     assertEquals(2, MyEnum.B.getPriority());
   }
 
+  /**
+   * Tests that regexes are not incorrectly internalized.
+   *
+   * Test for issue 8865.
+   */
+  public native void testJavaScriptRegExps() /*-{
+    // Make regexes large enough so that the will be interned (if regex interning was enabled).
+    var regExp1 = /this is a string where the search/g;
+    var regExp2 = /this is a string where the search/g;
+    var str = "this is a string where the search occurs";
+    @junit.framework.Assert::assertEquals(ZZ)(
+       regExp1.test(str), regExp2.test(str));
+  }-*/;
+
   private static void assertEqualContents(float[] expected, float[] actual) {
 
     assertEquals("Array length mismatch", expected.length, actual.length);