diff --git a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MethodGenerator.java b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MethodGenerator.java index 3d968e8e192..1a99d828991 100644 --- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MethodGenerator.java +++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MethodGenerator.java @@ -85,6 +85,7 @@ import java.util.List; import jdk.internal.org.objectweb.asm.Handle; import jdk.internal.org.objectweb.asm.MethodVisitor; import jdk.internal.org.objectweb.asm.Type; +import jdk.nashorn.internal.objects.annotations.SpecializedFunction.LinkLogic; /** * Base class for all method generating classes. @@ -97,7 +98,7 @@ public class MethodGenerator extends MethodVisitor { private final Type returnType; private final Type[] argumentTypes; - static final Type EMPTY_LINK_LOGIC_TYPE = Type.getType("Ljdk/nashorn/internal/objects/annotations/SpecializedFunction$LinkLogic$Empty;"); + static final Type EMPTY_LINK_LOGIC_TYPE = Type.getType(LinkLogic.getEmptyLinkLogicClass()); MethodGenerator(final MethodVisitor mv, final int access, final String name, final String descriptor) { super(Main.ASM_VERSION, mv); diff --git a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ScriptClassInfo.java b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ScriptClassInfo.java index 5436eb8fde3..9e3dfc174ab 100644 --- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ScriptClassInfo.java +++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ScriptClassInfo.java @@ -38,6 +38,7 @@ import jdk.nashorn.internal.objects.annotations.Property; import jdk.nashorn.internal.objects.annotations.ScriptClass; import jdk.nashorn.internal.objects.annotations.Setter; import jdk.nashorn.internal.objects.annotations.SpecializedFunction; +import jdk.nashorn.internal.objects.annotations.SpecializedFunction.LinkLogic; import jdk.nashorn.internal.objects.annotations.Where; import jdk.nashorn.internal.tools.nasgen.MemberInfo.Kind; @@ -55,8 +56,8 @@ public final class ScriptClassInfo { static final String SETTER_ANNO_DESC = Type.getDescriptor(Setter.class); static final String PROPERTY_ANNO_DESC = Type.getDescriptor(Property.class); static final String WHERE_ENUM_DESC = Type.getDescriptor(Where.class); + static final String LINK_LOGIC_DESC = Type.getDescriptor(LinkLogic.class); static final String SPECIALIZED_FUNCTION = Type.getDescriptor(SpecializedFunction.class); - static final String LINK_LOGIC_DESC = "Ljdk/nashorn/internal/objects/annotations/SpecializedFunction$LinkLogic;"; static final Map annotations = new HashMap<>(); diff --git a/nashorn/make/BuildNashorn.gmk b/nashorn/make/BuildNashorn.gmk index e7838e00d13..fcba486a6db 100644 --- a/nashorn/make/BuildNashorn.gmk +++ b/nashorn/make/BuildNashorn.gmk @@ -29,6 +29,7 @@ default: all -include $(SPEC) include MakeBase.gmk include JavaCompilation.gmk +include SetupJavaCompilers.gmk JDK_CLASSES := $(subst $(SPACE),$(PATH_SEP),$(strip $(addprefix $(JDK_OUTPUTDIR)/modules/, \ java.base java.logging java.scripting))) @@ -63,10 +64,10 @@ ASM_SRC := $(JDK_TOPDIR)/src/java.base/share/classes/jdk/internal/org/objectweb/ # Build nasgen $(eval $(call SetupJavaCompilation,BUILD_NASGEN, \ - SETUP := GENERATE_NEWBYTECODE_DEBUG, \ + SETUP := GENERATE_OLDBYTECODE, \ SRC := $(NASGEN_SRC) $(ASM_SRC), \ BIN := $(NASHORN_OUTPUTDIR)/nasgen_classes, \ - ADD_JAVAC_FLAGS := -cp $(NASHORN_OUTPUTDIR)/nashorn_classes)) + ADD_JAVAC_FLAGS := -bootclasspath "$(BOOT_RTJAR)$(PATH_SEP)$(NASHORN_OUTPUTDIR)/nashorn_classes")) # Nasgen needs nashorn classes $(BUILD_NASGEN): $(BUILD_NASHORN) diff --git a/nashorn/samples/BufferArray.java b/nashorn/samples/BufferArray.java index f1751f50860..b26b5c08eba 100644 --- a/nashorn/samples/BufferArray.java +++ b/nashorn/samples/BufferArray.java @@ -29,8 +29,8 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import jdk.nashorn.api.scripting.AbstractJSObject; import java.nio.DoubleBuffer; +import jdk.nashorn.api.scripting.AbstractJSObject; /** * Simple class demonstrating pluggable script object @@ -112,6 +112,8 @@ public class BufferArray extends AbstractJSObject { return true; } }; + default: + break; } return null; } diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ApplySpecialization.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ApplySpecialization.java index 28900f73779..b05475b6e54 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ApplySpecialization.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ApplySpecialization.java @@ -27,7 +27,6 @@ package jdk.nashorn.internal.codegen; import static jdk.nashorn.internal.codegen.CompilerConstants.ARGUMENTS_VAR; import static jdk.nashorn.internal.codegen.CompilerConstants.EXPLODED_ARGUMENT_PREFIX; - import java.lang.invoke.MethodType; import java.util.ArrayDeque; import java.util.ArrayList; @@ -35,7 +34,6 @@ import java.util.Deque; import java.util.HashSet; import java.util.List; import java.util.Set; - import jdk.nashorn.internal.ir.AccessNode; import jdk.nashorn.internal.ir.CallNode; import jdk.nashorn.internal.ir.Expression; @@ -131,7 +129,7 @@ public final class ApplySpecialization extends NodeVisitor imple @SuppressWarnings("serial") final UnsupportedOperationException uoe = new UnsupportedOperationException() { @Override - public Throwable fillInStackTrace() { + public synchronized Throwable fillInStackTrace() { return null; } }; diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java index 97b26212a46..ae3ee6947e0 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java @@ -104,6 +104,7 @@ import jdk.nashorn.internal.ir.IfNode; import jdk.nashorn.internal.ir.IndexNode; import jdk.nashorn.internal.ir.JoinPredecessor; import jdk.nashorn.internal.ir.JoinPredecessorExpression; +import jdk.nashorn.internal.ir.JumpStatement; import jdk.nashorn.internal.ir.LabelNode; import jdk.nashorn.internal.ir.LexicalContext; import jdk.nashorn.internal.ir.LexicalContextNode; @@ -1204,17 +1205,21 @@ final class CodeGenerator extends NodeOperatorVisitor targets = splitMethod.getExternalTargets(); + final boolean hasControlFlow = hasReturn || !targets.isEmpty(); final List targetNodes = splitMethod.getExternalTargetNodes(); final Type returnType = lc.getCurrentFunction().getReturnType(); @@ -2814,6 +2808,9 @@ final class CodeGenerator extends NodeOperatorVisitor 0) { sb.append("$cu").append(cuid); diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Label.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Label.java index 863046907c6..7c86abf0eb4 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Label.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Label.java @@ -590,8 +590,13 @@ public final class Label { return label.getOffset() > other.label.getOffset(); } + private String str; + @Override public String toString() { - return name + '_' + id; + if (str == null) { + str = name + '_' + id; + } + return str; } } diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/LocalVariableTypesCalculator.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/LocalVariableTypesCalculator.java index c9580d41341..491ef2caf13 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/LocalVariableTypesCalculator.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/LocalVariableTypesCalculator.java @@ -464,21 +464,20 @@ final class LocalVariableTypesCalculator extends NodeVisitor{ @Override public boolean enterBreakNode(final BreakNode breakNode) { - if(!reachable) { - return false; - } - - final BreakableNode target = lc.getBreakable(breakNode.getLabelName()); - return splitAwareJumpToLabel(breakNode, target, target.getBreakLabel()); + return enterJumpStatement(breakNode); } @Override public boolean enterContinueNode(final ContinueNode continueNode) { + return enterJumpStatement(continueNode); + } + + private boolean enterJumpStatement(final JumpStatement jump) { if(!reachable) { return false; } - final LoopNode target = lc.getContinueTo(continueNode.getLabelName()); - return splitAwareJumpToLabel(continueNode, target, target.getContinueLabel()); + final BreakableNode target = jump.getTarget(lc); + return splitAwareJumpToLabel(jump, target, jump.getTargetLabel(target)); } private boolean splitAwareJumpToLabel(final JumpStatement jumpStatement, final BreakableNode target, final Label targetLabel) { diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Lower.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Lower.java index 2c87f3b9a97..dddf6976891 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Lower.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Lower.java @@ -52,6 +52,7 @@ import jdk.nashorn.internal.ir.FunctionNode; import jdk.nashorn.internal.ir.FunctionNode.CompilationState; import jdk.nashorn.internal.ir.IdentNode; import jdk.nashorn.internal.ir.IfNode; +import jdk.nashorn.internal.ir.JumpStatement; import jdk.nashorn.internal.ir.LabelNode; import jdk.nashorn.internal.ir.LexicalContext; import jdk.nashorn.internal.ir.LiteralNode; @@ -382,12 +383,16 @@ final class Lower extends NodeOperatorVisitor implements Lo @Override public Node leaveBreakNode(final BreakNode breakNode) { - return copy(breakNode, (Node)Lower.this.lc.getBreakable(breakNode.getLabelName())); + return leaveJumpStatement(breakNode); } @Override public Node leaveContinueNode(final ContinueNode continueNode) { - return copy(continueNode, Lower.this.lc.getContinueTo(continueNode.getLabelName())); + return leaveJumpStatement(continueNode); + } + + private Node leaveJumpStatement(final JumpStatement jump) { + return copy(jump, (Node)jump.getTarget(Lower.this.lc)); } @Override @@ -627,7 +632,7 @@ final class Lower extends NodeOperatorVisitor implements Lo @Override public Node leaveContinueNode(final ContinueNode node) { // all inner loops have been popped. - if (lex.contains(lex.getContinueTo(node.getLabelName()))) { + if (lex.contains(node.getTarget(lex))) { escapes.add(node); } return node; diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/MethodEmitter.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/MethodEmitter.java index c1af31b5c22..20914472ce6 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/MethodEmitter.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/MethodEmitter.java @@ -103,6 +103,7 @@ import jdk.nashorn.internal.runtime.Context; import jdk.nashorn.internal.runtime.Debug; import jdk.nashorn.internal.runtime.JSType; import jdk.nashorn.internal.runtime.RewriteException; +import jdk.nashorn.internal.runtime.Scope; import jdk.nashorn.internal.runtime.ScriptObject; import jdk.nashorn.internal.runtime.ScriptRuntime; import jdk.nashorn.internal.runtime.UnwarrantedOptimismException; @@ -1046,6 +1047,14 @@ public class MethodEmitter implements Emitter { return load(getCompilerConstantSymbol(cc), type != null ? type : getCompilerConstantType(cc)); } + MethodEmitter loadScope() { + return loadCompilerConstant(SCOPE).checkcast(Scope.class); + } + + MethodEmitter setSplitState(final int state) { + return loadScope().load(state).invoke(Scope.SET_SPLIT_STATE); + } + void storeCompilerConstant(final CompilerConstants cc) { storeCompilerConstant(cc, null); } @@ -2134,6 +2143,8 @@ public class MethodEmitter implements Emitter { load("Function"); invoke(ScriptRuntime.INVALIDATE_RESERVED_BUILTIN_NAME); break; + default: + break; } return this; } @@ -2574,12 +2585,55 @@ public class MethodEmitter implements Emitter { * * @param args debug information to print */ + @SuppressWarnings("unused") private void debug(final Object... args) { if (debug) { debug(30, args); } } + private void debug(final String arg) { + if (debug) { + debug(30, arg); + } + } + + private void debug(final Object arg0, final Object arg1) { + if (debug) { + debug(30, new Object[] { arg0, arg1 }); + } + } + + private void debug(final Object arg0, final Object arg1, final Object arg2) { + if (debug) { + debug(30, new Object[] { arg0, arg1, arg2 }); + } + } + + private void debug(final Object arg0, final Object arg1, final Object arg2, final Object arg3) { + if (debug) { + debug(30, new Object[] { arg0, arg1, arg2, arg3 }); + } + } + + private void debug(final Object arg0, final Object arg1, final Object arg2, final Object arg3, final Object arg4) { + if (debug) { + debug(30, new Object[] { arg0, arg1, arg2, arg3, arg4 }); + } + } + + private void debug(final Object arg0, final Object arg1, final Object arg2, final Object arg3, final Object arg4, final Object arg5) { + if (debug) { + debug(30, new Object[] { arg0, arg1, arg2, arg3, arg4, arg5 }); + } + } + + private void debug(final Object arg0, final Object arg1, final Object arg2, final Object arg3, final Object arg4, final Object arg5, final Object arg6) { + if (debug) { + debug(30, new Object[] { arg0, arg1, arg2, arg3, arg4, arg5, arg6 }); + } + } + /** * Debug function that outputs generated bytecode and stack contents * for a label - indentation is currently the only thing that differs diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/OptimisticTypesPersistence.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/OptimisticTypesPersistence.java index 35308fc3a79..05a768727e9 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/OptimisticTypesPersistence.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/OptimisticTypesPersistence.java @@ -443,7 +443,7 @@ public final class OptimisticTypesPersistence { // does not increase filesDeleted } files[i] = null; // gc eligible - }; + } } private static Path[] getAllRegularFilesInLastModifiedOrder() throws IOException { @@ -454,7 +454,7 @@ public final class OptimisticTypesPersistence { @Override public boolean test(final Path path) { return !Files.isDirectory(path); - }; + } }) .map(new Function() { @Override diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/SplitMethodEmitter.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/SplitMethodEmitter.java index d5feac577d2..792a6255859 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/SplitMethodEmitter.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/SplitMethodEmitter.java @@ -25,8 +25,6 @@ package jdk.nashorn.internal.codegen; -import static jdk.nashorn.internal.codegen.CompilerConstants.SCOPE; - import java.util.ArrayList; import java.util.List; import jdk.internal.org.objectweb.asm.MethodVisitor; @@ -34,7 +32,6 @@ import jdk.nashorn.internal.codegen.types.Type; import jdk.nashorn.internal.ir.BreakableNode; import jdk.nashorn.internal.ir.LexicalContext; import jdk.nashorn.internal.ir.SplitNode; -import jdk.nashorn.internal.runtime.Scope; /** * Emitter used for splitting methods. Needs to keep track of if there are jump targets @@ -65,15 +62,13 @@ public class SplitMethodEmitter extends MethodEmitter { assert splitNode != null; final int index = findExternalTarget(lc, label, targetNode); if (index >= 0) { - loadCompilerConstant(SCOPE); - checkcast(Scope.class); - load(index + 1); - invoke(Scope.SET_SPLIT_STATE); - loadUndefined(Type.OBJECT); - _return(functionNode.getReturnType()); - return; + setSplitState(index + 1); // 0 is ordinary return + final Type retType = functionNode.getReturnType(); + loadUndefined(retType); + _return(retType); + } else { + super.splitAwareGoto(lc, label, targetNode); } - super.splitAwareGoto(lc, label, targetNode); } private int findExternalTarget(final LexicalContext lc, final Label label, final BreakableNode targetNode) { @@ -94,11 +89,7 @@ public class SplitMethodEmitter extends MethodEmitter { @Override MethodEmitter registerReturn() { setHasReturn(); - loadCompilerConstant(SCOPE); - checkcast(Scope.class); - load(0); - invoke(Scope.SET_SPLIT_STATE); - return this; + return setSplitState(0); } final List