changeset 476:5fc6b7f11289

Merge
author sundar
date Mon, 29 Jul 2013 10:28:03 +0530
parents d55856f82352 fbd21b00197b
children 7d5d24bdb671
files test/script/representations/NASHORN-592a.js
diffstat 38 files changed, 438 insertions(+), 318 deletions(-) [+]
line wrap: on
line diff
--- a/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ClassGenerator.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ClassGenerator.java	Mon Jul 29 10:28:03 2013 +0530
@@ -152,14 +152,14 @@
     }
 
     static MethodGenerator makeStaticInitializer(final ClassVisitor cv, final String name) {
-        final int access = ACC_PUBLIC | ACC_STATIC;
+        final int access =  ACC_PUBLIC | ACC_STATIC;
         final String desc = DEFAULT_INIT_DESC;
         final MethodVisitor mv = cv.visitMethod(access, name, desc, null, null);
         return new MethodGenerator(mv, access, name, desc);
     }
 
     static MethodGenerator makeConstructor(final ClassVisitor cv) {
-        final int access = ACC_PUBLIC;
+        final int access = 0;
         final String name = INIT;
         final String desc = DEFAULT_INIT_DESC;
         final MethodVisitor mv = cv.visitMethod(access, name, desc, null, null);
--- a/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ConstructorGenerator.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ConstructorGenerator.java	Mon Jul 29 10:28:03 2013 +0530
@@ -25,6 +25,7 @@
 
 package jdk.nashorn.internal.tools.nasgen;
 
+import static jdk.internal.org.objectweb.asm.Opcodes.ACC_FINAL;
 import static jdk.internal.org.objectweb.asm.Opcodes.ACC_PUBLIC;
 import static jdk.internal.org.objectweb.asm.Opcodes.ACC_SUPER;
 import static jdk.internal.org.objectweb.asm.Opcodes.H_INVOKESTATIC;
@@ -80,7 +81,7 @@
     byte[] getClassBytes() {
         // new class extensing from ScriptObject
         final String superClass = (constructor != null)? SCRIPTFUNCTIONIMPL_TYPE : SCRIPTOBJECT_TYPE;
-        cw.visit(V1_7, ACC_PUBLIC | ACC_SUPER, className, null, superClass, null);
+        cw.visit(V1_7, ACC_FINAL, className, null, superClass, null);
         if (memberCount > 0) {
             // add fields
             emitFields();
--- a/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/PrototypeGenerator.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/PrototypeGenerator.java	Mon Jul 29 10:28:03 2013 +0530
@@ -25,6 +25,7 @@
 
 package jdk.nashorn.internal.tools.nasgen;
 
+import static jdk.internal.org.objectweb.asm.Opcodes.ACC_FINAL;
 import static jdk.internal.org.objectweb.asm.Opcodes.ACC_PUBLIC;
 import static jdk.internal.org.objectweb.asm.Opcodes.ACC_SUPER;
 import static jdk.internal.org.objectweb.asm.Opcodes.V1_7;
@@ -60,7 +61,7 @@
 
     byte[] getClassBytes() {
         // new class extensing from ScriptObject
-        cw.visit(V1_7, ACC_PUBLIC | ACC_SUPER, className, null, PROTOTYPEOBJECT_TYPE, null);
+        cw.visit(V1_7, ACC_FINAL | ACC_SUPER, className, null, PROTOTYPEOBJECT_TYPE, null);
         if (memberCount > 0) {
             // add fields
             emitFields();
--- a/make/build.xml	Fri Jul 26 14:08:51 2013 -0700
+++ b/make/build.xml	Mon Jul 29 10:28:03 2013 +0530
@@ -47,10 +47,10 @@
     <!-- check if testng.jar is avaiable -->
     <available property="testng.available" file="${file.reference.testng.jar}"/>
 
-	<!-- enable/disable make code coverage -->
-	<condition property="cc.enabled">
-		<istrue value="${make.code.coverage}" />
-	</condition>
+    <!-- enable/disable make code coverage -->
+    <condition property="cc.enabled">
+        <istrue value="${make.code.coverage}" />
+    </condition>
 
     <!-- exclude tests in exclude lists -->
     <condition property="exclude.list" value="./exclude/exclude_list_cc.txt" else="./exclude/exclude_list.txt">
@@ -60,9 +60,9 @@
 
   <target name="init" depends="init-conditions, init-cc">
 
-	<!-- extends jvm args -->
-	<property name="run.test.jvmargs" value="${run.test.jvmargs.main}  ${run.test.cc.jvmargs}"/>
-	<property name="run.test.jvmargs.octane" value="${run.test.jvmargs.octane.main}  ${run.test.cc.jvmargs}" />
+    <!-- extends jvm args -->
+    <property name="run.test.jvmargs" value="${run.test.jvmargs.main}  ${run.test.cc.jvmargs}"/>
+    <property name="run.test.jvmargs.octane" value="${run.test.jvmargs.octane.main}  ${run.test.cc.jvmargs}" />
 
     <echo message="run.test.jvmargs=${run.test.jvmargs}"/>
     <echo message="run.test.jvmargs.octane=${run.test.jvmargs.octane}"/>
@@ -294,19 +294,6 @@
   </target>
 
   <target name="test" depends="jar, check-testng, check-external-tests, compile-test, generate-policy-file" if="testng.available">
-    <java classname="${nashorn.shell.tool}" fork="true" dir="${test.script.dir}/representations" output="${build.dir}/output1.log" error="${build.dir}/err.log">
-      <jvmarg line="${ext.class.path}"/>
-      <jvmarg line="-Dnashorn.fields.dual=true"/>
-      <arg value="NASHORN-592a.js"/>
-    </java>
-    <java classname="${nashorn.shell.tool}" fork="true" dir="${test.script.dir}/representations" output="${build.dir}/output2.log" error="${build.dir}/err.log">
-      <jvmarg line="${ext.class.path}"/>
-      <arg value="NASHORN-592a.js"/>
-    </java>
-    <condition property="representation-ok">
-      <filesmatch file1="${build.dir}/output1.log" file2="${build.dir}/output2.log"/>
-    </condition>
-    <fail unless="representation-ok">Representation test failed - output differs!</fail>
     <fileset id="test.classes" dir="${build.test.classes.dir}">
       <include name="**/api/javaaccess/*Test.class"/>
       <include name="**/api/scripting/*Test.class"/>
--- a/make/project.properties	Fri Jul 26 14:08:51 2013 -0700
+++ b/make/project.properties	Mon Jul 29 10:28:03 2013 +0530
@@ -223,7 +223,6 @@
 run.test.user.country=TR
 
 #  -XX:+PrintCompilation -XX:+UnlockDiagnosticVMOptions -XX:+PrintNMethods
-# add '-Dtest.js.outofprocess' to run each test in a new sub-process
 run.test.jvmargs.main=-server -Xmx${run.test.xmx} -XX:+TieredCompilation -ea -Dfile.encoding=UTF-8 -Duser.language=${run.test.user.language} -Duser.country=${run.test.user.country}
 
 #-XX:+HeapDumpOnOutOfMemoryError -XX:-UseCompressedKlassPointers -XX:+PrintHeapAtGC -XX:ClassMetaspaceSize=300M  
@@ -231,6 +230,9 @@
 
 run.test.jvmsecurityargs=-Xverify:all -Djava.security.properties=${basedir}/make/java.security.override -Djava.security.manager -Djava.security.policy=${basedir}/build/nashorn.policy
 
+# VM options for script tests with @fork option
+test-sys-prop.test.fork.jvm.options=${run.test.jvmargs.main} ${run.test.jvmsecurityargs}
+
 # path of rhino.jar for benchmarks
 rhino.jar=
 
--- a/src/jdk/nashorn/internal/objects/BoundScriptFunctionImpl.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/src/jdk/nashorn/internal/objects/BoundScriptFunctionImpl.java	Mon Jul 29 10:28:03 2013 +0530
@@ -35,7 +35,7 @@
  * must track their {@code [[TargetFunction]]} property for purposes of correctly implementing {@code [[HasInstance]]};
  * see {@link ScriptFunction#isInstance(ScriptObject)}.
  */
-class BoundScriptFunctionImpl extends ScriptFunctionImpl {
+final class BoundScriptFunctionImpl extends ScriptFunctionImpl {
     private final ScriptFunction targetFunction;
 
     BoundScriptFunctionImpl(ScriptFunctionData data, ScriptFunction targetFunction) {
--- a/src/jdk/nashorn/internal/objects/PrototypeObject.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/src/jdk/nashorn/internal/objects/PrototypeObject.java	Mon Jul 29 10:28:03 2013 +0530
@@ -75,7 +75,7 @@
      *
      * @param map property map
      */
-    public PrototypeObject(final PropertyMap map) {
+    PrototypeObject(final PropertyMap map) {
         this(Global.instance(), map);
     }
 
@@ -89,7 +89,7 @@
      * @param self self reference
      * @return constructor, probably, but not necessarily, a {@link ScriptFunction}
      */
-    public static Object getConstructor(final Object self) {
+    static Object getConstructor(final Object self) {
         return (self instanceof PrototypeObject) ?
             ((PrototypeObject)self).getConstructor() :
             UNDEFINED;
@@ -100,7 +100,7 @@
      * @param self self reference
      * @param constructor constructor, probably, but not necessarily, a {@link ScriptFunction}
      */
-    public static void setConstructor(final Object self, final Object constructor) {
+    static void setConstructor(final Object self, final Object constructor) {
         if (self instanceof PrototypeObject) {
             ((PrototypeObject)self).setConstructor(constructor);
         }
--- a/src/jdk/nashorn/internal/runtime/AccessorProperty.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/src/jdk/nashorn/internal/runtime/AccessorProperty.java	Mon Jul 29 10:28:03 2013 +0530
@@ -51,7 +51,7 @@
  * An AccessorProperty is the most generic property type. An AccessorProperty is
  * represented as fields in a ScriptObject class.
  */
-public class AccessorProperty extends Property {
+public final class AccessorProperty extends Property {
     private static final MethodHandles.Lookup lookup = MethodHandles.lookup();
     private static final MethodHandle REPLACE_MAP = findOwnMH("replaceMap", Object.class, Object.class, PropertyMap.class, String.class, Class.class, Class.class);
 
@@ -149,7 +149,7 @@
      * @param property  accessor property to rebind
      * @param delegate  delegate object to rebind receiver to
      */
-    public AccessorProperty(final AccessorProperty property, final Object delegate) {
+    AccessorProperty(final AccessorProperty property, final Object delegate) {
         super(property);
 
         this.primitiveGetter = bindTo(property.primitiveGetter, delegate);
@@ -185,7 +185,7 @@
      * @param getter the property getter
      * @param setter the property setter or null if non writable, non configurable
      */
-    public AccessorProperty(final String key, final int flags, final int slot, final MethodHandle getter, final MethodHandle setter) {
+    AccessorProperty(final String key, final int flags, final int slot, final MethodHandle getter, final MethodHandle setter) {
         super(key, flags, slot);
 
         // we don't need to prep the setters these will never be invalidated as this is a nasgen
--- a/src/jdk/nashorn/internal/runtime/FinalScriptFunctionData.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/src/jdk/nashorn/internal/runtime/FinalScriptFunctionData.java	Mon Jul 29 10:28:03 2013 +0530
@@ -33,7 +33,7 @@
  * This is a subclass that represents a script function that may not be regenerated.
  * This is used for example for bound functions and builtins.
  */
-public final class FinalScriptFunctionData extends ScriptFunctionData {
+final class FinalScriptFunctionData extends ScriptFunctionData {
 
     /**
      * Constructor - used for bind
--- a/src/jdk/nashorn/internal/runtime/ListAdapter.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/src/jdk/nashorn/internal/runtime/ListAdapter.java	Mon Jul 29 10:28:03 2013 +0530
@@ -47,7 +47,7 @@
  * operations respectively, while {@link #addLast(Object)} and {@link #removeLast()} will translate to {@code push} and
  * {@code pop}.
  */
-public class ListAdapter extends AbstractList<Object> implements RandomAccess, Deque<Object> {
+public final class ListAdapter extends AbstractList<Object> implements RandomAccess, Deque<Object> {
     // These add to the back and front of the list
     private static final InvokeByName PUSH    = new InvokeByName("push",    ScriptObject.class, void.class, Object.class);
     private static final InvokeByName UNSHIFT = new InvokeByName("unshift", ScriptObject.class, void.class, Object.class);
--- a/src/jdk/nashorn/internal/runtime/Property.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/src/jdk/nashorn/internal/runtime/Property.java	Mon Jul 29 10:28:03 2013 +0530
@@ -100,7 +100,7 @@
      * @param flags property flags
      * @param slot  property field number or spill slot
      */
-    public Property(final String key, final int flags, final int slot) {
+    Property(final String key, final int flags, final int slot) {
         assert key != null;
         this.key   = key;
         this.flags = flags;
@@ -112,7 +112,7 @@
      *
      * @param property source property
      */
-    protected Property(final Property property) {
+    Property(final Property property) {
         this.key   = property.key;
         this.flags = property.flags;
         this.slot  = property.slot;
@@ -123,7 +123,7 @@
      *
      * @return cloned property
      */
-    protected abstract Property copy();
+    abstract Property copy();
 
     /**
      * Property flag utility method for {@link PropertyDescriptor}s. Given two property descriptors,
--- a/src/jdk/nashorn/internal/runtime/PropertyListenerManager.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/src/jdk/nashorn/internal/runtime/PropertyListenerManager.java	Mon Jul 29 10:28:03 2013 +0530
@@ -32,6 +32,7 @@
  * Helper class to manage property listeners and notification.
  */
 public class PropertyListenerManager implements PropertyListener {
+    PropertyListenerManager() {}
 
     /** property listeners for this object. */
     private Map<PropertyListener,Boolean> listeners;
--- a/src/jdk/nashorn/internal/runtime/ScriptFunctionData.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/src/jdk/nashorn/internal/runtime/ScriptFunctionData.java	Mon Jul 29 10:28:03 2013 +0530
@@ -67,7 +67,7 @@
      * @param isBuiltin     is the function built in
      * @param isConstructor is the function a constructor
      */
-    protected ScriptFunctionData(final String name, final int arity, final boolean isStrict, final boolean isBuiltin, final boolean isConstructor) {
+    ScriptFunctionData(final String name, final int arity, final boolean isStrict, final boolean isBuiltin, final boolean isConstructor) {
         this.name          = name;
         this.arity         = arity;
         this.code          = new CompiledFunctions();
--- a/src/jdk/nashorn/internal/runtime/UserAccessorProperty.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/src/jdk/nashorn/internal/runtime/UserAccessorProperty.java	Mon Jul 29 10:28:03 2013 +0530
@@ -83,7 +83,7 @@
      * @param getterSlot getter slot, starting at first embed
      * @param setterSlot setter slot, starting at first embed
      */
-    public UserAccessorProperty(final String key, final int flags, final int getterSlot, final int setterSlot) {
+    UserAccessorProperty(final String key, final int flags, final int getterSlot, final int setterSlot) {
         super(key, flags, -1);
         this.getterSlot = getterSlot;
         this.setterSlot = setterSlot;
--- a/src/jdk/nashorn/internal/runtime/WithObject.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/src/jdk/nashorn/internal/runtime/WithObject.java	Mon Jul 29 10:28:03 2013 +0530
@@ -57,7 +57,7 @@
      * @param scope scope object
      * @param expression with expression
      */
-    public WithObject(final ScriptObject scope, final Object expression) {
+    WithObject(final ScriptObject scope, final Object expression) {
         super(scope, null);
         setIsScope();
         this.expression = expression;
--- a/src/jdk/nashorn/internal/runtime/linker/AdaptationException.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/src/jdk/nashorn/internal/runtime/linker/AdaptationException.java	Mon Jul 29 10:28:03 2013 +0530
@@ -26,7 +26,7 @@
 package jdk.nashorn.internal.runtime.linker;
 
 @SuppressWarnings("serial")
-class AdaptationException extends Exception {
+final class AdaptationException extends Exception {
     private final AdaptationResult adaptationResult;
 
     AdaptationException(final AdaptationResult.Outcome outcome, final String classList) {
--- a/src/jdk/nashorn/internal/runtime/linker/AdaptationResult.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/src/jdk/nashorn/internal/runtime/linker/AdaptationResult.java	Mon Jul 29 10:28:03 2013 +0530
@@ -32,7 +32,7 @@
  * A result of generating an adapter for a class. A tuple of an outcome and - in case of an error outcome - a list of
  * classes that caused the error.
  */
-class AdaptationResult {
+final class AdaptationResult {
     /**
      * Contains various outcomes for attempting to generate an adapter class. These are stored in AdapterInfo instances.
      * We have a successful outcome (adapter class was generated) and four possible error outcomes: superclass is final,
--- a/src/jdk/nashorn/internal/runtime/linker/InvokeByName.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/src/jdk/nashorn/internal/runtime/linker/InvokeByName.java	Mon Jul 29 10:28:03 2013 +0530
@@ -58,7 +58,7 @@
  * you dynamically invoke a function with the same name from multiple places in your code, it is advisable to create a
  * separate instance of this class for every place.
  */
-public class InvokeByName {
+public final class InvokeByName {
     private final String name;
     private final MethodHandle getter;
     private final MethodHandle invoker;
--- a/src/jdk/nashorn/internal/runtime/linker/JavaAdapterBytecodeGenerator.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/src/jdk/nashorn/internal/runtime/linker/JavaAdapterBytecodeGenerator.java	Mon Jul 29 10:28:03 2013 +0530
@@ -56,7 +56,6 @@
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Random;
 import java.util.Set;
 import jdk.internal.org.objectweb.asm.ClassWriter;
 import jdk.internal.org.objectweb.asm.Label;
--- a/src/jdk/nashorn/internal/runtime/linker/JavaAdapterServices.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/src/jdk/nashorn/internal/runtime/linker/JavaAdapterServices.java	Mon Jul 29 10:28:03 2013 +0530
@@ -37,7 +37,7 @@
 /**
  * Provides static utility services to generated Java adapter classes.
  */
-public class JavaAdapterServices {
+public final class JavaAdapterServices {
     private static final ThreadLocal<ScriptObject> classOverrides = new ThreadLocal<>();
 
     private JavaAdapterServices() {
--- a/src/jdk/nashorn/internal/runtime/linker/JavaArgumentConverters.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/src/jdk/nashorn/internal/runtime/linker/JavaArgumentConverters.java	Mon Jul 29 10:28:03 2013 +0530
@@ -42,7 +42,7 @@
  * Utility class shared by {@code NashornLinker} and {@code NashornPrimitiveLinker} for converting JS values to Java
  * types.
  */
-public class JavaArgumentConverters {
+final class JavaArgumentConverters {
 
     private static final MethodHandle TO_BOOLEAN        = findOwnMH("toBoolean", Boolean.class, Object.class);
     private static final MethodHandle TO_STRING         = findOwnMH("toString", String.class, Object.class);
--- a/src/jdk/nashorn/internal/runtime/linker/NashornCallSiteDescriptor.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/src/jdk/nashorn/internal/runtime/linker/NashornCallSiteDescriptor.java	Mon Jul 29 10:28:03 2013 +0530
@@ -39,7 +39,7 @@
  * we can have a more compact representation, as we know that we're always only using {@code "dyn:*"} operations; also
  * we're storing flags in an additional primitive field.
  */
-public class NashornCallSiteDescriptor extends AbstractCallSiteDescriptor {
+public final class NashornCallSiteDescriptor extends AbstractCallSiteDescriptor {
     /** Flags that the call site references a scope variable (it's an identifier reference or a var declaration, not a
      * property access expression. */
     public static final int CALLSITE_SCOPE                = 0x01;
--- a/src/jdk/nashorn/internal/runtime/linker/NashornLinker.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/src/jdk/nashorn/internal/runtime/linker/NashornLinker.java	Mon Jul 29 10:28:03 2013 +0530
@@ -46,7 +46,7 @@
  * This is the main dynamic linker for Nashorn. It is used for linking all {@link ScriptObject} and its subclasses (this
  * includes {@link ScriptFunction} and its subclasses) as well as {@link Undefined}.
  */
-public final class NashornLinker implements TypeBasedGuardingDynamicLinker, GuardingTypeConverterFactory, ConversionComparator {
+final class NashornLinker implements TypeBasedGuardingDynamicLinker, GuardingTypeConverterFactory, ConversionComparator {
     /**
      * Returns true if {@code ScriptObject} is assignable from {@code type}, or it is {@code Undefined}.
      */
--- a/src/jdk/nashorn/internal/runtime/linker/PrimitiveLookup.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/src/jdk/nashorn/internal/runtime/linker/PrimitiveLookup.java	Mon Jul 29 10:28:03 2013 +0530
@@ -25,7 +25,6 @@
 
 package jdk.nashorn.internal.runtime.linker;
 
-import jdk.nashorn.internal.lookup.Lookup;
 import static jdk.nashorn.internal.lookup.Lookup.MH;
 
 import java.lang.invoke.MethodHandle;
@@ -35,6 +34,7 @@
 import jdk.internal.dynalink.linker.LinkRequest;
 import jdk.internal.dynalink.support.CallSiteDescriptorFactory;
 import jdk.internal.dynalink.support.Guards;
+import jdk.nashorn.internal.lookup.Lookup;
 import jdk.nashorn.internal.runtime.ScriptObject;
 
 /**
@@ -42,7 +42,7 @@
  * numbers). This class is only public so it can be accessed by classes in the {@code jdk.nashorn.internal.objects}
  * package.
  */
-public class PrimitiveLookup {
+public final class PrimitiveLookup {
 
     private PrimitiveLookup() {
     }
--- a/src/jdk/nashorn/internal/runtime/options/KeyValueOption.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/src/jdk/nashorn/internal/runtime/options/KeyValueOption.java	Mon Jul 29 10:28:03 2013 +0530
@@ -36,7 +36,7 @@
  *
  * {@code --log=module1:level1,module2:level2... }
  */
-public class KeyValueOption extends Option<String> {
+public final class KeyValueOption extends Option<String> {
     /**
      * Map of keys given
      */
--- a/src/jdk/nashorn/internal/runtime/options/OptionTemplate.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/src/jdk/nashorn/internal/runtime/options/OptionTemplate.java	Mon Jul 29 10:28:03 2013 +0530
@@ -34,7 +34,7 @@
  * bundle file. Metainfo such as parameters and description is here as well
  * for context sensitive help generation.
  */
-public class OptionTemplate implements Comparable<OptionTemplate> {
+public final class OptionTemplate implements Comparable<OptionTemplate> {
     /** Resource, e.g. "nashorn" for this option */
     private final String resource;
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/script/basic/NASHORN-592-dual.js	Mon Jul 29 10:28:03 2013 +0530
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * NASHORN-592-dual: test all combos of field types and getters and setters
+ * This time use dual field representation
+ *
+ * @test
+ * @option -Dnashorn.fields.dual=true
+ * @fork
+ * @run/ignore-std-error
+ */
+
+load(__DIR__ + 'NASHORN-592.js');
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/script/basic/NASHORN-592-dual.js.EXPECTED	Mon Jul 29 10:28:03 2013 +0530
@@ -0,0 +1,44 @@
+0
+0
+NaN
+undefinedhej!
+17
+8
+34
+17hej!
+17
+8
+34.9422
+17.4711hej!
+0
+0
+NaN
+Fame and fortune Salamander Yahoo!hej!
+24
+11111
+23.23
+23
+23
+Have some pie!
+4711.17
+17172
+23
+23.23
+23
+23
+Have some pie!
+4711.17
+23
+111
+4711.16
+I like cake!
+0
+NaN
+0
+I like cake!
+17
+17.4711
+salamander
+4711.17
+axolotl
+lizard
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/script/basic/compile-octane-splitter.js	Mon Jul 29 10:28:03 2013 +0530
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @option -Dnashorn.compiler.splitter.threshold=1000
+ * @fork
+ * @runif external.octane
+ */ 
+
+compile_only = true;
+load(__DIR__ + 'run-octane.js');
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/script/basic/compile-octane-splitter.js.EXPECTED	Mon Jul 29 10:28:03 2013 +0530
@@ -0,0 +1,13 @@
+Compiled OK: box2d
+Compiled OK: code-load
+Compiled OK: crypto
+Compiled OK: deltablue
+Compiled OK: earley-boyer
+Compiled OK: gbemu
+Compiled OK: mandreel
+Compiled OK: navier-stokes
+Compiled OK: pdfjs
+Compiled OK: raytrace
+Compiled OK: regexp
+Compiled OK: richards
+Compiled OK: splay
--- a/test/script/basic/runsunspider.js	Fri Jul 26 14:08:51 2013 -0700
+++ b/test/script/basic/runsunspider.js	Mon Jul 29 10:28:03 2013 +0530
@@ -1,21 +1,21 @@
 /*
  * 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.
@@ -33,7 +33,7 @@
 
 function assertEq(a, b) {
     if (a !== b) {
-	throw "ASSERTION FAILED: " + a + " should be " + b;
+        throw "ASSERTION FAILED: " + a + " should be " + b;
     }
 }
 
@@ -44,19 +44,19 @@
 function runbench(name) {
     var filename = name.split("/").pop();
     if (verbose_run) {
-	print("Running " + filename);
+        print("Running " + filename);
     }
 
     var start = new Date;
     for (var i = 0; i < iterations__; i++) {
-	load(name);    
+        load(name);
     }
     var stop = new Date - start;
     total_time += stop;
-    
+
     if (verbose_run) {
-	print(filename + " done in " + stop + " ms"); 
-    } 
+        print(filename + " done in " + stop + " ms");
+    }
     runs++;
 }
 
@@ -73,27 +73,23 @@
 
 function runsuite(tests) {
     var changed = false;
-    
+
     var oldRandom = Math.random;
     Math.random = pseudorandom;
-    
+
     try {
-	for (var n = 0; n < tests.length; n++) {
-	    runbench(tests[n].name);
-	    if (typeof tests[n].actual !== 'undefined') {
-		assertEq(tests[n].actual(), tests[n].expected());
-	    }
-	    changed = true;
-	}
-    } catch (e) {
-	print("error: " + e.printStackTrace());
-	if (e.toString().indexOf(tests) == 1) {
-	    throw e;
-	}
-	// no scripting or something, silently fail
+        for (var n = 0; n < tests.length; n++) {
+            path = dir + '../external/sunspider/tests/sunspider-1.0/' + tests[n].name
+            runbench(path);
+            if (typeof tests[n].actual !== 'undefined') {
+                assertEq(tests[n].actual(), tests[n].expected());
+            }
+            changed = true;
+        }
+        // no scripting or something, silently fail
     } finally {
-	Math.random = oldRandom;
     }
+    Math.random = oldRandom;
 
     return changed;
 }
@@ -103,211 +99,211 @@
     var h = 0;
     var off = 0;
     for (var i = 0; i < s.length; i++) {
-	h = 31 * h + s.charCodeAt(off++);
-	h &= 0x7fffffff;
+        h = 31 * h + s.charCodeAt(off++);
+        h &= 0x7fffffff;
     }
     return h ^ s.length;
 }
 
 var tests = [
     { name: 'string-base64.js',
-      actual: function() {	  
-	  return hash(str);
+      actual: function() {
+          return hash(str);
       },
       expected: function() {
-	  return 1544571068;
+          return 1544571068;
       }
-    },    
+    },
     { name: 'string-validate-input.js',
-      actual: function() {	  
-	  return hash(endResult);
+      actual: function() {
+          return hash(endResult);
       },
       expected: function() {
-	  return 2016572373;
+          return 2016572373;
       }
-    },    
+    },
     { name: 'date-format-xparb.js',
-      actual: function() {	  
-	  return shortFormat + longFormat;
+      actual: function() {
+          return shortFormat + longFormat;
       },
       expected: function() {
-	  return "2017-09-05Tuesday, September 05, 2017 8:43:48 AM";
+          return "2017-09-05Tuesday, September 05, 2017 8:43:48 AM";
       }
-    },    
+    },
     { name: '3d-morph.js',
       actual: function() {
-	  var acceptableDelta = 4e-15;
-	  return (testOutput - 6.394884621840902e-14) < acceptableDelta;
+          var acceptableDelta = 4e-15;
+          return (testOutput - 6.394884621840902e-14) < acceptableDelta;
       },
       expected: function() {
-	  return true;
+          return true;
       }
-    },    
+    },
     { name: 'crypto-aes.js',
       actual: function() {
-	  return plainText;
+          return plainText;
       },
       expected: function() {
-	  return decryptedText;
+          return decryptedText;
       }
-    },    
+    },
     { name: 'crypto-md5.js',
       actual: function() {
-	  return md5Output;
+          return md5Output;
       },
       expected: function() {
-	  return "a831e91e0f70eddcb70dc61c6f82f6cd";
+          return "a831e91e0f70eddcb70dc61c6f82f6cd";
       }
-    },    
+    },
     { name: 'crypto-sha1.js',
       actual: function() {
-	  return sha1Output;
+          return sha1Output;
       },
       expected: function() {
-	  return "2524d264def74cce2498bf112bedf00e6c0b796d";
+          return "2524d264def74cce2498bf112bedf00e6c0b796d";
       }
-    },    
-    { name: 'bitops-bitwise-and.js', 
+    },
+    { name: 'bitops-bitwise-and.js',
       actual: function() {
-	  return result;      
+          return result;
       },
       expected: function() {
-	  return 0;
+          return 0;
       }
-    },    
-    { name: 'bitops-bits-in-byte.js', 
+    },
+    { name: 'bitops-bits-in-byte.js',
       actual: function() {
-	  return result;      
+          return result;
       },
       expected: function() {
-	  return 358400;
+          return 358400;
       }
-    },    
-    { name: 'bitops-nsieve-bits.js', 
+    },
+    { name: 'bitops-nsieve-bits.js',
       actual: function() {
-	  var ret = 0;
-	  for (var i = 0; i < result.length; ++i) {
-	      ret += result[i];
-	  }
-	  ret += result.length;
-	  return ret;	    
+          var ret = 0;
+          for (var i = 0; i < result.length; ++i) {
+              ret += result[i];
+          }
+          ret += result.length;
+          return ret;
       },
       expected: function() {
-	  return -1286749539853;
+          return -1286749539853;
       }
-    },    
-    { name: 'bitops-3bit-bits-in-byte.js', 
+    },
+    { name: 'bitops-3bit-bits-in-byte.js',
       actual: function() {
-	  return sum;      
+          return sum;
       },
       expected: function() {
-	  return 512000;
+          return 512000;
       }
-    },    
-    { name: 'access-nbody.js', 
+    },
+    { name: 'access-nbody.js',
       actual: function() {
-	  return ret;  
+          return ret;
       },
       expected: function() {
-	    return -0.16906933525822856;
+            return -1.3524862408537381;
       }
-    },    
-    { name: 'access-binary-trees.js', 
+    },
+    { name: 'access-binary-trees.js',
       actual: function() {
-	  return ret;  
+          return ret;
       },
       expected: function() {
-	  return -1;
+          return -4;
       }
-    },    
+    },
     { name: 'access-fannkuch.js',
       actual: function() {
-	  return ret;  
+          return ret;
       },
       expected: function() {
-	  return 22;
+          return 22;
       }
     },
     { name: 'math-spectral-norm.js',
-      actual: function() {	    
-	  var ret = '';
-	  for (var i = 6; i <= 48; i *= 2) {
-	      ret += spectralnorm(i) + ',';
-	  }
-	  return ret;
+      actual: function() {
+          var ret = '';
+          for (var i = 6; i <= 48; i *= 2) {
+              ret += spectralnorm(i) + ',';
+          }
+          return ret;
       },
       expected: function() {
-	  return "1.2657786149754053,1.2727355112619148,1.273989979775574,1.274190125290389,";
+          return "1.2657786149754053,1.2727355112619148,1.273989979775574,1.274190125290389,";
       }
-    },    
+    },
     { name: '3d-raytrace.js',
       actual: function() {
-	  return hash(testOutput);
+          return hash(testOutput);
       },
       expected: function() {
-	  return 230692593;
+          return 230692593;
       }
-    },    
+    },
     { name: 'regexp-dna.js',
       actual: function() {
-	  return dnaOutputString;
+          return dnaOutputString;
       },
       expected: function() {
-	  return "undefinedagggtaaa|tttaccct 0\n[cgt]gggtaaa|tttaccc[acg] 9\na[act]ggtaaa|tttacc[agt]t 27\nag[act]gtaaa|tttac[agt]ct 24\nagg[act]taaa|ttta[agt]cct 30\naggg[acg]aaa|ttt[cgt]ccct 9\nagggt[cgt]aa|tt[acg]accct 12\nagggta[cgt]a|t[acg]taccct 9\nagggtaa[cgt]|[acg]ttaccct 15\n";
+          return "agggtaaa|tttaccct 0\n[cgt]gggtaaa|tttaccc[acg] 9\na[act]ggtaaa|tttacc[agt]t 27\nag[act]gtaaa|tttac[agt]ct 24\nagg[act]taaa|ttta[agt]cct 30\naggg[acg]aaa|ttt[cgt]ccct 9\nagggt[cgt]aa|tt[acg]accct 12\nagggta[cgt]a|t[acg]taccct 9\nagggtaa[cgt]|[acg]ttaccct 15\n";
       }
-    },    
+    },
     { name: 'math-cordic.js',
       actual: function() {
-	  return total;
+          return total;
       },
       expected: function() {
-	  return 10362.570468755888;
+          return 10362.570468755888;
       }
     },
     { name: 'controlflow-recursive.js',
       actual: function() {
-	  var ret = 0;
-	  for (var i = 3; i <= 5; i++) {
-	      ret += ack(3,i);
-	      ret += fib(17.0+i);
-	      ret += tak(3*i+3,2*i+2,i+1);
-	  }
-	  return ret;
+          var ret = 0;
+          for (var i = 3; i <= 5; i++) {
+              ret += ack(3,i);
+              ret += fib(17.0+i);
+              ret += tak(3*i+3,2*i+2,i+1);
+          }
+          return ret;
       },
       expected: function() {
-	  return 57775;
+          return 57775;
       }
-    },    
+    },
     { name: 'date-format-tofte.js',
       actual: function() {
-	  return shortFormat + longFormat;
+          return shortFormat + longFormat;
       },
       expected: function() {
-	  return "2008-05-01Thursday, May 01, 2008 6:31:22 PM";
+          return "2008-05-01Thursday, May 01, 2008 6:31:22 PM";
       }
     },
     { name: 'string-tagcloud.js',
       actual: function() {
-	  // The result string embeds floating-point numbers, which can vary a bit on different platforms,
-	  // so we truncate them a bit before comparing.
-	  var tagcloud_norm = tagcloud.replace(/([0-9.]+)px/g, function(str, p1) { return p1.substr(0, 10) + 'px' })
-	  return tagcloud_norm.length;
+          // The result string embeds floating-point numbers, which can vary a bit on different platforms,
+          // so we truncate them a bit before comparing.
+          var tagcloud_norm = tagcloud.replace(/([0-9.]+)px/g, function(str, p1) { return p1.substr(0, 10) + 'px' })
+          return tagcloud_norm.length;
       },
       expected: function() {
-	  return 295906;
+          return 295906;
       }
-    },    
+    },
     { name: 'string-unpack-code.js',
       actual: function() {
-	  return decompressedMochiKit.length == 106415 &&
-	      decompressedMochiKit[2000] == '5' &&
-	      decompressedMochiKit[12000] == '_' &&
-	      decompressedMochiKit[82556] == '>';
+          return decompressedMochiKit.length == 106415 &&
+              decompressedMochiKit[2000] == '5' &&
+              decompressedMochiKit[12000] == '_' &&
+              decompressedMochiKit[82556] == '>';
       },
       expected: function() {
-	  return true;
+          return true;
       }
-    },    
+    },
     //TODO no easy way to sanity check result
     { name: 'string-fasta.js' },
     //TODO no easy way to sanity check result
@@ -315,17 +311,13 @@
     //TODO no easy way to sanity check result
     { name: 'access-nsieve.js' },
     //TODO no easy way to sanity check result
-    { name: '3d-cube.js' },    
+    { name: '3d-cube.js' },
 ];
 
 // handle the case this script may be run by a JS engine that doesn't
 // support __DIR__ global variable.
 var dir = (typeof(__DIR__) == 'undefined') ? "test/script/basic/" : __DIR__;
 
-for (i in tests) {
-    tests[i].name = dir + '../external/sunspider/tests/sunspider-1.0/' + tests[i].name;
-}
-
 var verbose_run = false;
 
 var args = [];
@@ -333,12 +325,12 @@
     args = $ARGS;
 } else if (typeof arguments !== 'undefined' && arguments.length != 0) {
     args = arguments;
-}  
+}
 
 for (i in args) {
     if (args[i] === '--verbose') {
-	verbose_run = true;
-	break;
+        verbose_run = true;
+        break;
     }
 }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/script/basic/splitter.js	Mon Jul 29 10:28:03 2013 +0530
@@ -0,0 +1,36 @@
+/*
+ * 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.
+ */
+
+/**
+ * Test various scripts with low splitter threshold
+ *
+ * @test
+ * @option -Dnashorn.compiler.splitter.threshold=200
+ * @run
+ * @fork
+ */
+
+load(__DIR__ + 'prototype.js');
+load(__DIR__ + 'yui.js');
+load(__DIR__ + 'NASHORN-689.js');
+load(__DIR__ + 'NASHORN-58.js');
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/script/basic/splitter.js.EXPECTED	Mon Jul 29 10:28:03 2013 +0530
@@ -0,0 +1,76 @@
+parsed and compiled ok prototype.js
+parsed and compiled ok yui-min.js
+parsed and compiled ok yui.js
+a=10
+a=9
+a=8
+a=7
+a=6
+a=5
+a=4
+a=3
+a=2
+a=1
+a=0
+10
+a=0
+a=1
+a=2
+a=3
+a=4
+a=5
+a=6
+a=7
+a=8
+a=9
+a=10
+ok
+a=0
+a=1
+a=2
+a=3
+a=4
+a=5
+a=6
+a=7
+a=8
+a=9
+a=10
+done
+no arg
+x=0
+x=1
+x=2
+x=3
+x=4
+x=5
+x=6
+x=7
+x=8
+x=9
+x=10
+ok
+done
+try
+finally
+3
+try
+finally
+2
+3
+1
+2
+3
+4
+5
+5
+6
+6
+1
+2
+3
+4
+6
+Error: testing
+finally
+SUCCESS
--- a/test/script/representations/NASHORN-592a.js	Fri Jul 26 14:08:51 2013 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,122 +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.
- * 
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- * 
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- * 
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/**
- * NASHORN-592a: test all combos of field types and getters and setters
- * This time use dual field representation
- *
- * @test
- * @option --dual-fields
- * @run
- */
-
-//fortype undefined
-var a;
-
-print(a & 0xff);
-print(a >>> 1);
-print(a * 2);
-print(a + "hej!");
-
-var b;
-b = 17;   //set undefined->int
-
-print(b & 0xff);
-print(b >>> 1);
-print(b * 2);
-print(b + "hej!");
-
-var c;
-c = 17.4711 //set undefined->double
-
-print(c & 0xff);
-print(c >>> 1);
-print(c * 2);
-print(c + "hej!");
-
-var d; // set undefined->double
-d = "Fame and fortune Salamander Yahoo!";
-
-print(d & 0xff);
-print(d >>> 1);
-print(d * 2);
-print(d + "hej!");
-
-// now we have exhausted all getters and undefined->everything setters.
-
-
-var e = 23; // int to everything setters,
-e = 24;     //int to int
-print(e);
-e = (22222 >>> 1); //int to long;
-print(e);
-e = 23.23;  //int to double
-print(e);
-e = 23;     //double to int - still double
-print(e);
-print(e & 0xff);
-e = "Have some pie!" //double to string
-print(e);
-e = 4711.17;
-print(e); //still an object not a double
-
-
-var f = (23222 >>> 1); // long to everything setters,
-f = 34344 >>> 1;     //long to long
-print(f);
-f = 23; //long to int - still long
-print(f);
-f = 23.23;  //long to double
-print(f);
-f = 23;     //double to int - still double
-print(f);
-print(f & 0xff);
-f = "Have some pie!" //double to string
-print(f);
-f = 4711.17;
-print(f); //still an object not a double
-
-var g = 4811.16;
-g = 23; //still double
-print(g);
-g = (222 >>> 1); //still double
-print(g);
-g = 4711.16; //double->double
-print(g);
-g = "I like cake!";
-print(g);  //object to various
-print(g & 0xff);
-print(g * 2);
-print(g >>> 2);
-print(g);
-
-var h = {x:17, y:17.4711, z:"salamander"};
-print(h.x);
-print(h.y);
-print(h.z);
-h.x = 4711.17;
-h.y = "axolotl";
-h.z = "lizard";
-print(h.x);
-print(h.y);
-print(h.z);
--- a/test/src/jdk/nashorn/internal/test/framework/AbstractScriptRunnable.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/test/src/jdk/nashorn/internal/test/framework/AbstractScriptRunnable.java	Mon Jul 29 10:28:03 2013 +0530
@@ -29,6 +29,7 @@
 import static jdk.nashorn.internal.test.framework.TestConfig.OPTIONS_COMPARE;
 import static jdk.nashorn.internal.test.framework.TestConfig.OPTIONS_EXPECT_COMPILE_FAIL;
 import static jdk.nashorn.internal.test.framework.TestConfig.OPTIONS_EXPECT_RUN_FAIL;
+import static jdk.nashorn.internal.test.framework.TestConfig.OPTIONS_FORK;
 import static jdk.nashorn.internal.test.framework.TestConfig.OPTIONS_IGNORE_STD_ERROR;
 import static jdk.nashorn.internal.test.framework.TestConfig.OPTIONS_RUN;
 import static jdk.nashorn.internal.test.framework.TestConfig.TEST_JS_FAIL_LIST;
@@ -68,6 +69,8 @@
     protected final boolean checkCompilerMsg;
     // .EXPECTED file compared for this or test?
     protected final boolean compare;
+    // should test run in a separate process?
+    protected final boolean fork;
     // ignore stderr output?
     protected final boolean ignoreStdError;
     // Foo.js.OUTPUT file where test stdout messages go
@@ -98,6 +101,7 @@
         this.checkCompilerMsg = testOptions.containsKey(OPTIONS_CHECK_COMPILE_MSG);
         this.ignoreStdError = testOptions.containsKey(OPTIONS_IGNORE_STD_ERROR);
         this.compare = testOptions.containsKey(OPTIONS_COMPARE);
+        this.fork = testOptions.containsKey(OPTIONS_FORK);
 
         final String testName = testFile.getName();
         this.outputFileName = buildDir + File.separator + testName + ".OUTPUT";
@@ -105,7 +109,6 @@
         this.copyExpectedFileName = buildDir + File.separator + testName + ".EXPECTED";
         this.expectedFileName = testFile.getPath() + ".EXPECTED";
 
-        final String failListString = System.getProperty(TEST_JS_FAIL_LIST);
         if (failListString != null) {
             final String[] failedTests = failListString.split(" ");
             for (final String failedTest : failedTests) {
@@ -147,10 +150,15 @@
     }
 
     // shared context or not?
-    protected static final boolean sharedContext;
+    protected static final boolean sharedContext = Boolean.getBoolean(TEST_JS_SHARED_CONTEXT);
+    protected static final String failListString = System.getProperty(TEST_JS_FAIL_LIST);
+    // VM options when a @fork test is executed by a separate process
+    protected static final String[] forkJVMOptions;
     static {
-        sharedContext = Boolean.getBoolean(TEST_JS_SHARED_CONTEXT);
+        String vmOptions = System.getProperty(TestConfig.TEST_FORK_JVM_OPTIONS);
+        forkJVMOptions = (vmOptions != null)? vmOptions.split(" ") : new String[0];
     }
+
     private static ThreadLocal<ScriptEvaluator> evaluators = new ThreadLocal<>();
 
     /**
--- a/test/src/jdk/nashorn/internal/test/framework/ScriptRunnable.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/test/src/jdk/nashorn/internal/test/framework/ScriptRunnable.java	Mon Jul 29 10:28:03 2013 +0530
@@ -43,6 +43,8 @@
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+
+import jdk.nashorn.tools.Shell;
 import org.testng.Assert;
 import org.testng.ITest;
 import org.testng.annotations.Test;
@@ -53,9 +55,6 @@
  * corresponding .EXPECTED file.
  */
 public final class ScriptRunnable extends AbstractScriptRunnable implements ITest {
-    // when test is run in a separate process, this is the command line
-    protected final ArrayList<String> separateProcessArgs;
-
     public ScriptRunnable(final String framework, final File testFile, final List<String> engineOptions, final Map<String, String> testOptions,  final List<String> scriptArguments) {
         super(framework, testFile, engineOptions, testOptions, scriptArguments);
 
@@ -63,9 +62,6 @@
           // add --dump-on-error option always so that we can get detailed error msg.
           engineOptions.add("-doe");
         }
-
-        final String separateProcess = System.getProperty("test.js.separateprocess");
-        this.separateProcessArgs = separateProcess == null ? null : new ArrayList<>(Arrays.asList(separateProcess.split(" ")));
     }
 
     @Override
@@ -81,7 +77,7 @@
 
     @Override
     protected void execute() {
-        if (separateProcessArgs != null) {
+        if (fork) {
             executeInNewProcess();
         } else {
             executeInThisProcess();
@@ -172,15 +168,24 @@
     }
 
     private void executeInNewProcess() {
-        final List<String> args = separateProcessArgs;
+
+        final String separator = System.getProperty("file.separator");
+        final List<String> cmd = new ArrayList<>();
+
+        cmd.add(System.getProperty("java.home") + separator + "bin" + separator + "java");
+        cmd.add("-Djava.ext.dirs=dist");
+        for (String str : forkJVMOptions) {
+            cmd.add(str);
+        }
+        cmd.add(Shell.class.getName());
         // now add the rest of the "in process" runtime arguments
-        args.addAll(getRuntimeArgs());
+        cmd.addAll(getRuntimeArgs());
 
         final File outputFileHandle = new File(outputFileName);
         final File errorFileHandle = new File(errorFileName);
 
         try {
-            final ProcessBuilder pb = new ProcessBuilder(args);
+            final ProcessBuilder pb = new ProcessBuilder(cmd);
             pb.redirectOutput(outputFileHandle);
             pb.redirectError(errorFileHandle);
             final Process process = pb.start();
--- a/test/src/jdk/nashorn/internal/test/framework/TestConfig.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/test/src/jdk/nashorn/internal/test/framework/TestConfig.java	Mon Jul 29 10:28:03 2013 +0530
@@ -36,6 +36,7 @@
     public static final String   OPTIONS_EXPECT_RUN_FAIL     = "expect-run-fail";
     public static final String   OPTIONS_IGNORE_STD_ERROR    = "ignore-std-error";
     public static final String   OPTIONS_COMPARE             = "compare";
+    public static final String   OPTIONS_FORK                = "fork";
 
     // System property names used for various test configurations
 
@@ -73,6 +74,8 @@
     // shared context mode or not
     static final String TEST_JS_SHARED_CONTEXT              = "test.js.shared.context";
 
+    static final String TEST_FORK_JVM_OPTIONS               = "test.fork.jvm.options";
+
     // file for storing last run's failed tests
     static final String TEST_FAILED_LIST_FILE = "test.failed.list.file";
 }
--- a/test/src/jdk/nashorn/internal/test/framework/TestFinder.java	Fri Jul 26 14:08:51 2013 -0700
+++ b/test/src/jdk/nashorn/internal/test/framework/TestFinder.java	Mon Jul 29 10:28:03 2013 +0530
@@ -29,6 +29,7 @@
 import static jdk.nashorn.internal.test.framework.TestConfig.OPTIONS_COMPARE;
 import static jdk.nashorn.internal.test.framework.TestConfig.OPTIONS_EXPECT_COMPILE_FAIL;
 import static jdk.nashorn.internal.test.framework.TestConfig.OPTIONS_EXPECT_RUN_FAIL;
+import static jdk.nashorn.internal.test.framework.TestConfig.OPTIONS_FORK;
 import static jdk.nashorn.internal.test.framework.TestConfig.OPTIONS_IGNORE_STD_ERROR;
 import static jdk.nashorn.internal.test.framework.TestConfig.OPTIONS_RUN;
 import static jdk.nashorn.internal.test.framework.TestConfig.TEST_FAILED_LIST_FILE;
@@ -208,6 +209,7 @@
         boolean checkCompilerMsg = false;
         boolean noCompare = false;
         boolean ignoreStdError = false;
+        boolean fork = false;
 
         final List<String> engineOptions = new ArrayList<>();
         final List<String> scriptArguments = new ArrayList<>();
@@ -284,6 +286,9 @@
                 case "@option":
                     engineOptions.add(scanner.next());
                     break;
+                case "@fork":
+                    fork = true;
+                    break;
                 }
 
                 // negative tests are expected to fail at runtime only
@@ -324,6 +329,9 @@
             if (ignoreStdError) {
                 testOptions.put(OPTIONS_IGNORE_STD_ERROR, "true");
             }
+            if (fork) {
+                testOptions.put(OPTIONS_FORK, "true");
+            }
 
             tests.add(factory.createTest(framework, testFile.toFile(), engineOptions, testOptions, scriptArguments));
         } else if (!isNotTest) {