8023531: new RegExp('').toString() should return '/(?:)/'
authorhannesw
Thu, 22 Aug 2013 17:23:50 +0200
changeset 19621 1b2a79d8924c
parent 19620 3f0c79b63846
child 19622 b042dad0de96
8023531: new RegExp('').toString() should return '/(?:)/' Reviewed-by: sundar, jlaskey
nashorn/src/jdk/nashorn/internal/runtime/ScriptObject.java
nashorn/src/jdk/nashorn/internal/runtime/WithObject.java
nashorn/src/jdk/nashorn/internal/runtime/regexp/RegExp.java
nashorn/test/script/basic/JDK-8023531.js
--- a/nashorn/src/jdk/nashorn/internal/runtime/ScriptObject.java	Thu Aug 22 18:46:26 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/runtime/ScriptObject.java	Thu Aug 22 17:23:50 2013 +0200
@@ -1008,10 +1008,6 @@
         return getMap().findProperty(key);
     }
 
-    static String convertKey(final Object key) {
-        return (key instanceof String) ? (String)key : JSType.toString(key);
-    }
-
     /**
      * Overridden by {@link jdk.nashorn.internal.objects.NativeArguments} class (internal use.)
      * Used for argument access in a vararg function using parameter name.
@@ -2374,7 +2370,7 @@
             return array.getInt(index);
         }
 
-        return getInt(index, convertKey(key));
+        return getInt(index, JSType.toString(key));
     }
 
     @Override
@@ -2386,7 +2382,7 @@
             return array.getInt(index);
         }
 
-        return getInt(index, convertKey(key));
+        return getInt(index, JSType.toString(key));
     }
 
     @Override
@@ -2398,7 +2394,7 @@
             return array.getInt(index);
         }
 
-        return getInt(index, convertKey(key));
+        return getInt(index, JSType.toString(key));
     }
 
     @Override
@@ -2409,7 +2405,7 @@
             return array.getInt(key);
         }
 
-        return getInt(key, convertKey(key));
+        return getInt(key, JSType.toString(key));
     }
 
     private long getLong(final int index, final String key) {
@@ -2451,7 +2447,7 @@
             return array.getLong(index);
         }
 
-        return getLong(index, convertKey(key));
+        return getLong(index, JSType.toString(key));
     }
 
     @Override
@@ -2463,7 +2459,7 @@
             return array.getLong(index);
         }
 
-        return getLong(index, convertKey(key));
+        return getLong(index, JSType.toString(key));
     }
 
     @Override
@@ -2475,7 +2471,7 @@
             return array.getLong(index);
         }
 
-        return getLong(index, convertKey(key));
+        return getLong(index, JSType.toString(key));
     }
 
     @Override
@@ -2486,7 +2482,7 @@
             return array.getLong(key);
         }
 
-        return getLong(key, convertKey(key));
+        return getLong(key, JSType.toString(key));
     }
 
     private double getDouble(final int index, final String key) {
@@ -2528,7 +2524,7 @@
             return array.getDouble(index);
         }
 
-        return getDouble(index, convertKey(key));
+        return getDouble(index, JSType.toString(key));
     }
 
     @Override
@@ -2540,7 +2536,7 @@
             return array.getDouble(index);
         }
 
-        return getDouble(index, convertKey(key));
+        return getDouble(index, JSType.toString(key));
     }
 
     @Override
@@ -2552,7 +2548,7 @@
             return array.getDouble(index);
         }
 
-        return getDouble(index, convertKey(key));
+        return getDouble(index, JSType.toString(key));
     }
 
     @Override
@@ -2563,7 +2559,7 @@
             return array.getDouble(key);
         }
 
-        return getDouble(key, convertKey(key));
+        return getDouble(key, JSType.toString(key));
     }
 
     private Object get(final int index, final String key) {
@@ -2605,7 +2601,7 @@
             return array.getObject(index);
         }
 
-        return get(index, convertKey(key));
+        return get(index, JSType.toString(key));
     }
 
     @Override
@@ -2617,7 +2613,7 @@
             return array.getObject(index);
         }
 
-        return get(index, convertKey(key));
+        return get(index, JSType.toString(key));
     }
 
     @Override
@@ -2629,7 +2625,7 @@
             return array.getObject(index);
         }
 
-        return get(index, convertKey(key));
+        return get(index, JSType.toString(key));
     }
 
     @Override
@@ -2640,7 +2636,7 @@
             return array.getObject(key);
         }
 
-        return get(key, convertKey(key));
+        return get(key, JSType.toString(key));
     }
 
     /**
@@ -2655,7 +2651,7 @@
         final long longIndex = index & JSType.MAX_UINT;
 
         if (!getArray().has(index)) {
-            final String key = convertKey(longIndex);
+            final String key = JSType.toString(longIndex);
             final FindProperty find = findProperty(key, true);
 
             if (find != null) {
@@ -2801,7 +2797,7 @@
             return;
         }
 
-        final String       propName = convertKey(key);
+        final String       propName = JSType.toString(key);
         final FindProperty find     = findProperty(propName, true);
 
         setObject(find, strict, propName, value);
@@ -3023,7 +3019,7 @@
             }
         }
 
-        final FindProperty find = findProperty(convertKey(key), true);
+        final FindProperty find = findProperty(JSType.toString(key), true);
 
         return find != null;
     }
@@ -3040,7 +3036,7 @@
             }
         }
 
-        final FindProperty find = findProperty(convertKey(key), true);
+        final FindProperty find = findProperty(JSType.toString(key), true);
 
         return find != null;
     }
@@ -3057,7 +3053,7 @@
             }
         }
 
-        final FindProperty find = findProperty(convertKey(key), true);
+        final FindProperty find = findProperty(JSType.toString(key), true);
 
         return find != null;
     }
@@ -3074,7 +3070,7 @@
             }
         }
 
-        final FindProperty find = findProperty(convertKey(key), true);
+        final FindProperty find = findProperty(JSType.toString(key), true);
 
         return find != null;
     }
@@ -3087,7 +3083,7 @@
             return true;
         }
 
-        final FindProperty find = findProperty(convertKey(key), false);
+        final FindProperty find = findProperty(JSType.toString(key), false);
 
         return find != null;
     }
@@ -3100,7 +3096,7 @@
             return true;
         }
 
-        final FindProperty find = findProperty(convertKey(key), false);
+        final FindProperty find = findProperty(JSType.toString(key), false);
 
         return find != null;
     }
@@ -3113,7 +3109,7 @@
             return true;
         }
 
-        final FindProperty find = findProperty(convertKey(key), false);
+        final FindProperty find = findProperty(JSType.toString(key), false);
 
         return find != null;
     }
@@ -3126,7 +3122,7 @@
             return true;
         }
 
-        final FindProperty find = findProperty(convertKey(key), false);
+        final FindProperty find = findProperty(JSType.toString(key), false);
 
         return find != null;
     }
@@ -3196,7 +3192,7 @@
     }
 
     private boolean deleteObject(final Object key, final boolean strict) {
-        final String propName = convertKey(key);
+        final String propName = JSType.toString(key);
         final FindProperty find = findProperty(propName, false);
 
         if (find == null) {
--- a/nashorn/src/jdk/nashorn/internal/runtime/WithObject.java	Thu Aug 22 18:46:26 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/runtime/WithObject.java	Thu Aug 22 17:23:50 2013 +0200
@@ -73,7 +73,7 @@
     public boolean delete(final Object key, final boolean strict) {
         if (expression instanceof ScriptObject) {
             final ScriptObject self = (ScriptObject)expression;
-            final String propName = ScriptObject.convertKey(key);
+            final String propName = JSType.toString(key);
 
             final FindProperty find = self.findProperty(propName, true);
 
--- a/nashorn/src/jdk/nashorn/internal/runtime/regexp/RegExp.java	Thu Aug 22 18:46:26 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/runtime/regexp/RegExp.java	Thu Aug 22 17:23:50 2013 +0200
@@ -60,7 +60,7 @@
      * @param flags the flags string
      */
     protected RegExp(final String source, final String flags) {
-        this.source = source;
+        this.source = source.length() == 0 ? "(?:)" : source;
         for (int i = 0; i < flags.length(); i++) {
             final char ch = flags.charAt(i);
             switch (ch) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8023531.js	Thu Aug 22 17:23:50 2013 +0200
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8023531: new RegExp('').toString() should return '/(?:)/'
+ *
+ * @test
+ * @run
+ */
+
+if (new RegExp("").toString() !== "/(?:)/") {
+    throw new Error();
+} else if (!(new RegExp("").test(""))) {
+    throw new Error();
+}
+
+if (new RegExp("", "g").toString() !== "/(?:)/g") {
+    throw new Error();
+} else if (!(new RegExp("", "g").test(""))) {
+    throw new Error();
+}
+
+if (new RegExp("", "i").toString() !== "/(?:)/i") {
+    throw new Error();
+} else if (!(new RegExp("", "i").test(""))) {
+    throw new Error();
+}
+
+if (new RegExp("", "m").toString() !== "/(?:)/m") {
+    throw new Error();
+} else if (!(new RegExp("", "m").test(""))) {
+    throw new Error();
+}
+
+if (RegExp("").toString() !== "/(?:)/") {
+    throw new Error();
+} else if (!RegExp("").test("")) {
+    throw new Error();
+}
+
+if (RegExp("", "g").toString() !== "/(?:)/g") {
+    throw new Error();
+} else if (!RegExp("", "g").test("")) {
+    throw new Error();
+}
+
+if (RegExp("", "i").toString() !== "/(?:)/i") {
+    throw new Error();
+} else if (!RegExp("", "i").test("")) {
+    throw new Error();
+}
+
+if (RegExp("", "m").toString() !== "/(?:)/m") {
+    throw new Error();
+} else if (!RegExp("", "m").test("")) {
+    throw new Error();
+}
+
+var re = /abc/;
+re.compile("");
+if (re.toString() !== "/(?:)/") {
+    throw new Error();
+} else if (!re.test("")) {
+    throw new Error();
+}
+
+re.compile("", "g");
+if (re.toString() !== "/(?:)/g") {
+    throw new Error();
+} else if (!re.test("")) {
+    throw new Error();
+}
+
+re.compile("", "i");
+if (re.toString() !== "/(?:)/i") {
+    throw new Error();
+} else if (!re.test("")) {
+    throw new Error();
+}
+
+re.compile("", "m");
+if (re.toString() !== "/(?:)/m") {
+    throw new Error();
+} else if (!re.test("")) {
+    throw new Error();
+}