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);