Mon, 02 Mar 2015 14:33:55 +0100
8074031: Canonicalize is-a-JS-string tests
Reviewed-by: hannesw, lagergren
1.1 --- a/src/jdk/nashorn/internal/lookup/MethodHandleFactory.java Fri Feb 20 15:47:28 2015 +0100 1.2 +++ b/src/jdk/nashorn/internal/lookup/MethodHandleFactory.java Mon Mar 02 14:33:55 2015 +0100 1.3 @@ -25,6 +25,8 @@ 1.4 1.5 package jdk.nashorn.internal.lookup; 1.6 1.7 +import static jdk.nashorn.internal.runtime.JSType.isString; 1.8 + 1.9 import java.io.ByteArrayOutputStream; 1.10 import java.io.PrintStream; 1.11 import java.lang.invoke.MethodHandle; 1.12 @@ -36,7 +38,6 @@ 1.13 import java.util.Arrays; 1.14 import java.util.List; 1.15 import java.util.logging.Level; 1.16 -import jdk.nashorn.internal.runtime.ConsString; 1.17 import jdk.nashorn.internal.runtime.Context; 1.18 import jdk.nashorn.internal.runtime.Debug; 1.19 import jdk.nashorn.internal.runtime.ScriptObject; 1.20 @@ -343,7 +344,7 @@ 1.21 final Object d = data[i]; 1.22 if (d == null) { 1.23 sb.append("<null> "); 1.24 - } else if (d instanceof String || d instanceof ConsString) { 1.25 + } else if (isString(d)) { 1.26 sb.append(d.toString()); 1.27 sb.append(' '); 1.28 } else if (d.getClass().isArray()) {
2.1 --- a/src/jdk/nashorn/internal/objects/Global.java Fri Feb 20 15:47:28 2015 +0100 2.2 +++ b/src/jdk/nashorn/internal/objects/Global.java Mon Mar 02 14:33:55 2015 +0100 2.3 @@ -28,6 +28,7 @@ 2.4 import static jdk.nashorn.internal.lookup.Lookup.MH; 2.5 import static jdk.nashorn.internal.runtime.ECMAErrors.referenceError; 2.6 import static jdk.nashorn.internal.runtime.ECMAErrors.typeError; 2.7 +import static jdk.nashorn.internal.runtime.JSType.isString; 2.8 import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED; 2.9 2.10 import java.io.IOException; 2.11 @@ -55,7 +56,6 @@ 2.12 import jdk.nashorn.internal.objects.annotations.Attribute; 2.13 import jdk.nashorn.internal.objects.annotations.Property; 2.14 import jdk.nashorn.internal.objects.annotations.ScriptClass; 2.15 -import jdk.nashorn.internal.runtime.ConsString; 2.16 import jdk.nashorn.internal.runtime.Context; 2.17 import jdk.nashorn.internal.runtime.ECMAErrors; 2.18 import jdk.nashorn.internal.runtime.GlobalConstants; 2.19 @@ -578,7 +578,7 @@ 2.20 return new NativeBoolean((Boolean)obj, this); 2.21 } else if (obj instanceof Number) { 2.22 return new NativeNumber(((Number)obj).doubleValue(), this); 2.23 - } else if (obj instanceof String || obj instanceof ConsString) { 2.24 + } else if (isString(obj)) { 2.25 return new NativeString((CharSequence)obj, this); 2.26 } else if (obj instanceof Object[]) { // extension 2.27 return new NativeArray(ArrayData.allocate((Object[])obj), this); 2.28 @@ -605,7 +605,7 @@ 2.29 * @return guarded invocation 2.30 */ 2.31 public static GuardedInvocation primitiveLookup(final LinkRequest request, final Object self) { 2.32 - if (self instanceof String || self instanceof ConsString) { 2.33 + if (isString(self)) { 2.34 return NativeString.lookupPrimitive(request, self); 2.35 } else if (self instanceof Number) { 2.36 return NativeNumber.lookupPrimitive(request, self); 2.37 @@ -622,7 +622,7 @@ 2.38 * @return method handle to create wrapper objects for primitive receiver 2.39 */ 2.40 public static MethodHandle getPrimitiveWrapFilter(final Object self) { 2.41 - if (self instanceof String || self instanceof ConsString) { 2.42 + if (isString(self)) { 2.43 return NativeString.WRAPFILTER; 2.44 } else if (self instanceof Number) { 2.45 return NativeNumber.WRAPFILTER; 2.46 @@ -948,7 +948,7 @@ 2.47 * This is directly invoked from generated when eval(code) is called in user code 2.48 */ 2.49 public static Object directEval(final Object self, final Object str, final Object callThis, final Object location, final boolean strict) { 2.50 - if (!(str instanceof String || str instanceof ConsString)) { 2.51 + if (!isString(str)) { 2.52 return str; 2.53 } 2.54 final Global global = Global.instanceFrom(self);
3.1 --- a/src/jdk/nashorn/internal/objects/NativeDate.java Fri Feb 20 15:47:28 2015 +0100 3.2 +++ b/src/jdk/nashorn/internal/objects/NativeDate.java Mon Mar 02 14:33:55 2015 +0100 3.3 @@ -30,6 +30,7 @@ 3.4 import static java.lang.Double.isNaN; 3.5 import static jdk.nashorn.internal.runtime.ECMAErrors.rangeError; 3.6 import static jdk.nashorn.internal.runtime.ECMAErrors.typeError; 3.7 + 3.8 import java.util.Locale; 3.9 import java.util.TimeZone; 3.10 import java.util.concurrent.Callable; 3.11 @@ -40,7 +41,6 @@ 3.12 import jdk.nashorn.internal.objects.annotations.SpecializedFunction; 3.13 import jdk.nashorn.internal.objects.annotations.Where; 3.14 import jdk.nashorn.internal.parser.DateParser; 3.15 -import jdk.nashorn.internal.runtime.ConsString; 3.16 import jdk.nashorn.internal.runtime.JSType; 3.17 import jdk.nashorn.internal.runtime.PropertyMap; 3.18 import jdk.nashorn.internal.runtime.ScriptEnvironment; 3.19 @@ -183,7 +183,7 @@ 3.20 case 1: 3.21 double num; 3.22 final Object arg = JSType.toPrimitive(args[0]); 3.23 - if (arg instanceof String || arg instanceof ConsString) { 3.24 + if (JSType.isString(arg)) { 3.25 num = parseDateString(arg.toString()); 3.26 } else { 3.27 num = timeClip(JSType.toNumber(args[0]));
4.1 --- a/src/jdk/nashorn/internal/objects/NativeJSON.java Fri Feb 20 15:47:28 2015 +0100 4.2 +++ b/src/jdk/nashorn/internal/objects/NativeJSON.java Mon Mar 02 14:33:55 2015 +0100 4.3 @@ -181,7 +181,7 @@ 4.4 } 4.5 gap = sb.toString(); 4.6 } 4.7 - } else if (modSpace instanceof String || modSpace instanceof ConsString) { 4.8 + } else if (JSType.isString(modSpace)) { 4.9 final String str = modSpace.toString(); 4.10 gap = str.substring(0, Math.min(10, str.length())); 4.11 } else {
5.1 --- a/src/jdk/nashorn/internal/objects/NativeString.java Fri Feb 20 15:47:28 2015 +0100 5.2 +++ b/src/jdk/nashorn/internal/objects/NativeString.java Mon Mar 02 14:33:55 2015 +0100 5.3 @@ -90,7 +90,7 @@ 5.4 5.5 private NativeString(final CharSequence value, final ScriptObject proto, final PropertyMap map) { 5.6 super(proto, map); 5.7 - assert value instanceof String || value instanceof ConsString; 5.8 + assert JSType.isString(value); 5.9 this.value = value; 5.10 } 5.11 5.12 @@ -155,7 +155,7 @@ 5.13 final Object self = request.getReceiver(); 5.14 final Class<?> returnType = desc.getMethodType().returnType(); 5.15 5.16 - if (returnType == Object.class && (self instanceof String || self instanceof ConsString)) { 5.17 + if (returnType == Object.class && JSType.isString(self)) { 5.18 try { 5.19 return new GuardedInvocation(MH.findStatic(MethodHandles.lookup(), NativeString.class, "get", desc.getMethodType()), NashornGuards.getInstanceOf2Guard(String.class, ConsString.class)); 5.20 } catch (final LookupException e) { 5.21 @@ -1312,7 +1312,7 @@ 5.22 } 5.23 5.24 private static CharSequence getCharSequence(final Object self) { 5.25 - if (self instanceof String || self instanceof ConsString) { 5.26 + if (JSType.isString(self)) { 5.27 return (CharSequence)self; 5.28 } else if (self instanceof NativeString) { 5.29 return ((NativeString)self).getValue();
6.1 --- a/src/jdk/nashorn/internal/runtime/ConsString.java Fri Feb 20 15:47:28 2015 +0100 6.2 +++ b/src/jdk/nashorn/internal/runtime/ConsString.java Mon Mar 02 14:33:55 2015 +0100 6.3 @@ -25,6 +25,8 @@ 6.4 6.5 package jdk.nashorn.internal.runtime; 6.6 6.7 +import static jdk.nashorn.internal.runtime.JSType.isString; 6.8 + 6.9 import java.util.ArrayDeque; 6.10 import java.util.Deque; 6.11 6.12 @@ -52,8 +54,8 @@ 6.13 * @param right right char sequence 6.14 */ 6.15 public ConsString(final CharSequence left, final CharSequence right) { 6.16 - assert left instanceof String || left instanceof ConsString; 6.17 - assert right instanceof String || right instanceof ConsString; 6.18 + assert isString(left); 6.19 + assert isString(right); 6.20 this.left = left; 6.21 this.right = right; 6.22 length = left.length() + right.length();
7.1 --- a/src/jdk/nashorn/internal/runtime/JSType.java Fri Feb 20 15:47:28 2015 +0100 7.2 +++ b/src/jdk/nashorn/internal/runtime/JSType.java Mon Mar 02 14:33:55 2015 +0100 7.3 @@ -312,7 +312,7 @@ 7.4 return JSType.BOOLEAN; 7.5 } 7.6 7.7 - if (obj instanceof String || obj instanceof ConsString) { 7.8 + if (isString(obj)) { 7.9 return JSType.STRING; 7.10 } 7.11 7.12 @@ -350,7 +350,7 @@ 7.13 return JSType.BOOLEAN; 7.14 } 7.15 7.16 - if (obj instanceof String || obj instanceof ConsString) { 7.17 + if (isString(obj)) { 7.18 return JSType.STRING; 7.19 } 7.20 7.21 @@ -456,8 +456,7 @@ 7.22 obj == ScriptRuntime.UNDEFINED || 7.23 obj instanceof Boolean || 7.24 obj instanceof Number || 7.25 - obj instanceof String || 7.26 - obj instanceof ConsString; 7.27 + isString(obj); 7.28 } 7.29 7.30 /** 7.31 @@ -578,7 +577,7 @@ 7.32 return num != 0 && !Double.isNaN(num); 7.33 } 7.34 7.35 - if (obj instanceof String || obj instanceof ConsString) { 7.36 + if (isString(obj)) { 7.37 return ((CharSequence)obj).length() > 0; 7.38 } 7.39 7.40 @@ -629,6 +628,15 @@ 7.41 } 7.42 7.43 /** 7.44 + * Returns true if object represents a primitive JavaScript string value. 7.45 + * @param obj the object 7.46 + * @return true if the object represents a primitive JavaScript string value. 7.47 + */ 7.48 + public static boolean isString(final Object obj) { 7.49 + return obj instanceof String || obj instanceof ConsString; 7.50 + } 7.51 + 7.52 + /** 7.53 * JavaScript compliant conversion of integer to String 7.54 * 7.55 * @param num an integer
8.1 --- a/src/jdk/nashorn/internal/runtime/ScriptFunctionData.java Fri Feb 20 15:47:28 2015 +0100 8.2 +++ b/src/jdk/nashorn/internal/runtime/ScriptFunctionData.java Mon Mar 02 14:33:55 2015 +0100 8.3 @@ -28,6 +28,7 @@ 8.4 import static jdk.nashorn.internal.lookup.Lookup.MH; 8.5 import static jdk.nashorn.internal.runtime.ECMAErrors.typeError; 8.6 import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED; 8.7 + 8.8 import java.io.IOException; 8.9 import java.io.ObjectInputStream; 8.10 import java.io.Serializable; 8.11 @@ -456,8 +457,7 @@ 8.12 } 8.13 8.14 static boolean isPrimitiveThis(final Object obj) { 8.15 - return obj instanceof String || obj instanceof ConsString || 8.16 - obj instanceof Number || obj instanceof Boolean; 8.17 + return JSType.isString(obj) || obj instanceof Number || obj instanceof Boolean; 8.18 } 8.19 8.20 /**
9.1 --- a/src/jdk/nashorn/internal/runtime/ScriptRuntime.java Fri Feb 20 15:47:28 2015 +0100 9.2 +++ b/src/jdk/nashorn/internal/runtime/ScriptRuntime.java Mon Mar 02 14:33:55 2015 +0100 9.3 @@ -32,6 +32,7 @@ 9.4 import static jdk.nashorn.internal.runtime.ECMAErrors.syntaxError; 9.5 import static jdk.nashorn.internal.runtime.ECMAErrors.typeError; 9.6 import static jdk.nashorn.internal.runtime.JSType.isRepresentableAsInt; 9.7 +import static jdk.nashorn.internal.runtime.JSType.isString; 9.8 9.9 import java.lang.invoke.MethodHandle; 9.10 import java.lang.invoke.MethodHandles; 9.11 @@ -56,7 +57,6 @@ 9.12 import jdk.nashorn.internal.parser.Lexer; 9.13 import jdk.nashorn.internal.runtime.linker.Bootstrap; 9.14 9.15 - 9.16 /** 9.17 * Utilities to be called by JavaScript runtime API and generated classes. 9.18 */ 9.19 @@ -564,8 +564,7 @@ 9.20 final Object xPrim = JSType.toPrimitive(x); 9.21 final Object yPrim = JSType.toPrimitive(y); 9.22 9.23 - if (xPrim instanceof String || yPrim instanceof String 9.24 - || xPrim instanceof ConsString || yPrim instanceof ConsString) { 9.25 + if (isString(xPrim) || isString(yPrim)) { 9.26 try { 9.27 return new ConsString(JSType.toCharSequence(xPrim), JSType.toCharSequence(yPrim)); 9.28 } catch (final IllegalArgumentException iae) { 9.29 @@ -1010,7 +1009,7 @@ 9.30 px = JSType.toPrimitive(x, Number.class); 9.31 } 9.32 9.33 - if (JSType.ofNoFunction(px) == JSType.STRING && JSType.ofNoFunction(py) == JSType.STRING) { 9.34 + if (isString(px) && isString(py)) { 9.35 // May be String or ConsString 9.36 return px.toString().compareTo(py.toString()) < 0; 9.37 }
10.1 --- a/src/jdk/nashorn/internal/runtime/ScriptingFunctions.java Fri Feb 20 15:47:28 2015 +0100 10.2 +++ b/src/jdk/nashorn/internal/runtime/ScriptingFunctions.java Mon Mar 02 14:33:55 2015 +0100 10.3 @@ -107,7 +107,7 @@ 10.4 10.5 if (file instanceof File) { 10.6 f = (File)file; 10.7 - } else if (file instanceof String || file instanceof ConsString) { 10.8 + } else if (JSType.isString(file)) { 10.9 f = new java.io.File(((CharSequence)file).toString()); 10.10 } 10.11
11.1 --- a/src/jdk/nashorn/internal/runtime/linker/BrowserJSObjectLinker.java Fri Feb 20 15:47:28 2015 +0100 11.2 +++ b/src/jdk/nashorn/internal/runtime/linker/BrowserJSObjectLinker.java Mon Mar 02 14:33:55 2015 +0100 11.3 @@ -25,11 +25,13 @@ 11.4 11.5 package jdk.nashorn.internal.runtime.linker; 11.6 11.7 +import static jdk.nashorn.internal.runtime.JSType.isString; 11.8 +import static jdk.nashorn.internal.runtime.linker.BrowserJSObjectLinker.JSObjectHandles.JSOBJECT_CALL; 11.9 import static jdk.nashorn.internal.runtime.linker.BrowserJSObjectLinker.JSObjectHandles.JSOBJECT_GETMEMBER; 11.10 import static jdk.nashorn.internal.runtime.linker.BrowserJSObjectLinker.JSObjectHandles.JSOBJECT_GETSLOT; 11.11 import static jdk.nashorn.internal.runtime.linker.BrowserJSObjectLinker.JSObjectHandles.JSOBJECT_SETMEMBER; 11.12 import static jdk.nashorn.internal.runtime.linker.BrowserJSObjectLinker.JSObjectHandles.JSOBJECT_SETSLOT; 11.13 -import static jdk.nashorn.internal.runtime.linker.BrowserJSObjectLinker.JSObjectHandles.JSOBJECT_CALL; 11.14 + 11.15 import java.lang.invoke.MethodHandle; 11.16 import java.lang.invoke.MethodHandles; 11.17 import jdk.internal.dynalink.CallSiteDescriptor; 11.18 @@ -40,7 +42,6 @@ 11.19 import jdk.internal.dynalink.support.CallSiteDescriptorFactory; 11.20 import jdk.nashorn.internal.lookup.MethodHandleFactory; 11.21 import jdk.nashorn.internal.lookup.MethodHandleFunctionality; 11.22 -import jdk.nashorn.internal.runtime.ConsString; 11.23 import jdk.nashorn.internal.runtime.JSType; 11.24 11.25 /** 11.26 @@ -171,7 +172,7 @@ 11.27 if (index > -1) { 11.28 return JSOBJECT_GETSLOT.invokeExact(jsobj, index); 11.29 } 11.30 - } else if (key instanceof String || key instanceof ConsString) { 11.31 + } else if (isString(key)) { 11.32 final String name = key.toString(); 11.33 if (name.indexOf('(') != -1) { 11.34 return fallback.invokeExact(jsobj, (Object) name); 11.35 @@ -187,7 +188,7 @@ 11.36 JSOBJECT_SETSLOT.invokeExact(jsobj, (int)key, value); 11.37 } else if (key instanceof Number) { 11.38 JSOBJECT_SETSLOT.invokeExact(jsobj, getIndex((Number)key), value); 11.39 - } else if (key instanceof String || key instanceof ConsString) { 11.40 + } else if (isString(key)) { 11.41 JSOBJECT_SETMEMBER.invokeExact(jsobj, key.toString(), value); 11.42 } 11.43 }
12.1 --- a/src/jdk/nashorn/internal/runtime/linker/JSObjectLinker.java Fri Feb 20 15:47:28 2015 +0100 12.2 +++ b/src/jdk/nashorn/internal/runtime/linker/JSObjectLinker.java Mon Mar 02 14:33:55 2015 +0100 12.3 @@ -25,6 +25,8 @@ 12.4 12.5 package jdk.nashorn.internal.runtime.linker; 12.6 12.7 +import static jdk.nashorn.internal.runtime.JSType.isString; 12.8 + 12.9 import java.lang.invoke.MethodHandle; 12.10 import java.lang.invoke.MethodHandles; 12.11 import java.util.Map; 12.12 @@ -38,7 +40,6 @@ 12.13 import jdk.nashorn.api.scripting.JSObject; 12.14 import jdk.nashorn.internal.lookup.MethodHandleFactory; 12.15 import jdk.nashorn.internal.lookup.MethodHandleFunctionality; 12.16 -import jdk.nashorn.internal.runtime.ConsString; 12.17 import jdk.nashorn.internal.runtime.JSType; 12.18 12.19 /** 12.20 @@ -166,7 +167,7 @@ 12.21 if (index > -1) { 12.22 return ((JSObject)jsobj).getSlot(index); 12.23 } 12.24 - } else if (key instanceof String || key instanceof ConsString) { 12.25 + } else if (isString(key)) { 12.26 final String name = key.toString(); 12.27 // get with method name and signature. delegate it to beans linker! 12.28 if (name.indexOf('(') != -1) { 12.29 @@ -183,7 +184,7 @@ 12.30 ((JSObject)jsobj).setSlot((Integer)key, value); 12.31 } else if (key instanceof Number) { 12.32 ((JSObject)jsobj).setSlot(getIndex((Number)key), value); 12.33 - } else if (key instanceof String || key instanceof ConsString) { 12.34 + } else if (isString(key)) { 12.35 ((JSObject)jsobj).setMember(key.toString(), value); 12.36 } 12.37 }
13.1 --- a/src/jdk/nashorn/internal/runtime/linker/JavaArgumentConverters.java Fri Feb 20 15:47:28 2015 +0100 13.2 +++ b/src/jdk/nashorn/internal/runtime/linker/JavaArgumentConverters.java Mon Mar 02 14:33:55 2015 +0100 13.3 @@ -27,6 +27,7 @@ 13.4 13.5 import static jdk.nashorn.internal.lookup.Lookup.MH; 13.6 import static jdk.nashorn.internal.runtime.ECMAErrors.typeError; 13.7 +import static jdk.nashorn.internal.runtime.JSType.isString; 13.8 import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED; 13.9 13.10 import java.lang.invoke.MethodHandle; 13.11 @@ -78,7 +79,7 @@ 13.12 } 13.13 13.14 if (obj == UNDEFINED) { 13.15 - // NOTE: same reasoning for FindBugs NP_BOOLEAN_RETURN_NUL warning as in the preceding comment. 13.16 + // NOTE: same reasoning for FindBugs NP_BOOLEAN_RETURN_NULL warning as in the preceding comment. 13.17 return null; 13.18 } 13.19 13.20 @@ -87,7 +88,7 @@ 13.21 return num != 0 && !Double.isNaN(num); 13.22 } 13.23 13.24 - if (obj instanceof String || obj instanceof ConsString) { 13.25 + if (isString(obj)) { 13.26 return ((CharSequence) obj).length() > 0; 13.27 } 13.28 13.29 @@ -207,7 +208,7 @@ 13.30 return f.longValue(); 13.31 } else if (obj instanceof Number) { 13.32 return ((Number)obj).longValue(); 13.33 - } else if (obj instanceof String || obj instanceof ConsString) { 13.34 + } else if (isString(obj)) { 13.35 return JSType.toLong(obj); 13.36 } else if (obj instanceof Boolean) { 13.37 return (Boolean)obj ? 1L : 0L;
14.1 --- a/src/jdk/nashorn/internal/runtime/linker/NashornPrimitiveLinker.java Fri Feb 20 15:47:28 2015 +0100 14.2 +++ b/src/jdk/nashorn/internal/runtime/linker/NashornPrimitiveLinker.java Mon Mar 02 14:33:55 2015 +0100 14.3 @@ -39,6 +39,7 @@ 14.4 import jdk.internal.dynalink.support.TypeUtilities; 14.5 import jdk.nashorn.internal.objects.Global; 14.6 import jdk.nashorn.internal.runtime.ConsString; 14.7 +import jdk.nashorn.internal.runtime.JSType; 14.8 import jdk.nashorn.internal.runtime.ScriptRuntime; 14.9 14.10 /** 14.11 @@ -170,7 +171,7 @@ 14.12 14.13 @SuppressWarnings("unused") 14.14 private static boolean isJavaScriptPrimitive(final Object o) { 14.15 - return o instanceof String || o instanceof Boolean || o instanceof Number || o instanceof ConsString || o == null; 14.16 + return JSType.isString(o) || o instanceof Boolean || o instanceof Number || o == null; 14.17 } 14.18 14.19 private static final MethodHandle GUARD_PRIMITIVE = findOwnMH("isJavaScriptPrimitive", boolean.class, Object.class);