8055917: jdk.nashorn.internal.codegen.CompilationPhase$N should be renamed to proper classes

Reviewed-by: attila, hannesw
This commit is contained in:
Athijegannathan Sundararajan 2015-09-14 16:13:10 +05:30
parent 9969836a33
commit cf428a3931
24 changed files with 417 additions and 457 deletions

View File

@ -1,48 +0,0 @@
/*
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Oracle nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
import javax.script.*;
import jdk.nashorn.api.scripting.*;
// Simple nashorn demo that evals a script with arbitrary script
// object bound as "this" for the evaluated script.
public class EvalWithArbitraryThis {
public static void main(String[] args) throws Exception {
ScriptEngineManager m = new ScriptEngineManager();
ScriptEngine e = m.getEngineByName("nashorn");
Object sobj = e.eval("( { foo: 343, bar: 'hello' } )");
// "this" bound to sobj in this eval.
// so it prints sobj.foo and sobj.bar.
((ScriptObjectMirror)sobj).eval("print(this.foo); print(this.bar)");
}
}

View File

@ -0,0 +1,136 @@
#// Usage: jjs exceptionswallow.js -- <directory>
/*
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Oracle nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
// This example demonstrates Java subclassing by Java.extend
// and javac Compiler and Tree API. This example looks for
// empty catch blocks ("exception swallow") and reports those.
if (arguments.length == 0) {
print("Usage: jjs exceptionswallow.js -- <directory>");
exit(1);
}
// Java types used
var File = Java.type("java.io.File");
var Files = Java.type("java.nio.file.Files");
var StringArray = Java.type("java.lang.String[]");
var ToolProvider = Java.type("javax.tools.ToolProvider");
var Tree = Java.type("com.sun.source.tree.Tree");
var EmptyStatementTree = Java.type("com.sun.source.tree.EmptyStatementTree");
var Trees = Java.type("com.sun.source.util.Trees");
var TreeScanner = Java.type("com.sun.source.util.TreeScanner");
// printEmptyCatch
function printEmptyCatch() {
// get the system compiler tool
var compiler = ToolProvider.systemJavaCompiler;
// get standard file manager
var fileMgr = compiler.getStandardFileManager(null, null, null);
// Using Java.to convert script array (arguments) to a Java String[]
var compUnits = fileMgr.getJavaFileObjects(
Java.to(arguments, StringArray));
// create a new compilation task
var task = compiler.getTask(null, fileMgr, null, null, null, compUnits);
// SourcePositions object to get positions of AST nodes
var sourcePositions = Trees.instance(task).sourcePositions;
// subclass SimpleTreeVisitor - to print empty catch
var EmptyCatchFinder = Java.extend(TreeScanner);
function hasOnlyEmptyStats(stats) {
var itr = stats.iterator();
while (itr.hasNext()) {
if (! (itr.next() instanceof EmptyStatementTree)) {
return false;
}
}
return true;
}
var visitor = new EmptyCatchFinder() {
// current CompilationUnitTree
compUnit: null,
// current LineMap (pos -> line, column)
lineMap: null,
// current compilation unit's file name
fileName: null,
// overrides of TreeScanner methods
visitCompilationUnit: function(node, p) {
// capture info about current Compilation unit
this.compUnit = node;
this.lineMap = node.lineMap;
this.fileName = node.sourceFile.name;
// Using Java.super API to call super class method here
return Java.super(visitor).visitCompilationUnit(node, p);
},
visitCatch: function (node, p) {
var stats = node.block.statements;
if (stats.empty || hasOnlyEmptyStats(stats)) {
// print information on this empty catch
var pos = sourcePositions.getStartPosition(this.compUnit, node);
var line = this.lineMap.getLineNumber(pos);
var col = this.lineMap.getColumnNumber(pos);
print("Exception swallow" + " @ " + this.fileName + ":" + line + ":" + col);
// print(node);
}
}
}
for each (var cu in task.parse()) {
cu.accept(visitor, null);
}
}
// for each ".java" file in directory (recursively) and check it!
function main(dir) {
Files.walk(dir.toPath()).
forEach(function(p) {
var name = p.toFile().absolutePath;
if (name.endsWith(".java")) {
try {
printEmptyCatch(p.toFile().getAbsolutePath());
} catch (e) {
print(e);
}
}
});
}
main(new File(arguments[0]));

View File

@ -43,7 +43,6 @@ if (arguments.length == 0) {
// Java types used
var File = Java.type("java.io.File");
var Files = Java.type("java.nio.file.Files");
var FileVisitOption = Java.type("java.nio.file.FileVisitOption");
var StringArray = Java.type("java.lang.String[]");
var ToolProvider = Java.type("javax.tools.ToolProvider");
var Tree = Java.type("com.sun.source.tree.Tree");
@ -106,7 +105,7 @@ function checkNonFinalParams(p) {
// for each ".java" file in directory (recursively).
function main(dir) {
var totalCount = 0;
Files.walk(dir.toPath(), FileVisitOption.FOLLOW_LINKS).
Files.walk(dir.toPath()).
forEach(function(p) {
var name = p.toFile().absolutePath;
if (name.endsWith(".java")) {

View File

@ -42,7 +42,6 @@ if (arguments.length == 0) {
// Java types used
var File = Java.type("java.io.File");
var Files = Java.type("java.nio.file.Files");
var FileVisitOption = Java.type("java.nio.file.FileVisitOption");
var StringArray = Java.type("java.lang.String[]");
var ToolProvider = Java.type("javax.tools.ToolProvider");
var Tree = Java.type("com.sun.source.tree.Tree");
@ -81,7 +80,7 @@ function countFoo() {
// for each ".java" file in directory (recursively) count "foo".
function main(dir) {
var totalCount = 0;
Files.walk(dir.toPath(), FileVisitOption.FOLLOW_LINKS).
Files.walk(dir.toPath()).
forEach(function(p) {
var name = p.toFile().absolutePath;
if (name.endsWith(".java")) {

View File

@ -0,0 +1,156 @@
#// Usage: jjs resourcetrysuggester.js -- <directory>
/*
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Oracle nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
// This example demonstrates Java subclassing by Java.extend
// and javac Compiler and Tree API. This example looks for
// finally clauses with "close" call and suggests "resource try"!
if (arguments.length == 0) {
print("Usage: jjs resourcetrysuggester.js -- <directory>");
exit(1);
}
// Java types used
var ExpressionStatementTree = Java.type("com.sun.source.tree.ExpressionStatementTree");
var File = Java.type("java.io.File");
var Files = Java.type("java.nio.file.Files");
var MemberSelectTree = Java.type("com.sun.source.tree.MemberSelectTree");
var MethodInvocationTree = Java.type("com.sun.source.tree.MethodInvocationTree");
var StringArray = Java.type("java.lang.String[]");
var ToolProvider = Java.type("javax.tools.ToolProvider");
var Tree = Java.type("com.sun.source.tree.Tree");
var Trees = Java.type("com.sun.source.util.Trees");
var TreeScanner = Java.type("com.sun.source.util.TreeScanner");
// resourceTrySuggestions
function resourceTrySuggestions() {
// get the system compiler tool
var compiler = ToolProvider.systemJavaCompiler;
// get standard file manager
var fileMgr = compiler.getStandardFileManager(null, null, null);
// Using Java.to convert script array (arguments) to a Java String[]
var compUnits = fileMgr.getJavaFileObjects(
Java.to(arguments, StringArray));
// create a new compilation task
var task = compiler.getTask(null, fileMgr, null, null, null, compUnits);
// SourcePositions object to get positions of AST nodes
var sourcePositions = Trees.instance(task).sourcePositions;
// subclass SimpleTreeVisitor - to print resource try suggestions
var ResourceTrySuggester = Java.extend(TreeScanner);
function hasOnlyEmptyStats(stats) {
var itr = stats.iterator();
while (itr.hasNext()) {
if (! (itr.next() instanceof EmptyStatementTree)) {
return false;
}
}
return true;
}
// does the given statement list has an expression statement which
// calls "close" method (don't worry about types - just crude one will do)
function hasCloseCall(stats) {
var itr = stats.iterator();
while (itr.hasNext()) {
var stat = itr.next();
if (stat instanceof ExpressionStatementTree) {
var expr = stat.expression;
if (expr instanceof MethodInvocationTree) {
var method = expr.methodSelect;
if (method instanceof MemberSelectTree) {
return method.identifier.toString().equals("close");
}
}
}
}
return false;
}
var visitor = new ResourceTrySuggester() {
// current CompilationUnitTree
compUnit: null,
// current LineMap (pos -> line, column)
lineMap: null,
// current compilation unit's file name
fileName: null,
// overrides of TreeScanner methods
visitCompilationUnit: function(node, p) {
// capture info about current Compilation unit
this.compUnit = node;
this.lineMap = node.lineMap;
this.fileName = node.sourceFile.name;
// Using Java.super API to call super class method here
return Java.super(visitor).visitCompilationUnit(node, p);
},
visitTry: function (node, p) {
var finallyBlk = node.finallyBlock;
if (finallyBlk != null && hasCloseCall(finallyBlk.statements)) {
var pos = sourcePositions.getStartPosition(this.compUnit, node);
var line = this.lineMap.getLineNumber(pos);
var col = this.lineMap.getColumnNumber(pos);
print("Consider resource try statement " + " @ " + this.fileName + ":" + line + ":" + col);
// print(node);
}
}
}
for each (var cu in task.parse()) {
cu.accept(visitor, null);
}
}
// for each ".java" file in directory (recursively) and check it!
function main(dir) {
Files.walk(dir.toPath()).
forEach(function(p) {
var name = p.toFile().absolutePath;
if (name.endsWith(".java")) {
try {
resourceTrySuggestions(p.toFile().getAbsolutePath());
} catch (e) {
print(e);
}
}
});
}
main(new File(arguments[0]));

View File

@ -36,13 +36,12 @@ if (arguments.length == 0) {
var Files = Java.type("java.nio.file.Files")
var FileSystems = Java.type("java.nio.file.FileSystems")
var FileVisitOption = Java.type("java.nio.file.FileVisitOption")
var Paths = Java.type("java.nio.file.Paths")
var zipfile = Paths.get(arguments[0])
var fs = FileSystems.newFileSystem(zipfile, null)
var root = fs.rootDirectories[0]
Files.walk(root, FileVisitOption.FOLLOW_LINKS).forEach(
Files.walk(root).forEach(
function(p) (print(p), print(Files.readAttributes(p, "zip:*")))
)
fs.close()

View File

@ -49,8 +49,8 @@ final class EditPad extends JFrame implements Runnable {
private final boolean[] closeLock;
private final Consumer<String> saveHandler;
EditPad(Consumer<String> errorHandler, String initialText,
boolean[] closeLock, Consumer<String> saveHandler) {
EditPad(final Consumer<String> errorHandler, final String initialText,
final boolean[] closeLock, final Consumer<String> saveHandler) {
super("Edit Pad (Experimental)");
this.errorHandler = errorHandler;
this.initialText = initialText;
@ -62,7 +62,7 @@ final class EditPad extends JFrame implements Runnable {
public void run() {
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
public void windowClosing(final WindowEvent e) {
EditPad.this.dispose();
notifyClose();
}
@ -77,7 +77,7 @@ final class EditPad extends JFrame implements Runnable {
setVisible(true);
}
private JPanel buttons(JTextArea textArea) {
private JPanel buttons(final JTextArea textArea) {
FlowLayout flow = new FlowLayout();
flow.setHgap(35);
JPanel buttons = new JPanel(flow);
@ -118,8 +118,8 @@ final class EditPad extends JFrame implements Runnable {
}
}
static void edit(Consumer<String> errorHandler, String initialText,
Consumer<String> saveHandler) {
static void edit(final Consumer<String> errorHandler, final String initialText,
final Consumer<String> saveHandler) {
boolean[] closeLock = new boolean[1];
SwingUtilities.invokeLater(
new EditPad(errorHandler, initialText, closeLock, saveHandler));
@ -127,7 +127,7 @@ final class EditPad extends JFrame implements Runnable {
while (!closeLock[0]) {
try {
closeLock.wait();
} catch (InterruptedException ex) {
} catch (final InterruptedException ex) {
// ignore and loop
}
}

View File

@ -49,13 +49,13 @@ final class ExternalEditor {
private Path dir;
private Path tmpfile;
ExternalEditor(Consumer<String> errorHandler, Consumer<String> saveHandler, Console input) {
ExternalEditor(final Consumer<String> errorHandler, final Consumer<String> saveHandler, final Console input) {
this.errorHandler = errorHandler;
this.saveHandler = saveHandler;
this.input = input;
}
private void edit(String cmd, String initialText) {
private void edit(final String cmd, final String initialText) {
try {
setupWatch(initialText);
launch(cmd);
@ -67,7 +67,7 @@ final class ExternalEditor {
/**
* Creates a WatchService and registers the given directory
*/
private void setupWatch(String initialText) throws IOException {
private void setupWatch(final String initialText) throws IOException {
this.watcher = FileSystems.getDefault().newWatchService();
this.dir = Files.createTempDirectory("REPL");
this.tmpfile = Files.createTempFile(dir, null, ".js");
@ -81,9 +81,9 @@ final class ExternalEditor {
WatchKey key;
try {
key = watcher.take();
} catch (ClosedWatchServiceException ex) {
} catch (final ClosedWatchServiceException ex) {
break;
} catch (InterruptedException ex) {
} catch (final InterruptedException ex) {
continue; // tolerate an intrupt
}
@ -103,7 +103,7 @@ final class ExternalEditor {
watchedThread.start();
}
private void launch(String cmd) throws IOException {
private void launch(final String cmd) throws IOException {
ProcessBuilder pb = new ProcessBuilder(cmd, tmpfile.toString());
pb = pb.inheritIO();
@ -111,9 +111,9 @@ final class ExternalEditor {
input.suspend();
Process process = pb.start();
process.waitFor();
} catch (IOException ex) {
} catch (final IOException ex) {
errorHandler.accept("process IO failure: " + ex.getMessage());
} catch (InterruptedException ex) {
} catch (final InterruptedException ex) {
errorHandler.accept("process interrupt: " + ex.getMessage());
} finally {
try {
@ -132,7 +132,7 @@ final class ExternalEditor {
List<String> lines;
try {
lines = Files.readAllLines(tmpfile);
} catch (IOException ex) {
} catch (final IOException ex) {
errorHandler.accept("Failure read edit file: " + ex.getMessage());
return ;
}
@ -144,8 +144,8 @@ final class ExternalEditor {
saveHandler.accept(sb.toString());
}
static void edit(String cmd, Consumer<String> errorHandler, String initialText,
Consumer<String> saveHandler, Console input) {
static void edit(final String cmd, final Consumer<String> errorHandler, final String initialText,
final Consumer<String> saveHandler, final Console input) {
ExternalEditor ed = new ExternalEditor(errorHandler, saveHandler, input);
ed.edit(cmd, initialText);
}

View File

@ -40,7 +40,6 @@ import jdk.nashorn.internal.ir.AccessNode;
import jdk.nashorn.internal.ir.CallNode;
import jdk.nashorn.internal.ir.Expression;
import jdk.nashorn.internal.ir.FunctionNode;
import jdk.nashorn.internal.ir.FunctionNode.CompilationState;
import jdk.nashorn.internal.ir.IdentNode;
import jdk.nashorn.internal.ir.LexicalContext;
import jdk.nashorn.internal.ir.Node;
@ -384,7 +383,7 @@ public final class ApplySpecialization extends NodeVisitor<LexicalContext> imple
callSiteTypes.pop();
explodedArguments.pop();
return newFunctionNode.setState(lc, CompilationState.BUILTINS_TRANSFORMED);
return newFunctionNode;
}
private static boolean isApply(final CallNode callNode) {

View File

@ -65,7 +65,6 @@ import jdk.nashorn.internal.ir.CatchNode;
import jdk.nashorn.internal.ir.Expression;
import jdk.nashorn.internal.ir.ForNode;
import jdk.nashorn.internal.ir.FunctionNode;
import jdk.nashorn.internal.ir.FunctionNode.CompilationState;
import jdk.nashorn.internal.ir.IdentNode;
import jdk.nashorn.internal.ir.IndexNode;
import jdk.nashorn.internal.ir.LexicalContext;
@ -828,7 +827,7 @@ final class AssignSymbols extends NodeVisitor<LexicalContext> implements Loggabl
lc.applyTopFlags(functionNode))))
.setThisProperties(lc, thisProperties.pop().size()));
}
return finalizedFunction.setState(lc, CompilationState.SYMBOLS_ASSIGNED);
return finalizedFunction;
}
@Override

View File

@ -93,7 +93,6 @@ import jdk.nashorn.internal.ir.Expression;
import jdk.nashorn.internal.ir.ExpressionStatement;
import jdk.nashorn.internal.ir.ForNode;
import jdk.nashorn.internal.ir.FunctionNode;
import jdk.nashorn.internal.ir.FunctionNode.CompilationState;
import jdk.nashorn.internal.ir.GetSplitState;
import jdk.nashorn.internal.ir.IdentNode;
import jdk.nashorn.internal.ir.IfNode;
@ -2142,7 +2141,7 @@ final class CodeGenerator extends NodeOperatorVisitor<CodeGeneratorLexicalContex
markOptimistic = false;
}
FunctionNode newFunctionNode = functionNode.setState(lc, CompilationState.BYTECODE_GENERATED);
FunctionNode newFunctionNode = functionNode;
if (markOptimistic) {
newFunctionNode = newFunctionNode.setFlag(lc, FunctionNode.IS_DEOPTIMIZABLE);
}

View File

@ -25,32 +25,17 @@
package jdk.nashorn.internal.codegen;
import static jdk.nashorn.internal.ir.FunctionNode.CompilationState.BUILTINS_TRANSFORMED;
import static jdk.nashorn.internal.ir.FunctionNode.CompilationState.BYTECODE_GENERATED;
import static jdk.nashorn.internal.ir.FunctionNode.CompilationState.BYTECODE_INSTALLED;
import static jdk.nashorn.internal.ir.FunctionNode.CompilationState.CONSTANT_FOLDED;
import static jdk.nashorn.internal.ir.FunctionNode.CompilationState.INITIALIZED;
import static jdk.nashorn.internal.ir.FunctionNode.CompilationState.LOCAL_VARIABLE_TYPES_CALCULATED;
import static jdk.nashorn.internal.ir.FunctionNode.CompilationState.LOWERED;
import static jdk.nashorn.internal.ir.FunctionNode.CompilationState.OPTIMISTIC_TYPES_ASSIGNED;
import static jdk.nashorn.internal.ir.FunctionNode.CompilationState.PARSED;
import static jdk.nashorn.internal.ir.FunctionNode.CompilationState.SCOPE_DEPTHS_COMPUTED;
import static jdk.nashorn.internal.ir.FunctionNode.CompilationState.SPLIT;
import static jdk.nashorn.internal.ir.FunctionNode.CompilationState.SYMBOLS_ASSIGNED;
import static jdk.nashorn.internal.runtime.logging.DebugLogger.quote;
import java.io.PrintWriter;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import jdk.nashorn.internal.AssertsEnabled;
import jdk.nashorn.internal.codegen.Compiler.CompilationPhases;
import jdk.nashorn.internal.ir.Block;
import jdk.nashorn.internal.ir.FunctionNode;
import jdk.nashorn.internal.ir.FunctionNode.CompilationState;
import jdk.nashorn.internal.ir.LexicalContext;
import jdk.nashorn.internal.ir.LiteralNode;
import jdk.nashorn.internal.ir.Node;
@ -67,15 +52,9 @@ import jdk.nashorn.internal.runtime.logging.DebugLogger;
* A compilation phase is a step in the processes of turning a JavaScript
* FunctionNode into bytecode. It has an optional return value.
*/
enum CompilationPhase {
/**
* Constant folding pass Simple constant folding that will make elementary
* constructs go away
*/
CONSTANT_FOLDING_PHASE(
EnumSet.of(
INITIALIZED,
PARSED)) {
abstract class CompilationPhase {
private static final class ConstantFoldingPhase extends CompilationPhase {
@Override
FunctionNode transform(final Compiler compiler, final CompilationPhases phases, final FunctionNode fn) {
return transformFunction(fn, new FoldConstants(compiler));
@ -85,20 +64,15 @@ enum CompilationPhase {
public String toString() {
return "'Constant Folding'";
}
},
}
/**
* Lower (Control flow pass) Finalizes the control flow. Clones blocks for
* finally constructs and similar things. Establishes termination criteria
* for nodes Guarantee return instructions to method making sure control
* flow cannot fall off the end. Replacing high level nodes with lower such
* as runtime nodes where applicable.
* Constant folding pass Simple constant folding that will make elementary
* constructs go away
*/
LOWERING_PHASE(
EnumSet.of(
INITIALIZED,
PARSED,
CONSTANT_FOLDED)) {
static final CompilationPhase CONSTANT_FOLDING_PHASE = new ConstantFoldingPhase();
private static final class LoweringPhase extends CompilationPhase {
@Override
FunctionNode transform(final Compiler compiler, final CompilationPhases phases, final FunctionNode fn) {
return transformFunction(fn, new Lower(compiler));
@ -108,42 +82,35 @@ enum CompilationPhase {
public String toString() {
return "'Control Flow Lowering'";
}
},
}
/**
* Phase used only when doing optimistic code generation. It assigns all potentially
* optimistic ops a program point so that an UnwarrantedException knows from where
* a guess went wrong when creating the continuation to roll back this execution
* Lower (Control flow pass) Finalizes the control flow. Clones blocks for
* finally constructs and similar things. Establishes termination criteria
* for nodes Guarantee return instructions to method making sure control
* flow cannot fall off the end. Replacing high level nodes with lower such
* as runtime nodes where applicable.
*/
TRANSFORM_BUILTINS_PHASE(
EnumSet.of(
INITIALIZED,
PARSED,
CONSTANT_FOLDED,
LOWERED)) {
//we only do this if we have a param type map, otherwise this is not a specialized recompile
static final CompilationPhase LOWERING_PHASE = new LoweringPhase();
private static final class ApplySpecializationPhase extends CompilationPhase {
@Override
FunctionNode transform(final Compiler compiler, final CompilationPhases phases, final FunctionNode fn) {
return setStates(transformFunction(fn, new ApplySpecialization(compiler)), BUILTINS_TRANSFORMED);
return transformFunction(fn, new ApplySpecialization(compiler));
}
@Override
public String toString() {
return "'Builtin Replacement'";
}
},
};
/**
* Splitter Split the AST into several compile units based on a heuristic size calculation.
* Split IR can lead to scope information being changed.
* Phase used to transform Function.prototype.apply.
*/
SPLITTING_PHASE(
EnumSet.of(
INITIALIZED,
PARSED,
CONSTANT_FOLDED,
LOWERED,
BUILTINS_TRANSFORMED)) {
static final CompilationPhase APPLY_SPECIALIZATION_PHASE = new ApplySpecializationPhase();
private static final class SplittingPhase extends CompilationPhase {
@Override
FunctionNode transform(final Compiler compiler, final CompilationPhases phases, final FunctionNode fn) {
final CompileUnit outermostCompileUnit = compiler.addCompileUnit(0L);
@ -170,16 +137,15 @@ enum CompilationPhase {
public String toString() {
return "'Code Splitting'";
}
},
};
PROGRAM_POINT_PHASE(
EnumSet.of(
INITIALIZED,
PARSED,
CONSTANT_FOLDED,
LOWERED,
BUILTINS_TRANSFORMED,
SPLIT)) {
/**
* Splitter Split the AST into several compile units based on a heuristic size calculation.
* Split IR can lead to scope information being changed.
*/
static final CompilationPhase SPLITTING_PHASE = new SplittingPhase();
private static final class ProgramPointPhase extends CompilationPhase {
@Override
FunctionNode transform(final Compiler compiler, final CompilationPhases phases, final FunctionNode fn) {
return transformFunction(fn, new ProgramPoints());
@ -189,16 +155,16 @@ enum CompilationPhase {
public String toString() {
return "'Program Point Calculation'";
}
},
};
CACHE_AST(
EnumSet.of(
INITIALIZED,
PARSED,
CONSTANT_FOLDED,
LOWERED,
BUILTINS_TRANSFORMED,
SPLIT)) {
/**
* Phase used only when doing optimistic code generation. It assigns all potentially
* optimistic ops a program point so that an UnwarrantedException knows from where
* a guess went wrong when creating the continuation to roll back this execution
*/
static final CompilationPhase PROGRAM_POINT_PHASE = new ProgramPointPhase();
private static final class CacheAstPhase extends CompilationPhase {
@Override
FunctionNode transform(final Compiler compiler, final CompilationPhases phases, final FunctionNode fn) {
if (!compiler.isOnDemandCompilation()) {
@ -217,16 +183,11 @@ enum CompilationPhase {
public String toString() {
return "'Cache ASTs'";
}
},
};
SYMBOL_ASSIGNMENT_PHASE(
EnumSet.of(
INITIALIZED,
PARSED,
CONSTANT_FOLDED,
LOWERED,
BUILTINS_TRANSFORMED,
SPLIT)) {
static final CompilationPhase CACHE_AST_PHASE = new CacheAstPhase();
private static final class SymbolAssignmentPhase extends CompilationPhase {
@Override
FunctionNode transform(final Compiler compiler, final CompilationPhases phases, final FunctionNode fn) {
return transformFunction(fn, new AssignSymbols(compiler));
@ -236,17 +197,11 @@ enum CompilationPhase {
public String toString() {
return "'Symbol Assignment'";
}
},
};
SCOPE_DEPTH_COMPUTATION_PHASE(
EnumSet.of(
INITIALIZED,
PARSED,
CONSTANT_FOLDED,
LOWERED,
BUILTINS_TRANSFORMED,
SPLIT,
SYMBOLS_ASSIGNED)) {
static final CompilationPhase SYMBOL_ASSIGNMENT_PHASE = new SymbolAssignmentPhase();
private static final class ScopeDepthComputationPhase extends CompilationPhase {
@Override
FunctionNode transform(final Compiler compiler, final CompilationPhases phases, final FunctionNode fn) {
return transformFunction(fn, new FindScopeDepths(compiler));
@ -256,18 +211,11 @@ enum CompilationPhase {
public String toString() {
return "'Scope Depth Computation'";
}
},
}
DECLARE_LOCAL_SYMBOLS_TO_COMPILER(
EnumSet.of(
INITIALIZED,
PARSED,
CONSTANT_FOLDED,
LOWERED,
BUILTINS_TRANSFORMED,
SPLIT,
SYMBOLS_ASSIGNED,
SCOPE_DEPTHS_COMPUTED)) {
static final CompilationPhase SCOPE_DEPTH_COMPUTATION_PHASE = new ScopeDepthComputationPhase();
private static final class DeclareLocalSymbolsPhase extends CompilationPhase {
@Override
FunctionNode transform(final Compiler compiler, final CompilationPhases phases, final FunctionNode fn) {
// It's not necessary to guard the marking of symbols as locals with this "if" condition for
@ -301,43 +249,28 @@ enum CompilationPhase {
public String toString() {
return "'Local Symbols Declaration'";
}
},
};
OPTIMISTIC_TYPE_ASSIGNMENT_PHASE(
EnumSet.of(
INITIALIZED,
PARSED,
CONSTANT_FOLDED,
LOWERED,
BUILTINS_TRANSFORMED,
SPLIT,
SYMBOLS_ASSIGNED,
SCOPE_DEPTHS_COMPUTED)) {
static final CompilationPhase DECLARE_LOCAL_SYMBOLS_PHASE = new DeclareLocalSymbolsPhase();
private static final class OptimisticTypeAssignmentPhase extends CompilationPhase {
@Override
FunctionNode transform(final Compiler compiler, final CompilationPhases phases, final FunctionNode fn) {
if (compiler.useOptimisticTypes()) {
return transformFunction(fn, new OptimisticTypesCalculator(compiler));
}
return setStates(fn, OPTIMISTIC_TYPES_ASSIGNED);
return fn;
}
@Override
public String toString() {
return "'Optimistic Type Assignment'";
}
},
}
LOCAL_VARIABLE_TYPE_CALCULATION_PHASE(
EnumSet.of(
INITIALIZED,
PARSED,
CONSTANT_FOLDED,
LOWERED,
BUILTINS_TRANSFORMED,
SPLIT,
SYMBOLS_ASSIGNED,
SCOPE_DEPTHS_COMPUTED,
OPTIMISTIC_TYPES_ASSIGNED)) {
static final CompilationPhase OPTIMISTIC_TYPE_ASSIGNMENT_PHASE = new OptimisticTypeAssignmentPhase();
private static final class LocalVariableTypeCalculationPhase extends CompilationPhase {
@Override
FunctionNode transform(final Compiler compiler, final CompilationPhases phases, final FunctionNode fn) {
final FunctionNode newFunctionNode = transformFunction(fn, new LocalVariableTypesCalculator(compiler));
@ -362,25 +295,11 @@ enum CompilationPhase {
public String toString() {
return "'Local Variable Type Calculation'";
}
},
};
static final CompilationPhase LOCAL_VARIABLE_TYPE_CALCULATION_PHASE = new LocalVariableTypeCalculationPhase();
/**
* Reuse compile units, if they are already present. We are using the same compiler
* to recompile stuff
*/
REUSE_COMPILE_UNITS_PHASE(
EnumSet.of(
INITIALIZED,
PARSED,
CONSTANT_FOLDED,
LOWERED,
BUILTINS_TRANSFORMED,
SPLIT,
SYMBOLS_ASSIGNED,
SCOPE_DEPTHS_COMPUTED,
OPTIMISTIC_TYPES_ASSIGNED,
LOCAL_VARIABLE_TYPES_CALCULATED)) {
private static final class ReuseCompileUnitsPhase extends CompilationPhase {
@Override
FunctionNode transform(final Compiler compiler, final CompilationPhases phases, final FunctionNode fn) {
assert phases.isRestOfCompilation() : "reuse compile units currently only used for Rest-Of methods";
@ -428,16 +347,15 @@ enum CompilationPhase {
public String toString() {
return "'Reuse Compile Units'";
}
},
}
REINITIALIZE_CACHED(
EnumSet.of(
INITIALIZED,
PARSED,
CONSTANT_FOLDED,
LOWERED,
BUILTINS_TRANSFORMED,
SPLIT)) {
/**
* Reuse compile units, if they are already present. We are using the same compiler
* to recompile stuff
*/
static final CompilationPhase REUSE_COMPILE_UNITS_PHASE = new ReuseCompileUnitsPhase();
private static final class ReinitializeCachedPhase extends CompilationPhase {
@Override
FunctionNode transform(final Compiler compiler, final CompilationPhases phases, final FunctionNode fn) {
final Set<CompileUnit> unitSet = CompileUnit.createCompileUnitSet();
@ -480,26 +398,11 @@ enum CompilationPhase {
public String toString() {
return "'Reinitialize cached'";
}
},
}
/**
* Bytecode generation:
*
* Generate the byte code class(es) resulting from the compiled FunctionNode
*/
BYTECODE_GENERATION_PHASE(
EnumSet.of(
INITIALIZED,
PARSED,
CONSTANT_FOLDED,
LOWERED,
BUILTINS_TRANSFORMED,
SPLIT,
SYMBOLS_ASSIGNED,
SCOPE_DEPTHS_COMPUTED,
OPTIMISTIC_TYPES_ASSIGNED,
LOCAL_VARIABLE_TYPES_CALCULATED)) {
static final CompilationPhase REINITIALIZE_CACHED = new ReinitializeCachedPhase();
private static final class BytecodeGenerationPhase extends CompilationPhase {
@Override
FunctionNode transform(final Compiler compiler, final CompilationPhases phases, final FunctionNode fn) {
final ScriptEnvironment senv = compiler.getScriptEnvironment();
@ -517,7 +420,7 @@ enum CompilationPhase {
try {
// Explicitly set BYTECODE_GENERATED here; it can not be set in case of skipping codegen for :program
// in the lazy + optimistic world. See CodeGenerator.skipFunction().
newFunctionNode = transformFunction(newFunctionNode, codegen).setState(null, BYTECODE_GENERATED);
newFunctionNode = transformFunction(newFunctionNode, codegen);
codegen.generateScopeCalls();
} catch (final VerifyError e) {
if (senv._verify_code || senv._print_code) {
@ -565,22 +468,16 @@ enum CompilationPhase {
public String toString() {
return "'Bytecode Generation'";
}
},
}
INSTALL_PHASE(
EnumSet.of(
INITIALIZED,
PARSED,
CONSTANT_FOLDED,
LOWERED,
BUILTINS_TRANSFORMED,
SPLIT,
SYMBOLS_ASSIGNED,
SCOPE_DEPTHS_COMPUTED,
OPTIMISTIC_TYPES_ASSIGNED,
LOCAL_VARIABLE_TYPES_CALCULATED,
BYTECODE_GENERATED)) {
/**
* Bytecode generation:
*
* Generate the byte code class(es) resulting from the compiled FunctionNode
*/
static final CompilationPhase BYTECODE_GENERATION_PHASE = new BytecodeGenerationPhase();
private static final class InstallPhase extends CompilationPhase {
@Override
FunctionNode transform(final Compiler compiler, final CompilationPhases phases, final FunctionNode fn) {
final DebugLogger log = compiler.getLogger();
@ -648,18 +545,16 @@ enum CompilationPhase {
log.fine(sb.toString());
}
return setStates(fn.setRootClass(null, rootClass), BYTECODE_INSTALLED);
return fn.setRootClass(null, rootClass);
}
@Override
public String toString() {
return "'Class Installation'";
}
}
};
/** pre conditions required for function node to which this transform is to be applied */
private final EnumSet<CompilationState> pre;
static final CompilationPhase INSTALL_PHASE = new InstallPhase();
/** start time of transform - used for timing, see {@link jdk.nashorn.internal.runtime.Timing} */
private long startTime;
@ -670,21 +565,7 @@ enum CompilationPhase {
/** boolean that is true upon transform completion */
private boolean isFinished;
private CompilationPhase(final EnumSet<CompilationState> pre) {
this.pre = pre;
}
private static FunctionNode setStates(final FunctionNode functionNode, final CompilationState state) {
if (!AssertsEnabled.assertsEnabled()) {
return functionNode;
}
return transformFunction(functionNode, new NodeVisitor<LexicalContext>(new LexicalContext()) {
@Override
public Node leaveFunctionNode(final FunctionNode fn) {
return fn.setState(lc, state);
}
});
}
private CompilationPhase() {}
/**
* Start a compilation phase
@ -694,23 +575,7 @@ enum CompilationPhase {
*/
protected FunctionNode begin(final Compiler compiler, final FunctionNode functionNode) {
compiler.getLogger().indent();
assert pre != null;
if (!functionNode.hasState(pre)) {
final StringBuilder sb = new StringBuilder("Compilation phase ");
sb.append(this).
append(" is not applicable to ").
append(quote(functionNode.getName())).
append("\n\tFunctionNode state = ").
append(functionNode.getState()).
append("\n\tRequired state = ").
append(this.pre);
throw new CompilationException(sb.toString());
}
startTime = System.nanoTime();
startTime = System.nanoTime();
return functionNode;
}

View File

@ -172,17 +172,17 @@ public final class Compiler implements Loggable {
"Common initial phases",
CompilationPhase.CONSTANT_FOLDING_PHASE,
CompilationPhase.LOWERING_PHASE,
CompilationPhase.TRANSFORM_BUILTINS_PHASE,
CompilationPhase.APPLY_SPECIALIZATION_PHASE,
CompilationPhase.SPLITTING_PHASE,
CompilationPhase.PROGRAM_POINT_PHASE,
CompilationPhase.SYMBOL_ASSIGNMENT_PHASE,
CompilationPhase.SCOPE_DEPTH_COMPUTATION_PHASE,
CompilationPhase.CACHE_AST
CompilationPhase.CACHE_AST_PHASE
);
private final static CompilationPhases COMPILE_CACHED_UPTO_BYTECODE = new CompilationPhases(
"After common phases, before bytecode generator",
CompilationPhase.DECLARE_LOCAL_SYMBOLS_TO_COMPILER,
CompilationPhase.DECLARE_LOCAL_SYMBOLS_PHASE,
CompilationPhase.OPTIMISTIC_TYPE_ASSIGNMENT_PHASE,
CompilationPhase.LOCAL_VARIABLE_TYPE_CALCULATION_PHASE
);

View File

@ -34,7 +34,6 @@ import java.util.Map;
import java.util.Set;
import jdk.nashorn.internal.ir.Block;
import jdk.nashorn.internal.ir.FunctionNode;
import jdk.nashorn.internal.ir.FunctionNode.CompilationState;
import jdk.nashorn.internal.ir.IdentNode;
import jdk.nashorn.internal.ir.LexicalContext;
import jdk.nashorn.internal.ir.Node;
@ -180,8 +179,7 @@ final class FindScopeDepths extends NodeVisitor<LexicalContext> implements Logga
@Override
public Node leaveFunctionNode(final FunctionNode functionNode) {
final String name = functionNode.getName();
FunctionNode newFunctionNode = functionNode.setState(lc, CompilationState.SCOPE_DEPTHS_COMPUTED);
FunctionNode newFunctionNode = functionNode;
if (compiler.isOnDemandCompilation()) {
final RecompilableScriptFunctionData data = compiler.getScriptFunctionData(newFunctionNode.getId());
if (data.inDynamicContext()) {

View File

@ -37,7 +37,6 @@ import jdk.nashorn.internal.ir.CaseNode;
import jdk.nashorn.internal.ir.EmptyNode;
import jdk.nashorn.internal.ir.Expression;
import jdk.nashorn.internal.ir.FunctionNode;
import jdk.nashorn.internal.ir.FunctionNode.CompilationState;
import jdk.nashorn.internal.ir.IfNode;
import jdk.nashorn.internal.ir.LexicalContext;
import jdk.nashorn.internal.ir.LiteralNode;
@ -101,7 +100,7 @@ final class FoldConstants extends NodeVisitor<LexicalContext> implements Loggabl
@Override
public Node leaveFunctionNode(final FunctionNode functionNode) {
return functionNode.setState(lc, CompilationState.CONSTANT_FOLDED);
return functionNode;
}
@Override

View File

@ -54,7 +54,6 @@ import jdk.nashorn.internal.ir.Expression;
import jdk.nashorn.internal.ir.ExpressionStatement;
import jdk.nashorn.internal.ir.ForNode;
import jdk.nashorn.internal.ir.FunctionNode;
import jdk.nashorn.internal.ir.FunctionNode.CompilationState;
import jdk.nashorn.internal.ir.GetSplitState;
import jdk.nashorn.internal.ir.IdentNode;
import jdk.nashorn.internal.ir.IfNode;
@ -1478,7 +1477,6 @@ final class LocalVariableTypesCalculator extends NodeVisitor<LexicalContext>{
newFunction = newFunction.setReturnType(lc, returnType);
newFunction = newFunction.setState(lc, CompilationState.LOCAL_VARIABLE_TYPES_CALCULATED);
newFunction = newFunction.setParameters(lc, newFunction.visitParameters(applyChangesVisitor));
return newFunction;
}

View File

@ -52,7 +52,6 @@ import jdk.nashorn.internal.ir.Expression;
import jdk.nashorn.internal.ir.ExpressionStatement;
import jdk.nashorn.internal.ir.ForNode;
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.IndexNode;
@ -276,7 +275,7 @@ final class Lower extends NodeOperatorVisitor<BlockLexicalContext> implements Lo
@Override
public Node leaveFunctionNode(final FunctionNode functionNode) {
log.info("END FunctionNode: ", functionNode.getName());
return functionNode.setState(lc, CompilationState.LOWERED);
return functionNode;
}
@Override

View File

@ -38,7 +38,6 @@ import jdk.nashorn.internal.ir.Expression;
import jdk.nashorn.internal.ir.ExpressionStatement;
import jdk.nashorn.internal.ir.ForNode;
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.IndexNode;
@ -208,7 +207,7 @@ final class OptimisticTypesCalculator extends NodeVisitor<LexicalContext> {
@Override
public Node leaveFunctionNode(final FunctionNode functionNode) {
neverOptimistic.pop();
return functionNode.setState(lc, CompilationState.OPTIMISTIC_TYPES_ASSIGNED);
return functionNode;
}
@Override

View File

@ -29,7 +29,6 @@ import java.util.ArrayList;
import java.util.List;
import jdk.nashorn.internal.ir.CompileUnitHolder;
import jdk.nashorn.internal.ir.FunctionNode;
import jdk.nashorn.internal.ir.FunctionNode.CompilationState;
import jdk.nashorn.internal.ir.LexicalContext;
import jdk.nashorn.internal.ir.LiteralNode;
import jdk.nashorn.internal.ir.LiteralNode.ArrayLiteralNode;
@ -64,7 +63,7 @@ abstract class ReplaceCompileUnits extends NodeVisitor<LexicalContext> {
@Override
public Node leaveFunctionNode(final FunctionNode node) {
return node.setCompileUnit(lc, getExistingReplacement(node)).setState(lc, CompilationState.COMPILE_UNITS_REUSED);
return node.setCompileUnit(lc, getExistingReplacement(node));
}
@Override

View File

@ -47,7 +47,6 @@ import jdk.nashorn.internal.ir.ContinueNode;
import jdk.nashorn.internal.ir.Expression;
import jdk.nashorn.internal.ir.ExpressionStatement;
import jdk.nashorn.internal.ir.FunctionNode;
import jdk.nashorn.internal.ir.FunctionNode.CompilationState;
import jdk.nashorn.internal.ir.GetSplitState;
import jdk.nashorn.internal.ir.IdentNode;
import jdk.nashorn.internal.ir.IfNode;
@ -176,11 +175,9 @@ final class SplitIntoFunctions extends NodeVisitor<BlockLexicalContext> {
// we still use IS_SPLIT as the criteria in CompilationPhase.SERIALIZE_SPLIT_PHASE.
FunctionNode.IS_ANONYMOUS | FunctionNode.USES_ANCESTOR_SCOPE | FunctionNode.IS_SPLIT,
body,
CompilationState.INITIALIZED,
null
)
.setCompileUnit(lc, splitNode.getCompileUnit())
.copyCompilationState(lc, originalFn);
.setCompileUnit(lc, splitNode.getCompileUnit());
// Call the function:
// either "(function () { ... }).call(this)"

View File

@ -33,7 +33,6 @@ import java.util.List;
import java.util.Map;
import jdk.nashorn.internal.ir.Block;
import jdk.nashorn.internal.ir.FunctionNode;
import jdk.nashorn.internal.ir.FunctionNode.CompilationState;
import jdk.nashorn.internal.ir.LexicalContext;
import jdk.nashorn.internal.ir.LiteralNode;
import jdk.nashorn.internal.ir.LiteralNode.ArrayLiteralNode;
@ -158,7 +157,7 @@ final class Splitter extends NodeVisitor<LexicalContext> implements Loggable {
assert functionNode.getCompileUnit() != null;
return functionNode.setState(null, CompilationState.SPLIT);
return functionNode;
}
private static List<FunctionNode> directChildren(final FunctionNode functionNode) {

View File

@ -33,10 +33,8 @@ import static jdk.nashorn.internal.runtime.linker.NashornCallSiteDescriptor.CALL
import static jdk.nashorn.internal.runtime.linker.NashornCallSiteDescriptor.CALLSITE_TRACE_VALUES;
import java.util.Collections;
import java.util.EnumSet;
import java.util.Iterator;
import java.util.List;
import jdk.nashorn.internal.AssertsEnabled;
import jdk.nashorn.internal.codegen.CompileUnit;
import jdk.nashorn.internal.codegen.Compiler;
import jdk.nashorn.internal.codegen.CompilerConstants;
@ -74,40 +72,6 @@ public final class FunctionNode extends LexicalContextExpression implements Flag
SETTER
}
/** Compilation states available */
public enum CompilationState {
/** compiler is ready */
INITIALIZED,
/** method has been parsed */
PARSED,
/** method has been parsed */
PARSE_ERROR,
/** constant folding pass */
CONSTANT_FOLDED,
/** method has been lowered */
LOWERED,
/** program points have been assigned to unique locations */
PROGRAM_POINTS_ASSIGNED,
/** any transformations of builtins have taken place, e.g. apply=&gt;call */
BUILTINS_TRANSFORMED,
/** method has been split */
SPLIT,
/** method has had symbols assigned */
SYMBOLS_ASSIGNED,
/** computed scope depths for symbols */
SCOPE_DEPTHS_COMPUTED,
/** method has had types calculated*/
OPTIMISTIC_TYPES_ASSIGNED,
/** method has had types calculated */
LOCAL_VARIABLE_TYPES_CALCULATED,
/** compile units reused (optional) */
COMPILE_UNITS_REUSED,
/** method has been emitted to bytecode */
BYTECODE_GENERATED,
/** method has been installed */
BYTECODE_INSTALLED
}
/** Source of entity. */
private transient final Source source;
@ -145,10 +109,6 @@ public final class FunctionNode extends LexicalContextExpression implements Flag
/** Method's namespace. */
private transient final Namespace namespace;
/** Current compilation state */
@Ignore
private final EnumSet<CompilationState> compilationState;
/** Number of properties of "this" object assigned in this function */
@Ignore
private final int thisProperties;
@ -306,7 +266,6 @@ public final class FunctionNode extends LexicalContextExpression implements Flag
* @param kind kind of function as in {@link FunctionNode.Kind}
* @param flags initial flags
* @param body body of the function
* @param state The initial state from the parser. Must be one of {@link CompilationState#PARSED} and {@link CompilationState#PARSE_ERROR}
* @param endParserState The parser state at the end of the parsing.
*/
public FunctionNode(
@ -323,7 +282,6 @@ public final class FunctionNode extends LexicalContextExpression implements Flag
final FunctionNode.Kind kind,
final int flags,
final Block body,
final CompilationState state,
final Object endParserState) {
super(token, finish);
@ -336,7 +294,6 @@ public final class FunctionNode extends LexicalContextExpression implements Flag
this.firstToken = firstToken;
this.lastToken = lastToken;
this.namespace = namespace;
this.compilationState = EnumSet.of(CompilationState.INITIALIZED, state);
this.flags = flags;
this.compileUnit = null;
this.body = body;
@ -353,7 +310,6 @@ public final class FunctionNode extends LexicalContextExpression implements Flag
final String name,
final Type returnType,
final CompileUnit compileUnit,
final EnumSet<CompilationState> compilationState,
final Block body,
final List<IdentNode> parameters,
final int thisProperties,
@ -368,7 +324,6 @@ public final class FunctionNode extends LexicalContextExpression implements Flag
this.returnType = returnType;
this.compileUnit = compileUnit;
this.lastToken = lastToken;
this.compilationState = compilationState;
this.body = body;
this.parameters = parameters;
this.thisProperties = thisProperties;
@ -468,7 +423,6 @@ public final class FunctionNode extends LexicalContextExpression implements Flag
name,
returnType,
compileUnit,
compilationState,
body,
parameters,
thisProperties,
@ -543,80 +497,6 @@ public final class FunctionNode extends LexicalContextExpression implements Flag
return lineNumber;
}
/**
* Get the compilation state of this function
* @return the compilation state
*/
public EnumSet<CompilationState> getState() {
return compilationState;
}
/**
* Check whether this FunctionNode has reached a give CompilationState.
*
* @param state the state to check for
* @return true of the node is in the given state
*/
public boolean hasState(final EnumSet<CompilationState> state) {
return !AssertsEnabled.assertsEnabled() || compilationState.containsAll(state);
}
/**
* Add a state to the total CompilationState of this node, e.g. if
* FunctionNode has been lowered, the compiler will add
* {@code CompilationState#LOWERED} to the state vector
*
* @param lc lexical context
* @param state {@link CompilationState} to add
* @return function node or a new one if state was changed
*/
public FunctionNode setState(final LexicalContext lc, final CompilationState state) {
if (!AssertsEnabled.assertsEnabled() || this.compilationState.contains(state)) {
return this;
}
final EnumSet<CompilationState> newState = EnumSet.copyOf(this.compilationState);
newState.add(state);
return setCompilationState(lc, newState);
}
/**
* Copy a compilation state from an original function to this function. Used when creating synthetic
* function nodes by the splitter.
*
* @param lc lexical context
* @param original the original function node to copy compilation state from
* @return function node or a new one if state was changed
*/
public FunctionNode copyCompilationState(final LexicalContext lc, final FunctionNode original) {
final EnumSet<CompilationState> origState = original.compilationState;
if (!AssertsEnabled.assertsEnabled() || this.compilationState.containsAll(origState)) {
return this;
}
final EnumSet<CompilationState> newState = EnumSet.copyOf(this.compilationState);
newState.addAll(origState);
return setCompilationState(lc, newState);
}
private FunctionNode setCompilationState(final LexicalContext lc, final EnumSet<CompilationState> compilationState) {
return Node.replaceInLexicalContext(
lc,
this,
new FunctionNode(
this,
lastToken,
endParserState,
flags,
name,
returnType,
compileUnit,
compilationState,
body,
parameters,
thisProperties,
rootClass, source, namespace));
}
/**
* Create a unique name in the namespace of this FunctionNode
* @param base prefix for name
@ -682,7 +562,6 @@ public final class FunctionNode extends LexicalContextExpression implements Flag
name,
returnType,
compileUnit,
compilationState,
body,
parameters,
thisProperties,
@ -823,7 +702,6 @@ public final class FunctionNode extends LexicalContextExpression implements Flag
name,
returnType,
compileUnit,
compilationState,
body,
parameters,
thisProperties,
@ -919,7 +797,6 @@ public final class FunctionNode extends LexicalContextExpression implements Flag
name,
returnType,
compileUnit,
compilationState,
body,
parameters,
thisProperties,
@ -996,7 +873,6 @@ public final class FunctionNode extends LexicalContextExpression implements Flag
name,
returnType,
compileUnit,
compilationState,
body,
parameters,
thisProperties,
@ -1070,7 +946,6 @@ public final class FunctionNode extends LexicalContextExpression implements Flag
name,
returnType,
compileUnit,
compilationState,
body,
parameters,
thisProperties,
@ -1158,7 +1033,6 @@ public final class FunctionNode extends LexicalContextExpression implements Flag
name,
type,
compileUnit,
compilationState,
body,
parameters,
thisProperties,
@ -1224,7 +1098,6 @@ public final class FunctionNode extends LexicalContextExpression implements Flag
name,
returnType,
compileUnit,
compilationState,
body,
parameters,
thisProperties,
@ -1280,7 +1153,6 @@ public final class FunctionNode extends LexicalContextExpression implements Flag
name,
returnType,
compileUnit,
compilationState,
body,
parameters,
thisProperties,

View File

@ -84,7 +84,6 @@ import jdk.nashorn.internal.ir.Expression;
import jdk.nashorn.internal.ir.ExpressionStatement;
import jdk.nashorn.internal.ir.ForNode;
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.IndexNode;
@ -487,7 +486,6 @@ loop:
}
private FunctionNode createFunctionNode(final ParserContextFunctionNode function, final long startToken, final IdentNode ident, final List<IdentNode> parameters, final FunctionNode.Kind kind, final int functionLine, final Block body){
final CompilationState state = errors.hasErrors() ? CompilationState.PARSE_ERROR : CompilationState.PARSED;
// Start new block.
final FunctionNode functionNode =
new FunctionNode(
@ -504,7 +502,6 @@ loop:
kind,
function.getFlags(),
body,
state,
function.getEndParserState());
printAST(functionNode);

View File

@ -591,7 +591,7 @@ public class ScriptFunction extends ScriptObject {
*
* @param newPrototype new prototype object
*/
public final void setPrototype(Object newPrototype) {
public final void setPrototype(final Object newPrototype) {
if (newPrototype instanceof ScriptObject && newPrototype != this.prototype && allocatorMap != null) {
// Replace our current allocator map with one that is associated with the new prototype.
allocatorMap = allocatorMap.changeProto((ScriptObject) newPrototype);