diff --git a/nashorn/bin/checkintest.sh b/nashorn/bin/checkintest.sh deleted file mode 100644 index c4a9e96ca12..00000000000 --- a/nashorn/bin/checkintest.sh +++ /dev/null @@ -1,266 +0,0 @@ -#!/bin/bash -# -# 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. -# - -#best pass rate at test 262 known -TEST262_PASS_AT_LEAST=435 - -RUN_TEST="true" -RUN_TEST262="true" -RUN_NODE="true" -KEEP_OUTPUT="true" -CLEAN_AND_BUILD_NASHORN="true" - -#the stable node version to sync against -NODE_LAST_STABLE=v0.6.18 - -#parse args -for arg in $* -do - if [ $arg = "--no-test" ]; then - RUN_TEST="false" - echo "**** WARNING - you have disabled 'ant test', which is a minimum checkin requirement..." - elif [ $arg = "--no-262" ]; then - RUN_TEST262="false" - elif [ $arg = "--no-node" ]; then - RUN_NODE="false" - elif [ $arg = "--no-build" ]; then - CLEAN_AND_BUILD_NASHORN="false" - elif [ $arg = "--no-logs" ]; then - KEEP_OUTPUT="false" - fi -done - -function lastpart() { - arr=$(echo $1 | tr "/" "\n") - for x in $arr - do - _last=$x - done - echo $_last -} - -function check_installed() { - which $1 >/dev/null - if [ $? -ne 0 ]; then - echo "Error $1 not installed: $?" - exit 2 - fi -} - -check_installed hg -check_installed git -check_installed mv -check_installed git - -PWD=$(pwd); - -while [ -z $NASHORN_ROOT ] -do - if [ -e $PWD/.hg ]; then - NASHORN_ROOT=${PWD} - break - fi - PWD=$(dirname ${PWD}) -done - -echo "Nashorn root detected at ${NASHORN_ROOT}" - -COMMON_ROOT=$(dirname $NASHORN_ROOT) -echo "Common root is ${COMMON_ROOT}" - -echo "Running checkintest..." - -ABSOLUTE_NASHORN_HOME=$COMMON_ROOT/$(lastpart $NASHORN_ROOT) - -if [ $CLEAN_AND_BUILD_NASHORN != "false" ]; then - echo "Cleaning and building nashorn at $ABSOLUTE_NASHORN_HOME/nashorn..." - $(cd $ABSOLUTE_NASHORN_HOME/nashorn; ant clean >/dev/null 2>/dev/null) - $(cd $ABSOLUTE_NASHORN_HOME/nashorn; ant jar >/dev/null 2>/dev/null) - echo "Done." -fi - -function failure_check() { - while read line - do - LINE=$(echo $line | grep "Tests run") - if [ "${LINE}" != "" ]; then - RESULT=$(echo $line | grep "Failures: 0" | grep "Errors: 0") - if [ "${RESULT}" == "" ]; then - TESTNAME=$2 - echo "There were errors in ${TESTNAME} : ${LINE}" - exit 1 - fi - fi - done < $1 -} - -function test() { - TEST_OUTPUT=$ABSOLUTE_NASHORN_HOME/$(mktemp tmp.XXXXX) - echo "Running 'ant test' on nashorn from ${ABSOLUTE_NASHORN_HOME}/nashorn..." - $(cd $ABSOLUTE_NASHORN_HOME/nashorn; ant test >$TEST_OUTPUT) - echo "Done." - - failure_check $TEST_OUTPUT - - echo "**** SUCCESS: 'ant test' successful" - - if [ $KEEP_OUTPUT == "true" ]; then - cp $TEST_OUTPUT ./checkintest.test.log - rm -fr $TEST_OUTPUT - fi -} - -if [ $RUN_TEST != "false" ]; then - test; -fi - -function test262() { - - echo "Running 'ant test262parallel' on nashorn from ${ABSOLUTE_NASHORN_HOME}/nashorn..." - TEST262_OUTPUT=$ABSOLUTE_NASHORN_HOME/$(mktemp tmp.XXXXX) - - echo "Looking for ${ABSOLUTE_NASHORN_HOME}/test/test262..." - - if [ ! -e $ABSOLUTE_NASHORN_HOME/nashorn/test/test262 ]; then - echo "test262 is missing... looking in $COMMON_ROOT..." - if [ ! -e $COMMON_ROOT/test262 ]; then - echo "... not there either... cloning from repo..." - hg clone http://hg.ecmascript.org/tests/test262 $COMMON_ROOT/test262 >/dev/null 2>/dev/null - echo "Done." - fi - echo "Adding soft link ${COMMON_ROOT}/test262 -> ${ABSOLUTE_NASHORN_HOME}/test/test262..." - ln -s $COMMON_ROOT/test262 $ABSOLUTE_NASHORN_HOME/nashorn/test/test262 - echo "Done." - fi - - echo "Ensuring test262 is up to date..." - $(cd $ABSOLUTE_NASHORN_HOME/nashorn/test/test262; hg pull -u >/dev/null 2>/dev/null) - echo "Done." - - echo "Running test262..." - $(cd $ABSOLUTE_NASHORN_HOME/nashorn; ant test262parallel > $TEST262_OUTPUT) - - FAILED=$(cat $TEST262_OUTPUT|grep "Tests run:"| cut -d ' ' -f 15 |tr -cd '"[[:digit:]]') - if [ $FAILED -gt $TEST262_PASS_AT_LEAST ]; then - echo "FAILURE: There are ${FAILED} failures in test262 and can be no more than ${TEST262_PASS_AT_LEAST}" - cp $TEST262_OUTPUT ./checkintest.test262.log - echo "See ./checkintest.test262.log" - echo "Terminating due to error" - exit 1 - elif [ $FAILED -lt $TEST262_PASS_AT_LEAST ]; then - echo "There seem to have been fixes to 262. ${FAILED} < ${TEST262_PASS_AT_LEAST}. Please update limit in bin/checkintest.sh" - fi - - echo "**** SUCCESS: Test262 passed with no more than ${TEST262_PASS_AT_LEAST} failures." - - if [ $KEEP_OUTPUT == "true" ]; then - cp $TEST262_OUTPUT ./checkintest.test262.log - rm -fr $TEST262_OUTPUT - fi -} - -if [ $RUN_TEST262 != "false" ]; then - test262; -fi; - -function testnode() { - TESTNODEJAR_OUTPUT=$ABSOLUTE_NASHORN_HOME/$(mktemp tmp.XXXXX) - - echo "Running node tests..." -#replace node jar properties nashorn with this nashorn - - NODEJAR_PROPERTIES=~/nodejar.properties - - NODE_HOME=$(cat $NODEJAR_PROPERTIES | grep ^node.home | cut -f2 -d=) - NASHORN_HOME=$(cat $NODEJAR_PROPERTIES | grep ^nashorn.home | cut -f2 -d=) - - ABSOLUTE_NODE_HOME=$COMMON_ROOT/$(lastpart $NODE_HOME) - - echo "Writing nodejar.properties..." - - cat > $NODEJAR_PROPERTIES << EOF -node.home=../node -nashorn.home=../$(lastpart $NASHORN_ROOT) -EOF - echo "Done." - echo "Checking node home ${ABSOLUTE_NODE_HOME}..." - - if [ ! -e $ABSOLUTE_NODE_HOME ]; then - echo "Node base dir not found. Cloning node..." - $(cd $COMMON_ROOT; git clone https://github.com/joyent/node.git $(lastpart $NODE_HOME) >/dev/null 2>/dev/null) - echo "Done." - echo "Updating to last stable version ${NODE_LAST_STABLE}..." - $(cd $ABSOLUTE_NODE_HOME; git checkout $NODE_LAST_STABLE >/dev/null 2>/dev/null) - echo "Done." - echo "Running configure..." - $(cd $ABSOLUTE_NODE_HOME; ./configure >/dev/null 2>/dev/null) - echo "Done." - fi - - echo "Ensuring node is built..." -#make sure node is built - $(cd $ABSOLUTE_NODE_HOME; make >/dev/null 2>/dev/null) - echo "Done." - - NODEJAR_HOME=$COMMON_ROOT/nodejar - - if [ ! -e $NODEJAR_HOME ]; then - echo "No node jar home found. cloning from depot..." - $(cd $COMMON_ROOT; hg clone https://hg.kenai.com/hg/nodejs~source nodejar >/dev/null 2>/dev/null) - $(cd $COMMON_ROOT/nodejar; ant >/dev/null) - echo "Done." - echo "Copying node files..." - $(cd $COMMON_ROOT/nodejar; ant copy-node-files >/dev/null 2>/dev/null) - echo "Patching node files..." - $(cd $COMMON_ROOT/nodejar; ant patch-node-files >/dev/null 2>/dev/null) - echo "Done." - fi - - echo "Ensuring node.jar is up to date from source depot..." - $(cd $COMMON_ROOT/nodejar; hg pull -u >/dev/null 2>/dev/null) - echo "Done." - - echo "Installing nashorn..." - $(cd $COMMON_ROOT/nodejar; ant >/dev/null) - echo "Done." - - echo "Running node.jar test..." - $(cd $COMMON_ROOT/nodejar; mvn clean verify >$TESTNODEJAR_OUTPUT) - echo "Done." - - failure_check $TESTNODEJAR_OUTPUT - - echo "**** SUCCESS: Node test successful." - - if [ $KEEP_OUTPUT == "true" ]; then - rm -fr $TESTNODEJAR_OUTPUT - cp $TESTNODEJAR_OUTPUT ./checkintest.nodejar.log - fi -} - -if [ $RUN_NODE != "false" ]; then - testnode; -fi; - -echo "Finished" diff --git a/nashorn/bin/fastCatchCombinator.jar b/nashorn/bin/fastCatchCombinator.jar deleted file mode 100644 index 03e105006e3..00000000000 Binary files a/nashorn/bin/fastCatchCombinator.jar and /dev/null differ diff --git a/nashorn/bin/runoptdualcatch.sh b/nashorn/bin/runopt.sh similarity index 83% rename from nashorn/bin/runoptdualcatch.sh rename to nashorn/bin/runopt.sh index 5b366efd20c..9c77c5bc789 100644 --- a/nashorn/bin/runoptdualcatch.sh +++ b/nashorn/bin/runopt.sh @@ -3,18 +3,16 @@ #FLAGS="-Djava.lang.invoke.MethodHandle.COMPILE_THRESHOLD=3 -Djava.lang.invoke.MethodHandle.DUMP_CLASS_FILES=true -Djava.lang.invoke.MethodHandle.TRACE_METHOD_LINKAGE=true -Djava.lang.invoke.MethodHandle.TRACE_INTERPRETER=true" #FLAGS="-Djava.security.manager -Djava.security.policy=../build/nashorn.policy -Dnashorn.debug" -FILENAME="./optimistic_dual_catch_$(date|sed "s/ /_/g"|sed "s/:/_/g").jfr" +FILENAME="./optimistic_$(date|sed "s/ /_/g"|sed "s/:/_/g").jfr" DIR=.. -FAST_CATCH_COMBINATOR= -#$DIR/bin/fastCatchCombinator.jar NASHORN_JAR=$DIR/dist/nashorn.jar $JAVA_HOME/bin/java \ $FLAGS \ -ea \ -esa \ --Xbootclasspath/p:$FAST_CATCH_COMBINATOR:$NASHORN_JAR \ +-Xbootclasspath/p:$NASHORN_JAR \ -Xms2G -Xmx2G \ -XX:+UnlockCommercialFeatures \ -XX:+FlightRecorder \ diff --git a/nashorn/bin/runopt_noassert.sh b/nashorn/bin/runopt_noassert.sh new file mode 100644 index 00000000000..6331972ab64 --- /dev/null +++ b/nashorn/bin/runopt_noassert.sh @@ -0,0 +1,28 @@ +#!/bin/sh + +#FLAGS="-Djava.lang.invoke.MethodHandle.COMPILE_THRESHOLD=3 -Djava.lang.invoke.MethodHandle.DUMP_CLASS_FILES=true -Djava.lang.invoke.MethodHandle.TRACE_METHOD_LINKAGE=true -Djava.lang.invoke.MethodHandle.TRACE_INTERPRETER=true" + +FILENAME="./optimistic_noassert_$(date|sed "s/ /_/g"|sed "s/:/_/g").jfr" + +DIR=.. +NASHORN_JAR=$DIR/dist/nashorn.jar + +$JAVA_HOME/bin/java \ +$FLAGS \ +-Xbootclasspath/p:$NASHORN_JAR \ +-Xms2G -Xmx2G \ +-XX:+UnlockCommercialFeatures \ +-XX:+FlightRecorder \ +-XX:FlightRecorderOptions=defaultrecording=true,disk=true,dumponexit=true,dumponexitpath=$FILENAME,stackdepth=1024 \ +-XX:TypeProfileLevel=222 \ +-XX:+UnlockExperimentalVMOptions \ +-XX:+UseTypeSpeculation \ +-XX:+UseMathExactIntrinsics \ +-XX:+UnlockDiagnosticVMOptions \ +-cp $CLASSPATH:../build/test/classes/ \ +jdk.nashorn.tools.Shell ${@} + +#-XX:+ShowHiddenFrames \ +#-XX:+PrintOptoAssembly \ +#-XX:-TieredCompilation \ +#-XX:CICompilerCount=1 \ diff --git a/nashorn/bin/runoptdualcatch9.sh b/nashorn/bin/runopt_nojfr.sh similarity index 62% rename from nashorn/bin/runoptdualcatch9.sh rename to nashorn/bin/runopt_nojfr.sh index ffc2b054be3..daf3c6a0073 100644 --- a/nashorn/bin/runoptdualcatch9.sh +++ b/nashorn/bin/runopt_nojfr.sh @@ -2,30 +2,25 @@ #FLAGS="-Djava.lang.invoke.MethodHandle.COMPILE_THRESHOLD=3 -Djava.lang.invoke.MethodHandle.DUMP_CLASS_FILES=true -Djava.lang.invoke.MethodHandle.TRACE_METHOD_LINKAGE=true -Djava.lang.invoke.MethodHandle.TRACE_INTERPRETER=true" -FILENAME="./optimistic_dual_catch_$(date|sed "s/ /_/g"|sed "s/:/_/g").jfr" - DIR=.. -FAST_CATCH_COMBINATOR= -#$DIR/bin/fastCatchCombinator.jar NASHORN_JAR=$DIR/dist/nashorn.jar $JAVA_HOME/bin/java \ $FLAGS \ -ea \ -esa \ --Xbootclasspath/p:$FAST_CATCH_COMBINATOR:$NASHORN_JAR \ +-Xbootclasspath/p:$NASHORN_JAR \ -Xms2G -Xmx2G \ -XX:+UnlockCommercialFeatures \ -XX:TypeProfileLevel=222 \ -XX:+UnlockExperimentalVMOptions \ +-XX:+UseTypeSpeculation \ +-XX:+UseMathExactIntrinsics \ -XX:+UnlockDiagnosticVMOptions \ +-XX:+UseNewCode \ -cp $CLASSPATH:../build/test/classes/ \ jdk.nashorn.tools.Shell ${@} -#-XX:+FlightRecorder \ -#-XX:FlightRecorderOptions=defaultrecording=true,disk=true,dumponexit=true,dumponexitpath=$FILENAME,stackdepth=1024 \ -#-XX:+UseTypeSpeculation \ -#-XX:+UseMathExactIntrinsics \ #-XX:+ShowHiddenFrames \ #-XX:+PrintOptoAssembly \ #-XX:-TieredCompilation \ diff --git a/nashorn/src/jdk/internal/dynalink/linker/GuardedInvocation.java b/nashorn/src/jdk/internal/dynalink/linker/GuardedInvocation.java index 98fb9362b0f..facd5287e32 100644 --- a/nashorn/src/jdk/internal/dynalink/linker/GuardedInvocation.java +++ b/nashorn/src/jdk/internal/dynalink/linker/GuardedInvocation.java @@ -83,6 +83,8 @@ package jdk.internal.dynalink.linker; +import static jdk.nashorn.internal.lookup.Lookup.MH; + import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; @@ -91,9 +93,7 @@ import java.lang.invoke.WrongMethodTypeException; import java.util.List; import jdk.internal.dynalink.CallSiteDescriptor; -import jdk.internal.dynalink.support.CatchExceptionCombinator; import jdk.internal.dynalink.support.Guards; -import jdk.nashorn.internal.runtime.options.Options; /** * Represents a conditionally valid method handle. It is an immutable triple of an invocation method handle, a guard @@ -105,8 +105,6 @@ import jdk.nashorn.internal.runtime.options.Options; * @author Attila Szegedi */ public class GuardedInvocation { - private static final boolean USE_FAST_REWRITE = Options.getBooleanProperty("nashorn.fastrewrite"); - private final MethodHandle invocation; private final MethodHandle guard; private final Class<? extends Throwable> exception; @@ -417,7 +415,7 @@ public class GuardedInvocation { final MethodHandle catchGuarded = exception == null ? guarded : - catchException( + MH.catchException( guarded, exception, MethodHandles.dropArguments( @@ -437,13 +435,6 @@ public class GuardedInvocation { return spGuarded; } - private static MethodHandle catchException(final MethodHandle target, final Class<? extends Throwable> exType, final MethodHandle handler) { - if (USE_FAST_REWRITE) { - return CatchExceptionCombinator.catchException(target, exType, handler); - } - return MethodHandles.catchException(target, exType, handler); - } - private static void assertType(final MethodHandle mh, final MethodType type) { if(!mh.type().equals(type)) { throw new WrongMethodTypeException("Expected type: " + type + " actual type: " + mh.type()); diff --git a/nashorn/src/jdk/internal/dynalink/support/CatchExceptionCombinator.java b/nashorn/src/jdk/internal/dynalink/support/CatchExceptionCombinator.java deleted file mode 100644 index 0aa5ac9f16d..00000000000 --- a/nashorn/src/jdk/internal/dynalink/support/CatchExceptionCombinator.java +++ /dev/null @@ -1,180 +0,0 @@ -package jdk.internal.dynalink.support; - -import static jdk.internal.org.objectweb.asm.Opcodes.ACC_PUBLIC; -import static jdk.internal.org.objectweb.asm.Opcodes.ACC_STATIC; -import static jdk.internal.org.objectweb.asm.Opcodes.ACC_SUPER; -import static jdk.internal.org.objectweb.asm.Opcodes.V1_7; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.function.Function; -import jdk.internal.org.objectweb.asm.ClassWriter; -import jdk.internal.org.objectweb.asm.Label; -import jdk.internal.org.objectweb.asm.Type; -import jdk.internal.org.objectweb.asm.commons.InstructionAdapter; -import jdk.nashorn.internal.runtime.RewriteException; -import sun.misc.Unsafe; - -/** - * Generates method handles that combine an invocation and a handler for a {@link RewriteException}. Always immediately - * generates compiled bytecode. - */ -public class CatchExceptionCombinator { - static { - System.err.println("*** Running with fast catch combinator handler ***"); - } - private static final Type METHOD_HANDLE_TYPE = Type.getType(MethodHandle.class); - private static final String METHOD_HANDLE_TYPE_NAME = METHOD_HANDLE_TYPE.getInternalName(); - private static final String OBJECT_TYPE_NAME = Type.getInternalName(Object.class); - - private static final String HANDLER_TYPE_NAME = "java.lang.invoke.CatchExceptionCombinator$MH"; - private static final String INVOKE_METHOD_NAME = "invoke"; - - private static final Unsafe UNSAFE = Unsafe.getUnsafe(); - - private static final ConcurrentMap<CombinatorParameters, ClassTemplate> handlerClassBytes = new ConcurrentHashMap<>(); - - private static final class CombinatorParameters { - final MethodType targetType; - final Class<? extends Throwable> exType; - final MethodType handlerType; - - CombinatorParameters(final MethodType targetType, final Class<? extends Throwable> exType, MethodType handlerType) { - this.targetType = targetType; - this.exType = exType; - this.handlerType = handlerType; - } - - @Override - public boolean equals(Object obj) { - if(obj instanceof CombinatorParameters) { - final CombinatorParameters p = (CombinatorParameters)obj; - return targetType.equals(p.targetType) && exType.equals(p.exType) && handlerType.equals(p.handlerType); - } - return false; - } - - @Override - public int hashCode() { - return targetType.hashCode() ^ exType.hashCode() ^ handlerType.hashCode(); - } - } - - /** - * Catch exception - create combinator - * @param target target - * @param exType type to check for - * @param handler catch handler - * @return target wrapped in catch handler - */ - public static MethodHandle catchException(final MethodHandle target, final Class<? extends Throwable> exType, final MethodHandle handler) { - final MethodType targetType = target.type(); - final MethodType handlerType = handler.type(); - - final ClassTemplate classTemplate = handlerClassBytes.computeIfAbsent( - new CombinatorParameters(targetType, exType, handlerType), new Function<CombinatorParameters, ClassTemplate>() { - @Override - public ClassTemplate apply(final CombinatorParameters parameters) { - return generateClassTemplate(parameters); - } - }); - return classTemplate.instantiate(target, handler, targetType); - } - - private static final class ClassTemplate { - final byte[] bytes; - final int target_cp_index; - final int handler_cp_index; - final int cp_size; - - ClassTemplate(final byte[] bytes, final int target_cp_index, final int handler_cp_index, final int cp_size) { - this.bytes = bytes; - this.target_cp_index = target_cp_index; - this.handler_cp_index = handler_cp_index; - this.cp_size = cp_size; - } - - MethodHandle instantiate(final MethodHandle target, final MethodHandle handler, final MethodType type) { - final Object[] cpPatch = new Object[cp_size]; - cpPatch[target_cp_index] = target; - cpPatch[handler_cp_index] = handler; - final Class<?> handlerClass = UNSAFE.defineAnonymousClass(CatchExceptionCombinator.class, bytes, cpPatch); - try { - return MethodHandles.lookup().findStatic(handlerClass, INVOKE_METHOD_NAME, type); - } catch (NoSuchMethodException | IllegalAccessException e) { - throw new AssertionError(e); - } - } - } - - private static ClassTemplate generateClassTemplate(final CombinatorParameters combinatorParameters) { - final ClassWriter w = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); - w.visit(V1_7, ACC_PUBLIC | ACC_SUPER, HANDLER_TYPE_NAME, null, OBJECT_TYPE_NAME, null); - - final MethodType targetType = combinatorParameters.targetType; - final Class<? extends Throwable> exType = combinatorParameters.exType; - final String methodDescriptor = targetType.toMethodDescriptorString(); - final Class<?> returnType = targetType.returnType(); - final MethodType handlerType = combinatorParameters.handlerType; - - // NOTE: must use strings as placeholders in the constant pool, even if we'll be replacing them with method handles. - final String targetPlaceholder = "T_PLACEHOLDER"; - final String handlerPlaceholder = "H_PLACEHOLDER"; - final int target_cp_index = w.newConst(targetPlaceholder); - final int handler_cp_index = w.newConst(handlerPlaceholder); - - final InstructionAdapter mv = new InstructionAdapter(w.visitMethod(ACC_PUBLIC | ACC_STATIC, INVOKE_METHOD_NAME, methodDescriptor, null, null)); - mv.visitAnnotation("Ljava/lang/invoke/LambdaForm$Hidden;", true); - mv.visitAnnotation("Ljava/lang/invoke/LambdaForm$Compiled;", true); - mv.visitAnnotation("Ljava/lang/invoke/ForceInline;", true); - - mv.visitCode(); - - final Label _try = new Label(); - final Label _end_try= new Label(); - - mv.visitLabel(_try); - // Invoke - mv.aconst(targetPlaceholder); - mv.checkcast(METHOD_HANDLE_TYPE); - final Class<?>[] paramTypes = targetType.parameterArray(); - for(int i = 0, slot = 0; i < paramTypes.length; ++i) { - final Type paramType = Type.getType(paramTypes[i]); - mv.load(slot, paramType); - slot += paramType.getSize(); - } - generateInvokeBasic(mv, methodDescriptor); - final Type asmReturnType = Type.getType(returnType); - mv.areturn(asmReturnType); - - mv.visitTryCatchBlock(_try, _end_try, _end_try, Type.getInternalName(exType)); - mv.visitLabel(_end_try); - // Handle exception - mv.aconst(handlerPlaceholder); - mv.checkcast(METHOD_HANDLE_TYPE); - mv.swap(); - final Class<?>[] handlerParamTypes = handlerType.parameterArray(); - for(int i = 1, slot = 0; i < handlerParamTypes.length; ++i) { - final Type paramType = Type.getType(handlerParamTypes[i]); - mv.load(slot, paramType); - slot += paramType.getSize(); - } - generateInvokeBasic(mv, handlerType.toMethodDescriptorString()); - mv.areturn(asmReturnType); - - mv.visitMaxs(0, 0); - mv.visitEnd(); - - w.visitEnd(); - final byte[] bytes = w.toByteArray(); - final int cp_size = (((bytes[8] & 0xFF) << 8) | (bytes[9] & 0xFF)); - return new ClassTemplate(bytes, target_cp_index, handler_cp_index, cp_size); - } - - private static void generateInvokeBasic(final InstructionAdapter mv, final String methodDesc) { - mv.invokevirtual(METHOD_HANDLE_TYPE_NAME, "invokeBasic", methodDesc, false); - } -} diff --git a/nashorn/src/jdk/nashorn/internal/codegen/ObjectClassGenerator.java b/nashorn/src/jdk/nashorn/internal/codegen/ObjectClassGenerator.java index b97083eb101..c153440e6b8 100644 --- a/nashorn/src/jdk/nashorn/internal/codegen/ObjectClassGenerator.java +++ b/nashorn/src/jdk/nashorn/internal/codegen/ObjectClassGenerator.java @@ -162,7 +162,6 @@ public final class ObjectClassGenerator { */ static { if (!OBJECT_FIELDS_ONLY) { - LOG.warning("Running with primitive fields - there is untested functionality!"); FIELD_TYPES.add(PRIMITIVE_FIELD_TYPE); } else { LOG.warning("Running with object fields only - this is a deprecated configuration."); diff --git a/nashorn/src/jdk/nashorn/internal/runtime/CompiledFunction.java b/nashorn/src/jdk/nashorn/internal/runtime/CompiledFunction.java index ef04266a11b..13fae0e22f9 100644 --- a/nashorn/src/jdk/nashorn/internal/runtime/CompiledFunction.java +++ b/nashorn/src/jdk/nashorn/internal/runtime/CompiledFunction.java @@ -38,24 +38,16 @@ import java.util.Map; import java.util.TreeMap; import java.util.logging.Level; -import jdk.internal.dynalink.support.CatchExceptionCombinator; import jdk.nashorn.internal.codegen.types.ArrayType; import jdk.nashorn.internal.codegen.types.Type; import jdk.nashorn.internal.ir.FunctionNode; import jdk.nashorn.internal.runtime.linker.Bootstrap; -import jdk.nashorn.internal.runtime.options.Options; /** * An version of a JavaScript function, native or JavaScript. * Supports lazily generating a constructor version of the invocation. */ final class CompiledFunction { - private static final boolean USE_FAST_REWRITE = Options.getBooleanProperty("nashorn.fastrewrite"); - static { - if(USE_FAST_REWRITE && CompiledFunction.class.getClassLoader() != null) { - throw new AssertionError("-Dnashorn.fastrewrite can only be used with Nashorn in boot class path! (Try -Xbootclasspath/p:dist/nashorn.jar )"); - } - } private static final MethodHandle NEWFILTER = findOwnMH("newFilter", Object.class, Object.class, Object.class); private static final MethodHandle RELINK_COMPOSABLE_INVOKER = findOwnMH("relinkComposableInvoker", void.class, CallSite.class, CompiledFunction.class, boolean.class); @@ -548,9 +540,6 @@ final class CompiledFunction { if(isOptimistic) { assert handleRewriteException != null; final MethodHandle typedHandleRewriteException = changeReturnType(handleRewriteException, inv.type().returnType()); - if(USE_FAST_REWRITE) { - return CatchExceptionCombinator.catchException(inv, RewriteException.class, typedHandleRewriteException); - } return MH.catchException(inv, RewriteException.class, typedHandleRewriteException); } return inv; diff --git a/nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayData.java b/nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayData.java index c65235274dd..ce678d1e947 100644 --- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayData.java +++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayData.java @@ -39,31 +39,11 @@ import jdk.nashorn.internal.objects.Global; import jdk.nashorn.internal.runtime.JSType; import jdk.nashorn.internal.runtime.PropertyDescriptor; import jdk.nashorn.internal.runtime.UnwarrantedOptimismException; -import sun.misc.Unsafe; /** * ArrayData - abstraction for wrapping array elements */ public abstract class ArrayData { - /** - * Unsafe instance used for unsafe array getters (de facto always safe as they are guarded - * by {@link ArrayData#has(int)} anyway - */ - protected static final Unsafe UNSAFE = null; - -/* static { - @SuppressWarnings("unused") - Unsafe unsafe = null; - try { - unsafe = Unsafe.getUnsafe(); - } catch (final SecurityException e) { - System.err.println("WARNING: Disabling unsafe array getters... Unsafe not available"); - } - //TODO: disabled for now as we have seen no real performance improvement on non-micros - //and using UNSAFE is a damn stupid thing to do - UNSAFE = unsafe; - }*/ - /** Minimum chunk size for underlying arrays */ protected static final int CHUNK_SIZE = 32; @@ -417,7 +397,7 @@ public abstract class ArrayData { * @param programPoint program point * @return the value */ - public int getIntOptimistic(int index, int programPoint) { + public int getIntOptimistic(final int index, final int programPoint) { throw new UnwarrantedOptimismException(getObject(index), programPoint, getOptimisticType()); } @@ -437,7 +417,7 @@ public abstract class ArrayData { * @param programPoint program point * @return the value */ - public long getLongOptimistic(int index, int programPoint) { + public long getLongOptimistic(final int index, final int programPoint) { throw new UnwarrantedOptimismException(getObject(index), programPoint, getOptimisticType()); } @@ -457,7 +437,7 @@ public abstract class ArrayData { * @param programPoint program point * @return the value */ - public double getDoubleOptimistic(int index, int programPoint) { + public double getDoubleOptimistic(final int index, final int programPoint) { throw new UnwarrantedOptimismException(getObject(index), programPoint, getOptimisticType()); } diff --git a/nashorn/src/jdk/nashorn/internal/runtime/arrays/IntArrayData.java b/nashorn/src/jdk/nashorn/internal/runtime/arrays/IntArrayData.java index 1b03f5f7d71..98bb4d3693f 100644 --- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/IntArrayData.java +++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/IntArrayData.java @@ -65,19 +65,8 @@ final class IntArrayData extends ContinuousArrayData { this.array = array; } - private static final MethodHandle HAS_GET_ELEM = specialCall(MethodHandles.lookup(), IntArrayData.class, UNSAFE == null ? "getElem" : "getElemUnsafe", int.class, int.class).methodHandle(); - private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), IntArrayData.class, UNSAFE == null ? "setElem" : "setElemUnsafe", void.class, int.class, int.class).methodHandle(); - - private final static long UNSAFE_BASE = UNSAFE == null ? 0L : UNSAFE.arrayBaseOffset(int[].class); - private final static long UNSAFE_SCALE = UNSAFE == null ? 0L : UNSAFE.arrayIndexScale(int[].class); - - @SuppressWarnings("unused") - private int getElemUnsafe(final int index) { - if (has(index)) { - return UNSAFE.getInt(array, UNSAFE_BASE + UNSAFE_SCALE * index); - } - throw new ClassCastException(); - } + private static final MethodHandle HAS_GET_ELEM = specialCall(MethodHandles.lookup(), IntArrayData.class, "getElem", int.class, int.class).methodHandle(); + private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), IntArrayData.class, "setElem", void.class, int.class, int.class).methodHandle(); @SuppressWarnings("unused") private int getElem(final int index) { @@ -87,15 +76,6 @@ final class IntArrayData extends ContinuousArrayData { throw new ClassCastException(); } - @SuppressWarnings("unused") - private void setElemUnsafe(final int index, final int elem) { - if (hasRoomFor(index)) { - UNSAFE.putInt(array, UNSAFE_BASE + UNSAFE_SCALE * index, elem); - return; - } - throw new ClassCastException(); - } - @SuppressWarnings("unused") private void setElem(final int index, final int elem) { if (hasRoomFor(index)) { diff --git a/nashorn/src/jdk/nashorn/internal/runtime/arrays/LongArrayData.java b/nashorn/src/jdk/nashorn/internal/runtime/arrays/LongArrayData.java index 3e38bb435ba..ee24b3a2a44 100644 --- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/LongArrayData.java +++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/LongArrayData.java @@ -188,19 +188,8 @@ final class LongArrayData extends ContinuousArrayData { return Type.LONG; } - private static final MethodHandle HAS_GET_ELEM = specialCall(MethodHandles.lookup(), LongArrayData.class, UNSAFE == null ? "getElem" : "getElemUnsafe", long.class, int.class).methodHandle(); - private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), LongArrayData.class, UNSAFE == null ? "setElem" : "setElemUnsafe", void.class, int.class, long.class).methodHandle(); - - private final static long UNSAFE_BASE = UNSAFE == null ? 0L : UNSAFE.arrayBaseOffset(long[].class); - private final static long UNSAFE_SCALE = UNSAFE == null ? 0L : UNSAFE.arrayIndexScale(long[].class); - - @SuppressWarnings("unused") - private long getElemUnsafe(final int index) { - if (has(index)) { - return UNSAFE.getLong(array, UNSAFE_BASE + UNSAFE_SCALE * index); - } - throw new ClassCastException(); - } + private static final MethodHandle HAS_GET_ELEM = specialCall(MethodHandles.lookup(), LongArrayData.class, "getElem", long.class, int.class).methodHandle(); + private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), LongArrayData.class, "setElem", void.class, int.class, long.class).methodHandle(); @SuppressWarnings("unused") private long getElem(final int index) { @@ -210,15 +199,6 @@ final class LongArrayData extends ContinuousArrayData { throw new ClassCastException(); } - @SuppressWarnings("unused") - private void setElemUnsafe(final int index, final long elem) { - if (hasRoomFor(index)) { - UNSAFE.putLong(array, UNSAFE_BASE + UNSAFE_SCALE * index, elem); - return; - } - throw new ClassCastException(); - } - @SuppressWarnings("unused") private void setElem(final int index, final long elem) { if (hasRoomFor(index)) { diff --git a/nashorn/src/jdk/nashorn/internal/runtime/arrays/NumberArrayData.java b/nashorn/src/jdk/nashorn/internal/runtime/arrays/NumberArrayData.java index 9be15576838..95b3095f9c8 100644 --- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/NumberArrayData.java +++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/NumberArrayData.java @@ -168,19 +168,8 @@ final class NumberArrayData extends ContinuousArrayData { return Type.NUMBER; } - private static final MethodHandle HAS_GET_ELEM = specialCall(MethodHandles.lookup(), NumberArrayData.class, UNSAFE == null ? "getElem" : "getElemUnsafe", double.class, int.class).methodHandle(); - private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), NumberArrayData.class, UNSAFE == null ? "setElem" : "setElemUnsafe", void.class, int.class, double.class).methodHandle(); - - private final static long UNSAFE_BASE = UNSAFE == null ? 0L : UNSAFE.arrayBaseOffset(double[].class); - private final static long UNSAFE_SCALE = UNSAFE == null ? 0L : UNSAFE.arrayIndexScale(double[].class); - - @SuppressWarnings("unused") - private double getElemUnsafe(final int index) { - if (has(index)) { - return UNSAFE.getDouble(array, UNSAFE_BASE + UNSAFE_SCALE * index); - } - throw new ClassCastException(); - } + private static final MethodHandle HAS_GET_ELEM = specialCall(MethodHandles.lookup(), NumberArrayData.class, "getElem", double.class, int.class).methodHandle(); + private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), NumberArrayData.class, "setElem", void.class, int.class, double.class).methodHandle(); @SuppressWarnings("unused") private double getElem(final int index) { @@ -190,15 +179,6 @@ final class NumberArrayData extends ContinuousArrayData { throw new ClassCastException(); } - @SuppressWarnings("unused") - private void setElemUnsafe(final int index, final double elem) { - if (hasRoomFor(index)) { - UNSAFE.putDouble(array, UNSAFE_BASE + UNSAFE_SCALE * index, elem); - return; - } - throw new ClassCastException(); - } - @SuppressWarnings("unused") private void setElem(final int index, final double elem) { if (hasRoomFor(index)) { diff --git a/nashorn/src/jdk/nashorn/internal/runtime/arrays/ObjectArrayData.java b/nashorn/src/jdk/nashorn/internal/runtime/arrays/ObjectArrayData.java index c7a64b7df5d..726c6fc1abc 100644 --- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/ObjectArrayData.java +++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/ObjectArrayData.java @@ -161,19 +161,8 @@ final class ObjectArrayData extends ContinuousArrayData { return Type.OBJECT; } - private static final MethodHandle HAS_GET_ELEM = specialCall(MethodHandles.lookup(), ObjectArrayData.class, UNSAFE == null ? "getElem" : "getElemUnsafe", Object.class, int.class).methodHandle(); - private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), ObjectArrayData.class, UNSAFE == null ? "setElem" : "setElemUnsafe", void.class, int.class, Object.class).methodHandle(); - - private final static long UNSAFE_BASE = UNSAFE == null ? 0L : UNSAFE.arrayBaseOffset(Object[].class); - private final static long UNSAFE_SCALE = UNSAFE == null ? 0L : UNSAFE.arrayIndexScale(Object[].class); - - @SuppressWarnings("unused") - private Object getElemUnsafe(final int index) { - if (has(index)) { - return UNSAFE.getObject(array, UNSAFE_BASE + UNSAFE_SCALE * index); - } - throw new ClassCastException(); - } + private static final MethodHandle HAS_GET_ELEM = specialCall(MethodHandles.lookup(), ObjectArrayData.class, "getElem", Object.class, int.class).methodHandle(); + private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), ObjectArrayData.class, "setElem", void.class, int.class, Object.class).methodHandle(); @SuppressWarnings("unused") private Object getElem(final int index) { @@ -183,15 +172,6 @@ final class ObjectArrayData extends ContinuousArrayData { throw new ClassCastException(); } - @SuppressWarnings("unused") - private void setElemUnsafe(final int index, final Object elem) { - if (hasRoomFor(index)) { - UNSAFE.putObject(array, UNSAFE_BASE + UNSAFE_SCALE * index, elem); - return; - } - throw new ClassCastException(); - } - @SuppressWarnings("unused") private void setElem(final int index, final Object elem) { if (hasRoomFor(index)) {