8055917: jdk.nashorn.internal.codegen.CompilationPhase$N should be renamed to proper classes
Reviewed-by: attila, hannesw
This commit is contained in:
parent
9969836a33
commit
cf428a3931
@ -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)");
|
||||
}
|
||||
}
|
136
nashorn/samples/exceptionswallow.js
Normal file
136
nashorn/samples/exceptionswallow.js
Normal 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]));
|
@ -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")) {
|
||||
|
@ -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")) {
|
||||
|
156
nashorn/samples/resourcetrysuggester.js
Normal file
156
nashorn/samples/resourcetrysuggester.js
Normal 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]));
|
@ -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()
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
);
|
||||
|
@ -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()) {
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)"
|
||||
|
@ -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) {
|
||||
|
@ -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=>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,
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user