Mercurial > hg > shenandoah-preopenjdk-archive > openjdk8 > nashorn
changeset 1104:4191f598c8ff
Merge
author | lana |
---|---|
date | Wed, 26 Nov 2014 13:57:43 -0800 |
parents | ed60257f2060 (current diff) ac111e4cb1dc (diff) |
children | d8bb6c470778 |
files | |
diffstat | 40 files changed, 1410 insertions(+), 273 deletions(-) [+] |
line wrap: on
line diff
--- a/src/jdk/nashorn/internal/codegen/AssignSymbols.java Wed Nov 26 08:00:20 2014 -0800 +++ b/src/jdk/nashorn/internal/codegen/AssignSymbols.java Wed Nov 26 13:57:43 2014 -0800 @@ -356,6 +356,10 @@ throwParserException(ECMAErrors.getMessage("syntax.error.redeclare.variable", name), origin); } else { symbol.setHasBeenDeclared(); + // Set scope flag on top-level block scoped symbols + if (function.isProgram() && function.getBody() == block) { + symbol.setIsScope(); + } } } else if ((flags & IS_INTERNAL) != 0) { // Always create a new definition. @@ -540,7 +544,7 @@ final int flags; if (varNode.isAnonymousFunctionDeclaration()) { flags = IS_INTERNAL; - } else if (lc.getCurrentFunction().isProgram()) { + } else if (!varNode.isBlockScoped() && lc.getCurrentFunction().isProgram()) { flags = IS_SCOPE; } else { flags = 0;
--- a/src/jdk/nashorn/internal/codegen/MapCreator.java Wed Nov 26 08:00:20 2014 -0800 +++ b/src/jdk/nashorn/internal/codegen/MapCreator.java Wed Nov 26 13:57:43 2014 -0800 @@ -152,6 +152,10 @@ flags |= Property.NOT_WRITABLE; } + if (symbol.isBlockScoped()) { + flags |= Property.IS_LEXICAL_BINDING; + } + // Mark symbol as needing declaration. Access before declaration will throw a ReferenceError. if (symbol.isBlockScoped() && symbol.isScope()) { flags |= Property.NEEDS_DECLARATION;
--- a/src/jdk/nashorn/internal/objects/Global.java Wed Nov 26 08:00:20 2014 -0800 +++ b/src/jdk/nashorn/internal/objects/Global.java Wed Nov 26 13:57:43 2014 -0800 @@ -34,6 +34,7 @@ import java.io.PrintWriter; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.lang.invoke.SwitchPoint; import java.lang.reflect.Field; import java.util.ArrayList; @@ -44,6 +45,7 @@ import java.util.concurrent.ConcurrentHashMap; import javax.script.ScriptContext; import javax.script.ScriptEngine; +import jdk.internal.dynalink.CallSiteDescriptor; import jdk.internal.dynalink.linker.GuardedInvocation; import jdk.internal.dynalink.linker.LinkRequest; import jdk.nashorn.api.scripting.ClassFilter; @@ -54,6 +56,8 @@ 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; import jdk.nashorn.internal.runtime.GlobalFunctions; import jdk.nashorn.internal.runtime.JSType; import jdk.nashorn.internal.runtime.NativeJavaPackage; @@ -69,6 +73,7 @@ import jdk.nashorn.internal.runtime.arrays.ArrayData; import jdk.nashorn.internal.runtime.linker.Bootstrap; import jdk.nashorn.internal.runtime.linker.InvokeByName; +import jdk.nashorn.internal.runtime.linker.NashornCallSiteDescriptor; import jdk.nashorn.internal.runtime.regexp.RegExpResult; import jdk.nashorn.internal.scripts.JO; @@ -410,13 +415,14 @@ // Used to store the last RegExp result to support deprecated RegExp constructor properties private RegExpResult lastRegExpResult; - private static final MethodHandle EVAL = findOwnMH_S("eval", Object.class, Object.class, Object.class); - private static final MethodHandle NO_SUCH_PROPERTY = findOwnMH_S(NO_SUCH_PROPERTY_NAME, Object.class, Object.class, Object.class); - private static final MethodHandle PRINT = findOwnMH_S("print", Object.class, Object.class, Object[].class); - private static final MethodHandle PRINTLN = findOwnMH_S("println", Object.class, Object.class, Object[].class); - private static final MethodHandle LOAD = findOwnMH_S("load", Object.class, Object.class, Object.class); - private static final MethodHandle LOADWITHNEWGLOBAL = findOwnMH_S("loadWithNewGlobal", Object.class, Object.class, Object[].class); - private static final MethodHandle EXIT = findOwnMH_S("exit", Object.class, Object.class, Object.class); + private static final MethodHandle EVAL = findOwnMH_S("eval", Object.class, Object.class, Object.class); + private static final MethodHandle NO_SUCH_PROPERTY = findOwnMH_S(NO_SUCH_PROPERTY_NAME, Object.class, Object.class, Object.class); + private static final MethodHandle PRINT = findOwnMH_S("print", Object.class, Object.class, Object[].class); + private static final MethodHandle PRINTLN = findOwnMH_S("println", Object.class, Object.class, Object[].class); + private static final MethodHandle LOAD = findOwnMH_S("load", Object.class, Object.class, Object.class); + private static final MethodHandle LOAD_WITH_NEW_GLOBAL = findOwnMH_S("loadWithNewGlobal", Object.class, Object.class, Object[].class); + private static final MethodHandle EXIT = findOwnMH_S("exit", Object.class, Object.class, Object.class); + private static final MethodHandle LEXICAL_SCOPE_FILTER = findOwnMH_S("lexicalScopeFilter", Object.class, Object.class); // initialized by nasgen private static PropertyMap $nasgenmap$; @@ -429,6 +435,12 @@ // current ScriptEngine associated - can be null. private ScriptEngine engine; + // ES6 global lexical scope. + private final LexicalScope lexicalScope; + + // Switchpoint for non-constant global callsites in the presence of ES6 lexical scope. + private SwitchPoint lexicalScopeSwitchPoint; + /** * Set the current script context * @param scontext script context @@ -466,6 +478,7 @@ super(checkAndGetMap(context)); this.context = context; this.setIsScope(); + this.lexicalScope = context.getEnv()._es6 ? new LexicalScope(this) : null; } /** @@ -1694,6 +1707,133 @@ splitState = state; } + /** + * Return the ES6 global scope for lexically declared bindings. + * @return the ES6 lexical global scope. + */ + public final ScriptObject getLexicalScope() { + assert context.getEnv()._es6; + return lexicalScope; + } + + @Override + public void addBoundProperties(final ScriptObject source, final jdk.nashorn.internal.runtime.Property[] properties) { + PropertyMap ownMap = getMap(); + LexicalScope lexicalScope = null; + PropertyMap lexicalMap = null; + boolean hasLexicalDefinitions = false; + + if (context.getEnv()._es6) { + lexicalScope = (LexicalScope) getLexicalScope(); + lexicalMap = lexicalScope.getMap(); + + for (final jdk.nashorn.internal.runtime.Property property : properties) { + if (property.isLexicalBinding()) { + hasLexicalDefinitions = true; + } + // ES6 15.1.8 steps 6. and 7. + final jdk.nashorn.internal.runtime.Property globalProperty = ownMap.findProperty(property.getKey()); + if (globalProperty != null && !globalProperty.isConfigurable() && property.isLexicalBinding()) { + throw ECMAErrors.syntaxError("redeclare.variable", property.getKey()); + } + final jdk.nashorn.internal.runtime.Property lexicalProperty = lexicalMap.findProperty(property.getKey()); + if (lexicalProperty != null && !property.isConfigurable()) { + throw ECMAErrors.syntaxError("redeclare.variable", property.getKey()); + } + } + } + + for (final jdk.nashorn.internal.runtime.Property property : properties) { + if (property.isLexicalBinding()) { + assert lexicalScope != null; + lexicalMap = lexicalScope.addBoundProperty(lexicalMap, source, property); + + if (ownMap.findProperty(property.getKey()) != null) { + // If property exists in the global object invalidate any global constant call sites. + invalidateGlobalConstant(property.getKey()); + } + } else { + ownMap = addBoundProperty(ownMap, source, property); + } + } + + setMap(ownMap); + + if (hasLexicalDefinitions) { + lexicalScope.setMap(lexicalMap); + invalidateLexicalSwitchPoint(); + } + } + + @Override + public GuardedInvocation findGetMethod(final CallSiteDescriptor desc, final LinkRequest request, final String operator) { + final String name = desc.getNameToken(CallSiteDescriptor.NAME_OPERAND); + final boolean isScope = NashornCallSiteDescriptor.isScope(desc); + + if (lexicalScope != null && isScope && !NashornCallSiteDescriptor.isApplyToCall(desc)) { + if (lexicalScope.hasOwnProperty(name)) { + return lexicalScope.findGetMethod(desc, request, operator); + } + } + + final GuardedInvocation invocation = super.findGetMethod(desc, request, operator); + + // We want to avoid adding our generic lexical scope switchpoint to global constant invocations, + // because those are invalidated per-key in the addBoundProperties method above. + // We therefor check if the invocation does already have a switchpoint and the property is non-inherited, + // assuming this only applies to global constants. If other non-inherited properties will + // start using switchpoints some time in the future we'll have to revisit this. + if (isScope && context.getEnv()._es6 && (invocation.getSwitchPoints() == null || !hasOwnProperty(name))) { + return invocation.addSwitchPoint(getLexicalScopeSwitchPoint()); + } + + return invocation; + } + + @Override + public GuardedInvocation findSetMethod(final CallSiteDescriptor desc, final LinkRequest request) { + final boolean isScope = NashornCallSiteDescriptor.isScope(desc); + + if (lexicalScope != null && isScope) { + final String name = desc.getNameToken(CallSiteDescriptor.NAME_OPERAND); + if (lexicalScope.hasOwnProperty(name)) { + return lexicalScope.findSetMethod(desc, request); + } + } + + final GuardedInvocation invocation = super.findSetMethod(desc, request); + + if (isScope && context.getEnv()._es6) { + return invocation.addSwitchPoint(getLexicalScopeSwitchPoint()); + } + + return invocation; + } + + private synchronized SwitchPoint getLexicalScopeSwitchPoint() { + SwitchPoint switchPoint = lexicalScopeSwitchPoint; + if (switchPoint == null || switchPoint.hasBeenInvalidated()) { + switchPoint = lexicalScopeSwitchPoint = new SwitchPoint(); + } + return switchPoint; + } + + private synchronized void invalidateLexicalSwitchPoint() { + if (lexicalScopeSwitchPoint != null) { + context.getLogger(GlobalConstants.class).info("Invalidating non-constant globals on lexical scope update"); + SwitchPoint.invalidateAll(new SwitchPoint[]{ lexicalScopeSwitchPoint }); + } + } + + + @SuppressWarnings("unused") + private static Object lexicalScopeFilter(final Object self) { + if (self instanceof Global) { + return ((Global) self).getLexicalScope(); + } + return self; + } + private <T extends ScriptObject> T initConstructorAndSwitchPoint(final String name, final Class<T> clazz) { final T func = initConstructor(name, clazz); tagBuiltinProperties(name, func); @@ -1739,7 +1879,7 @@ this.unescape = ScriptFunctionImpl.makeFunction("unescape", GlobalFunctions.UNESCAPE); this.print = ScriptFunctionImpl.makeFunction("print", env._print_no_newline ? PRINT : PRINTLN); this.load = ScriptFunctionImpl.makeFunction("load", LOAD); - this.loadWithNewGlobal = ScriptFunctionImpl.makeFunction("loadWithNewGlobal", LOADWITHNEWGLOBAL); + this.loadWithNewGlobal = ScriptFunctionImpl.makeFunction("loadWithNewGlobal", LOAD_WITH_NEW_GLOBAL); this.exit = ScriptFunctionImpl.makeFunction("exit", EXIT); this.quit = ScriptFunctionImpl.makeFunction("quit", EXIT); @@ -2205,4 +2345,36 @@ protected boolean isGlobal() { return true; } + + /** + * A class representing the ES6 global lexical scope. + */ + private static class LexicalScope extends ScriptObject { + + LexicalScope(final ScriptObject proto) { + super(proto, PropertyMap.newMap()); + } + + @Override + protected GuardedInvocation findGetMethod(final CallSiteDescriptor desc, final LinkRequest request, final String operator) { + return filterInvocation(super.findGetMethod(desc, request, operator)); + } + + @Override + protected GuardedInvocation findSetMethod(final CallSiteDescriptor desc, final LinkRequest request) { + return filterInvocation(super.findSetMethod(desc, request)); + } + + @Override + protected PropertyMap addBoundProperty(final PropertyMap propMap, final ScriptObject source, final jdk.nashorn.internal.runtime.Property property) { + // We override this method just to make it callable by Global + return super.addBoundProperty(propMap, source, property); + } + + private static GuardedInvocation filterInvocation(final GuardedInvocation invocation) { + final MethodType type = invocation.getInvocation().type(); + return invocation.asType(type.changeParameterType(0, Object.class)).filterArguments(0, LEXICAL_SCOPE_FILTER); + } + } + }
--- a/src/jdk/nashorn/internal/parser/Parser.java Wed Nov 26 08:00:20 2014 -0800 +++ b/src/jdk/nashorn/internal/parser/Parser.java Wed Nov 26 13:57:43 2014 -0800 @@ -707,20 +707,9 @@ FunctionNode.Kind.SCRIPT, functionLine); - // If ES6 block scope is enabled add a per-script block for top-level LET and CONST declarations. - final int startLine = start; - Block outer = useBlockScope() ? newBlock() : null; functionDeclarations = new ArrayList<>(); - - try { - sourceElements(allowPropertyFunction); - addFunctionDeclarations(script); - } finally { - if (outer != null) { - outer = restoreBlock(outer); - appendStatement(new BlockStatement(startLine, outer)); - } - } + sourceElements(allowPropertyFunction); + addFunctionDeclarations(script); functionDeclarations = null; expect(EOF);
--- a/src/jdk/nashorn/internal/runtime/CodeStore.java Wed Nov 26 08:00:20 2014 -0800 +++ b/src/jdk/nashorn/internal/runtime/CodeStore.java Wed Nov 26 13:57:43 2014 -0800 @@ -82,10 +82,9 @@ * Returns a new code store instance. * * @param context the current context - * @return The instance - * @throws IOException If an error occurs + * @return The instance, or null if code store could not be created */ - public static CodeStore newCodeStore(final Context context) throws IOException { + public static CodeStore newCodeStore(final Context context) { final Class<CodeStore> baseClass = CodeStore.class; try { // security check first @@ -103,9 +102,14 @@ } catch (final AccessControlException e) { context.getLogger(CodeStore.class).warning("failed to load code store provider ", e); } - final CodeStore store = new DirectoryCodeStore(context); - store.initLogger(context); - return store; + try { + final CodeStore store = new DirectoryCodeStore(context); + store.initLogger(context); + return store; + } catch (final IOException e) { + context.getLogger(CodeStore.class).warning("failed to create cache directory ", e); + return null; + } }
--- a/src/jdk/nashorn/internal/runtime/Context.java Wed Nov 26 08:00:20 2014 -0800 +++ b/src/jdk/nashorn/internal/runtime/Context.java Wed Nov 26 13:57:43 2014 -0800 @@ -509,11 +509,7 @@ } if (env._persistent_cache) { - try { - codeStore = newCodeStore(this); - } catch (final IOException e) { - throw new RuntimeException("Error initializing code cache", e); - } + codeStore = newCodeStore(this); } // print version info if asked. @@ -1200,7 +1196,7 @@ FunctionNode functionNode = null; // We only use the code store here if optimistic types are disabled. With optimistic types, initial compilation // just creates a thin wrapper, and actual code is stored per function in RecompilableScriptFunctionData. - final boolean useCodeStore = env._persistent_cache && !env._parse_only && !env._optimistic_types; + final boolean useCodeStore = codeStore != null && !env._parse_only && !env._optimistic_types; final String cacheKey = useCodeStore ? CodeStore.getCacheKey(0, null) : null; if (useCodeStore) {
--- a/src/jdk/nashorn/internal/runtime/Property.java Wed Nov 26 08:00:20 2014 -0800 +++ b/src/jdk/nashorn/internal/runtime/Property.java Wed Nov 26 13:57:43 2014 -0800 @@ -84,14 +84,17 @@ public static final int IS_NASGEN_PRIMITIVE = 1 << 6; /** Is this a builtin property, e.g. Function.prototype.apply */ - public static final int IS_BUILTIN = 1 << 7; + public static final int IS_BUILTIN = 1 << 7; /** Is this property bound to a receiver? This means get/set operations will be delegated to * a statically defined object instead of the object passed as callsite parameter. */ - public static final int IS_BOUND = 1 << 7; + public static final int IS_BOUND = 1 << 8; /** Is this a lexically scoped LET or CONST variable that is dead until it is declared. */ - public static final int NEEDS_DECLARATION = 1 << 8; + public static final int NEEDS_DECLARATION = 1 << 9; + + /** Is this property an ES6 lexical binding? */ + public static final int IS_LEXICAL_BINDING = 1 << 10; /** Property key. */ private final String key; @@ -714,4 +717,12 @@ public boolean isFunctionDeclaration() { return (flags & IS_FUNCTION_DECLARATION) == IS_FUNCTION_DECLARATION; } + + /** + * Is this a property defined by ES6 let or const? + * @return true if this property represents a lexical binding. + */ + public boolean isLexicalBinding() { + return (flags & IS_LEXICAL_BINDING) == IS_LEXICAL_BINDING; + } }
--- a/src/jdk/nashorn/internal/runtime/ScriptObject.java Wed Nov 26 08:00:20 2014 -0800 +++ b/src/jdk/nashorn/internal/runtime/ScriptObject.java Wed Nov 26 13:57:43 2014 -0800 @@ -304,29 +304,44 @@ PropertyMap newMap = this.getMap(); for (final Property property : properties) { - final String key = property.getKey(); - final Property oldProp = newMap.findProperty(key); - if (oldProp == null) { - if (property instanceof UserAccessorProperty) { - // Note: we copy accessor functions to this object which is semantically different from binding. - final UserAccessorProperty prop = this.newUserAccessors(key, property.getFlags(), property.getGetterFunction(source), property.getSetterFunction(source)); - newMap = newMap.addPropertyNoHistory(prop); - } else { - newMap = newMap.addPropertyBind((AccessorProperty)property, source); - } + newMap = addBoundProperty(newMap, source, property); + } + + this.setMap(newMap); + } + + /** + * Add a bound property from {@code source}, using the interim property map {@code propMap}, and return the + * new interim property map. + * + * @param propMap the property map + * @param source the source object + * @param property the property to be added + * @return the new property map + */ + protected PropertyMap addBoundProperty(final PropertyMap propMap, final ScriptObject source, final Property property) { + PropertyMap newMap = propMap; + final String key = property.getKey(); + final Property oldProp = newMap.findProperty(key); + if (oldProp == null) { + if (property instanceof UserAccessorProperty) { + // Note: we copy accessor functions to this object which is semantically different from binding. + final UserAccessorProperty prop = this.newUserAccessors(key, property.getFlags(), property.getGetterFunction(source), property.getSetterFunction(source)); + newMap = newMap.addPropertyNoHistory(prop); } else { - // See ECMA section 10.5 Declaration Binding Instantiation - // step 5 processing each function declaration. - if (property.isFunctionDeclaration() && !oldProp.isConfigurable()) { - if (oldProp instanceof UserAccessorProperty || - !(oldProp.isWritable() && oldProp.isEnumerable())) { - throw typeError("cant.redefine.property", key, ScriptRuntime.safeToString(this)); - } + newMap = newMap.addPropertyBind((AccessorProperty)property, source); + } + } else { + // See ECMA section 10.5 Declaration Binding Instantiation + // step 5 processing each function declaration. + if (property.isFunctionDeclaration() && !oldProp.isConfigurable()) { + if (oldProp instanceof UserAccessorProperty || + !(oldProp.isWritable() && oldProp.isEnumerable())) { + throw typeError("cant.redefine.property", key, ScriptRuntime.safeToString(this)); } } } - - this.setMap(newMap); + return newMap; } /** @@ -510,7 +525,11 @@ } } - private void invalidateGlobalConstant(final String key) { + /** + * Invalidate any existing global constant method handles that may exist for {@code key}. + * @param key the property name + */ + protected void invalidateGlobalConstant(final String key) { final GlobalConstants globalConstants = getGlobalConstants(); if (globalConstants != null) { globalConstants.delete(key);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/JDK-8049407-big-endian.js Wed Nov 26 13:57:43 2014 -0800 @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2010, 2014, 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. + */ + +/** + * Verify DataView behavior with little/big endian + * + * @test + * @run + * @bigendian + */ + +var dir = typeof(__DIR__) == 'undefined' ? "test/script/basic/" : __DIR__; +load(dir + "JDK-8049407-payload.js");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/JDK-8049407-big-endian.js.EXPECTED Wed Nov 26 13:57:43 2014 -0800 @@ -0,0 +1,1 @@ +false
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/JDK-8049407-payload.js Wed Nov 26 13:57:43 2014 -0800 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2010, 2014, 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. + */ + +/** + * Verify DataView behavior with little/big endian + * + * @subtest + * @run + */ + +var littleEndian = (function() { + var buffer = new ArrayBuffer(2); + new DataView(buffer).setInt16(0, 256, true); + return new Int16Array(buffer)[0] === 256; + })(); + +print(littleEndian);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/JDK-8049407.js Wed Nov 26 13:57:43 2014 -0800 @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2010, 2014, 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. + */ + +/** + * Verify DataView behavior with little/big endian + * + * @test + * @run + * @littleendian + */ + +var dir = typeof(__DIR__) == 'undefined' ? "test/script/basic/" : __DIR__; +load(dir + "JDK-8049407-payload.js");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/JDK-8049407.js.EXPECTED Wed Nov 26 13:57:43 2014 -0800 @@ -0,0 +1,1 @@ +true
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/NASHORN-377-big-endian.js Wed Nov 26 13:57:43 2014 -0800 @@ -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. + */ + +/* + * NASHORN-377: Typed arrays. + * + * @test + * @run + * @bigendian + */ + +var dir = typeof(__DIR__) == 'undefined' ? "test/script/basic/" : __DIR__; +load(dir + "NASHORN-377-payload.js");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/NASHORN-377-big-endian.js.EXPECTED Wed Nov 26 13:57:43 2014 -0800 @@ -0,0 +1,34 @@ +8 8 true undefined +[object ArrayBuffer] [object ArrayBuffer] [object Int8Array] +0 8 8 1 +0 8 8 1 +0 8 8 1 +0 8 4 2 +0 8 4 2 +0 8 2 4 +0 8 2 4 +0 8 2 4 +0 8 1 8 +7071727374-807677 7071727374807677 +727374-807677 2 6 +72737480 2 4 +71727374 1 4 +717273748076 +7071727374807677 1886483059 1954575991 +70717273-1020305 1886483059 -16909061 +70717273fefdfcfb 1886483059 4278058235 +40490fdafefdfcfb 2 +400921fb4d12d84a 1 +400921fb4d12d84a 1074340347 1293080650 +00000000400921fb4d12d84a +400921fb4d12-27b6 400921fb4d12d84a +00-100804d12-27b6 ffff00804d12d84a +0 1 2 3 4 5 6 7 +0102030405060708 +subarray(2,4)=0304 subarray(-6,-4)=0304 +010203040506 +03040506 0405 +0102030405060708090a0b0c0d0e0f10 +slice(4,8)=05060708 slice(-8,-4)=090a0b0c +0102030405060708090a0b0c +060708090a0b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/NASHORN-377-payload.js Wed Nov 26 13:57:43 2014 -0800 @@ -0,0 +1,226 @@ +/* + * 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. + */ + +/* + * NASHORN-377: Typed arrays. Payload for litte and big endian platforms. + * + * @subtest + * @run + */ + +var types = [Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array]; + +//--------------------------------------------------------------------------- +// utility functions +//--------------------------------------------------------------------------- +function tohex(d, w) { + var hex = Number(d).toString(16); + var pad = (w ? w : 8) - hex.length; + hex = "00000000".substr(0, pad) + hex; + return hex; +} + +function arrstr(a, n, w) { + var s = ""; + if (typeof n == "undefined") n = a.length; + if (typeof w == "undefined") w = a.constructor.BYTES_PER_ELEMENT * 2; + for (var i = 0; i < n; i++) { + s += tohex(a[i], w); + } + return s; +} +function bufstr(b) { + if (b.buffer !== undefined) { + b = b.buffer; + } + return arrstr(new Uint8Array(b)); +} + +function assertFail(f) { + try { + f(); + } catch (e) { + //print(e); + return; + } + throw "assertion failed: expected exception"; +} + +function assertTrue(f) { + if (f() !== true) throw "assertion failed: " + f; +} + +function isUndefined(x) { + return typeof x === "undefined"; +} + +function fillArray(a, start) { + if (typeof start == "undefined") start = 1; + for (var i = 0; i < a.length; i++) { + a[i] = i + start; + } + return a; +} + +//--------------------------------------------------------------------------- +// tests +//--------------------------------------------------------------------------- +(function() { + var b = new ArrayBuffer(8); + var i8 = new Int8Array(b); + print(i8.buffer.byteLength, b.byteLength, i8.buffer === b, b.length); + print(b, i8.buffer, i8); +})(); + +(function test_attributes() { + var b = new ArrayBuffer(8); + for (var i in types) { + var x = new types[i](b); + print(x.byteOffset, x.byteLength, x.length, x.constructor.BYTES_PER_ELEMENT); + assertTrue(function(){ return x.constructor === types[i] }); + } +})(); + +(function() { + var b = new ArrayBuffer(8); + var i8 = new Int8Array(b); + fillArray(i8, 0x70); + + var i8_2 = new Int8Array(b, 2); + var i8_2_4 = new Uint8Array(b, 2, 4); + + i8_2_4[3] = 0x80; + + print(arrstr(i8, 8, 2) + " " + bufstr(i8)); + print(arrstr(i8_2, 6) + " " + i8_2.byteOffset + " " + i8_2.byteLength); + print(arrstr(i8_2_4, 4) + " " + i8_2_4.byteOffset + " " + i8_2_4.byteLength); + + var i8_1_5 = i8.subarray(1, 5); + i8_2_4.subarray(1, 5); + print(arrstr(i8_1_5, 4) + " " + i8_1_5.byteOffset + " " + i8_1_5.byteLength); + + print(bufstr(b.slice(1,7))); +})(); + +(function() { + var b = new ArrayBuffer(8); + fillArray(new Int8Array(b), 0x70); + new Int8Array(b)[5] = 0x80; + + var i32 = new Int32Array(b); + var u32 = new Uint32Array(b); + print(arrstr(i32), i32[0], i32[1]); + i32[1] = 0xfefdfcfb; + print(arrstr(i32), i32[0], i32[1]); + print(arrstr(u32), u32[0], u32[1]); + + var pi = 3.1415926; + var f32 = new Float32Array(b); + var f64 = new Float64Array(b); + f32[0] = pi; + print(bufstr(b), f32.length); + f64[0] = pi; + print(bufstr(b), f64.length); + print(arrstr(u32), u32[0], u32[1]); + + var d = new Int32Array(3); + d.set(i32,1); + print(bufstr(d)); + + var s = new Int16Array(b); + var t = new Uint16Array(b); + print(arrstr(s), arrstr(t)); + s[0] = -1; s[1] = 0x80; + print(arrstr(s), arrstr(t)); +})(); + +(function enumerate_properties() { + var i8 = new Int8Array(new ArrayBuffer(8)); + var s = ""; for (var i in i8) { s += i + " "; } print(s.trim()); +})(); + +// check that ScriptObject fallback is still working +// DISABLED because correct behavior is unclear +(function() { + // NB: firefox will never set any out-of-bounds or non-array values although it does get both from prototype. + var z = new Uint8Array(4); + z["asdf"] = "asdf"; print(z["asdf"]); + z[0x100000000] = "asdf"; print(z[0x100000000]); + z[-1] = "asdf"; print(z[-1]); + + // v8 and nashorn disagree on out-of-bounds uint32 indices: v8 won't go to the prototype. + z[0xf0000000] = "asdf"; print(z[0xf0000000]); + z[0xffffffff] = "asdf"; print(z[0xffffffff]); + z[0x70000000] = "asdf"; print(z[0x70000000]); + + // this will work in firefox and nashorn (not in v8). + Uint8Array.prototype[4] = "asdf"; print(z[4]); +}); + +(function test_exceptions() { + assertFail(function() { new Int32Array(new ArrayBuffer(7)); }); + assertFail(function() { new Int32Array(new ArrayBuffer(8), 0, 4); }); + assertFail(function() { new Int32Array(new ArrayBuffer(8),-1, 2); }); + assertFail(function() { new Int32Array(new ArrayBuffer(8), 0,-1); }); +})(); + +(function test_subarray() { + var x = fillArray(new Int8Array(8)); + print(arrstr(x)); + print("subarray(2,4)=" + arrstr(x.subarray(2, 4)), "subarray(-6,-4)=" + arrstr(x.subarray(-6, -4))); // negative index refers from the end of the array + print(arrstr(x.subarray(-10, -2))); // negative index clamped to 0 + assertTrue(function(){ return arrstr(x.subarray(6, 4)) === ""; }); // negative length clamped to 0 + print(arrstr(x.subarray(1,-1).subarray(1,-1)), arrstr(x.subarray(1,-1).subarray(1,-1).subarray(1,-1))); // subarray of subarray +})(); + +(function test_slice() { + var b = new ArrayBuffer(16); + fillArray(new Int8Array(b)); + print(bufstr(b)); + print("slice(4,8)=" + bufstr(b.slice(4, 8)), "slice(-8,-4)=" + bufstr(b.slice(-8, -4))); // negative index refers from the end of the array + print(bufstr(b.slice(-20, -4))); // negative index clamped to 0 + assertTrue(function(){ return bufstr(b.slice(8, 4)) === ""; }); // negative length clamped to 0 + print(arrstr(new Int16Array(b.slice(1,-1).slice(2,-1).slice(1,-2).slice(1,-1)))); // slice of slice +})(); + +(function test_clamped() { + var a = new Uint8ClampedArray(10); + a[0] = -17; // clamped to 0 + a[1] = 4711; // clamped to 255 + a[2] = 17.5; // clamped to 18 + a[3] = 16.5; // clamped to 16 + a[4] = 255.9; // clamped to 255 + a[5] = Infinity; // clamped to 255 + a[6] = -Infinity; // clamped to 0 + a[7] = NaN; // 0 + assertTrue(function(){ return a[0] === 0 && a[1] === 255 && a[2] === 18 && a[3] === 16 && a[4] === 255 && a[5] === 255 && a[6] === 0 && a[7] === 0; }); +})(); + +(function test_out_of_bounds() { + var a = new Int32Array(10); + a[10] = 10; + a[100] = 100; + a[1000] = 1000; + assertTrue(function(){ return isUndefined(a[10]) && isUndefined(a[11]) && isUndefined(a[100]) && isUndefined(a[123]) && isUndefined(a[1000]); }); +})(); +
--- a/test/script/basic/NASHORN-377.js Wed Nov 26 08:00:20 2014 -0800 +++ b/test/script/basic/NASHORN-377.js Wed Nov 26 13:57:43 2014 -0800 @@ -26,201 +26,8 @@ * * @test * @run + * @littleendian */ -var types = [Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array]; - -//--------------------------------------------------------------------------- -// utility functions -//--------------------------------------------------------------------------- -function tohex(d, w) { - var hex = Number(d).toString(16); - var pad = (w ? w : 8) - hex.length; - hex = "00000000".substr(0, pad) + hex; - return hex; -} - -function arrstr(a, n, w) { - var s = ""; - if (typeof n == "undefined") n = a.length; - if (typeof w == "undefined") w = a.constructor.BYTES_PER_ELEMENT * 2; - for (var i = 0; i < n; i++) { - s += tohex(a[i], w); - } - return s; -} -function bufstr(b) { - if (b.buffer !== undefined) { - b = b.buffer; - } - return arrstr(new Uint8Array(b)); -} - -function assertFail(f) { - try { - f(); - } catch (e) { - //print(e); - return; - } - throw "assertion failed: expected exception"; -} - -function assertTrue(f) { - if (f() !== true) throw "assertion failed: " + f; -} - -function isUndefined(x) { - return typeof x === "undefined"; -} - -function fillArray(a, start) { - if (typeof start == "undefined") start = 1; - for (var i = 0; i < a.length; i++) { - a[i] = i + start; - } - return a; -} - -//--------------------------------------------------------------------------- -// tests -//--------------------------------------------------------------------------- -(function() { - var b = new ArrayBuffer(8); - var i8 = new Int8Array(b); - print(i8.buffer.byteLength, b.byteLength, i8.buffer === b, b.length); - print(b, i8.buffer, i8); -})(); - -(function test_attributes() { - var b = new ArrayBuffer(8); - for (var i in types) { - var x = new types[i](b); - print(x.byteOffset, x.byteLength, x.length, x.constructor.BYTES_PER_ELEMENT); - assertTrue(function(){ return x.constructor === types[i] }); - } -})(); - -(function() { - var b = new ArrayBuffer(8); - var i8 = new Int8Array(b); - fillArray(i8, 0x70); - - var i8_2 = new Int8Array(b, 2); - var i8_2_4 = new Uint8Array(b, 2, 4); - - i8_2_4[3] = 0x80; - - print(arrstr(i8, 8, 2) + " " + bufstr(i8)); - print(arrstr(i8_2, 6) + " " + i8_2.byteOffset + " " + i8_2.byteLength); - print(arrstr(i8_2_4, 4) + " " + i8_2_4.byteOffset + " " + i8_2_4.byteLength); - - var i8_1_5 = i8.subarray(1, 5); - i8_2_4.subarray(1, 5); - print(arrstr(i8_1_5, 4) + " " + i8_1_5.byteOffset + " " + i8_1_5.byteLength); - - print(bufstr(b.slice(1,7))); -})(); - -(function() { - var b = new ArrayBuffer(8); - fillArray(new Int8Array(b), 0x70); - new Int8Array(b)[5] = 0x80; - - var i32 = new Int32Array(b); - var u32 = new Uint32Array(b); - print(arrstr(i32), i32[0], i32[1]); - i32[1] = 0xfefdfcfb; - print(arrstr(i32), i32[0], i32[1]); - print(arrstr(u32), u32[0], u32[1]); - - var pi = 3.1415926; - var f32 = new Float32Array(b); - var f64 = new Float64Array(b); - f32[0] = pi; - print(bufstr(b), f32.length); - f64[0] = pi; - print(bufstr(b), f64.length); - print(arrstr(u32), u32[0], u32[1]); - - var d = new Int32Array(3); - d.set(i32,1); - print(bufstr(d)); - - var s = new Int16Array(b); - var t = new Uint16Array(b); - print(arrstr(s), arrstr(t)); - s[0] = -1; s[1] = 0x80; - print(arrstr(s), arrstr(t)); -})(); - -(function enumerate_properties() { - var i8 = new Int8Array(new ArrayBuffer(8)); - var s = ""; for (var i in i8) { s += i + " "; } print(s.trim()); -})(); - -// check that ScriptObject fallback is still working -// DISABLED because correct behavior is unclear -(function() { - // NB: firefox will never set any out-of-bounds or non-array values although it does get both from prototype. - var z = new Uint8Array(4); - z["asdf"] = "asdf"; print(z["asdf"]); - z[0x100000000] = "asdf"; print(z[0x100000000]); - z[-1] = "asdf"; print(z[-1]); - - // v8 and nashorn disagree on out-of-bounds uint32 indices: v8 won't go to the prototype. - z[0xf0000000] = "asdf"; print(z[0xf0000000]); - z[0xffffffff] = "asdf"; print(z[0xffffffff]); - z[0x70000000] = "asdf"; print(z[0x70000000]); - - // this will work in firefox and nashorn (not in v8). - Uint8Array.prototype[4] = "asdf"; print(z[4]); -}); - -(function test_exceptions() { - assertFail(function() { new Int32Array(new ArrayBuffer(7)); }); - assertFail(function() { new Int32Array(new ArrayBuffer(8), 0, 4); }); - assertFail(function() { new Int32Array(new ArrayBuffer(8),-1, 2); }); - assertFail(function() { new Int32Array(new ArrayBuffer(8), 0,-1); }); -})(); - -(function test_subarray() { - var x = fillArray(new Int8Array(8)); - print(arrstr(x)); - print("subarray(2,4)=" + arrstr(x.subarray(2, 4)), "subarray(-6,-4)=" + arrstr(x.subarray(-6, -4))); // negative index refers from the end of the array - print(arrstr(x.subarray(-10, -2))); // negative index clamped to 0 - assertTrue(function(){ return arrstr(x.subarray(6, 4)) === ""; }); // negative length clamped to 0 - print(arrstr(x.subarray(1,-1).subarray(1,-1)), arrstr(x.subarray(1,-1).subarray(1,-1).subarray(1,-1))); // subarray of subarray -})(); - -(function test_slice() { - var b = new ArrayBuffer(16); - fillArray(new Int8Array(b)); - print(bufstr(b)); - print("slice(4,8)=" + bufstr(b.slice(4, 8)), "slice(-8,-4)=" + bufstr(b.slice(-8, -4))); // negative index refers from the end of the array - print(bufstr(b.slice(-20, -4))); // negative index clamped to 0 - assertTrue(function(){ return bufstr(b.slice(8, 4)) === ""; }); // negative length clamped to 0 - print(arrstr(new Int16Array(b.slice(1,-1).slice(2,-1).slice(1,-2).slice(1,-1)))); // slice of slice -})(); - -(function test_clamped() { - var a = new Uint8ClampedArray(10); - a[0] = -17; // clamped to 0 - a[1] = 4711; // clamped to 255 - a[2] = 17.5; // clamped to 18 - a[3] = 16.5; // clamped to 16 - a[4] = 255.9; // clamped to 255 - a[5] = Infinity; // clamped to 255 - a[6] = -Infinity; // clamped to 0 - a[7] = NaN; // 0 - assertTrue(function(){ return a[0] === 0 && a[1] === 255 && a[2] === 18 && a[3] === 16 && a[4] === 255 && a[5] === 255 && a[6] === 0 && a[7] === 0; }); -})(); - -(function test_out_of_bounds() { - var a = new Int32Array(10); - a[10] = 10; - a[100] = 100; - a[1000] = 1000; - assertTrue(function(){ return isUndefined(a[10]) && isUndefined(a[11]) && isUndefined(a[100]) && isUndefined(a[123]) && isUndefined(a[1000]); }); -})(); - +var dir = typeof(__DIR__) == 'undefined' ? "test/script/basic/" : __DIR__; +load(dir + "NASHORN-377-payload.js");
--- a/test/script/basic/compile-octane-normal.js Wed Nov 26 08:00:20 2014 -0800 +++ b/test/script/basic/compile-octane-normal.js Wed Nov 26 13:57:43 2014 -0800 @@ -38,5 +38,5 @@ */ var fn = __DIR__ + 'compile-octane.js'; -var url = "file://" + fn; -loadWithNewGlobal(new java.net.URL(url)); +var url = new java.io.File(fn).toURL(); +loadWithNewGlobal(url);
--- a/test/script/basic/compile-octane-splitter.js Wed Nov 26 08:00:20 2014 -0800 +++ b/test/script/basic/compile-octane-splitter.js Wed Nov 26 13:57:43 2014 -0800 @@ -40,5 +40,5 @@ */ var fn = __DIR__ + 'compile-octane.js'; -var url = "file://" + fn; -loadWithNewGlobal(new java.net.URL(url)); +var url = new java.io.File(fn).toURL(); +loadWithNewGlobal(url);
--- a/test/script/basic/compile-octane.js Wed Nov 26 08:00:20 2014 -0800 +++ b/test/script/basic/compile-octane.js Wed Nov 26 13:57:43 2014 -0800 @@ -132,7 +132,7 @@ str2 += " processing file: " + file + "..."; print_if_verbose(str2); } - newGlobal.load("file://" + path + file); + newGlobal.load(new java.io.File(path + file).toURL()); } } print("Done.");
--- a/test/script/basic/es6/const-redeclare-extra.js.EXPECTED Wed Nov 26 08:00:20 2014 -0800 +++ b/test/script/basic/es6/const-redeclare-extra.js.EXPECTED Wed Nov 26 13:57:43 2014 -0800 @@ -1,9 +1,9 @@ SyntaxError: test/script/basic/es6/const-redeclare-extra.js#36:8<eval>:3:8 Variable "x" has already been declared var x = {}; ^ -SyntaxError: test/script/basic/es6/const-redeclare-extra.js#36:8<eval>:2:8 Variable "x" has already been declared - var x = 2; - ^ -SyntaxError: test/script/basic/es6/const-redeclare-extra.js#36:8<eval>:2:13 Variable "x" has already been declared - function x () {} - ^ +SyntaxError: test/script/basic/es6/const-redeclare-extra.js#36:8<eval>:3:10 Variable "x" has already been declared + const x = {}; + ^ +SyntaxError: test/script/basic/es6/const-redeclare-extra.js#36:8<eval>:3:10 Variable "x" has already been declared + const x = 5; + ^
--- a/test/script/basic/es6/let-load.js Wed Nov 26 08:00:20 2014 -0800 +++ b/test/script/basic/es6/let-load.js Wed Nov 26 13:57:43 2014 -0800 @@ -26,7 +26,8 @@ * * @test * @run - * @option --language=es6 */ + * @option --language=es6 + */ "use strict";
--- a/test/script/basic/es6/let-load.js.EXPECTED Wed Nov 26 08:00:20 2014 -0800 +++ b/test/script/basic/es6/let-load.js.EXPECTED Wed Nov 26 13:57:43 2014 -0800 @@ -2,7 +2,7 @@ block function print local defs: 20 30 imported var: 1 -ReferenceError: "b" is not defined -ReferenceError: "c" is not defined +imported let: 2 +imported const: 3 top level function ReferenceError: "block" is not defined
--- a/test/script/basic/es6/let-redeclare-extra.js.EXPECTED Wed Nov 26 08:00:20 2014 -0800 +++ b/test/script/basic/es6/let-redeclare-extra.js.EXPECTED Wed Nov 26 13:57:43 2014 -0800 @@ -4,12 +4,12 @@ SyntaxError: test/script/basic/es6/let-redeclare-extra.js#35:8<eval>:3:8 Variable "x" has already been declared var x = 2; ^ -SyntaxError: test/script/basic/es6/let-redeclare-extra.js#35:8<eval>:2:8 Variable "x" has already been declared - var x = 2; +SyntaxError: test/script/basic/es6/let-redeclare-extra.js#35:8<eval>:3:8 Variable "x" has already been declared + let x = undefined; ^ SyntaxError: test/script/basic/es6/let-redeclare-extra.js#35:8<eval>:2:10 Variable "x" has already been declared const x = function (){}; ^ -SyntaxError: test/script/basic/es6/let-redeclare-extra.js#35:8<eval>:3:13 Variable "a" has already been declared - function a () {}; - ^ +SyntaxError: test/script/basic/es6/let-redeclare-extra.js#35:8<eval>:2:8 Variable "a" has already been declared + let a = 2; + ^
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/es6/lexical-toplevel-def.js Wed Nov 26 13:57:43 2014 -0800 @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2014, 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-8057691: Nashorn: let & const declarations are not shared between scripts + * + * @subtest + */ + +var VAR = "VAR"; +let LET = "LET"; +const CONST = "CONST"; +function FUNC() {} +this.GLOBAL = "GLOBAL";
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/es6/lexical-toplevel-print.js Wed Nov 26 13:57:43 2014 -0800 @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2014, 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-8057691: Nashorn: let & const declarations are not shared between scripts + * + * @subtest + */ + +print(VAR); +print(LET); +print(CONST); +print(FUNC); +print(GLOBAL); +print(this.VAR); +print(this.LET); // undefined +print(this.CONST); // undefined +print(this.FUNC); +print(this.GLOBAL); +print("VAR" in this); +print("LET" in this); // false +print("CONST" in this); // false +print("FUNC" in this); +print("GLOBAL" in this); + +try { + LET = LET + "LET"; + CONST = CONST + "CONST"; +} catch (e) { + print(String(e).replace(/\\/g, "/")); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/es6/lexical-toplevel-redeclare-func-on-let.js Wed Nov 26 13:57:43 2014 -0800 @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2014, 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-8057691: Nashorn: let & const declarations are not shared between scripts + * + * @subtest + */ + +function LET() {} +var SHOULD_NOT_EXIST = 10;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/es6/lexical-toplevel-redeclare-let-on-builtin.js Wed Nov 26 13:57:43 2014 -0800 @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2014, 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-8057691: Nashorn: let & const declarations are not shared between scripts + * + * @subtest + */ + +let Object = "LEXICAL BUILTIN";
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/es6/lexical-toplevel-redeclare-let-on-func.js Wed Nov 26 13:57:43 2014 -0800 @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2014, 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-8057691: Nashorn: let & const declarations are not shared between scripts + * + * @subtest + */ + +let FUNC = 10; +var SHOULD_NOT_EXIST = 10;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/es6/lexical-toplevel-redeclare-let-on-global.js Wed Nov 26 13:57:43 2014 -0800 @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2014, 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-8057691: Nashorn: let & const declarations are not shared between scripts + * + * @subtest + */ + +let GLOBAL = "LEXICAL GLOBAL";
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/es6/lexical-toplevel-redeclare-let-on-var.js Wed Nov 26 13:57:43 2014 -0800 @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2014, 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-8057691: Nashorn: let & const declarations are not shared between scripts + * + * @subtest + */ + +let VAR = 10; +var SHOULD_NOT_EXIST = 10;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/es6/lexical-toplevel-redeclare-var-on-let.js Wed Nov 26 13:57:43 2014 -0800 @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2014, 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-8057691: Nashorn: let & const declarations are not shared between scripts + * + * @subtest + */ + +var LET = 10; +var SHOULD_NOT_EXIST = 10;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/es6/lexical-toplevel-redeclare.js Wed Nov 26 13:57:43 2014 -0800 @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2014, 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-8057691: Nashorn: let & const declarations are not shared between scripts + * + * @test + * @run + * @option -scripting + * @option --language=es6 + */ + +load(__DIR__ + "lexical-toplevel-def.js"); + +var global = this; + +function tryIt (code) { + try { + eval(code) + } catch (e) { + print(String(e).replace(/\\/g, "/")) + } +} + +function loadScript(script) { + print(script); + try { + load(__DIR__ + script); + } catch (e) { + print(String(e).replace(/\\/g, "/")); + } + print(VAR); + print(LET); + print(CONST); + print(FUNC); + print(GLOBAL); + print(global.VAR); + print(global.LET); + print(global.CONST); + print(global.FUNC); + print(global.GLOBAL); + try { + print(SHOULD_NOT_EXIST); + } catch (e) { + print(String(e).replace(/\\/g, "/")); + } + print(global.SHOULD_NOT_EXIST); + print(Object); + print(global.Object); + print(); +} + +loadScript("lexical-toplevel-redeclare-var-on-let.js"); +loadScript("lexical-toplevel-redeclare-func-on-let.js"); +loadScript("lexical-toplevel-redeclare-let-on-var.js"); +loadScript("lexical-toplevel-redeclare-let-on-func.js"); +loadScript("lexical-toplevel-redeclare-let-on-builtin.js"); +loadScript("lexical-toplevel-redeclare-let-on-global.js");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/es6/lexical-toplevel-redeclare.js.EXPECTED Wed Nov 26 13:57:43 2014 -0800 @@ -0,0 +1,100 @@ +lexical-toplevel-redeclare-var-on-let.js +SyntaxError: Variable "LET" has already been declared +VAR +LET +CONST +function FUNC() {} +GLOBAL +VAR +undefined +undefined +function FUNC() {} +GLOBAL +ReferenceError: "SHOULD_NOT_EXIST" is not defined +undefined +function Object() { [native code] } +function Object() { [native code] } + +lexical-toplevel-redeclare-func-on-let.js +SyntaxError: Variable "LET" has already been declared +VAR +LET +CONST +function FUNC() {} +GLOBAL +VAR +undefined +undefined +function FUNC() {} +GLOBAL +ReferenceError: "SHOULD_NOT_EXIST" is not defined +undefined +function Object() { [native code] } +function Object() { [native code] } + +lexical-toplevel-redeclare-let-on-var.js +SyntaxError: Variable "VAR" has already been declared +VAR +LET +CONST +function FUNC() {} +GLOBAL +VAR +undefined +undefined +function FUNC() {} +GLOBAL +ReferenceError: "SHOULD_NOT_EXIST" is not defined +undefined +function Object() { [native code] } +function Object() { [native code] } + +lexical-toplevel-redeclare-let-on-func.js +SyntaxError: Variable "FUNC" has already been declared +VAR +LET +CONST +function FUNC() {} +GLOBAL +VAR +undefined +undefined +function FUNC() {} +GLOBAL +ReferenceError: "SHOULD_NOT_EXIST" is not defined +undefined +function Object() { [native code] } +function Object() { [native code] } + +lexical-toplevel-redeclare-let-on-builtin.js +VAR +LET +CONST +function FUNC() {} +GLOBAL +VAR +undefined +undefined +function FUNC() {} +GLOBAL +ReferenceError: "SHOULD_NOT_EXIST" is not defined +undefined +LEXICAL BUILTIN +function Object() { [native code] } + +lexical-toplevel-redeclare-let-on-global.js +VAR +LET +CONST +function FUNC() {} +LEXICAL GLOBAL +VAR +undefined +undefined +function FUNC() {} +GLOBAL +ReferenceError: "SHOULD_NOT_EXIST" is not defined +undefined +LEXICAL BUILTIN +function Object() { [native code] } +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/es6/lexical-toplevel.js Wed Nov 26 13:57:43 2014 -0800 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2014, 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-8057691: Nashorn: let & const declarations are not shared between scripts + * + * @test + * @run + * @option --language=es6 + */ + +load(__DIR__ + "lexical-toplevel-def.js"); + +load(__DIR__ + "lexical-toplevel-print.js"); +load(__DIR__ + "lexical-toplevel-print.js");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/es6/lexical-toplevel.js.EXPECTED Wed Nov 26 13:57:43 2014 -0800 @@ -0,0 +1,30 @@ +VAR +LET +CONST +function FUNC() {} +GLOBAL +VAR +undefined +undefined +function FUNC() {} +GLOBAL +true +false +false +true +true +VAR +LETLET +CONST +function FUNC() {} +GLOBAL +VAR +undefined +undefined +function FUNC() {} +GLOBAL +true +false +false +true +true
--- a/test/script/nosecurity/JDK-8050964.js Wed Nov 26 08:00:20 2014 -0800 +++ b/test/script/nosecurity/JDK-8050964.js Wed Nov 26 13:57:43 2014 -0800 @@ -50,6 +50,7 @@ var jdepsPath = javahome + "/../bin/jdeps".replaceAll(/\//g, File.separater); // run jdep on nashorn.jar - only summary but print profile info +$ENV.PWD=System.getProperty("user.dir") // to avoid RE on Cygwin `${jdepsPath} -s -P ${nashornJar.absolutePath}` // check for "(compact1)" in output from jdep tool
--- a/test/script/nosecurity/JDK-8055034.js Wed Nov 26 08:00:20 2014 -0800 +++ b/test/script/nosecurity/JDK-8055034.js Wed Nov 26 13:57:43 2014 -0800 @@ -49,7 +49,7 @@ var jjsCmd = javahome + "/../bin/jjs"; jjsCmd += " -J-Djava.ext.dirs=" + nashornJarDir; jjsCmd = jjsCmd.toString().replaceAll(/\//g, File.separater); - +$ENV.PWD=System.getProperty("user.dir") // to avoid RE on Cygwin $EXEC(jjsCmd, "var x = Object.create(null);\nx;\nprint('PASSED');\nexit(0)"); // $ERR has all interactions including prompts! Just check for error substring.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/src/jdk/nashorn/internal/runtime/LexicalBindingTest.java Wed Nov 26 13:57:43 2014 -0800 @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2014, 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. + */ + +package jdk.nashorn.internal.runtime; + +import jdk.nashorn.api.scripting.NashornScriptEngineFactory; +import org.testng.annotations.Test; + +import javax.script.Bindings; +import javax.script.ScriptContext; +import javax.script.ScriptEngine; +import javax.script.ScriptException; +import javax.script.SimpleScriptContext; + +import static org.testng.Assert.assertEquals; + +/** + * Top-level lexical binding tests. + * + * @test + * @run testng jdk.nashorn.internal.runtime.LexicalBindingTest + */ +@SuppressWarnings("javadoc") +public class LexicalBindingTest { + + final static String LANGUAGE_ES6 = "--language=es6"; + final static int NUMBER_OF_CONTEXTS = 20; + final static int MEGAMORPHIC_LOOP_COUNT = 20; + + /** + * Test access to global var-declared variables for shared script classes with multiple globals. + */ + @Test + public static void megamorphicVarTest() throws ScriptException, InterruptedException { + final NashornScriptEngineFactory factory = new NashornScriptEngineFactory(); + final ScriptEngine e = factory.getScriptEngine(); + final ScriptContext[] contexts = new ScriptContext[NUMBER_OF_CONTEXTS]; + final String sharedScript = "foo"; + + + for (int i = 0; i < NUMBER_OF_CONTEXTS; i++) { + final ScriptContext context = contexts[i] = new SimpleScriptContext(); + final Bindings b = e.createBindings(); + context.setBindings(b, ScriptContext.ENGINE_SCOPE); + assertEquals(e.eval("var foo = '" + i + "';", context), null); + } + + for (int i = 0; i < NUMBER_OF_CONTEXTS; i++) { + final ScriptContext context = contexts[i]; + assertEquals(e.eval(sharedScript, context), String.valueOf(i)); + } + } + + /** + * Test access to global lexically declared variables for shared script classes with multiple globals. + */ + @Test + public static void megamorphicMultiGlobalLetTest() throws ScriptException, InterruptedException { + final NashornScriptEngineFactory factory = new NashornScriptEngineFactory(); + final ScriptEngine e = factory.getScriptEngine(LANGUAGE_ES6); + final ScriptContext[] contexts = new ScriptContext[NUMBER_OF_CONTEXTS]; + final String sharedScript = "foo"; + + + for (int i = 0; i < NUMBER_OF_CONTEXTS; i++) { + final ScriptContext context = contexts[i] = new SimpleScriptContext(); + final Bindings b = e.createBindings(); + context.setBindings(b, ScriptContext.ENGINE_SCOPE); + assertEquals(e.eval("let foo = '" + i + "';", context), null); + } + + for (int i = 0; i < NUMBER_OF_CONTEXTS; i++) { + final ScriptContext context = contexts[i]; + assertEquals(e.eval(sharedScript, context), String.valueOf(i)); + } + } + + + /** + * Test access to global lexically declared variables for shared script classes with single global. + */ + @Test + public static void megamorphicSingleGlobalLetTest() throws ScriptException, InterruptedException { + final NashornScriptEngineFactory factory = new NashornScriptEngineFactory(); + final ScriptEngine e = factory.getScriptEngine(LANGUAGE_ES6); + final String sharedGetterScript = "foo"; + final String sharedSetterScript = "foo = 1"; + + for (int i = 0; i < MEGAMORPHIC_LOOP_COUNT; i++) { + assertEquals(e.eval(sharedSetterScript), 1); + assertEquals(e.eval(sharedGetterScript), 1); + assertEquals(e.eval("delete foo; a" + i + " = 1; foo = " + i + ";"), i); + assertEquals(e.eval(sharedGetterScript), i); + } + + assertEquals(e.eval("let foo = 'foo';"), null); + assertEquals(e.eval(sharedGetterScript), "foo"); + assertEquals(e.eval(sharedSetterScript), 1); + assertEquals(e.eval(sharedGetterScript), 1); + assertEquals(e.eval("this.foo"), MEGAMORPHIC_LOOP_COUNT - 1); + } + + /** + * Test access to global lexically declared variables for shared script classes with single global. + */ + @Test + public static void megamorphicInheritedGlobalLetTest() throws ScriptException, InterruptedException { + final NashornScriptEngineFactory factory = new NashornScriptEngineFactory(); + final ScriptEngine e = factory.getScriptEngine(LANGUAGE_ES6); + final String sharedGetterScript = "foo"; + final String sharedSetterScript = "foo = 1"; + + for (int i = 0; i < MEGAMORPHIC_LOOP_COUNT; i++) { + assertEquals(e.eval(sharedSetterScript), 1); + assertEquals(e.eval(sharedGetterScript), 1); + assertEquals(e.eval("delete foo; a" + i + " = 1; Object.prototype.foo = " + i + ";"), i); + assertEquals(e.eval(sharedGetterScript), i); + } + + assertEquals(e.eval("let foo = 'foo';"), null); + assertEquals(e.eval(sharedGetterScript), "foo"); + assertEquals(e.eval(sharedSetterScript), 1); + assertEquals(e.eval(sharedGetterScript), 1); + assertEquals(e.eval("this.foo"), MEGAMORPHIC_LOOP_COUNT - 1); + } + + /** + * Test multi-threaded access to global lexically declared variables for shared script classes with multiple globals. + */ + @Test + public static void multiThreadedLetTest() throws ScriptException, InterruptedException { + final NashornScriptEngineFactory factory = new NashornScriptEngineFactory(); + final ScriptEngine e = factory.getScriptEngine(LANGUAGE_ES6); + final Bindings b = e.createBindings(); + final ScriptContext origContext = e.getContext(); + final ScriptContext newCtxt = new SimpleScriptContext(); + newCtxt.setBindings(b, ScriptContext.ENGINE_SCOPE); + final String sharedScript = "foo"; + + assertEquals(e.eval("let foo = 'original context';", origContext), null); + assertEquals(e.eval("let foo = 'new context';", newCtxt), null); + + final Thread t1 = new Thread(new ScriptRunner(e, origContext, sharedScript, "original context", 1000)); + final Thread t2 = new Thread(new ScriptRunner(e, newCtxt, sharedScript, "new context", 1000)); + t1.start(); + t2.start(); + t1.join(); + t2.join(); + + assertEquals(e.eval("foo = 'newer context';", newCtxt), "newer context"); + final Thread t3 = new Thread(new ScriptRunner(e, origContext, sharedScript, "original context", 1000)); + final Thread t4 = new Thread(new ScriptRunner(e, newCtxt, sharedScript, "newer context", 1000)); + + t3.start(); + t4.start(); + t3.join(); + t4.join(); + + assertEquals(e.eval(sharedScript), "original context"); + assertEquals(e.eval(sharedScript, newCtxt), "newer context"); + } + + private static class ScriptRunner implements Runnable { + + final ScriptEngine engine; + final ScriptContext context; + final String source; + final Object expected; + final int iterations; + + ScriptRunner(final ScriptEngine engine, final ScriptContext context, final String source, final Object expected, final int iterations) { + this.engine = engine; + this.context = context; + this.source = source; + this.expected = expected; + this.iterations = iterations; + } + + @Override + public void run() { + try { + for (int i = 0; i < iterations; i++) { + assertEquals(engine.eval(source, context), expected); + } + } catch (final ScriptException se) { + throw new RuntimeException(se); + } + } + } +}
--- a/test/src/jdk/nashorn/internal/test/framework/TestFinder.java Wed Nov 26 08:00:20 2014 -0800 +++ b/test/src/jdk/nashorn/internal/test/framework/TestFinder.java Wed Nov 26 13:57:43 2014 -0800 @@ -46,6 +46,7 @@ import java.io.File; import java.io.FileReader; import java.io.IOException; +import java.nio.ByteOrder; import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.FileVisitOption; @@ -264,6 +265,12 @@ isTest = false; isNotTest = true; break; + case "@bigendian": + shouldRun = ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN; + break; + case "@littleendian": + shouldRun = ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN; + break; case "@runif": { final String prop = scanner.next(); if (System.getProperty(prop) != null) {