Thu, 22 Aug 2013 17:23:50 +0200
8023531: new RegExp('').toString() should return '/(?:)/'
Reviewed-by: sundar, jlaskey
1.1 --- a/src/jdk/nashorn/internal/runtime/ScriptObject.java Thu Aug 22 18:46:26 2013 +0530 1.2 +++ b/src/jdk/nashorn/internal/runtime/ScriptObject.java Thu Aug 22 17:23:50 2013 +0200 1.3 @@ -1008,10 +1008,6 @@ 1.4 return getMap().findProperty(key); 1.5 } 1.6 1.7 - static String convertKey(final Object key) { 1.8 - return (key instanceof String) ? (String)key : JSType.toString(key); 1.9 - } 1.10 - 1.11 /** 1.12 * Overridden by {@link jdk.nashorn.internal.objects.NativeArguments} class (internal use.) 1.13 * Used for argument access in a vararg function using parameter name. 1.14 @@ -2374,7 +2370,7 @@ 1.15 return array.getInt(index); 1.16 } 1.17 1.18 - return getInt(index, convertKey(key)); 1.19 + return getInt(index, JSType.toString(key)); 1.20 } 1.21 1.22 @Override 1.23 @@ -2386,7 +2382,7 @@ 1.24 return array.getInt(index); 1.25 } 1.26 1.27 - return getInt(index, convertKey(key)); 1.28 + return getInt(index, JSType.toString(key)); 1.29 } 1.30 1.31 @Override 1.32 @@ -2398,7 +2394,7 @@ 1.33 return array.getInt(index); 1.34 } 1.35 1.36 - return getInt(index, convertKey(key)); 1.37 + return getInt(index, JSType.toString(key)); 1.38 } 1.39 1.40 @Override 1.41 @@ -2409,7 +2405,7 @@ 1.42 return array.getInt(key); 1.43 } 1.44 1.45 - return getInt(key, convertKey(key)); 1.46 + return getInt(key, JSType.toString(key)); 1.47 } 1.48 1.49 private long getLong(final int index, final String key) { 1.50 @@ -2451,7 +2447,7 @@ 1.51 return array.getLong(index); 1.52 } 1.53 1.54 - return getLong(index, convertKey(key)); 1.55 + return getLong(index, JSType.toString(key)); 1.56 } 1.57 1.58 @Override 1.59 @@ -2463,7 +2459,7 @@ 1.60 return array.getLong(index); 1.61 } 1.62 1.63 - return getLong(index, convertKey(key)); 1.64 + return getLong(index, JSType.toString(key)); 1.65 } 1.66 1.67 @Override 1.68 @@ -2475,7 +2471,7 @@ 1.69 return array.getLong(index); 1.70 } 1.71 1.72 - return getLong(index, convertKey(key)); 1.73 + return getLong(index, JSType.toString(key)); 1.74 } 1.75 1.76 @Override 1.77 @@ -2486,7 +2482,7 @@ 1.78 return array.getLong(key); 1.79 } 1.80 1.81 - return getLong(key, convertKey(key)); 1.82 + return getLong(key, JSType.toString(key)); 1.83 } 1.84 1.85 private double getDouble(final int index, final String key) { 1.86 @@ -2528,7 +2524,7 @@ 1.87 return array.getDouble(index); 1.88 } 1.89 1.90 - return getDouble(index, convertKey(key)); 1.91 + return getDouble(index, JSType.toString(key)); 1.92 } 1.93 1.94 @Override 1.95 @@ -2540,7 +2536,7 @@ 1.96 return array.getDouble(index); 1.97 } 1.98 1.99 - return getDouble(index, convertKey(key)); 1.100 + return getDouble(index, JSType.toString(key)); 1.101 } 1.102 1.103 @Override 1.104 @@ -2552,7 +2548,7 @@ 1.105 return array.getDouble(index); 1.106 } 1.107 1.108 - return getDouble(index, convertKey(key)); 1.109 + return getDouble(index, JSType.toString(key)); 1.110 } 1.111 1.112 @Override 1.113 @@ -2563,7 +2559,7 @@ 1.114 return array.getDouble(key); 1.115 } 1.116 1.117 - return getDouble(key, convertKey(key)); 1.118 + return getDouble(key, JSType.toString(key)); 1.119 } 1.120 1.121 private Object get(final int index, final String key) { 1.122 @@ -2605,7 +2601,7 @@ 1.123 return array.getObject(index); 1.124 } 1.125 1.126 - return get(index, convertKey(key)); 1.127 + return get(index, JSType.toString(key)); 1.128 } 1.129 1.130 @Override 1.131 @@ -2617,7 +2613,7 @@ 1.132 return array.getObject(index); 1.133 } 1.134 1.135 - return get(index, convertKey(key)); 1.136 + return get(index, JSType.toString(key)); 1.137 } 1.138 1.139 @Override 1.140 @@ -2629,7 +2625,7 @@ 1.141 return array.getObject(index); 1.142 } 1.143 1.144 - return get(index, convertKey(key)); 1.145 + return get(index, JSType.toString(key)); 1.146 } 1.147 1.148 @Override 1.149 @@ -2640,7 +2636,7 @@ 1.150 return array.getObject(key); 1.151 } 1.152 1.153 - return get(key, convertKey(key)); 1.154 + return get(key, JSType.toString(key)); 1.155 } 1.156 1.157 /** 1.158 @@ -2655,7 +2651,7 @@ 1.159 final long longIndex = index & JSType.MAX_UINT; 1.160 1.161 if (!getArray().has(index)) { 1.162 - final String key = convertKey(longIndex); 1.163 + final String key = JSType.toString(longIndex); 1.164 final FindProperty find = findProperty(key, true); 1.165 1.166 if (find != null) { 1.167 @@ -2801,7 +2797,7 @@ 1.168 return; 1.169 } 1.170 1.171 - final String propName = convertKey(key); 1.172 + final String propName = JSType.toString(key); 1.173 final FindProperty find = findProperty(propName, true); 1.174 1.175 setObject(find, strict, propName, value); 1.176 @@ -3023,7 +3019,7 @@ 1.177 } 1.178 } 1.179 1.180 - final FindProperty find = findProperty(convertKey(key), true); 1.181 + final FindProperty find = findProperty(JSType.toString(key), true); 1.182 1.183 return find != null; 1.184 } 1.185 @@ -3040,7 +3036,7 @@ 1.186 } 1.187 } 1.188 1.189 - final FindProperty find = findProperty(convertKey(key), true); 1.190 + final FindProperty find = findProperty(JSType.toString(key), true); 1.191 1.192 return find != null; 1.193 } 1.194 @@ -3057,7 +3053,7 @@ 1.195 } 1.196 } 1.197 1.198 - final FindProperty find = findProperty(convertKey(key), true); 1.199 + final FindProperty find = findProperty(JSType.toString(key), true); 1.200 1.201 return find != null; 1.202 } 1.203 @@ -3074,7 +3070,7 @@ 1.204 } 1.205 } 1.206 1.207 - final FindProperty find = findProperty(convertKey(key), true); 1.208 + final FindProperty find = findProperty(JSType.toString(key), true); 1.209 1.210 return find != null; 1.211 } 1.212 @@ -3087,7 +3083,7 @@ 1.213 return true; 1.214 } 1.215 1.216 - final FindProperty find = findProperty(convertKey(key), false); 1.217 + final FindProperty find = findProperty(JSType.toString(key), false); 1.218 1.219 return find != null; 1.220 } 1.221 @@ -3100,7 +3096,7 @@ 1.222 return true; 1.223 } 1.224 1.225 - final FindProperty find = findProperty(convertKey(key), false); 1.226 + final FindProperty find = findProperty(JSType.toString(key), false); 1.227 1.228 return find != null; 1.229 } 1.230 @@ -3113,7 +3109,7 @@ 1.231 return true; 1.232 } 1.233 1.234 - final FindProperty find = findProperty(convertKey(key), false); 1.235 + final FindProperty find = findProperty(JSType.toString(key), false); 1.236 1.237 return find != null; 1.238 } 1.239 @@ -3126,7 +3122,7 @@ 1.240 return true; 1.241 } 1.242 1.243 - final FindProperty find = findProperty(convertKey(key), false); 1.244 + final FindProperty find = findProperty(JSType.toString(key), false); 1.245 1.246 return find != null; 1.247 } 1.248 @@ -3196,7 +3192,7 @@ 1.249 } 1.250 1.251 private boolean deleteObject(final Object key, final boolean strict) { 1.252 - final String propName = convertKey(key); 1.253 + final String propName = JSType.toString(key); 1.254 final FindProperty find = findProperty(propName, false); 1.255 1.256 if (find == null) {
2.1 --- a/src/jdk/nashorn/internal/runtime/WithObject.java Thu Aug 22 18:46:26 2013 +0530 2.2 +++ b/src/jdk/nashorn/internal/runtime/WithObject.java Thu Aug 22 17:23:50 2013 +0200 2.3 @@ -73,7 +73,7 @@ 2.4 public boolean delete(final Object key, final boolean strict) { 2.5 if (expression instanceof ScriptObject) { 2.6 final ScriptObject self = (ScriptObject)expression; 2.7 - final String propName = ScriptObject.convertKey(key); 2.8 + final String propName = JSType.toString(key); 2.9 2.10 final FindProperty find = self.findProperty(propName, true); 2.11
3.1 --- a/src/jdk/nashorn/internal/runtime/regexp/RegExp.java Thu Aug 22 18:46:26 2013 +0530 3.2 +++ b/src/jdk/nashorn/internal/runtime/regexp/RegExp.java Thu Aug 22 17:23:50 2013 +0200 3.3 @@ -60,7 +60,7 @@ 3.4 * @param flags the flags string 3.5 */ 3.6 protected RegExp(final String source, final String flags) { 3.7 - this.source = source; 3.8 + this.source = source.length() == 0 ? "(?:)" : source; 3.9 for (int i = 0; i < flags.length(); i++) { 3.10 final char ch = flags.charAt(i); 3.11 switch (ch) {
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 4.2 +++ b/test/script/basic/JDK-8023531.js Thu Aug 22 17:23:50 2013 +0200 4.3 @@ -0,0 +1,106 @@ 4.4 +/* 4.5 + * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. 4.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4.7 + * 4.8 + * This code is free software; you can redistribute it and/or modify it 4.9 + * under the terms of the GNU General Public License version 2 only, as 4.10 + * published by the Free Software Foundation. 4.11 + * 4.12 + * This code is distributed in the hope that it will be useful, but WITHOUT 4.13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 4.14 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 4.15 + * version 2 for more details (a copy is included in the LICENSE file that 4.16 + * accompanied this code). 4.17 + * 4.18 + * You should have received a copy of the GNU General Public License version 4.19 + * 2 along with this work; if not, write to the Free Software Foundation, 4.20 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 4.21 + * 4.22 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 4.23 + * or visit www.oracle.com if you need additional information or have any 4.24 + * questions. 4.25 + */ 4.26 + 4.27 +/** 4.28 + * JDK-8023531: new RegExp('').toString() should return '/(?:)/' 4.29 + * 4.30 + * @test 4.31 + * @run 4.32 + */ 4.33 + 4.34 +if (new RegExp("").toString() !== "/(?:)/") { 4.35 + throw new Error(); 4.36 +} else if (!(new RegExp("").test(""))) { 4.37 + throw new Error(); 4.38 +} 4.39 + 4.40 +if (new RegExp("", "g").toString() !== "/(?:)/g") { 4.41 + throw new Error(); 4.42 +} else if (!(new RegExp("", "g").test(""))) { 4.43 + throw new Error(); 4.44 +} 4.45 + 4.46 +if (new RegExp("", "i").toString() !== "/(?:)/i") { 4.47 + throw new Error(); 4.48 +} else if (!(new RegExp("", "i").test(""))) { 4.49 + throw new Error(); 4.50 +} 4.51 + 4.52 +if (new RegExp("", "m").toString() !== "/(?:)/m") { 4.53 + throw new Error(); 4.54 +} else if (!(new RegExp("", "m").test(""))) { 4.55 + throw new Error(); 4.56 +} 4.57 + 4.58 +if (RegExp("").toString() !== "/(?:)/") { 4.59 + throw new Error(); 4.60 +} else if (!RegExp("").test("")) { 4.61 + throw new Error(); 4.62 +} 4.63 + 4.64 +if (RegExp("", "g").toString() !== "/(?:)/g") { 4.65 + throw new Error(); 4.66 +} else if (!RegExp("", "g").test("")) { 4.67 + throw new Error(); 4.68 +} 4.69 + 4.70 +if (RegExp("", "i").toString() !== "/(?:)/i") { 4.71 + throw new Error(); 4.72 +} else if (!RegExp("", "i").test("")) { 4.73 + throw new Error(); 4.74 +} 4.75 + 4.76 +if (RegExp("", "m").toString() !== "/(?:)/m") { 4.77 + throw new Error(); 4.78 +} else if (!RegExp("", "m").test("")) { 4.79 + throw new Error(); 4.80 +} 4.81 + 4.82 +var re = /abc/; 4.83 +re.compile(""); 4.84 +if (re.toString() !== "/(?:)/") { 4.85 + throw new Error(); 4.86 +} else if (!re.test("")) { 4.87 + throw new Error(); 4.88 +} 4.89 + 4.90 +re.compile("", "g"); 4.91 +if (re.toString() !== "/(?:)/g") { 4.92 + throw new Error(); 4.93 +} else if (!re.test("")) { 4.94 + throw new Error(); 4.95 +} 4.96 + 4.97 +re.compile("", "i"); 4.98 +if (re.toString() !== "/(?:)/i") { 4.99 + throw new Error(); 4.100 +} else if (!re.test("")) { 4.101 + throw new Error(); 4.102 +} 4.103 + 4.104 +re.compile("", "m"); 4.105 +if (re.toString() !== "/(?:)/m") { 4.106 + throw new Error(); 4.107 +} else if (!re.test("")) { 4.108 + throw new Error(); 4.109 +}