# HG changeset patch # User attila # Date 1425303235 -3600 # Node ID a8523237b66cdbcfb1cebc28d27157b0a83530cf # Parent 8cc2618a07aa00ecd69c7e2e5e92f357c18b4eeb 8074031: Canonicalize is-a-JS-string tests Reviewed-by: hannesw, lagergren diff -r 8cc2618a07aa -r a8523237b66c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/lookup/MethodHandleFactory.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/lookup/MethodHandleFactory.java Fri Feb 27 14:33:47 2015 +0100 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/lookup/MethodHandleFactory.java Mon Mar 02 14:33:55 2015 +0100 @@ -25,6 +25,8 @@ package jdk.nashorn.internal.lookup; +import static jdk.nashorn.internal.runtime.JSType.isString; + import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.lang.invoke.MethodHandle; @@ -36,7 +38,6 @@ import java.util.Arrays; import java.util.List; import java.util.logging.Level; -import jdk.nashorn.internal.runtime.ConsString; import jdk.nashorn.internal.runtime.Context; import jdk.nashorn.internal.runtime.Debug; import jdk.nashorn.internal.runtime.ScriptObject; @@ -343,7 +344,7 @@ final Object d = data[i]; if (d == null) { sb.append(" "); - } else if (d instanceof String || d instanceof ConsString) { + } else if (isString(d)) { sb.append(d.toString()); sb.append(' '); } else if (d.getClass().isArray()) { diff -r 8cc2618a07aa -r a8523237b66c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java Fri Feb 27 14:33:47 2015 +0100 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java Mon Mar 02 14:33:55 2015 +0100 @@ -28,6 +28,7 @@ import static jdk.nashorn.internal.lookup.Lookup.MH; import static jdk.nashorn.internal.runtime.ECMAErrors.referenceError; import static jdk.nashorn.internal.runtime.ECMAErrors.typeError; +import static jdk.nashorn.internal.runtime.JSType.isString; import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED; import java.io.IOException; @@ -55,7 +56,6 @@ import jdk.nashorn.internal.objects.annotations.Attribute; import jdk.nashorn.internal.objects.annotations.Property; import jdk.nashorn.internal.objects.annotations.ScriptClass; -import jdk.nashorn.internal.runtime.ConsString; import jdk.nashorn.internal.runtime.Context; import jdk.nashorn.internal.runtime.ECMAErrors; import jdk.nashorn.internal.runtime.GlobalConstants; @@ -577,7 +577,7 @@ return new NativeBoolean((Boolean)obj, this); } else if (obj instanceof Number) { return new NativeNumber(((Number)obj).doubleValue(), this); - } else if (obj instanceof String || obj instanceof ConsString) { + } else if (isString(obj)) { return new NativeString((CharSequence)obj, this); } else if (obj instanceof Object[]) { // extension return new NativeArray(ArrayData.allocate((Object[])obj), this); @@ -604,7 +604,7 @@ * @return guarded invocation */ public static GuardedInvocation primitiveLookup(final LinkRequest request, final Object self) { - if (self instanceof String || self instanceof ConsString) { + if (isString(self)) { return NativeString.lookupPrimitive(request, self); } else if (self instanceof Number) { return NativeNumber.lookupPrimitive(request, self); @@ -621,7 +621,7 @@ * @return method handle to create wrapper objects for primitive receiver */ public static MethodHandle getPrimitiveWrapFilter(final Object self) { - if (self instanceof String || self instanceof ConsString) { + if (isString(self)) { return NativeString.WRAPFILTER; } else if (self instanceof Number) { return NativeNumber.WRAPFILTER; @@ -947,7 +947,7 @@ * This is directly invoked from generated when eval(code) is called in user code */ public static Object directEval(final Object self, final Object str, final Object callThis, final Object location, final boolean strict) { - if (!(str instanceof String || str instanceof ConsString)) { + if (!isString(str)) { return str; } final Global global = Global.instanceFrom(self); diff -r 8cc2618a07aa -r a8523237b66c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeDate.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeDate.java Fri Feb 27 14:33:47 2015 +0100 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeDate.java Mon Mar 02 14:33:55 2015 +0100 @@ -30,6 +30,7 @@ import static java.lang.Double.isNaN; import static jdk.nashorn.internal.runtime.ECMAErrors.rangeError; import static jdk.nashorn.internal.runtime.ECMAErrors.typeError; + import java.util.Locale; import java.util.TimeZone; import java.util.concurrent.Callable; @@ -40,7 +41,6 @@ import jdk.nashorn.internal.objects.annotations.SpecializedFunction; import jdk.nashorn.internal.objects.annotations.Where; import jdk.nashorn.internal.parser.DateParser; -import jdk.nashorn.internal.runtime.ConsString; import jdk.nashorn.internal.runtime.JSType; import jdk.nashorn.internal.runtime.PropertyMap; import jdk.nashorn.internal.runtime.ScriptEnvironment; @@ -183,7 +183,7 @@ case 1: double num; final Object arg = JSType.toPrimitive(args[0]); - if (arg instanceof String || arg instanceof ConsString) { + if (JSType.isString(arg)) { num = parseDateString(arg.toString()); } else { num = timeClip(JSType.toNumber(args[0])); diff -r 8cc2618a07aa -r a8523237b66c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeJSON.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeJSON.java Fri Feb 27 14:33:47 2015 +0100 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeJSON.java Mon Mar 02 14:33:55 2015 +0100 @@ -181,7 +181,7 @@ } gap = sb.toString(); } - } else if (modSpace instanceof String || modSpace instanceof ConsString) { + } else if (JSType.isString(modSpace)) { final String str = modSpace.toString(); gap = str.substring(0, Math.min(10, str.length())); } else { diff -r 8cc2618a07aa -r a8523237b66c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeString.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeString.java Fri Feb 27 14:33:47 2015 +0100 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeString.java Mon Mar 02 14:33:55 2015 +0100 @@ -90,7 +90,7 @@ private NativeString(final CharSequence value, final ScriptObject proto, final PropertyMap map) { super(proto, map); - assert value instanceof String || value instanceof ConsString; + assert JSType.isString(value); this.value = value; } @@ -155,7 +155,7 @@ final Object self = request.getReceiver(); final Class returnType = desc.getMethodType().returnType(); - if (returnType == Object.class && (self instanceof String || self instanceof ConsString)) { + if (returnType == Object.class && JSType.isString(self)) { try { return new GuardedInvocation(MH.findStatic(MethodHandles.lookup(), NativeString.class, "get", desc.getMethodType()), NashornGuards.getInstanceOf2Guard(String.class, ConsString.class)); } catch (final LookupException e) { @@ -1312,7 +1312,7 @@ } private static CharSequence getCharSequence(final Object self) { - if (self instanceof String || self instanceof ConsString) { + if (JSType.isString(self)) { return (CharSequence)self; } else if (self instanceof NativeString) { return ((NativeString)self).getValue(); diff -r 8cc2618a07aa -r a8523237b66c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ConsString.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ConsString.java Fri Feb 27 14:33:47 2015 +0100 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ConsString.java Mon Mar 02 14:33:55 2015 +0100 @@ -25,6 +25,8 @@ package jdk.nashorn.internal.runtime; +import static jdk.nashorn.internal.runtime.JSType.isString; + import java.util.ArrayDeque; import java.util.Deque; @@ -52,8 +54,8 @@ * @param right right char sequence */ public ConsString(final CharSequence left, final CharSequence right) { - assert left instanceof String || left instanceof ConsString; - assert right instanceof String || right instanceof ConsString; + assert isString(left); + assert isString(right); this.left = left; this.right = right; length = left.length() + right.length(); diff -r 8cc2618a07aa -r a8523237b66c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSType.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSType.java Fri Feb 27 14:33:47 2015 +0100 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSType.java Mon Mar 02 14:33:55 2015 +0100 @@ -311,7 +311,7 @@ return JSType.BOOLEAN; } - if (obj instanceof String || obj instanceof ConsString) { + if (isString(obj)) { return JSType.STRING; } @@ -349,7 +349,7 @@ return JSType.BOOLEAN; } - if (obj instanceof String || obj instanceof ConsString) { + if (isString(obj)) { return JSType.STRING; } @@ -455,8 +455,7 @@ obj == ScriptRuntime.UNDEFINED || obj instanceof Boolean || obj instanceof Number || - obj instanceof String || - obj instanceof ConsString; + isString(obj); } /** @@ -577,7 +576,7 @@ return num != 0 && !Double.isNaN(num); } - if (obj instanceof String || obj instanceof ConsString) { + if (isString(obj)) { return ((CharSequence)obj).length() > 0; } @@ -628,6 +627,15 @@ } /** + * Returns true if object represents a primitive JavaScript string value. + * @param obj the object + * @return true if the object represents a primitive JavaScript string value. + */ + public static boolean isString(final Object obj) { + return obj instanceof String || obj instanceof ConsString; + } + + /** * JavaScript compliant conversion of integer to String * * @param num an integer diff -r 8cc2618a07aa -r a8523237b66c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptFunctionData.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptFunctionData.java Fri Feb 27 14:33:47 2015 +0100 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptFunctionData.java Mon Mar 02 14:33:55 2015 +0100 @@ -28,6 +28,7 @@ import static jdk.nashorn.internal.lookup.Lookup.MH; import static jdk.nashorn.internal.runtime.ECMAErrors.typeError; import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED; + import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable; @@ -456,8 +457,7 @@ } static boolean isPrimitiveThis(final Object obj) { - return obj instanceof String || obj instanceof ConsString || - obj instanceof Number || obj instanceof Boolean; + return JSType.isString(obj) || obj instanceof Number || obj instanceof Boolean; } /** diff -r 8cc2618a07aa -r a8523237b66c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptRuntime.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptRuntime.java Fri Feb 27 14:33:47 2015 +0100 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptRuntime.java Mon Mar 02 14:33:55 2015 +0100 @@ -32,6 +32,7 @@ import static jdk.nashorn.internal.runtime.ECMAErrors.syntaxError; import static jdk.nashorn.internal.runtime.ECMAErrors.typeError; import static jdk.nashorn.internal.runtime.JSType.isRepresentableAsInt; +import static jdk.nashorn.internal.runtime.JSType.isString; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; @@ -56,7 +57,6 @@ import jdk.nashorn.internal.parser.Lexer; import jdk.nashorn.internal.runtime.linker.Bootstrap; - /** * Utilities to be called by JavaScript runtime API and generated classes. */ @@ -564,8 +564,7 @@ final Object xPrim = JSType.toPrimitive(x); final Object yPrim = JSType.toPrimitive(y); - if (xPrim instanceof String || yPrim instanceof String - || xPrim instanceof ConsString || yPrim instanceof ConsString) { + if (isString(xPrim) || isString(yPrim)) { try { return new ConsString(JSType.toCharSequence(xPrim), JSType.toCharSequence(yPrim)); } catch (final IllegalArgumentException iae) { @@ -1010,7 +1009,7 @@ px = JSType.toPrimitive(x, Number.class); } - if (JSType.ofNoFunction(px) == JSType.STRING && JSType.ofNoFunction(py) == JSType.STRING) { + if (isString(px) && isString(py)) { // May be String or ConsString return px.toString().compareTo(py.toString()) < 0; } diff -r 8cc2618a07aa -r a8523237b66c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptingFunctions.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptingFunctions.java Fri Feb 27 14:33:47 2015 +0100 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptingFunctions.java Mon Mar 02 14:33:55 2015 +0100 @@ -107,7 +107,7 @@ if (file instanceof File) { f = (File)file; - } else if (file instanceof String || file instanceof ConsString) { + } else if (JSType.isString(file)) { f = new java.io.File(((CharSequence)file).toString()); } diff -r 8cc2618a07aa -r a8523237b66c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/BrowserJSObjectLinker.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/BrowserJSObjectLinker.java Fri Feb 27 14:33:47 2015 +0100 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/BrowserJSObjectLinker.java Mon Mar 02 14:33:55 2015 +0100 @@ -25,11 +25,13 @@ package jdk.nashorn.internal.runtime.linker; +import static jdk.nashorn.internal.runtime.JSType.isString; +import static jdk.nashorn.internal.runtime.linker.BrowserJSObjectLinker.JSObjectHandles.JSOBJECT_CALL; import static jdk.nashorn.internal.runtime.linker.BrowserJSObjectLinker.JSObjectHandles.JSOBJECT_GETMEMBER; import static jdk.nashorn.internal.runtime.linker.BrowserJSObjectLinker.JSObjectHandles.JSOBJECT_GETSLOT; import static jdk.nashorn.internal.runtime.linker.BrowserJSObjectLinker.JSObjectHandles.JSOBJECT_SETMEMBER; import static jdk.nashorn.internal.runtime.linker.BrowserJSObjectLinker.JSObjectHandles.JSOBJECT_SETSLOT; -import static jdk.nashorn.internal.runtime.linker.BrowserJSObjectLinker.JSObjectHandles.JSOBJECT_CALL; + import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import jdk.internal.dynalink.CallSiteDescriptor; @@ -40,7 +42,6 @@ import jdk.internal.dynalink.support.CallSiteDescriptorFactory; import jdk.nashorn.internal.lookup.MethodHandleFactory; import jdk.nashorn.internal.lookup.MethodHandleFunctionality; -import jdk.nashorn.internal.runtime.ConsString; import jdk.nashorn.internal.runtime.JSType; /** @@ -186,7 +187,7 @@ if (index > -1) { return JSOBJECT_GETSLOT.invokeExact(jsobj, index); } - } else if (key instanceof String || key instanceof ConsString) { + } else if (isString(key)) { final String name = key.toString(); if (name.indexOf('(') != -1) { return fallback.invokeExact(jsobj, (Object) name); @@ -202,7 +203,7 @@ JSOBJECT_SETSLOT.invokeExact(jsobj, (int)key, value); } else if (key instanceof Number) { JSOBJECT_SETSLOT.invokeExact(jsobj, getIndex((Number)key), value); - } else if (key instanceof String || key instanceof ConsString) { + } else if (isString(key)) { JSOBJECT_SETMEMBER.invokeExact(jsobj, key.toString(), value); } } diff -r 8cc2618a07aa -r a8523237b66c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JSObjectLinker.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JSObjectLinker.java Fri Feb 27 14:33:47 2015 +0100 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JSObjectLinker.java Mon Mar 02 14:33:55 2015 +0100 @@ -25,6 +25,8 @@ package jdk.nashorn.internal.runtime.linker; +import static jdk.nashorn.internal.runtime.JSType.isString; + import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.util.Map; @@ -38,7 +40,6 @@ import jdk.nashorn.api.scripting.JSObject; import jdk.nashorn.internal.lookup.MethodHandleFactory; import jdk.nashorn.internal.lookup.MethodHandleFunctionality; -import jdk.nashorn.internal.runtime.ConsString; import jdk.nashorn.internal.runtime.JSType; /** @@ -166,7 +167,7 @@ if (index > -1) { return ((JSObject)jsobj).getSlot(index); } - } else if (key instanceof String || key instanceof ConsString) { + } else if (isString(key)) { final String name = key.toString(); // get with method name and signature. delegate it to beans linker! if (name.indexOf('(') != -1) { @@ -183,7 +184,7 @@ ((JSObject)jsobj).setSlot((Integer)key, value); } else if (key instanceof Number) { ((JSObject)jsobj).setSlot(getIndex((Number)key), value); - } else if (key instanceof String || key instanceof ConsString) { + } else if (isString(key)) { ((JSObject)jsobj).setMember(key.toString(), value); } } diff -r 8cc2618a07aa -r a8523237b66c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaArgumentConverters.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaArgumentConverters.java Fri Feb 27 14:33:47 2015 +0100 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaArgumentConverters.java Mon Mar 02 14:33:55 2015 +0100 @@ -27,6 +27,7 @@ import static jdk.nashorn.internal.lookup.Lookup.MH; import static jdk.nashorn.internal.runtime.ECMAErrors.typeError; +import static jdk.nashorn.internal.runtime.JSType.isString; import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED; import java.lang.invoke.MethodHandle; @@ -78,7 +79,7 @@ } if (obj == UNDEFINED) { - // NOTE: same reasoning for FindBugs NP_BOOLEAN_RETURN_NUL warning as in the preceding comment. + // NOTE: same reasoning for FindBugs NP_BOOLEAN_RETURN_NULL warning as in the preceding comment. return null; } @@ -87,7 +88,7 @@ return num != 0 && !Double.isNaN(num); } - if (obj instanceof String || obj instanceof ConsString) { + if (isString(obj)) { return ((CharSequence) obj).length() > 0; } @@ -207,7 +208,7 @@ return f.longValue(); } else if (obj instanceof Number) { return ((Number)obj).longValue(); - } else if (obj instanceof String || obj instanceof ConsString) { + } else if (isString(obj)) { return JSType.toLong(obj); } else if (obj instanceof Boolean) { return (Boolean)obj ? 1L : 0L; diff -r 8cc2618a07aa -r a8523237b66c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornPrimitiveLinker.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornPrimitiveLinker.java Fri Feb 27 14:33:47 2015 +0100 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornPrimitiveLinker.java Mon Mar 02 14:33:55 2015 +0100 @@ -39,6 +39,7 @@ import jdk.internal.dynalink.support.TypeUtilities; import jdk.nashorn.internal.objects.Global; import jdk.nashorn.internal.runtime.ConsString; +import jdk.nashorn.internal.runtime.JSType; import jdk.nashorn.internal.runtime.ScriptRuntime; /** @@ -170,7 +171,7 @@ @SuppressWarnings("unused") private static boolean isJavaScriptPrimitive(final Object o) { - return o instanceof String || o instanceof Boolean || o instanceof Number || o instanceof ConsString || o == null; + return JSType.isString(o) || o instanceof Boolean || o instanceof Number || o == null; } private static final MethodHandle GUARD_PRIMITIVE = findOwnMH("isJavaScriptPrimitive", boolean.class, Object.class);