# HG changeset patch # User lana # Date 1381269612 25200 # Node ID 2b9685a87b372031c873d32a304533c7f60c3e7d # Parent b9a0f6c693f347a6f4b9bb994957f4eaa05bdedd# Parent 8ebfde8a3436b14778ef4b5a28ad181288cbff9f Merge diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/make/build.xml --- a/nashorn/make/build.xml Wed Jul 05 19:15:04 2017 +0200 +++ b/nashorn/make/build.xml Tue Oct 08 15:00:12 2013 -0700 @@ -236,6 +236,10 @@ + + + + @@ -245,6 +249,7 @@ + diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/make/java.security.override --- a/nashorn/make/java.security.override Wed Jul 05 19:15:04 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -# We would like to avoid references from anywhere outside nashorn -# to codegen, IR and parser packages, in particular script generated classes. -# We ensure that by overriding "package.access" security property. - -# The following "package.access" value was copied from default java.security -# of jre/lib/security and appended with nashorn sensitive packages. - -# -# List of comma-separated packages that start with or equal this string -# will cause a security exception to be thrown when -# passed to checkPackageAccess unless the -# corresponding RuntimePermission ("accessClassInPackage."+package) has -# been granted. -package.access=sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.org.apache.xerces.internal.utils.,com.sun.org.apache.xalan.internal.utils.,com.sun.org.glassfish.external.,com.sun.org.glassfish.gmbal.,jdk.internal.,jdk.nashorn.internal.,jdk.nashorn.tools. diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/make/project.properties --- a/nashorn/make/project.properties Wed Jul 05 19:15:04 2017 +0200 +++ b/nashorn/make/project.properties Tue Oct 08 15:00:12 2013 -0700 @@ -234,7 +234,7 @@ #-XX:-UseCompressedKlassPointers -XX:+PrintHeapAtGC -XX:ClassMetaspaceSize=300M run.test.jvmargs.octane.main=${run.test.jvmargs.common} -run.test.jvmsecurityargs=-Xverify:all -Djava.security.properties=${basedir}/make/java.security.override -Djava.security.manager -Djava.security.policy=${basedir}/build/nashorn.policy +run.test.jvmsecurityargs=-Xverify:all -Djava.security.manager -Djava.security.policy=${basedir}/build/nashorn.policy # VM options for script tests with @fork option test-sys-prop.test.fork.jvm.options=${run.test.jvmargs.main} -Xmx${run.test.xmx} ${run.test.jvmsecurityargs} diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/src/jdk/nashorn/api/scripting/NashornScriptEngine.java --- a/nashorn/src/jdk/nashorn/api/scripting/NashornScriptEngine.java Wed Jul 05 19:15:04 2017 +0200 +++ b/nashorn/src/jdk/nashorn/api/scripting/NashornScriptEngine.java Tue Oct 08 15:00:12 2013 -0700 @@ -313,7 +313,7 @@ if (! Modifier.isPublic(clazz.getModifiers())) { throw new SecurityException(getMessage("implementing.non.public.interface", clazz.getName())); } - Context.checkPackageAccess(clazz.getName()); + Context.checkPackageAccess(clazz); } ScriptObject realSelf = null; diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/src/jdk/nashorn/internal/codegen/Attr.java --- a/nashorn/src/jdk/nashorn/internal/codegen/Attr.java Wed Jul 05 19:15:04 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/codegen/Attr.java Tue Oct 08 15:00:12 2013 -0700 @@ -1082,24 +1082,6 @@ private boolean enterAssignmentNode(final BinaryNode binaryNode) { start(binaryNode); - final Node lhs = binaryNode.lhs(); - - if (lhs instanceof IdentNode) { - final Block block = lc.getCurrentBlock(); - final IdentNode ident = (IdentNode)lhs; - final String name = ident.getName(); - - Symbol symbol = findSymbol(block, name); - - if (symbol == null) { - symbol = defineSymbol(block, name, IS_GLOBAL); - } else { - maybeForceScope(symbol); - } - - addLocalDef(name); - } - return true; } @@ -1112,20 +1094,33 @@ * @param binaryNode assignment node */ private Node leaveAssignmentNode(final BinaryNode binaryNode) { - BinaryNode newBinaryNode = binaryNode; - final Expression lhs = binaryNode.lhs(); final Expression rhs = binaryNode.rhs(); final Type type; + if (lhs instanceof IdentNode) { + final Block block = lc.getCurrentBlock(); + final IdentNode ident = (IdentNode)lhs; + final String name = ident.getName(); + final Symbol symbol = findSymbol(block, name); + + if (symbol == null) { + defineSymbol(block, name, IS_GLOBAL); + } else { + maybeForceScope(symbol); + } + + addLocalDef(name); + } + if (rhs.getType().isNumeric()) { - type = Type.widest(binaryNode.lhs().getType(), binaryNode.rhs().getType()); + type = Type.widest(lhs.getType(), rhs.getType()); } else { type = Type.OBJECT; //force lhs to be an object if not numeric assignment, e.g. strings too. } newType(lhs.getSymbol(), type); - return end(ensureSymbol(type, newBinaryNode)); + return end(ensureSymbol(type, binaryNode)); } private boolean isLocal(FunctionNode function, Symbol symbol) { diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java --- a/nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java Wed Jul 05 19:15:04 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java Tue Oct 08 15:00:12 2013 -0700 @@ -1827,6 +1827,8 @@ } if (cases.isEmpty()) { + // still evaluate expression for side-effects. + load(expression).pop(); method.label(breakLabel); return false; } @@ -1956,7 +1958,7 @@ final Expression expression = throwNode.getExpression(); final int position = throwNode.position(); - final int line = source.getLine(position); + final int line = throwNode.getLineNumber(); final int column = source.getColumn(position); load(expression); diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/src/jdk/nashorn/internal/codegen/FoldConstants.java --- a/nashorn/src/jdk/nashorn/internal/codegen/FoldConstants.java Wed Jul 05 19:15:04 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/codegen/FoldConstants.java Tue Oct 08 15:00:12 2013 -0700 @@ -88,8 +88,8 @@ @Override public Node leaveIfNode(final IfNode ifNode) { final Node test = ifNode.getTest(); - if (test instanceof LiteralNode) { - final Block shortCut = ((LiteralNode)test).isTrue() ? ifNode.getPass() : ifNode.getFail(); + if (test instanceof LiteralNode.PrimitiveLiteralNode) { + final Block shortCut = ((LiteralNode.PrimitiveLiteralNode)test).isTrue() ? ifNode.getPass() : ifNode.getFail(); if (shortCut != null) { return new BlockStatement(ifNode.getLineNumber(), shortCut); } @@ -101,8 +101,8 @@ @Override public Node leaveTernaryNode(final TernaryNode ternaryNode) { final Node test = ternaryNode.getTest(); - if (test instanceof LiteralNode) { - return ((LiteralNode)test).isTrue() ? ternaryNode.getTrueExpression() : ternaryNode.getFalseExpression(); + if (test instanceof LiteralNode.PrimitiveLiteralNode) { + return ((LiteralNode.PrimitiveLiteralNode)test).isTrue() ? ternaryNode.getTrueExpression() : ternaryNode.getFalseExpression(); } return ternaryNode; } diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/src/jdk/nashorn/internal/ir/IdentNode.java --- a/nashorn/src/jdk/nashorn/internal/ir/IdentNode.java Wed Jul 05 19:15:04 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/ir/IdentNode.java Tue Oct 08 15:00:12 2013 -0700 @@ -40,9 +40,10 @@ */ @Immutable public final class IdentNode extends Expression implements PropertyKey, TypeOverride, FunctionCall { - private static final int PROPERTY_NAME = 1 << 0; - private static final int INITIALIZED_HERE = 1 << 1; - private static final int FUNCTION = 1 << 2; + private static final int PROPERTY_NAME = 1 << 0; + private static final int INITIALIZED_HERE = 1 << 1; + private static final int FUNCTION = 1 << 2; + private static final int FUTURESTRICT_NAME = 1 << 3; /** Identifier. */ private final String name; @@ -197,6 +198,25 @@ } /** + * Check if this IdentNode is a future strict name + * @return true if this is a future strict name + */ + public boolean isFutureStrictName() { + return (flags & FUTURESTRICT_NAME) != 0; + } + + /** + * Flag this IdentNode as a future strict name + * @return a node equivalent to this one except for the requested change. + */ + public IdentNode setIsFutureStrictName() { + if (isFutureStrictName()) { + return this; + } + return new IdentNode(this, name, callSiteType, flags | FUTURESTRICT_NAME); + } + + /** * Helper function for local def analysis. * @return true if IdentNode is initialized on creation */ diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/src/jdk/nashorn/internal/ir/LexicalContext.java --- a/nashorn/src/jdk/nashorn/internal/ir/LexicalContext.java Wed Jul 05 19:15:04 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/ir/LexicalContext.java Tue Oct 08 15:00:12 2013 -0700 @@ -587,11 +587,11 @@ final FunctionNode fn = (FunctionNode)node; final Source source = fn.getSource(); String src = source.toString(); - if (src.indexOf(File.pathSeparator) != -1) { + if (src.contains(File.pathSeparator)) { src = src.substring(src.lastIndexOf(File.pathSeparator)); } src += ' '; - src += source.getLine(fn.getStart()); + src += fn.getLineNumber(); sb.append(src); } sb.append(' '); diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/src/jdk/nashorn/internal/ir/LiteralNode.java --- a/nashorn/src/jdk/nashorn/internal/ir/LiteralNode.java Wed Jul 05 19:15:04 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/ir/LiteralNode.java Tue Oct 08 15:00:12 2013 -0700 @@ -96,14 +96,6 @@ return value == null; } - /** - * Check if the literal value is boolean true - * @return true if literal value is boolean true - */ - public boolean isTrue() { - return JSType.toBoolean(value); - } - @Override public Type getType() { return Type.typeFor(value.getClass()); @@ -259,8 +251,31 @@ return new NullLiteralNode(parent.getToken(), parent.getFinish()); } + /** + * Super class for primitive (side-effect free) literals. + * + * @param the literal type + */ + public static class PrimitiveLiteralNode extends LiteralNode { + private PrimitiveLiteralNode(final long token, final int finish, final T value) { + super(token, finish, value); + } + + private PrimitiveLiteralNode(final PrimitiveLiteralNode literalNode) { + super(literalNode); + } + + /** + * Check if the literal value is boolean true + * @return true if literal value is boolean true + */ + public boolean isTrue() { + return JSType.toBoolean(value); + } + } + @Immutable - private static final class BooleanLiteralNode extends LiteralNode { + private static final class BooleanLiteralNode extends PrimitiveLiteralNode { private BooleanLiteralNode(final long token, final int finish, final boolean value) { super(Token.recast(token, value ? TokenType.TRUE : TokenType.FALSE), finish, value); @@ -312,7 +327,7 @@ } @Immutable - private static final class NumberLiteralNode extends LiteralNode { + private static final class NumberLiteralNode extends PrimitiveLiteralNode { private final Type type = numberGetType(value); @@ -374,7 +389,7 @@ return new NumberLiteralNode(parent.getToken(), parent.getFinish(), value); } - private static class UndefinedLiteralNode extends LiteralNode { + private static class UndefinedLiteralNode extends PrimitiveLiteralNode { private UndefinedLiteralNode(final long token, final int finish) { super(Token.recast(token, TokenType.OBJECT), finish, ScriptRuntime.UNDEFINED); } @@ -410,7 +425,7 @@ } @Immutable - private static class StringLiteralNode extends LiteralNode { + private static class StringLiteralNode extends PrimitiveLiteralNode { private StringLiteralNode(final long token, final int finish, final String value) { super(Token.recast(token, TokenType.STRING), finish, value); } @@ -522,7 +537,7 @@ return POSTSET_MARKER; } - private static final class NullLiteralNode extends LiteralNode { + private static final class NullLiteralNode extends PrimitiveLiteralNode { private NullLiteralNode(final long token, final int finish) { super(Token.recast(token, TokenType.OBJECT), finish, null); diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/src/jdk/nashorn/internal/objects/NativeArray.java --- a/nashorn/src/jdk/nashorn/internal/objects/NativeArray.java Wed Jul 05 19:15:04 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/objects/NativeArray.java Tue Oct 08 15:00:12 2013 -0700 @@ -819,8 +819,15 @@ if (bulkable(sobj)) { sobj.getArray().shiftLeft(1); } else { + boolean hasPrevious = true; for (long k = 1; k < len; k++) { - sobj.set(k - 1, sobj.get(k), true); + boolean hasCurrent = sobj.has(k); + if (hasCurrent) { + sobj.set(k - 1, sobj.get(k), true); + } else if (hasPrevious) { + sobj.delete(k - 1, true); + } + hasPrevious = hasCurrent; } } sobj.delete(--len, true); @@ -860,9 +867,12 @@ return new NativeArray(sobj.getArray().slice(k, finale)); } - final NativeArray copy = new NativeArray(0); + // Construct array with proper length to have a deleted filter on undefined elements + final NativeArray copy = new NativeArray(finale - k); for (long n = 0; k < finale; n++, k++) { - copy.defineOwnProperty(ArrayIndex.getArrayIndex(n), sobj.get(k)); + if (sobj.has(k)) { + copy.defineOwnProperty(ArrayIndex.getArrayIndex(n), sobj.get(k)); + } } return copy; diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/src/jdk/nashorn/internal/objects/NativeError.java --- a/nashorn/src/jdk/nashorn/internal/objects/NativeError.java Wed Jul 05 19:15:04 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/objects/NativeError.java Tue Oct 08 15:00:12 2013 -0700 @@ -37,10 +37,12 @@ import jdk.nashorn.internal.objects.annotations.Property; import jdk.nashorn.internal.objects.annotations.ScriptClass; import jdk.nashorn.internal.objects.annotations.Where; +import jdk.nashorn.internal.objects.ScriptFunctionImpl; import jdk.nashorn.internal.runtime.ECMAException; import jdk.nashorn.internal.runtime.JSType; import jdk.nashorn.internal.runtime.PropertyMap; import jdk.nashorn.internal.runtime.ScriptObject; +import jdk.nashorn.internal.runtime.ScriptFunction; import jdk.nashorn.internal.runtime.ScriptRuntime; /** @@ -138,7 +140,10 @@ Global.checkObject(errorObj); final ScriptObject sobj = (ScriptObject)errorObj; final ECMAException exp = new ECMAException(sobj, null); - sobj.set("stack", getScriptStackString(sobj, exp), false); + sobj.delete("stack", false); + final ScriptFunction getStack = ScriptFunctionImpl.makeFunction("getStack", GET_STACK); + final ScriptFunction setStack = ScriptFunctionImpl.makeFunction("setStack", SET_STACK); + sobj.addOwnProperty("stack", Attribute.NOT_ENUMERABLE, getStack, setStack); return UNDEFINED; } diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/src/jdk/nashorn/internal/objects/NativeFunction.java --- a/nashorn/src/jdk/nashorn/internal/objects/NativeFunction.java Wed Jul 05 19:15:04 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/objects/NativeFunction.java Tue Oct 08 15:00:12 2013 -0700 @@ -221,6 +221,7 @@ final StringBuilder sb = new StringBuilder(); sb.append("(function ("); + final String funcBody; if (args.length > 0) { final StringBuilder paramListBuf = new StringBuilder(); for (int i = 0; i < args.length - 1; i++) { @@ -230,15 +231,20 @@ } } + // now convert function body to a string + funcBody = JSType.toString(args[args.length - 1]); + final String paramList = paramListBuf.toString(); if (! paramList.isEmpty()) { checkFunctionParameters(paramList); sb.append(paramList); } + } else { + funcBody = null; } + sb.append(") {\n"); if (args.length > 0) { - final String funcBody = JSType.toString(args[args.length - 1]); checkFunctionBody(funcBody); sb.append(funcBody); sb.append('\n'); diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/src/jdk/nashorn/internal/parser/AbstractParser.java --- a/nashorn/src/jdk/nashorn/internal/parser/AbstractParser.java Wed Jul 05 19:15:04 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/parser/AbstractParser.java Tue Oct 08 15:00:12 2013 -0700 @@ -378,7 +378,7 @@ next(); // Create IDENT node. - return new IdentNode(identToken, finish, ident); + return new IdentNode(identToken, finish, ident).setIsFutureStrictName(); } // Get IDENT. diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/src/jdk/nashorn/internal/parser/Parser.java --- a/nashorn/src/jdk/nashorn/internal/parser/Parser.java Wed Jul 05 19:15:04 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/parser/Parser.java Tue Oct 08 15:00:12 2013 -0700 @@ -909,6 +909,10 @@ default: break; } + + if (ident.isFutureStrictName()) { + throw error(AbstractParser.message("strict.name", ident.getName(), contextString), ident.getToken()); + } } } @@ -2436,7 +2440,7 @@ // name is null, generate anonymous name boolean isAnonymous = false; if (name == null) { - final String tmpName = "_L" + source.getLine(Token.descPosition(token)); + final String tmpName = "_L" + functionLine; name = new IdentNode(functionToken, Token.descPosition(functionToken), tmpName); isAnonymous = true; } diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/src/jdk/nashorn/internal/runtime/CompiledFunction.java --- a/nashorn/src/jdk/nashorn/internal/runtime/CompiledFunction.java Wed Jul 05 19:15:04 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/runtime/CompiledFunction.java Tue Oct 08 15:00:12 2013 -0700 @@ -48,6 +48,7 @@ } CompiledFunction(final MethodType type, final MethodHandle invoker, final MethodHandle constructor) { + assert type != null; this.type = type; this.invoker = invoker; this.constructor = constructor; @@ -80,7 +81,37 @@ @Override public int compareTo(final CompiledFunction o) { - return weight() - o.weight(); + return compareMethodTypes(type(), o.type()); + } + + private static int compareMethodTypes(final MethodType ownType, final MethodType otherType) { + // Comparable interface demands that compareTo() should only return 0 if objects are equal. + // Failing to meet this requirement causes same weight functions to replace each other in TreeSet, + // so we go some lengths to come up with an ordering between same weight functions, + // first falling back to parameter count and then to hash code. + if (ownType.equals(otherType)) { + return 0; + } + + final int diff = weight(ownType) - weight(otherType); + if (diff != 0) { + return diff; + } + if (ownType.parameterCount() != otherType.parameterCount()) { + return ownType.parameterCount() - otherType.parameterCount(); + } + // We're just interested in not returning 0 here, not correct ordering + return ownType.hashCode() - otherType.hashCode(); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof CompiledFunction && type().equals(((CompiledFunction)obj).type()); + } + + @Override + public int hashCode() { + return type().hashCode(); } private int weight() { @@ -119,14 +150,14 @@ * a semantically equivalent linkage can be performed. * * @param mt type to check against - * @return + * @return true if types are compatible */ boolean typeCompatible(final MethodType mt) { - final Class[] wantedParams = mt.parameterArray(); - final Class[] existingParams = type().parameterArray(); + final int wantedParamCount = mt.parameterCount(); + final int existingParamCount = type.parameterCount(); //if we are not examining a varargs type, the number of parameters must be the same - if (wantedParams.length != existingParams.length && !isVarArgsType(mt)) { + if (wantedParamCount != existingParamCount && !isVarArgsType(mt)) { return false; } @@ -134,10 +165,10 @@ //parameters lengths do not match is if our type ends with a varargs argument. //then every trailing parameter in the given callsite can be folded into it, making //us compatible (albeit slower than a direct specialization) - final int lastParamIndex = Math.min(wantedParams.length, existingParams.length); + final int lastParamIndex = Math.min(wantedParamCount, existingParamCount); for (int i = 0; i < lastParamIndex; i++) { - final Type w = Type.typeFor(wantedParams[i]); - final Type e = Type.typeFor(existingParams[i]); + final Type w = Type.typeFor(mt.parameterType(i)); + final Type e = Type.typeFor(type.parameterType(i)); //don't specialize on booleans, we have the "true" vs int 1 ambiguity in resolution //we also currently don't support boolean as a javascript function callsite type. diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/src/jdk/nashorn/internal/runtime/Context.java --- a/nashorn/src/jdk/nashorn/internal/runtime/Context.java Wed Jul 05 19:15:04 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/runtime/Context.java Tue Oct 08 15:00:12 2013 -0700 @@ -91,6 +91,11 @@ */ public static final String NASHORN_JAVA_REFLECTION = "nashorn.JavaReflection"; + // nashorn load psuedo URL prefixes + private static final String LOAD_CLASSPATH = "classpath:"; + private static final String LOAD_FX = "fx:"; + private static final String LOAD_NASHORN = "nashorn:"; + /* Force DebuggerSupport to be loaded. */ static { DebuggerSupport.FORCELOAD = true; @@ -501,21 +506,26 @@ // or a ScriptObject that has "name" and "source" (string valued) properties. if (src instanceof String) { final String srcStr = (String)src; - final File file = new File(srcStr); - if (srcStr.indexOf(':') != -1) { - if ((source = loadInternal(srcStr, "nashorn:", "resources/")) == null && - (source = loadInternal(srcStr, "fx:", "resources/fx/")) == null) { - URL url; - try { - //check for malformed url. if malformed, it may still be a valid file - url = new URL(srcStr); - } catch (final MalformedURLException e) { - url = file.toURI().toURL(); + if (srcStr.startsWith(LOAD_CLASSPATH)) { + URL url = getResourceURL(srcStr.substring(LOAD_CLASSPATH.length())); + source = (url != null)? new Source(url.toString(), url) : null; + } else { + final File file = new File(srcStr); + if (srcStr.indexOf(':') != -1) { + if ((source = loadInternal(srcStr, LOAD_NASHORN, "resources/")) == null && + (source = loadInternal(srcStr, LOAD_FX, "resources/fx/")) == null) { + URL url; + try { + //check for malformed url. if malformed, it may still be a valid file + url = new URL(srcStr); + } catch (final MalformedURLException e) { + url = file.toURI().toURL(); + } + source = new Source(url.toString(), url); } - source = new Source(url.toString(), url); + } else if (file.isFile()) { + source = new Source(srcStr, file); } - } else if (file.isFile()) { - source = new Source(srcStr, file); } } else if (src instanceof File && ((File)src).isFile()) { final File file = (File)src; @@ -610,36 +620,53 @@ } /** - * Checks that the given package can be accessed from no permissions context. + * Checks that the given Class can be accessed from no permissions context. * - * @param fullName fully qualified package name + * @param clazz Class object * @throw SecurityException if not accessible */ - public static void checkPackageAccess(final String fullName) { - final int index = fullName.lastIndexOf('.'); - if (index != -1) { - final SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - AccessController.doPrivileged(new PrivilegedAction() { - @Override - public Void run() { - sm.checkPackageAccess(fullName.substring(0, index)); - return null; - } - }, NO_PERMISSIONS_ACC_CTXT); + public static void checkPackageAccess(final Class clazz) { + final SecurityManager sm = System.getSecurityManager(); + if (sm != null) { + Class bottomClazz = clazz; + while(bottomClazz.isArray()) { + bottomClazz = bottomClazz.getComponentType(); } + checkPackageAccess(sm, bottomClazz.getName()); } } /** * Checks that the given package can be accessed from no permissions context. * + * @param sm current security manager instance * @param fullName fully qualified package name + * @throw SecurityException if not accessible + */ + private static void checkPackageAccess(final SecurityManager sm, final String fullName) { + sm.getClass(); // null check + final int index = fullName.lastIndexOf('.'); + if (index != -1) { + final String pkgName = fullName.substring(0, index); + AccessController.doPrivileged(new PrivilegedAction() { + @Override + public Void run() { + sm.checkPackageAccess(pkgName); + return null; + } + }, NO_PERMISSIONS_ACC_CTXT); + } + } + + /** + * Checks that the given Class can be accessed from no permissions context. + * + * @param clazz Class object * @return true if package is accessible, false otherwise */ - public static boolean isAccessiblePackage(final String fullName) { + private static boolean isAccessiblePackage(final Class clazz) { try { - checkPackageAccess(fullName); + checkPackageAccess(clazz); return true; } catch (final SecurityException se) { return false; @@ -653,7 +680,7 @@ * @return true if Class is accessible, false otherwise */ public static boolean isAccessibleClass(final Class clazz) { - return Modifier.isPublic(clazz.getModifiers()) && Context.isAccessiblePackage(clazz.getName()); + return Modifier.isPublic(clazz.getModifiers()) && Context.isAccessiblePackage(clazz); } /** @@ -667,8 +694,16 @@ * @throws ClassNotFoundException if class cannot be resolved */ public Class findClass(final String fullName) throws ClassNotFoundException { + if (fullName.indexOf('[') != -1 || fullName.indexOf('/') != -1) { + // don't allow array class names or internal names. + throw new ClassNotFoundException(fullName); + } + // check package access as soon as possible! - checkPackageAccess(fullName); + final SecurityManager sm = System.getSecurityManager(); + if (sm != null) { + checkPackageAccess(sm, fullName); + } // try the script -classpath loader, if that is set if (classPathLoader != null) { @@ -803,6 +838,18 @@ return Context.getContextTrusted(); } + private URL getResourceURL(final String resName) throws IOException { + // try the classPathLoader if we have and then + // try the appLoader if non-null. + if (classPathLoader != null) { + return classPathLoader.getResource(resName); + } else if (appLoader != null) { + return appLoader.getResource(resName); + } + + return null; + } + private Object evaluateSource(final Source source, final ScriptObject scope, final ScriptObject thiz) { ScriptFunction script = null; diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/src/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java --- a/nashorn/src/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java Wed Jul 05 19:15:04 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java Tue Oct 08 15:00:12 2013 -0700 @@ -132,7 +132,7 @@ if (source != null) { sb.append(source.getName()) .append(':') - .append(source.getLine(Token.descPosition(token))) + .append(functionNode.getLineNumber()) .append(' '); } diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/src/jdk/nashorn/internal/runtime/Source.java --- a/nashorn/src/jdk/nashorn/internal/runtime/Source.java Wed Jul 05 19:15:04 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/runtime/Source.java Tue Oct 08 15:00:12 2013 -0700 @@ -272,6 +272,10 @@ /** * Return line number of character position. + * + *

This method can be expensive for large sources as it iterates through + * all characters up to {@code position}.

+ * * @param position Position of character in source content. * @return Line number. */ diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/src/jdk/nashorn/internal/runtime/linker/JavaAdapterFactory.java --- a/nashorn/src/jdk/nashorn/internal/runtime/linker/JavaAdapterFactory.java Wed Jul 05 19:15:04 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/runtime/linker/JavaAdapterFactory.java Tue Oct 08 15:00:12 2013 -0700 @@ -109,7 +109,7 @@ if (sm != null) { for (Class type : types) { // check for restricted package access - Context.checkPackageAccess(type.getName()); + Context.checkPackageAccess(type); } } return getAdapterInfo(types).getAdapterClassFor(classOverrides); diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/src/jdk/nashorn/internal/runtime/linker/NashornStaticClassLinker.java --- a/nashorn/src/jdk/nashorn/internal/runtime/linker/NashornStaticClassLinker.java Wed Jul 05 19:15:04 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/runtime/linker/NashornStaticClassLinker.java Tue Oct 08 15:00:12 2013 -0700 @@ -70,7 +70,7 @@ // We intercept "new" on StaticClass instances to provide additional capabilities if ("new".equals(desc.getNameToken(CallSiteDescriptor.OPERATOR))) { // make sure new is on accessible Class - Context.checkPackageAccess(receiverClass.getName()); + Context.checkPackageAccess(receiverClass); // Is the class abstract? (This includes interfaces.) if (NashornLinker.isAbstractClass(receiverClass)) { diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/src/jdk/nashorn/internal/runtime/resources/fx/base.js --- a/nashorn/src/jdk/nashorn/internal/runtime/resources/fx/base.js Wed Jul 05 19:15:04 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/runtime/resources/fx/base.js Tue Oct 08 15:00:12 2013 -0700 @@ -33,7 +33,6 @@ var JFX_SWT_CLASSES = []; function LOAD_FX_CLASSES(clsList) { - for each (var cls in clsList) { // Ex. Stage = Java.type("javafx.stage.Stage"); this[cls[cls.length - 1]] = Java.type(cls.join(".")); @@ -146,3 +145,5 @@ } } })(); + +LOAD_FX_CLASSES(JFX_BASE_CLASSES); diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/test/script/basic/JDK-8023026.js --- a/nashorn/test/script/basic/JDK-8023026.js Wed Jul 05 19:15:04 2017 +0200 +++ b/nashorn/test/script/basic/JDK-8023026.js Tue Oct 08 15:00:12 2013 -0700 @@ -48,7 +48,7 @@ function(x) x*x)); } -var array = new (Java.type("[I"))(4); +var array = new (Java.type("int[]"))(4); for (var i in array) { array[i] = i; } diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/test/script/basic/JDK-8025213.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8025213.js Tue Oct 08 15:00:12 2013 -0700 @@ -0,0 +1,39 @@ +/* + * 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-8025213: Assignment marks variable as defined too early + * + * @test + * @run + */ + +function test() { + if (String("")) { + var foo = 42; + } + foo = foo + 1; + print(foo); +} + +test(); diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/test/script/basic/JDK-8025213.js.EXPECTED --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8025213.js.EXPECTED Tue Oct 08 15:00:12 2013 -0700 @@ -0,0 +1,1 @@ +NaN diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/test/script/basic/JDK-8025488.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8025488.js Tue Oct 08 15:00:12 2013 -0700 @@ -0,0 +1,43 @@ +/* + * 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-8025488: Error.captureStackTrace should not format error stack + * + * @test + * @run + */ + + +function MyError () { + Error.call(this); + Error.captureStackTrace(this); + this.arr = {}; +}; + +MyError.prototype.toString = function() { + return this.arr.toString(); +} + +var e = new MyError(); +print(e.stack); diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/test/script/basic/JDK-8025488.js.EXPECTED --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8025488.js.EXPECTED Tue Oct 08 15:00:12 2013 -0700 @@ -0,0 +1,3 @@ +[object Object] + at MyError (test/script/basic/JDK-8025488.js:34) + at (test/script/basic/JDK-8025488.js:42) diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/test/script/basic/JDK-8025515.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8025515.js Tue Oct 08 15:00:12 2013 -0700 @@ -0,0 +1,58 @@ +/* + * 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-8025515: Performance issues with Source.getLine() + * + * @test + * @run + */ + +// Make sure synthetic names of anonymous functions have correct line numbers + +function testMethodName(f, expected) { + try { + f(); + fail("expected error"); + } catch (e) { + var stack = e.getStackTrace(); + if (stack[0].methodName !== expected) { + fail("got " + stack[0].methodName + ", expected " + expected); + } + } +} + +testMethodName(function() { + return a.b.c; +}, "_L45"); + +testMethodName(function() { throw new Error() }, "_L49"); + +var f = (function() { + return function() { a.b.c; }; +})(); +testMethodName(f, "_L51$_L52"); + +testMethodName((function() { + return function() { return a.b.c; }; +})(), "_L56$_L57"); diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/test/script/basic/JDK-8025520.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8025520.js Tue Oct 08 15:00:12 2013 -0700 @@ -0,0 +1,50 @@ +/* + * 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-8025520: Array.prototype.slice should only copy defined elements + * + * @test + * @run + */ + +var s = Array.prototype.slice.call({length: 6, 3: 1}, 2, 5); + +if (s.length != 3) { + fail("s.length != 3"); +} +if (0 in s) { + fail("0 in s"); +} +if (s.hasOwnProperty(0)) { + fail("s.hasOwnProperty(0)"); +} +if (s[1] !== 1) { + fail("s[1] !== 1"); +} +if (2 in s) { + fail("2 in s"); +} +if (s.hasOwnProperty(2)) { + fail("s.hasOwnProperty(2)"); +} diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/test/script/basic/JDK-8025589.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8025589.js Tue Oct 08 15:00:12 2013 -0700 @@ -0,0 +1,51 @@ +/* + * 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-8025589: Array.prototype.shift should only copy defined elements in generic mode + * + * @test + * @run + */ + +var s = {length: 4, 2: 1}; +Array.prototype.shift.call(s); + +if (s.length != 3) { + fail("s.length != 3"); +} +if (0 in s) { + fail("0 in s"); +} +if (s.hasOwnProperty(0)) { + fail("s.hasOwnProperty(0)"); +} +if (s[1] !== 1) { + fail("s[1] !== 1"); +} +if (2 in s) { + fail("2 in s"); +} +if (s.hasOwnProperty(2)) { + fail("s.hasOwnProperty(2)"); +} diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/test/script/basic/JDK-8026033.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8026033.js Tue Oct 08 15:00:12 2013 -0700 @@ -0,0 +1,39 @@ +/* + * 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-8026033: Switch should load expression even when there are no cases in it + * + * @test + * @run + */ + +try { + (function() { switch(x) {} })(); + fail("Should have thrown ReferenceError"); +} catch (e) { + if (! (e instanceof ReferenceError)) { + fail("ReferenceError expected, got " + e); + } + print(e); +} diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/test/script/basic/JDK-8026033.js.EXPECTED --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8026033.js.EXPECTED Tue Oct 08 15:00:12 2013 -0700 @@ -0,0 +1,1 @@ +ReferenceError: "x" is not defined diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/test/script/basic/JDK-8026042.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8026042.js Tue Oct 08 15:00:12 2013 -0700 @@ -0,0 +1,43 @@ +/* + * 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-8026042: FoldConstants need to guard against ArrayLiteralNode + * + * @test + * @run + */ + +try { + if ([a]) { + print("fail"); + } +} catch (e) { + print(e); +} + +try { + [a] ? print(1) : print(2); +} catch (e) { + print(e); +} diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/test/script/basic/JDK-8026042.js.EXPECTED --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8026042.js.EXPECTED Tue Oct 08 15:00:12 2013 -0700 @@ -0,0 +1,2 @@ +ReferenceError: "a" is not defined +ReferenceError: "a" is not defined diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/test/script/basic/JDK-8026048.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8026048.js Tue Oct 08 15:00:12 2013 -0700 @@ -0,0 +1,37 @@ +/* + * 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-8026048: Function constructor should convert arguments to String before performing any syntax checks + * + * @test + * @run + */ + +try { + Function("-", {toString:function(){throw "err"}}) +} catch (e) { + if (e !== "err") { + fail("err xpected, got " + e); + } +} diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/test/script/error/JDK-8026039.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/error/JDK-8026039.js Tue Oct 08 15:00:12 2013 -0700 @@ -0,0 +1,32 @@ +/* + * 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-8026039: future strict names are allowed as function name and argument name of a strict function + * + * @test/compile-error + */ + +function public() {"use strict"} + +function f(public) {"use strict"} diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/test/script/error/JDK-8026039.js.EXPECTED --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/error/JDK-8026039.js.EXPECTED Tue Oct 08 15:00:12 2013 -0700 @@ -0,0 +1,9 @@ +test/script/error/JDK-8026039.js:30:9 "public" cannot be used as function name in strict mode +function public() {"use strict"} + ^ +test/script/error/JDK-8026039.js:32:11 Expected ident but found public +function f(public) {"use strict"} + ^ +test/script/error/JDK-8026039.js:33:0 Expected } but found eof + +^ diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/test/script/sandbox/arrayclass.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/sandbox/arrayclass.js Tue Oct 08 15:00:12 2013 -0700 @@ -0,0 +1,37 @@ +/* + * 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. + */ + +/** + * Try to access array class of a sensitive class like Unsafe. + * + * @test + * @security + * @run + */ + +try { + var unsafeArr = Java.type("[Lsun.misc.Unsafe;"); + fail("No Exception for [Lsun.misc.Unsafe;"); +} catch (e) { + print(e); +} diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/test/script/sandbox/arrayclass.js.EXPECTED --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/sandbox/arrayclass.js.EXPECTED Tue Oct 08 15:00:12 2013 -0700 @@ -0,0 +1,1 @@ +java.lang.ClassNotFoundException: [Lsun.misc.Unsafe; diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/test/script/trusted/JDK-8025629.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/trusted/JDK-8025629.js Tue Oct 08 15:00:12 2013 -0700 @@ -0,0 +1,33 @@ +/* + * 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-8025629: load function should support a way to load scripts from classpath + * + * @test + * @run + */ + +load("classpath:jdk/nashorn/internal/runtime/resources/load_test.js") + +Assert.assertEquals(loadedFunc("hello"), "HELLO"); diff -r b9a0f6c693f3 -r 2b9685a87b37 nashorn/test/src/jdk/nashorn/internal/runtime/resources/load_test.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/src/jdk/nashorn/internal/runtime/resources/load_test.js Tue Oct 08 15:00:12 2013 -0700 @@ -0,0 +1,28 @@ +/* + * 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ + +function loadedFunc(arg) { + return arg.toUpperCase(); +}