changeset 702:39a3e5a4d6d4

Merge
author kizune
date Thu, 05 Dec 2013 16:37:35 +0400
parents c1049f63d4f5 (current diff) 7fa32e7d755f (diff)
children dd59e60accdd
files makefiles/BuildNashorn.gmk makefiles/Makefile
diffstat 18 files changed, 502 insertions(+), 324 deletions(-) [+]
line wrap: on
line diff
--- 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
--- /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
--- 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)
--- 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
--- 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)
--- 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);
         }
--- 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;
     }
 
--- 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);
     }
 
     /**
--- 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);
     }
 
     /**
--- 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) {
--- 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);
         }
--- 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) {
--- 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
+     * <p>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.</p>
+     *
+     * @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);
+    }
+
 }
 
--- /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]);
--- /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
--- /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);
+    }
+}
--- /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
--- 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 {