# HG changeset patch # User kizune # Date 1386247055 -14400 # Node ID 39a3e5a4d6d4393d3f9fe58e87e17ac0575de8ae # Parent c1049f63d4f568a8ba96a5d511c01e8df268ad85# Parent 7fa32e7d755fccee8b8d7cea200a472c7a2630f0 Merge diff -r c1049f63d4f5 -r 39a3e5a4d6d4 .hgtags --- a/.hgtags Tue Dec 03 14:13:15 2013 +0400 +++ b/.hgtags Thu Dec 05 16:37:35 2013 +0400 @@ -228,3 +228,4 @@ 0fb1a427fbf6e04c77cebbbf99b6631c664ed793 jdk8-b116 1db3d4e4d18913e853d7bebf86816e87fda00a71 jdk8-b117 8d014b039b44c23fa520ce20c2c27f7aa91441e9 jdk8-b118 +c3343930c73c58a22c1d58719bb988aeb25a871f jdk8-b119 diff -r c1049f63d4f5 -r 39a3e5a4d6d4 make/BuildNashorn.gmk --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/make/BuildNashorn.gmk Thu Dec 05 16:37:35 2013 +0400 @@ -0,0 +1,112 @@ +# +# 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. +# + +# This must be the first rule +default: all + +-include $(SPEC) +include MakeBase.gmk +include JavaCompilation.gmk + +JDK_CLASSES := $(JDK_OUTPUTDIR)/classes + +NASHORN_JAR := $(NASHORN_DIST)/nashorn.jar +NASHORN_VERSION := $(JDK_VERSION) +NASHORN_FULL_VERSION := $(FULL_VERSION) + +ifdef MILESTONE + ifeq ($(MILESTONE), internal) + NASHORN_VERSION = $(FULL_VERSION) + endif +endif + +# Need to use source and target 7 for nasgen to work. +$(eval $(call SetupJavaCompiler,GENERATE_NEWBYTECODE_DEBUG, \ + JVM := $(JAVA), \ + JAVAC := $(NEW_JAVAC), \ + FLAGS := -g -source 7 -target 7 -bootclasspath $(JDK_CLASSES), \ + SERVER_DIR := $(SJAVAC_SERVER_DIR), \ + SERVER_JVM := $(SJAVAC_SERVER_JAVA))) + +# Build nashorn into intermediate directory +$(eval $(call SetupJavaCompilation,BUILD_NASHORN, \ + SETUP := GENERATE_NEWBYTECODE_DEBUG, \ + SRC := $(NASHORN_TOPDIR)/src, \ + COPY := .properties .js, \ + BIN := $(NASHORN_OUTPUTDIR)/nashorn_classes)) + +NASGEN_SRC := $(NASHORN_TOPDIR)/buildtools/nasgen/src +ASM_SRC := $(JDK_TOPDIR)/src/share/classes/jdk/internal/org/objectweb/asm + +# Build nasgen +$(eval $(call SetupJavaCompilation,BUILD_NASGEN, \ + SETUP := GENERATE_NEWBYTECODE_DEBUG, \ + SRC := $(NASGEN_SRC) $(ASM_SRC), \ + BIN := $(NASHORN_OUTPUTDIR)/nasgen_classes, \ + ADD_JAVAC_FLAGS := -cp $(NASHORN_OUTPUTDIR)/nashorn_classes)) + +# Nasgen needs nashorn classes +$(BUILD_NASGEN): $(BUILD_NASHORN) + +# Copy classes to final classes dir and run nasgen to modify classes in jdk.nashorn.internal.objects package +$(NASHORN_OUTPUTDIR)/classes/_the.nasgen.run: $(BUILD_NASGEN) + $(ECHO) Running nasgen + $(MKDIR) -p $(@D) + $(RM) -rf $(@D)/jdk $(@D)/netscape + $(CP) -R -p $(NASHORN_OUTPUTDIR)/nashorn_classes/* $(@D)/ + $(FIXPATH) $(JAVA) \ + -cp "$(NASHORN_OUTPUTDIR)/nasgen_classes$(PATH_SEP)$(NASHORN_OUTPUTDIR)/nashorn_classes" \ + jdk.nashorn.internal.tools.nasgen.Main $(@D) jdk.nashorn.internal.objects $(@D) + $(TOUCH) $@ + +# Version file needs to be processed with version numbers +VERSION_FILE := $(NASHORN_OUTPUTDIR)/classes/jdk/nashorn/internal/runtime/resources/version.properties + +# Needs to happen after nasgen run since nasgen run deletes it +$(VERSION_FILE): $(NASHORN_OUTPUTDIR)/classes/_the.nasgen.run +$(VERSION_FILE): $(NASHORN_TOPDIR)/src/jdk/nashorn/internal/runtime/resources/version.properties-template + $(ECHO) Creating version.properties + $(MKDIR) -p $(@D) + $(CAT) $< | $(SED) -e 's/$$(FULL_VERSION)/$(NASHORN_FULL_VERSION)/g' \ + -e 's/$$(RELEASE)/$(NASHORN_VERSION)/g' \ + -e '/^#.*$$/d' -e '/^$$/d' > $@ + + +MANIFEST_ATTRIBUTES := Name: jdk/nashorn/\nImplementation-Title: Oracle Nashorn\nImplementation-Version: $(NASHORN_FULL_VERSION) + +# Create nashorn.jar from the final classes dir +$(eval $(call SetupArchive,BUILD_NASHORN_JAR, \ + $(NASHORN_OUTPUTDIR)/classes/_the.nasgen.run \ + $(VERSION_FILE), \ + SRCS := $(NASHORN_OUTPUTDIR)/classes, \ + SUFFIXES := .class .js .properties Factory, \ + MANIFEST := $(NASHORN_TOPDIR)/src/META-INF/MANIFEST.MF, \ + EXTRA_MANIFEST_ATTR := $(MANIFEST_ATTRIBUTES), \ + SKIP_METAINF := true, \ + JAR := $(NASHORN_JAR))) + +all: $(NASHORN_JAR) + +.PHONY: all diff -r c1049f63d4f5 -r 39a3e5a4d6d4 make/Makefile --- a/make/Makefile Tue Dec 03 14:13:15 2013 +0400 +++ b/make/Makefile Thu Dec 05 16:37:35 2013 +0400 @@ -1,5 +1,5 @@ # -# Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2012, 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 @@ -23,37 +23,27 @@ # questions. # -# -# On Solaris, the standard 'make' utility will not work with these makefiles. -# This little rule is only understood by Solaris make, and is harmless -# when seen by the GNU make tool. If using Solaris make, this causes the -# make command to fail. -# -SUN_MAKE_TEST:sh = @echo "ERROR: PLEASE USE GNU VERSION OF MAKE"; exit 33 +# Locate this Makefile +ifeq ($(filter /%, $(lastword $(MAKEFILE_LIST))), ) + makefile_path := $(CURDIR)/$(lastword $(MAKEFILE_LIST)) +else + makefile_path := $(lastword $(MAKEFILE_LIST)) +endif +repo_dir := $(patsubst %/make/Makefile, %, $(makefile_path)) - -# Default target and expected 'do everything' target -all: - echo Nashorn can only be built with NEWBUILD=true - -# Standard make clobber target -clobber: +# What is the name of this subsystem (langtools, corba, etc)? +subsystem_name := $(notdir $(repo_dir)) -#------------------------------------------------------------------- -# -# Targets for Oracle's internal JPRT build system - -CD = cd -ZIP = zip - -JPRT_ARCHIVE_BUNDLE=$(ABS_OUTPUTDIR)/$(JPRT_BUILD_FLAVOR)-bundle.zip +# Try to locate top-level makefile +top_level_makefile := $(repo_dir)/../Makefile +ifneq ($(wildcard $(top_level_makefile)), ) + $(info Will run $(subsystem_name) target on top-level Makefile) + $(info WARNING: This is a non-recommended way of building!) + $(info ===================================================) +else + $(info Cannot locate top-level Makefile. Is this repo not checked out as part of a complete forest?) + $(error Build from top-level Makefile instead) +endif -jprt_build_product jprt_build_debug jprt_build_fastdebug: all - ( $(CD) $(OUTPUTDIR) && \ - $(ZIP) -q -r $(JPRT_ARCHIVE_BUNDLE) build dist ) - -#------------------------------------------------------------------- - -# Declare these phony (not filenames) -.PHONY: $(ANT_TARGETS) all clobber \ - jprt_build_product jprt_build_debug jprt_build_fastdebug +all: + @$(MAKE) -f $(top_level_makefile) $(subsystem_name) diff -r c1049f63d4f5 -r 39a3e5a4d6d4 makefiles/BuildNashorn.gmk --- a/makefiles/BuildNashorn.gmk Tue Dec 03 14:13:15 2013 +0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,112 +0,0 @@ -# -# 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. -# - -# This must be the first rule -default: all - --include $(SPEC) -include MakeBase.gmk -include JavaCompilation.gmk - -JDK_CLASSES := $(JDK_OUTPUTDIR)/classes - -NASHORN_JAR := $(NASHORN_DIST)/nashorn.jar -NASHORN_VERSION := $(JDK_VERSION) -NASHORN_FULL_VERSION := $(FULL_VERSION) - -ifdef MILESTONE - ifeq ($(MILESTONE), internal) - NASHORN_VERSION = $(FULL_VERSION) - endif -endif - -# Need to use source and target 7 for nasgen to work. -$(eval $(call SetupJavaCompiler,GENERATE_NEWBYTECODE_DEBUG, \ - JVM := $(JAVA), \ - JAVAC := $(NEW_JAVAC), \ - FLAGS := -g -source 7 -target 7 -bootclasspath $(JDK_CLASSES), \ - SERVER_DIR := $(SJAVAC_SERVER_DIR), \ - SERVER_JVM := $(SJAVAC_SERVER_JAVA))) - -# Build nashorn into intermediate directory -$(eval $(call SetupJavaCompilation,BUILD_NASHORN, \ - SETUP := GENERATE_NEWBYTECODE_DEBUG, \ - SRC := $(NASHORN_TOPDIR)/src, \ - COPY := .properties .js, \ - BIN := $(NASHORN_OUTPUTDIR)/nashorn_classes)) - -NASGEN_SRC := $(NASHORN_TOPDIR)/buildtools/nasgen/src -ASM_SRC := $(JDK_TOPDIR)/src/share/classes/jdk/internal/org/objectweb/asm - -# Build nasgen -$(eval $(call SetupJavaCompilation,BUILD_NASGEN, \ - SETUP := GENERATE_NEWBYTECODE_DEBUG, \ - SRC := $(NASGEN_SRC) $(ASM_SRC), \ - BIN := $(NASHORN_OUTPUTDIR)/nasgen_classes, \ - ADD_JAVAC_FLAGS := -cp $(NASHORN_OUTPUTDIR)/nashorn_classes)) - -# Nasgen needs nashorn classes -$(BUILD_NASGEN): $(BUILD_NASHORN) - -# Copy classes to final classes dir and run nasgen to modify classes in jdk.nashorn.internal.objects package -$(NASHORN_OUTPUTDIR)/classes/_the.nasgen.run: $(BUILD_NASGEN) - $(ECHO) Running nasgen - $(MKDIR) -p $(@D) - $(RM) -rf $(@D)/jdk $(@D)/netscape - $(CP) -R -p $(NASHORN_OUTPUTDIR)/nashorn_classes/* $(@D)/ - $(FIXPATH) $(JAVA) \ - -cp "$(NASHORN_OUTPUTDIR)/nasgen_classes$(PATH_SEP)$(NASHORN_OUTPUTDIR)/nashorn_classes" \ - jdk.nashorn.internal.tools.nasgen.Main $(@D) jdk.nashorn.internal.objects $(@D) - $(TOUCH) $@ - -# Version file needs to be processed with version numbers -VERSION_FILE := $(NASHORN_OUTPUTDIR)/classes/jdk/nashorn/internal/runtime/resources/version.properties - -# Needs to happen after nasgen run since nasgen run deletes it -$(VERSION_FILE): $(NASHORN_OUTPUTDIR)/classes/_the.nasgen.run -$(VERSION_FILE): $(NASHORN_TOPDIR)/src/jdk/nashorn/internal/runtime/resources/version.properties-template - $(ECHO) Creating version.properties - $(MKDIR) -p $(@D) - $(CAT) $< | $(SED) -e 's/$$(FULL_VERSION)/$(NASHORN_FULL_VERSION)/g' \ - -e 's/$$(RELEASE)/$(NASHORN_VERSION)/g' \ - -e '/^#.*$$/d' -e '/^$$/d' > $@ - - -MANIFEST_ATTRIBUTES := Name: jdk/nashorn/\nImplementation-Title: Oracle Nashorn\nImplementation-Version: $(NASHORN_FULL_VERSION) - -# Create nashorn.jar from the final classes dir -$(eval $(call SetupArchive,BUILD_NASHORN_JAR, \ - $(NASHORN_OUTPUTDIR)/classes/_the.nasgen.run \ - $(VERSION_FILE), \ - SRCS := $(NASHORN_OUTPUTDIR)/classes, \ - SUFFIXES := .class .js .properties Factory, \ - MANIFEST := $(NASHORN_TOPDIR)/src/META-INF/MANIFEST.MF, \ - EXTRA_MANIFEST_ATTR := $(MANIFEST_ATTRIBUTES), \ - SKIP_METAINF := true, \ - JAR := $(NASHORN_JAR))) - -all: $(NASHORN_JAR) - -.PHONY: all diff -r c1049f63d4f5 -r 39a3e5a4d6d4 makefiles/Makefile --- a/makefiles/Makefile Tue Dec 03 14:13:15 2013 +0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ -# -# Copyright (c) 2012, 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. -# - -# Locate this Makefile -ifeq ($(filter /%, $(lastword $(MAKEFILE_LIST))), ) - makefile_path := $(CURDIR)/$(lastword $(MAKEFILE_LIST)) -else - makefile_path := $(lastword $(MAKEFILE_LIST)) -endif -repo_dir := $(patsubst %/makefiles/Makefile, %, $(makefile_path)) - -# What is the name of this subsystem (langtools, corba, etc)? -subsystem_name := $(notdir $(repo_dir)) - -# Try to locate top-level makefile -top_level_makefile := $(repo_dir)/../common/makefiles/Makefile -ifneq ($(wildcard $(top_level_makefile)), ) - $(info Will run $(subsystem_name) target on top-level Makefile) - $(info WARNING: This is a non-recommended way of building!) - $(info ===================================================) -else - $(info Cannot locate top-level Makefile. Is this repo not checked out as part of a complete forest?) - $(error Build from top-level Makefile instead) -endif - -all: - @$(MAKE) -f $(top_level_makefile) $(subsystem_name) diff -r c1049f63d4f5 -r 39a3e5a4d6d4 src/jdk/nashorn/internal/codegen/CodeGenerator.java --- a/src/jdk/nashorn/internal/codegen/CodeGenerator.java Tue Dec 03 14:13:15 2013 +0400 +++ b/src/jdk/nashorn/internal/codegen/CodeGenerator.java Thu Dec 05 16:37:35 2013 +0400 @@ -2186,15 +2186,14 @@ @Override public boolean enterWhileNode(final WhileNode whileNode) { - lineNumber(whileNode); - final Expression test = whileNode.getTest(); final Block body = whileNode.getBody(); final Label breakLabel = whileNode.getBreakLabel(); final Label continueLabel = whileNode.getContinueLabel(); + final boolean isDoWhile = whileNode.isDoWhile(); final Label loopLabel = new Label("loop"); - if (!whileNode.isDoWhile()) { + if (!isDoWhile) { method._goto(continueLabel); } @@ -2202,6 +2201,7 @@ body.accept(this); if (!whileNode.isTerminal()) { method.label(continueLabel); + lineNumber(whileNode); new BranchOptimizer(this, method).execute(test, loopLabel, true); method.label(breakLabel); } diff -r c1049f63d4f5 -r 39a3e5a4d6d4 src/jdk/nashorn/internal/ir/debug/PrintVisitor.java --- a/src/jdk/nashorn/internal/ir/debug/PrintVisitor.java Tue Dec 03 14:13:15 2013 +0400 +++ b/src/jdk/nashorn/internal/ir/debug/PrintVisitor.java Thu Dec 05 16:37:35 2013 +0400 @@ -28,6 +28,7 @@ import java.util.List; import jdk.nashorn.internal.ir.BinaryNode; import jdk.nashorn.internal.ir.Block; +import jdk.nashorn.internal.ir.BlockStatement; import jdk.nashorn.internal.ir.CaseNode; import jdk.nashorn.internal.ir.CatchNode; import jdk.nashorn.internal.ir.ExpressionStatement; @@ -141,7 +142,6 @@ @Override public boolean enterBlock(final Block block) { sb.append(' '); - //sb.append(Debug.id(block)); sb.append('{'); indent += TABWIDTH; @@ -190,8 +190,13 @@ sb.append(EOLN); indent(); sb.append('}'); - // sb.append(Debug.id(block)); + + return false; + } + @Override + public boolean enterBlockStatement(final BlockStatement statement) { + statement.getBlock().accept(this); return false; } @@ -233,7 +238,6 @@ public boolean enterFunctionNode(final FunctionNode functionNode) { functionNode.toString(sb); enterBlock(functionNode.getBody()); - //sb.append(EOLN); return false; } diff -r c1049f63d4f5 -r 39a3e5a4d6d4 src/jdk/nashorn/internal/objects/NativeArguments.java --- a/src/jdk/nashorn/internal/objects/NativeArguments.java Tue Dec 03 14:13:15 2013 +0400 +++ b/src/jdk/nashorn/internal/objects/NativeArguments.java Thu Dec 05 16:37:35 2013 +0400 @@ -35,6 +35,7 @@ import java.util.Arrays; import java.util.BitSet; import jdk.nashorn.internal.runtime.AccessorProperty; +import jdk.nashorn.internal.runtime.JSType; import jdk.nashorn.internal.runtime.Property; import jdk.nashorn.internal.runtime.PropertyDescriptor; import jdk.nashorn.internal.runtime.PropertyMap; @@ -140,8 +141,9 @@ @Override public boolean delete(final Object key, final boolean strict) { - final int index = ArrayIndex.getArrayIndex(key); - return isMapped(index) ? deleteMapped(index, strict) : super.delete(key, strict); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = ArrayIndex.getArrayIndex(primitiveKey); + return isMapped(index) ? deleteMapped(index, strict) : super.delete(primitiveKey, strict); } /** diff -r c1049f63d4f5 -r 39a3e5a4d6d4 src/jdk/nashorn/internal/objects/NativeObject.java --- a/src/jdk/nashorn/internal/objects/NativeObject.java Tue Dec 03 14:13:15 2013 +0400 +++ b/src/jdk/nashorn/internal/objects/NativeObject.java Thu Dec 05 16:37:35 2013 +0400 @@ -484,10 +484,12 @@ */ @Function(attributes = Attribute.NOT_ENUMERABLE) public static Object hasOwnProperty(final Object self, final Object v) { - final String str = JSType.toString(v); + // Convert ScriptObjects to primitive with String.class hint + // but no need to convert other primitives to string. + final Object key = JSType.toPrimitive(v, String.class); final Object obj = Global.toObject(self); - return (obj instanceof ScriptObject) && ((ScriptObject)obj).hasOwnProperty(str); + return (obj instanceof ScriptObject) && ((ScriptObject)obj).hasOwnProperty(key); } /** diff -r c1049f63d4f5 -r 39a3e5a4d6d4 src/jdk/nashorn/internal/objects/NativeString.java --- a/src/jdk/nashorn/internal/objects/NativeString.java Tue Dec 03 14:13:15 2013 +0400 +++ b/src/jdk/nashorn/internal/objects/NativeString.java Thu Dec 05 16:37:35 2013 +0400 @@ -167,11 +167,12 @@ @SuppressWarnings("unused") private static Object get(final Object self, final Object key) { final CharSequence cs = JSType.toCharSequence(self); - final int index = ArrayIndex.getArrayIndex(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = ArrayIndex.getArrayIndex(primitiveKey); if (index >= 0 && index < cs.length()) { return String.valueOf(cs.charAt(index)); } - return ((ScriptObject) Global.toObject(self)).get(key); + return ((ScriptObject) Global.toObject(self)).get(primitiveKey); } @SuppressWarnings("unused") @@ -202,11 +203,12 @@ // String characters can be accessed with array-like indexing.. @Override public Object get(final Object key) { - final int index = ArrayIndex.getArrayIndex(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = ArrayIndex.getArrayIndex(primitiveKey); if (index >= 0 && index < value.length()) { return String.valueOf(value.charAt(index)); } - return super.get(key); + return super.get(primitiveKey); } @Override @@ -295,8 +297,9 @@ @Override public boolean has(final Object key) { - final int index = ArrayIndex.getArrayIndex(key); - return isValid(index) || super.has(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = ArrayIndex.getArrayIndex(primitiveKey); + return isValid(index) || super.has(primitiveKey); } @Override @@ -318,8 +321,9 @@ @Override public boolean hasOwnProperty(final Object key) { - final int index = ArrayIndex.getArrayIndex(key); - return isValid(index) || super.hasOwnProperty(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = ArrayIndex.getArrayIndex(primitiveKey); + return isValid(index) || super.hasOwnProperty(primitiveKey); } @Override @@ -358,8 +362,9 @@ @Override public boolean delete(final Object key, final boolean strict) { - final int index = ArrayIndex.getArrayIndex(key); - return checkDeleteIndex(index, strict)? false : super.delete(key, strict); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = ArrayIndex.getArrayIndex(primitiveKey); + return checkDeleteIndex(index, strict)? false : super.delete(primitiveKey, strict); } private boolean checkDeleteIndex(final int index, final boolean strict) { diff -r c1049f63d4f5 -r 39a3e5a4d6d4 src/jdk/nashorn/internal/parser/Parser.java --- a/src/jdk/nashorn/internal/parser/Parser.java Tue Dec 03 14:13:15 2013 +0400 +++ b/src/jdk/nashorn/internal/parser/Parser.java Thu Dec 05 16:37:35 2013 +0400 @@ -1210,21 +1210,24 @@ */ private void whileStatement() { // Capture WHILE token. - final int whileLine = line; final long whileToken = token; // WHILE tested in caller. next(); // Construct WHILE node. - WhileNode whileNode = new WhileNode(whileLine, whileToken, Token.descPosition(whileToken), false); + WhileNode whileNode = new WhileNode(line, whileToken, Token.descPosition(whileToken), false); lc.push(whileNode); try { expect(LPAREN); - whileNode = whileNode.setTest(lc, expression()); + final int whileLine = line; + final Expression test = expression(); expect(RPAREN); - whileNode = whileNode.setBody(lc, getStatement()); - appendStatement(whileNode); + final Block body = getStatement(); + appendStatement(whileNode = + new WhileNode(whileLine, whileToken, finish, false). + setTest(lc, test). + setBody(lc, body)); } finally { lc.pop(whileNode); } @@ -1242,28 +1245,33 @@ */ private void doStatement() { // Capture DO token. - final int doLine = line; final long doToken = token; // DO tested in the caller. next(); - WhileNode doWhileNode = new WhileNode(doLine, doToken, Token.descPosition(doToken), true); + WhileNode doWhileNode = new WhileNode(-1, doToken, Token.descPosition(doToken), true); lc.push(doWhileNode); try { // Get DO body. - doWhileNode = doWhileNode.setBody(lc, getStatement()); + final Block body = getStatement(); expect(WHILE); expect(LPAREN); - doWhileNode = doWhileNode.setTest(lc, expression()); + final int doLine = line; + final Expression test = expression(); expect(RPAREN); if (type == SEMICOLON) { endOfLine(); } doWhileNode.setFinish(finish); - appendStatement(doWhileNode); + + //line number is last + appendStatement(doWhileNode = + new WhileNode(doLine, doToken, finish, true). + setBody(lc, body). + setTest(lc, test)); } finally { lc.pop(doWhileNode); } diff -r c1049f63d4f5 -r 39a3e5a4d6d4 src/jdk/nashorn/internal/runtime/ScriptObject.java --- a/src/jdk/nashorn/internal/runtime/ScriptObject.java Tue Dec 03 14:13:15 2013 +0400 +++ b/src/jdk/nashorn/internal/runtime/ScriptObject.java Thu Dec 05 16:37:35 2013 +0400 @@ -2373,11 +2373,13 @@ private int getInt(final int index, final String key) { if (isValidArrayIndex(index)) { - for (ScriptObject object = this; ; ) { - final FindProperty find = object.findProperty(key, false, false, this); - - if (find != null) { - return getIntValue(find); + for (ScriptObject object = this; ; ) { + if (object.getMap().containsArrayKeys()) { + final FindProperty find = object.findProperty(key, false, false, this); + + if (find != null) { + return getIntValue(find); + } } if ((object = object.getProto()) == null) { @@ -2389,7 +2391,7 @@ if (array.has(index)) { return array.getInt(index); } - } + } } else { final FindProperty find = findProperty(key, true); @@ -2403,14 +2405,15 @@ @Override public int getInt(final Object key) { - final int index = getArrayIndex(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = getArrayIndex(primitiveKey); final ArrayData array = getArray(); if (array.has(index)) { return array.getInt(index); } - return getInt(index, JSType.toString(key)); + return getInt(index, JSType.toString(primitiveKey)); } @Override @@ -2439,22 +2442,25 @@ @Override public int getInt(final int key) { + final int index = getArrayIndex(key); final ArrayData array = getArray(); - if (array.has(key)) { - return array.getInt(key); + if (array.has(index)) { + return array.getInt(index); } - return getInt(key, JSType.toString(key)); + return getInt(index, JSType.toString(key)); } private long getLong(final int index, final String key) { if (isValidArrayIndex(index)) { for (ScriptObject object = this; ; ) { - final FindProperty find = object.findProperty(key, false, false, this); - - if (find != null) { - return getLongValue(find); + if (object.getMap().containsArrayKeys()) { + final FindProperty find = object.findProperty(key, false, false, this); + + if (find != null) { + return getLongValue(find); + } } if ((object = object.getProto()) == null) { @@ -2466,7 +2472,7 @@ if (array.has(index)) { return array.getLong(index); } - } + } } else { final FindProperty find = findProperty(key, true); @@ -2480,14 +2486,15 @@ @Override public long getLong(final Object key) { - final int index = getArrayIndex(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = getArrayIndex(primitiveKey); final ArrayData array = getArray(); if (array.has(index)) { return array.getLong(index); } - return getLong(index, JSType.toString(key)); + return getLong(index, JSType.toString(primitiveKey)); } @Override @@ -2516,22 +2523,25 @@ @Override public long getLong(final int key) { + final int index = getArrayIndex(key); final ArrayData array = getArray(); - if (array.has(key)) { - return array.getLong(key); + if (array.has(index)) { + return array.getLong(index); } - return getLong(key, JSType.toString(key)); + return getLong(index, JSType.toString(key)); } private double getDouble(final int index, final String key) { if (isValidArrayIndex(index)) { for (ScriptObject object = this; ; ) { - final FindProperty find = object.findProperty(key, false, false, this); - - if (find != null) { - return getDoubleValue(find); + if (object.getMap().containsArrayKeys()) { + final FindProperty find = object.findProperty(key, false, false, this); + + if (find != null) { + return getDoubleValue(find); + } } if ((object = object.getProto()) == null) { @@ -2543,7 +2553,7 @@ if (array.has(index)) { return array.getDouble(index); } - } + } } else { final FindProperty find = findProperty(key, true); @@ -2557,14 +2567,15 @@ @Override public double getDouble(final Object key) { - final int index = getArrayIndex(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = getArrayIndex(primitiveKey); final ArrayData array = getArray(); if (array.has(index)) { return array.getDouble(index); } - return getDouble(index, JSType.toString(key)); + return getDouble(index, JSType.toString(primitiveKey)); } @Override @@ -2593,22 +2604,25 @@ @Override public double getDouble(final int key) { + final int index = getArrayIndex(key); final ArrayData array = getArray(); - if (array.has(key)) { - return array.getDouble(key); + if (array.has(index)) { + return array.getDouble(index); } - return getDouble(key, JSType.toString(key)); + return getDouble(index, JSType.toString(key)); } private Object get(final int index, final String key) { if (isValidArrayIndex(index)) { for (ScriptObject object = this; ; ) { - final FindProperty find = object.findProperty(key, false, false, this); - - if (find != null) { - return getObjectValue(find); + if (object.getMap().containsArrayKeys()) { + final FindProperty find = object.findProperty(key, false, false, this); + + if (find != null) { + return getObjectValue(find); + } } if ((object = object.getProto()) == null) { @@ -2634,14 +2648,15 @@ @Override public Object get(final Object key) { - final int index = getArrayIndex(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = getArrayIndex(primitiveKey); final ArrayData array = getArray(); if (array.has(index)) { return array.getObject(index); } - return get(index, JSType.toString(key)); + return get(index, JSType.toString(primitiveKey)); } @Override @@ -2670,13 +2685,14 @@ @Override public Object get(final int key) { + final int index = getArrayIndex(key); final ArrayData array = getArray(); - if (array.has(key)) { - return array.getObject(key); + if (array.has(index)) { + return array.getObject(index); } - return get(key, JSType.toString(key)); + return get(index, JSType.toString(key)); } /** @@ -2688,7 +2704,7 @@ */ private void doesNotHave(final int index, final Object value, final boolean strict) { final long oldLength = getArray().length(); - final long longIndex = index & JSType.MAX_UINT; + final long longIndex = ArrayIndex.toLongIndex(index); if (getMap().containsArrayKeys()) { final String key = JSType.toString(longIndex); @@ -2774,7 +2790,8 @@ @Override public void set(final Object key, final int value, final boolean strict) { - final int index = getArrayIndex(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = getArrayIndex(primitiveKey); if (isValidArrayIndex(index)) { if (getArray().has(index)) { @@ -2786,13 +2803,14 @@ return; } - final String propName = JSType.toString(key); + final String propName = JSType.toString(primitiveKey); setObject(findProperty(propName, true), strict, propName, JSType.toObject(value)); } @Override public void set(final Object key, final long value, final boolean strict) { - final int index = getArrayIndex(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = getArrayIndex(primitiveKey); if (isValidArrayIndex(index)) { if (getArray().has(index)) { @@ -2804,13 +2822,14 @@ return; } - final String propName = JSType.toString(key); + final String propName = JSType.toString(primitiveKey); setObject(findProperty(propName, true), strict, propName, JSType.toObject(value)); } @Override public void set(final Object key, final double value, final boolean strict) { - final int index = getArrayIndex(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = getArrayIndex(primitiveKey); if (isValidArrayIndex(index)) { if (getArray().has(index)) { @@ -2822,13 +2841,14 @@ return; } - final String propName = JSType.toString(key); + final String propName = JSType.toString(primitiveKey); setObject(findProperty(propName, true), strict, propName, JSType.toObject(value)); } @Override public void set(final Object key, final Object value, final boolean strict) { - final int index = getArrayIndex(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = getArrayIndex(primitiveKey); if (isValidArrayIndex(index)) { if (getArray().has(index)) { @@ -2840,7 +2860,7 @@ return; } - final String propName = JSType.toString(key); + final String propName = JSType.toString(primitiveKey); setObject(findProperty(propName, true), strict, propName, value); } @@ -3062,82 +3082,69 @@ @Override public boolean has(final Object key) { - final int index = getArrayIndex(key); - - if (isValidArrayIndex(index)) { - for (ScriptObject self = this; self != null; self = self.getProto()) { - if (self.getArray().has(index)) { - return true; - } - } - } - - return hasProperty(JSType.toString(key), true); + final Object primitiveKey = JSType.toPrimitive(key); + final int index = getArrayIndex(primitiveKey); + return isValidArrayIndex(index) ? hasArrayProperty(index) : hasProperty(JSType.toString(primitiveKey), true); } @Override public boolean has(final double key) { final int index = getArrayIndex(key); - - if (isValidArrayIndex(index)) { - for (ScriptObject self = this; self != null; self = self.getProto()) { - if (self.getArray().has(index)) { - return true; - } - } - } - - return hasProperty(JSType.toString(key), true); + return isValidArrayIndex(index) ? hasArrayProperty(index) : hasProperty(JSType.toString(key), true); } @Override public boolean has(final long key) { final int index = getArrayIndex(key); - - if (isValidArrayIndex(index)) { - for (ScriptObject self = this; self != null; self = self.getProto()) { - if (self.getArray().has(index)) { - return true; - } - } - } - - return hasProperty(JSType.toString(key), true); + return isValidArrayIndex(index) ? hasArrayProperty(index) : hasProperty(JSType.toString(key), true); } @Override public boolean has(final int key) { final int index = getArrayIndex(key); - - if (isValidArrayIndex(index)) { - for (ScriptObject self = this; self != null; self = self.getProto()) { - if (self.getArray().has(index)) { - return true; - } + return isValidArrayIndex(index) ? hasArrayProperty(index) : hasProperty(JSType.toString(key), true); + } + + private boolean hasArrayProperty(final int index) { + boolean hasArrayKeys = false; + + for (ScriptObject self = this; self != null; self = self.getProto()) { + if (self.getArray().has(index)) { + return true; } + hasArrayKeys = hasArrayKeys || self.getMap().containsArrayKeys(); } - return hasProperty(JSType.toString(key), true); + return hasArrayKeys && hasProperty(ArrayIndex.toKey(index), true); } @Override public boolean hasOwnProperty(final Object key) { - return getArray().has(getArrayIndex(key)) || hasProperty(JSType.toString(key), false); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = getArrayIndex(primitiveKey); + return isValidArrayIndex(index) ? hasOwnArrayProperty(index) : hasProperty(JSType.toString(primitiveKey), false); } @Override public boolean hasOwnProperty(final int key) { - return getArray().has(getArrayIndex(key)) || hasProperty(JSType.toString(key), false); + final int index = getArrayIndex(key); + return isValidArrayIndex(index) ? hasOwnArrayProperty(index) : hasProperty(JSType.toString(key), false); } @Override public boolean hasOwnProperty(final long key) { - return getArray().has(getArrayIndex(key)) || hasProperty(JSType.toString(key), false); + final int index = getArrayIndex(key); + return isValidArrayIndex(index) ? hasOwnArrayProperty(index) : hasProperty(JSType.toString(key), false); } @Override public boolean hasOwnProperty(final double key) { - return getArray().has(getArrayIndex(key)) || hasProperty(JSType.toString(key), false); + final int index = getArrayIndex(key); + return isValidArrayIndex(index) ? hasOwnArrayProperty(index) : hasProperty(JSType.toString(key), false); + } + + private boolean hasOwnArrayProperty(final int index) { + return getArray().has(index) || (getMap().containsArrayKeys() && hasProperty(ArrayIndex.toKey(index), false)); } @Override @@ -3190,7 +3197,8 @@ @Override public boolean delete(final Object key, final boolean strict) { - final int index = getArrayIndex(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = getArrayIndex(primitiveKey); final ArrayData array = getArray(); if (array.has(index)) { @@ -3201,7 +3209,7 @@ return false; } - return deleteObject(key, strict); + return deleteObject(primitiveKey, strict); } private boolean deleteObject(final Object key, final boolean strict) { diff -r c1049f63d4f5 -r 39a3e5a4d6d4 src/jdk/nashorn/internal/runtime/arrays/ArrayIndex.java --- a/src/jdk/nashorn/internal/runtime/arrays/ArrayIndex.java Tue Dec 03 14:13:15 2013 +0400 +++ b/src/jdk/nashorn/internal/runtime/arrays/ArrayIndex.java Thu Dec 05 16:37:35 2013 +0400 @@ -27,6 +27,7 @@ import jdk.nashorn.internal.runtime.ConsString; import jdk.nashorn.internal.runtime.JSType; +import jdk.nashorn.internal.runtime.ScriptObject; /** * Array index computation helpers. that both throw exceptions or return @@ -80,7 +81,12 @@ * Returns a valid array index in an int, if the object represents one. This * routine needs to perform quickly since all keys are tested with it. * - * @param key key to check for array index + *

The {@code key} parameter must be a JavaScript primitive type, i.e. one of + * {@code String}, {@code Number}, {@code Boolean}, {@code null}, or {@code undefined}. + * {@code ScriptObject} instances should be converted to primitive with + * {@code String.class} hint before being passed to this method.

+ * + * @param key key to check for array index. * @return the array index, or {@code -1} if {@code key} does not represent a valid index. * Note that negative return values other than {@code -1} are considered valid and can be converted to * the actual index using {@link #toLongIndex(int)}. @@ -88,18 +94,31 @@ public static int getArrayIndex(final Object key) { if (key instanceof Integer) { return getArrayIndex(((Integer) key).intValue()); - } else if (key instanceof Number) { - return getArrayIndex(((Number) key).doubleValue()); + } else if (key instanceof Double) { + return getArrayIndex(((Double) key).doubleValue()); } else if (key instanceof String) { return (int)fromString((String) key); + } else if (key instanceof Long) { + return getArrayIndex(((Long) key).longValue()); } else if (key instanceof ConsString) { return (int)fromString(key.toString()); } + assert !(key instanceof ScriptObject); return INVALID_ARRAY_INDEX; } /** + * Returns a valid array index in an int, if {@code key} represents one. + * + * @param key key to check + * @return the array index, or {@code -1} if {@code key} is not a valid array index. + */ + public static int getArrayIndex(final int key) { + return (key >= 0) ? key : INVALID_ARRAY_INDEX; + } + + /** * Returns a valid array index in an int, if the long represents one. * * @param key key to check @@ -129,10 +148,7 @@ */ public static int getArrayIndex(final double key) { if (JSType.isRepresentableAsInt(key)) { - final int intKey = (int)key; - if (intKey >= 0) { - return intKey; - } + return getArrayIndex((int) key); } else if (JSType.isRepresentableAsLong(key)) { return getArrayIndex((long) key); } @@ -177,5 +193,16 @@ return index & JSType.MAX_UINT; } + /** + * Convert an index to a key string. This is the same as calling {@link #toLongIndex(int)} + * and converting the result to String. + * + * @param index index to convert + * @return index as string + */ + public static String toKey(final int index) { + return Long.toString(index & JSType.MAX_UINT); + } + } diff -r c1049f63d4f5 -r 39a3e5a4d6d4 test/script/basic/JDK-8028210.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/JDK-8028210.js Thu Dec 05 16:37:35 2013 +0400 @@ -0,0 +1,83 @@ +/* + * 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-8028210: Missing conversions on array index expression + * + * @test + * @run + */ + +var array = [1, 2]; +var key1 = [[[0]]]; +var key2 = new String("1"); +var key3 = { + toString: function() { + print("toString called"); + return "2"; + } +}; + +print(array[key1]); +print(array[key2]); +array[key3] = 3; +print(array[key3]); +print(key3 in array); +print(array.hasOwnProperty(key3)); +print(delete array[key3]); +print(array[key3]); + +// string access +print("abc"[key1]); +print("abc"[key2]); +print("abc"[key3]); + +// arguments object +(function(a, b, c) { + print(arguments[key3]); + delete arguments[key3]; + print(arguments[key3], c); +})(1, 2, 3); + +// int keys +array = []; +array[4294967294] = 1; +print(array[-2]); +print(array[4294967294]); +print(-2 in array); +print(4294967294 in array); +print(delete(array[-2])); +print(array[4294967294]); +print(delete(array[4294967294])); +print(array[4294967294]); + +array = []; +array[-2] = 1; +print(array[-2]); +print(array[4294967294]); +print(-2 in array); +print(4294967294 in array); +print(delete(array[4294967294])); +print(array[-2]); +print(delete(array[-2])); +print(array[-2]); diff -r c1049f63d4f5 -r 39a3e5a4d6d4 test/script/basic/JDK-8028210.js.EXPECTED --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/JDK-8028210.js.EXPECTED Thu Dec 05 16:37:35 2013 +0400 @@ -0,0 +1,38 @@ +1 +2 +toString called +toString called +3 +toString called +true +toString called +true +toString called +true +toString called +undefined +a +b +toString called +c +toString called +3 +toString called +toString called +undefined 3 +undefined +1 +false +true +true +1 +true +undefined +1 +undefined +true +false +true +1 +true +undefined diff -r c1049f63d4f5 -r 39a3e5a4d6d4 test/script/basic/JDK-8028434.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/JDK-8028434.js Thu Dec 05 16:37:35 2013 +0400 @@ -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-8028434: Check that the line number of the tests in while and do while loops + * is correct. It needs to correspond to the line with the test expression. + * + * @test + * @run + */ + +try { + while (test.apa < 0) { + print("x"); + } +} catch (e) { + var st = e.getStackTrace(); + if (st.length != 1) { + print("erroneous stacktrace length " + s.length); + } + if (st[0].lineNumber !== 33) { + print("erroneous stacktrace element, lineNumber=" + st[0].lineNumber + " elem=" + st); + } +} + +try { + do { + print("x"); + } while (test.apa < 0); +} catch (e) { + var st = e.getStackTrace(); + if (st.length != 1) { + print("erroneous stacktrace length " + s.length); + } + if (st[0].lineNumber !== 49) { + print("erroneous stacktrace element, lineNumber= " + st[0].lineNumber + " elem=" + st); + } +} diff -r c1049f63d4f5 -r 39a3e5a4d6d4 test/script/basic/JDK-8028434.js.EXPECTED --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/JDK-8028434.js.EXPECTED Thu Dec 05 16:37:35 2013 +0400 @@ -0,0 +1,1 @@ +x diff -r c1049f63d4f5 -r 39a3e5a4d6d4 test/src/jdk/nashorn/api/scripting/ScriptEngineTest.java --- a/test/src/jdk/nashorn/api/scripting/ScriptEngineTest.java Tue Dec 03 14:13:15 2013 +0400 +++ b/test/src/jdk/nashorn/api/scripting/ScriptEngineTest.java Thu Dec 05 16:37:35 2013 +0400 @@ -50,7 +50,7 @@ * * @test * @build jdk.nashorn.api.scripting.Window jdk.nashorn.api.scripting.WindowEventHandler jdk.nashorn.api.scripting.VariableArityTestInterface jdk.nashorn.api.scripting.ScriptEngineTest - * @run testng jdk.nashorn.api.scripting.ScriptEngineTest + * @run testng/othervm jdk.nashorn.api.scripting.ScriptEngineTest */ public class ScriptEngineTest {