# HG changeset patch
# User asaha
# Date 1433388620 25200
# Node ID 676ce2f6b277e5c81fe87e412a275619f7d34644
# Parent dc07d2b95013d84c55c434dba15877de8f1eca10# Parent 3780124b6dbb100c2c4af2759b8f0e12a8bf1c4c
Merge
diff -r dc07d2b95013 -r 676ce2f6b277 .hgtags
--- a/.hgtags Thu May 28 20:55:21 2015 -0700
+++ b/.hgtags Wed Jun 03 20:30:20 2015 -0700
@@ -422,3 +422,4 @@
78fcf7f0eac8ffa474518b315bdf84a1dbd6e76d jdk8u60-b15
bf44ade6c2c2e697ccbc1e57f3eac870908614e6 jdk8u60-b16
ff7052ce0f6b655d726cd0f77e9a5f8313361889 jdk8u60-b17
+0b5c0f02a0b79ae0aa97520d65e5b520af8f1b2a jdk8u60-b18
diff -r dc07d2b95013 -r 676ce2f6b277 make/build.xml
--- a/make/build.xml Thu May 28 20:55:21 2015 -0700
+++ b/make/build.xml Wed Jun 03 20:30:20 2015 -0700
@@ -210,7 +210,7 @@
-
@@ -460,7 +460,7 @@
-
+
diff -r dc07d2b95013 -r 676ce2f6b277 samples/browser_dom.js
--- a/samples/browser_dom.js Thu May 28 20:55:21 2015 -0700
+++ b/samples/browser_dom.js Wed Jun 03 20:30:20 2015 -0700
@@ -40,7 +40,6 @@
var ChangeListener = Java.type("javafx.beans.value.ChangeListener");
var Scene = Java.type("javafx.scene.Scene");
var WebView = Java.type("javafx.scene.web.WebView");
-var EventListener = Java.type("org.w3c.dom.events.EventListener");
// JavaFX start method
function start(stage) {
diff -r dc07d2b95013 -r 676ce2f6b277 samples/console.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/samples/console.js Wed Jun 03 20:30:20 2015 -0700
@@ -0,0 +1,134 @@
+/*
+ * 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.
+ */
+
+/**
+ * Simple Web Console-like support for Nashorn. In addition to
+ * Web console object methods, this console add methods of
+ * java.io.Console as well. Note:not all web console methods are
+ * implemented but useful subset is implemented.
+ *
+ * See also: https://developer.mozilla.org/en/docs/Web/API/console
+ */
+
+
+if (typeof console == 'undefined') {
+
+(function() {
+ var LocalDateTime = Java.type("java.time.LocalDateTime");
+ var System = Java.type("java.lang.System");
+ var jconsole = System.console();
+
+ // add a new global variable called "console"
+ this.console = {
+ };
+
+ function addConsoleMethods() {
+ // expose methods of java.io.Console as an extension
+ var placeholder = "-*-";
+ // put a placeholder for each name from java.lang.Object
+ var objMethods = Object.bindProperties({}, new java.lang.Object());
+ for (var m in objMethods) {
+ console[m] = placeholder;
+ }
+
+ // bind only the methods of java.io.Console
+ // This bind will skip java.lang.Object methods as console
+ // has properties of same name.
+ Object.bindProperties(console, jconsole);
+
+ // Now, delete java.lang.Object methods
+ for (var m in console) {
+ if (console[m] == placeholder) {
+ delete console[m];
+ }
+ }
+ }
+
+ addConsoleMethods();
+
+ function consoleLog(type, msg) {
+ // print type of message, then time.
+ jconsole.format("%s [%s] ", type, LocalDateTime.now().toString());
+ if (typeof msg == 'string') {
+ jconsole.format(msg + "\n", Array.prototype.slice.call(arguments, 2));
+ } else {
+ // simple space separated values and newline at the end
+ var arr = Array.prototype.slice.call(arguments, 1);
+ jconsole.format("%s\n", arr.join(" "));
+ }
+ }
+
+ console.toString = function() "[object Console]";
+
+ // web console functions
+
+ console.assert = function(expr) {
+ if (! expr) {
+ arguments[0] = "Assertion Failed:";
+ consoleLog.apply(console, arguments);
+ // now, stack trace at the end
+ jconsole.format("%s\n", new Error().stack);
+ }
+ };
+
+ // dummy clear to avoid error!
+ console.clear = function() {};
+
+ var counter = {
+ get: function(label) {
+ if (! this[label]) {
+ return this[label] = 1;
+ } else {
+ return ++this[label];
+ }
+ }
+ };
+
+ // counter
+ console.count = function(label) {
+ label = label? String(label) : "";
+ jconsole.format("%s: %d\n",label, counter.get(label).intValue());
+ }
+
+ // logging
+ console.error = consoleLog.bind(jconsole, "ERROR");
+ console.info = consoleLog.bind(jconsole, "INFO");
+ console.log = console.info;
+ console.debug = console.log;
+ console.warn = consoleLog.bind(jconsole, "WARNING");
+
+ // print stack trace
+ console.trace = function() {
+ jconsole.format("%s\n", new Error().stack);
+ };
+})();
+
+}
diff -r dc07d2b95013 -r 676ce2f6b277 samples/consoleuse.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/samples/consoleuse.js Wed Jun 03 20:30:20 2015 -0700
@@ -0,0 +1,55 @@
+/*
+ * 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.
+ */
+
+load(__DIR__ + "console.js");
+
+console.log("consoleuse.js started!");
+
+function func() {
+ console.count("func");
+}
+
+
+func();
+func();
+func();
+func();
+
+// java.io.Console method
+console.readPassword("passworld please: ");
+console.error("Big error: %s!", "you revealed your password!");
+console.warn("You've done this %d times", 345);
+console.assert(arguments.length != 0, "no arguments!");
+
+// java.io.Console methods
+var str = console.readLine("enter something: ");
+console.printf("you entered: %s\n", str);
+
diff -r dc07d2b95013 -r 676ce2f6b277 samples/time_color.fx
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/samples/time_color.fx Wed Jun 03 20:30:20 2015 -0700
@@ -0,0 +1,89 @@
+#// Usage: jjs -fx time_color.js [-- true/false]
+
+/*
+ * Copyright (c) 2014, 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.
+ */
+
+// A simple javafx program that changes background color
+// of scene based on current time value (once per sec).
+// inspired by http://whatcolourisit.scn9a.org/
+
+if (!$OPTIONS._fx) {
+ print("Usage: jjs -fx time_color.js");
+ print(" jjs -fx time_color.js -- true");
+ exit(1);
+}
+
+// JavaFX classes used
+var Color = Java.type("javafx.scene.paint.Color");
+var Group = Java.type("javafx.scene.Group");
+var Label = Java.type("javafx.scene.control.Label");
+var Platform = Java.type("javafx.application.Platform");
+var Scene = Java.type("javafx.scene.Scene");
+var Timer = Java.type("java.util.Timer");
+
+// execute function periodically once per given time in millisec
+function setInterval(func, ms) {
+ // New timer, run as daemon so the application can quit
+ var timer = new Timer("setInterval", true);
+ timer.schedule(function() Platform.runLater(func), ms, ms);
+ return timer;
+}
+
+// do you want to flip hour/min/sec for RGB?
+var flip = arguments.length > 0? "true".equals(arguments[0]) : false;
+
+// JavaFX start method
+function start(stage) {
+ start.title = "Time Color";
+ var root = new Group();
+ var label = new Label("time");
+ label.textFill = Color.WHITE;
+ root.children.add(label);
+ stage.scene = new Scene(root, 700, 500);
+
+ setInterval(function() {
+ var d = new Date();
+ var hours = d.getHours();
+ var mins = d.getMinutes();
+ var secs = d.getSeconds();
+
+ if (hours < 10) hours = "0" + hours;
+ if (mins < 10) mins = "0" + mins;
+ if (secs < 10) secs = "0" + secs;
+
+ var hex = flip?
+ "#" + secs + mins + hours : "#" + hours + mins + secs;
+ label.text = "Color: " + hex;
+ stage.scene.fill = Color.web(hex);
+ }, 1000);
+
+ stage.show();
+}
diff -r dc07d2b95013 -r 676ce2f6b277 samples/undefined_call.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/samples/undefined_call.js Wed Jun 03 20:30:20 2015 -0700
@@ -0,0 +1,48 @@
+/*
+ * 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.
+ */
+
+// Nashorn extension: __noSuchMethod__
+// See also: https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions#Nashornextensions-__noSuchMethod__
+
+Object.prototype.__noSuchMethod__ = function(name) {
+ print(name + " function is not defined in " + this);
+
+ // Nashorn extension: stack property
+ // gives stack trace as a string
+ print(new Error().stack);
+}
+
+function func(obj) {
+ obj.foo();
+}
+
+func({});
+func(this);
diff -r dc07d2b95013 -r 676ce2f6b277 samples/unzip.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/samples/unzip.js Wed Jun 03 20:30:20 2015 -0700
@@ -0,0 +1,79 @@
+/*
+ * 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.
+ */
+
+/*
+ * Simple unzip tool using #nashorn and #java
+ * zip fs file system interface.
+ */
+
+if (arguments.length == 0) {
+ print("Usage: jjs zipfs.js -- <.zip/.jar file> [out dir]");
+ exit(1);
+}
+
+var File = Java.type("java.io.File");
+// output directory where zip is extracted
+var outDir = arguments[1];
+if (!outDir) {
+ outDir = ".";
+} else {
+ if (! new File(outDir).isDirectory()) {
+ print(outDir + " directory does not exist!");
+ exit(1);
+ }
+}
+
+var Files = Java.type("java.nio.file.Files");
+var FileSystems = Java.type("java.nio.file.FileSystems");
+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];
+
+// walk root and handle each Path
+Files.walk(root).forEach(
+ function(p) {
+ var outPath = outDir +
+ p.toString().replace('/', File.separatorChar);
+ print(outPath);
+ if (Files.isDirectory(p)) {
+ // create directories as needed
+ new File(outPath).mkdirs();
+ } else {
+ // copy a 'file' resource
+ Files.copy(p, new File(outPath).toPath());
+ }
+ }
+);
+
+// done
+fs.close();
diff -r dc07d2b95013 -r 676ce2f6b277 src/jdk/nashorn/internal/codegen/AssignSymbols.java
--- a/src/jdk/nashorn/internal/codegen/AssignSymbols.java Thu May 28 20:55:21 2015 -0700
+++ b/src/jdk/nashorn/internal/codegen/AssignSymbols.java Wed Jun 03 20:30:20 2015 -0700
@@ -84,6 +84,7 @@
import jdk.nashorn.internal.ir.VarNode;
import jdk.nashorn.internal.ir.WithNode;
import jdk.nashorn.internal.ir.visitor.NodeVisitor;
+import jdk.nashorn.internal.parser.TokenType;
import jdk.nashorn.internal.runtime.Context;
import jdk.nashorn.internal.runtime.ECMAErrors;
import jdk.nashorn.internal.runtime.ErrorManager;
@@ -714,12 +715,10 @@
@Override
public Node leaveBinaryNode(final BinaryNode binaryNode) {
- switch (binaryNode.tokenType()) {
- case ASSIGN:
+ if (binaryNode.isTokenType(TokenType.ASSIGN)) {
return leaveASSIGN(binaryNode);
- default:
- return super.leaveBinaryNode(binaryNode);
}
+ return super.leaveBinaryNode(binaryNode);
}
private Node leaveASSIGN(final BinaryNode binaryNode) {
diff -r dc07d2b95013 -r 676ce2f6b277 src/jdk/nashorn/internal/codegen/CodeGenerator.java
--- a/src/jdk/nashorn/internal/codegen/CodeGenerator.java Thu May 28 20:55:21 2015 -0700
+++ b/src/jdk/nashorn/internal/codegen/CodeGenerator.java Wed Jun 03 20:30:20 2015 -0700
@@ -3798,7 +3798,6 @@
emitBranch(binaryNode, onTrue, true);
if (isCurrentDiscard) {
method.label(onTrue);
- method.pop();
} else {
method.load(false);
method._goto(skip);
diff -r dc07d2b95013 -r 676ce2f6b277 src/jdk/nashorn/internal/codegen/LocalVariableTypesCalculator.java
--- a/src/jdk/nashorn/internal/codegen/LocalVariableTypesCalculator.java Thu May 28 20:55:21 2015 -0700
+++ b/src/jdk/nashorn/internal/codegen/LocalVariableTypesCalculator.java Wed Jun 03 20:30:20 2015 -0700
@@ -459,7 +459,7 @@
// NOTE: regardless of operator's lexical associativity, lhs is always evaluated first.
final Expression lhs = binaryNode.lhs();
final LvarType lhsType;
- if (!(lhs instanceof IdentNode && binaryNode.tokenType() == TokenType.ASSIGN)) {
+ if (!(lhs instanceof IdentNode && binaryNode.isTokenType(TokenType.ASSIGN))) {
lhsType = visitExpression(lhs);
} else {
// Can't visit IdentNode on LHS of a simple assignment, as visits imply use, and this is def.
diff -r dc07d2b95013 -r 676ce2f6b277 src/jdk/nashorn/internal/codegen/Lower.java
--- a/src/jdk/nashorn/internal/codegen/Lower.java Thu May 28 20:55:21 2015 -0700
+++ b/src/jdk/nashorn/internal/codegen/Lower.java Wed Jun 03 20:30:20 2015 -0700
@@ -200,7 +200,7 @@
final String name = getConstantPropertyName(indexNode.getIndex());
if (name != null) {
// If index node is a constant property name convert index node to access node.
- assert Token.descType(indexNode.getToken()) == TokenType.LBRACKET;
+ assert indexNode.isIndex();
return new AccessNode(indexNode.getToken(), indexNode.getFinish(), indexNode.getBase(), name);
}
return super.leaveIndexNode(indexNode);
diff -r dc07d2b95013 -r 676ce2f6b277 src/jdk/nashorn/internal/codegen/OptimisticTypesPersistence.java
--- a/src/jdk/nashorn/internal/codegen/OptimisticTypesPersistence.java Thu May 28 20:55:21 2015 -0700
+++ b/src/jdk/nashorn/internal/codegen/OptimisticTypesPersistence.java Wed Jun 03 20:30:20 2015 -0700
@@ -61,7 +61,7 @@
import jdk.nashorn.internal.runtime.options.Options;
/**
- * Static utility that encapsulates persistence of type information for functions compiled with optimistic
+ *
Static utility that encapsulates persistence of type information for functions compiled with optimistic
* typing. With this feature enabled, when a JavaScript function is recompiled because it gets deoptimized,
* the type information for deoptimization is stored in a cache file. If the same function is compiled in a
* subsequent JVM invocation, the type information is used for initial compilation, thus allowing the system
@@ -77,6 +77,7 @@
* {@code nashorn.typeInfo.cleanupDelaySeconds} system property. You can also specify the word
* {@code unlimited} as the value for {@code nashorn.typeInfo.maxFiles} in which case the type info cache is
* allowed to grow without limits.
+ *
*/
public final class OptimisticTypesPersistence {
// Default is 0, for disabling the feature when not specified. A reasonable default when enabled is
diff -r dc07d2b95013 -r 676ce2f6b277 src/jdk/nashorn/internal/ir/AccessNode.java
--- a/src/jdk/nashorn/internal/ir/AccessNode.java Thu May 28 20:55:21 2015 -0700
+++ b/src/jdk/nashorn/internal/ir/AccessNode.java Wed Jun 03 20:30:20 2015 -0700
@@ -28,8 +28,6 @@
import jdk.nashorn.internal.codegen.types.Type;
import jdk.nashorn.internal.ir.annotations.Immutable;
import jdk.nashorn.internal.ir.visitor.NodeVisitor;
-import jdk.nashorn.internal.parser.Token;
-import jdk.nashorn.internal.parser.TokenType;
/**
* IR representation of a property access (period operator.)
@@ -103,14 +101,6 @@
return property;
}
- /**
- * Return true if this node represents an index operation normally represented as {@link IndexNode}.
- * @return true if an index access.
- */
- public boolean isIndex() {
- return Token.descType(getToken()) == TokenType.LBRACKET;
- }
-
private AccessNode setBase(final Expression base) {
if (this.base == base) {
return this;
diff -r dc07d2b95013 -r 676ce2f6b277 src/jdk/nashorn/internal/ir/BaseNode.java
--- a/src/jdk/nashorn/internal/ir/BaseNode.java Thu May 28 20:55:21 2015 -0700
+++ b/src/jdk/nashorn/internal/ir/BaseNode.java Wed Jun 03 20:30:20 2015 -0700
@@ -29,6 +29,7 @@
import jdk.nashorn.internal.codegen.types.Type;
import jdk.nashorn.internal.ir.annotations.Immutable;
+import jdk.nashorn.internal.parser.TokenType;
/**
* IR base for accessing/indexing nodes.
@@ -122,6 +123,14 @@
}
/**
+ * Return true if this node represents an index operation normally represented as {@link IndexNode}.
+ * @return true if an index access.
+ */
+ public boolean isIndex() {
+ return isTokenType(TokenType.LBRACKET);
+ }
+
+ /**
* Mark this node as being the callee operand of a {@link CallNode}.
* @return a base node identical to this one in all aspects except with its function flag set.
*/
diff -r dc07d2b95013 -r 676ce2f6b277 src/jdk/nashorn/internal/ir/BinaryNode.java
--- a/src/jdk/nashorn/internal/ir/BinaryNode.java Thu May 28 20:55:21 2015 -0700
+++ b/src/jdk/nashorn/internal/ir/BinaryNode.java Wed Jun 03 20:30:20 2015 -0700
@@ -312,7 +312,7 @@
@Override
public boolean isSelfModifying() {
- return isAssignment() && tokenType() != TokenType.ASSIGN;
+ return isAssignment() && !isTokenType(TokenType.ASSIGN);
}
@Override
@@ -529,7 +529,7 @@
final TokenType tokenType = tokenType();
if(tokenType == TokenType.ADD || tokenType == TokenType.ASSIGN_ADD) {
return OPTIMISTIC_UNDECIDED_TYPE;
- } else if (CAN_OVERFLOW.contains(tokenType())) {
+ } else if (CAN_OVERFLOW.contains(tokenType)) {
return Type.INT;
}
return getMostPessimisticType();
diff -r dc07d2b95013 -r 676ce2f6b277 src/jdk/nashorn/internal/ir/LexicalContext.java
--- a/src/jdk/nashorn/internal/ir/LexicalContext.java Thu May 28 20:55:21 2015 -0700
+++ b/src/jdk/nashorn/internal/ir/LexicalContext.java Wed Jun 03 20:30:20 2015 -0700
@@ -204,7 +204,7 @@
/**
* Explicitly apply flags to the topmost element on the stack. This is only valid to use from a
* {@code NodeVisitor.leaveXxx()} method and only on the node being exited at the time. It is not mandatory to use,
- * as {@link #pop(LexicalContextNode)} will apply the flags automatically, but this method can be used to apply them
+ * as {@link #pop(Node)} will apply the flags automatically, but this method can be used to apply them
* during the {@code leaveXxx()} method in case its logic depends on the value of the flags.
* @param node the node to apply the flags to. Must be the topmost node on the stack.
* @return the passed in node, or a modified node (if any flags were modified)
diff -r dc07d2b95013 -r 676ce2f6b277 src/jdk/nashorn/internal/ir/Node.java
--- a/src/jdk/nashorn/internal/ir/Node.java Thu May 28 20:55:21 2015 -0700
+++ b/src/jdk/nashorn/internal/ir/Node.java Wed Jun 03 20:30:20 2015 -0700
@@ -220,26 +220,28 @@
}
/**
- * Return token tokenType from a token descriptor.
+ * Returns this node's token's type. If you want to check for the node having a specific token type,
+ * consider using {@link #isTokenType(TokenType)} instead.
*
- * @return Type of token.
+ * @return type of token.
*/
public TokenType tokenType() {
return Token.descType(token);
}
/**
- * Test token tokenType.
+ * Tests if this node has the specific token type.
*
- * @param type a type to check this token against
+ * @param type a token type to check this node's token type against
* @return true if token types match.
*/
public boolean isTokenType(final TokenType type) {
- return Token.descType(token) == type;
+ return tokenType() == type;
}
/**
- * Get the token for this location
+ * Get the token for this node. If you want to retrieve the token's type, consider using
+ * {@link #tokenType()} or {@link #isTokenType(TokenType)} instead.
* @return the token
*/
public long getToken() {
diff -r dc07d2b95013 -r 676ce2f6b277 src/jdk/nashorn/internal/ir/TryNode.java
--- a/src/jdk/nashorn/internal/ir/TryNode.java Thu May 28 20:55:21 2015 -0700
+++ b/src/jdk/nashorn/internal/ir/TryNode.java Wed Jun 03 20:30:20 2015 -0700
@@ -57,7 +57,7 @@
* block was not terminal; the original jump/return is simply ignored if the finally block itself
* terminates). The reason for this somewhat strange arrangement is that we didn't want to create a
* separate class for the (label, BlockStatement pair) but rather reused the already available LabelNode.
- * However, if we simply used List without wrapping the label nodes in an additional Block,
+ * However, if we simply used List<LabelNode> without wrapping the label nodes in an additional Block,
* that would've thrown off visitors relying on BlockLexicalContext -- same reason why we never use
* Statement as the type of bodies of e.g. IfNode, WhileNode etc. but rather blockify them even when they're
* single statements.
diff -r dc07d2b95013 -r 676ce2f6b277 src/jdk/nashorn/internal/ir/VarNode.java
--- a/src/jdk/nashorn/internal/ir/VarNode.java Thu May 28 20:55:21 2015 -0700
+++ b/src/jdk/nashorn/internal/ir/VarNode.java Wed Jun 03 20:30:20 2015 -0700
@@ -27,7 +27,6 @@
import jdk.nashorn.internal.ir.annotations.Immutable;
import jdk.nashorn.internal.ir.visitor.NodeVisitor;
-import jdk.nashorn.internal.parser.Token;
/**
* Node represents a var/let declaration.
@@ -182,7 +181,7 @@
@Override
public void toString(final StringBuilder sb, final boolean printType) {
- sb.append(Token.descType(getToken()).getName()).append(' ');
+ sb.append(tokenType().getName()).append(' ');
name.toString(sb, printType);
if (init != null) {
diff -r dc07d2b95013 -r 676ce2f6b277 src/jdk/nashorn/internal/objects/Global.java
--- a/src/jdk/nashorn/internal/objects/Global.java Thu May 28 20:55:21 2015 -0700
+++ b/src/jdk/nashorn/internal/objects/Global.java Wed Jun 03 20:30:20 2015 -0700
@@ -220,7 +220,12 @@
@Property(name = "Number", attributes = Attribute.NOT_ENUMERABLE)
public volatile Object number;
- /** ECMA 15.1.4.7 Date constructor */
+ /**
+ * Getter for ECMA 15.1.4.7 Date property
+ *
+ * @param self self reference
+ * @return Date property value
+ */
@Getter(name = "Date", attributes = Attribute.NOT_ENUMERABLE)
public static Object getDate(final Object self) {
final Global global = Global.instanceFrom(self);
@@ -230,6 +235,12 @@
return global.date;
}
+ /**
+ * Setter for ECMA 15.1.4.7 Date property
+ *
+ * @param self self reference
+ * @param value value for the Date property
+ */
@Setter(name = "Date", attributes = Attribute.NOT_ENUMERABLE)
public static void setDate(final Object self, final Object value) {
final Global global = Global.instanceFrom(self);
@@ -238,7 +249,12 @@
private volatile Object date = LAZY_SENTINEL;
- /** ECMA 15.1.4.8 RegExp constructor */
+ /**
+ * Getter for ECMA 15.1.4.8 RegExp property
+ *
+ * @param self self reference
+ * @return RegExp property value
+ */
@Getter(name = "RegExp", attributes = Attribute.NOT_ENUMERABLE)
public static Object getRegExp(final Object self) {
final Global global = Global.instanceFrom(self);
@@ -248,6 +264,12 @@
return global.regexp;
}
+ /**
+ * Setter for ECMA 15.1.4.8 RegExp property
+ *
+ * @param self self reference
+ * @param value value for the RegExp property
+ */
@Setter(name = "RegExp", attributes = Attribute.NOT_ENUMERABLE)
public static void setRegExp(final Object self, final Object value) {
final Global global = Global.instanceFrom(self);
@@ -256,7 +278,11 @@
private volatile Object regexp = LAZY_SENTINEL;
- /** ECMA 15.12 - The JSON object */
+ /**
+ * Getter for ECMA 15.12 - The JSON property
+ * @param self self reference
+ * @return the value of JSON property
+ */
@Getter(name = "JSON", attributes = Attribute.NOT_ENUMERABLE)
public static Object getJSON(final Object self) {
final Global global = Global.instanceFrom(self);
@@ -266,6 +292,11 @@
return global.json;
}
+ /**
+ * Setter for ECMA 15.12 - The JSON property
+ * @param self self reference
+ * @param value value for the JSON property
+ */
@Setter(name = "JSON", attributes = Attribute.NOT_ENUMERABLE)
public static void setJSON(final Object self, final Object value) {
final Global global = Global.instanceFrom(self);
@@ -274,7 +305,11 @@
private volatile Object json = LAZY_SENTINEL;
- /** Nashorn extension: global.JSAdapter */
+ /**
+ * Getter for Nashorn extension: global.JSAdapter
+ * @param self self reference
+ * @return value of the JSAdapter property
+ */
@Getter(name = "JSAdapter", attributes = Attribute.NOT_ENUMERABLE)
public static Object getJSAdapter(final Object self) {
final Global global = Global.instanceFrom(self);
@@ -284,6 +319,11 @@
return global.jsadapter;
}
+ /**
+ * Setter for Nashorn extension: global.JSAdapter
+ * @param self self reference
+ * @param value value for the JSAdapter property
+ */
@Setter(name = "JSAdapter", attributes = Attribute.NOT_ENUMERABLE)
public static void setJSAdapter(final Object self, final Object value) {
final Global global = Global.instanceFrom(self);
@@ -300,7 +340,11 @@
@Property(name = "Error", attributes = Attribute.NOT_ENUMERABLE)
public volatile Object error;
- /** EvalError object */
+ /**
+ * Getter for the EvalError property
+ * @param self self reference
+ * @return the value of EvalError property
+ */
@Getter(name = "EvalError", attributes = Attribute.NOT_ENUMERABLE)
public static Object getEvalError(final Object self) {
final Global global = Global.instanceFrom(self);
@@ -310,6 +354,11 @@
return global.evalError;
}
+ /**
+ * Setter for the EvalError property
+ * @param self self reference
+ * @param value value of the EvalError property
+ */
@Setter(name = "EvalError", attributes = Attribute.NOT_ENUMERABLE)
public static void setEvalError(final Object self, final Object value) {
final Global global = Global.instanceFrom(self);
@@ -318,7 +367,11 @@
private volatile Object evalError = LAZY_SENTINEL;
- /** RangeError object */
+ /**
+ * Getter for the RangeError property.
+ * @param self self reference
+ * @return the value of RangeError property
+ */
@Getter(name = "RangeError", attributes = Attribute.NOT_ENUMERABLE)
public static Object getRangeError(final Object self) {
final Global global = Global.instanceFrom(self);
@@ -328,6 +381,12 @@
return global.rangeError;
}
+
+ /**
+ * Setter for the RangeError property.
+ * @param self self reference
+ * @param value value for the RangeError property
+ */
@Setter(name = "RangeError", attributes = Attribute.NOT_ENUMERABLE)
public static void setRangeError(final Object self, final Object value) {
final Global global = Global.instanceFrom(self);
@@ -348,7 +407,11 @@
@Property(name = "TypeError", attributes = Attribute.NOT_ENUMERABLE)
public volatile Object typeError;
- /** URIError object */
+ /**
+ * Getter for the URIError property.
+ * @param self self reference
+ * @return the value of URIError property
+ */
@Getter(name = "URIError", attributes = Attribute.NOT_ENUMERABLE)
public static Object getURIError(final Object self) {
final Global global = Global.instanceFrom(self);
@@ -358,6 +421,11 @@
return global.uriError;
}
+ /**
+ * Setter for the URIError property.
+ * @param self self reference
+ * @param value value for the URIError property
+ */
@Setter(name = "URIError", attributes = Attribute.NOT_ENUMERABLE)
public static void setURIError(final Object self, final Object value) {
final Global global = Global.instanceFrom(self);
@@ -366,7 +434,11 @@
private volatile Object uriError = LAZY_SENTINEL;
- /** ArrayBuffer object */
+ /**
+ * Getter for the ArrayBuffer property.
+ * @param self self reference
+ * @return the value of the ArrayBuffer property
+ */
@Getter(name = "ArrayBuffer", attributes = Attribute.NOT_ENUMERABLE)
public static Object getArrayBuffer(final Object self) {
final Global global = Global.instanceFrom(self);
@@ -376,6 +448,11 @@
return global.arrayBuffer;
}
+ /**
+ * Setter for the ArrayBuffer property.
+ * @param self self reference
+ * @param value value of the ArrayBuffer property
+ */
@Setter(name = "ArrayBuffer", attributes = Attribute.NOT_ENUMERABLE)
public static void setArrayBuffer(final Object self, final Object value) {
final Global global = Global.instanceFrom(self);
@@ -384,7 +461,11 @@
private volatile Object arrayBuffer;
- /** DataView object */
+ /**
+ * Getter for the DataView property.
+ * @param self self reference
+ * @return the value of the DataView property
+ */
@Getter(name = "DataView", attributes = Attribute.NOT_ENUMERABLE)
public static Object getDataView(final Object self) {
final Global global = Global.instanceFrom(self);
@@ -394,6 +475,12 @@
return global.dataView;
}
+
+ /**
+ * Setter for the DataView property.
+ * @param self self reference
+ * @param value value of the DataView property
+ */
@Setter(name = "DataView", attributes = Attribute.NOT_ENUMERABLE)
public static void setDataView(final Object self, final Object value) {
final Global global = Global.instanceFrom(self);
@@ -402,7 +489,11 @@
private volatile Object dataView;
- /** TypedArray (int8) */
+ /**
+ * Getter for the Int8Array property.
+ * @param self self reference
+ * @return the value of the Int8Array property.
+ */
@Getter(name = "Int8Array", attributes = Attribute.NOT_ENUMERABLE)
public static Object getInt8Array(final Object self) {
final Global global = Global.instanceFrom(self);
@@ -412,6 +503,11 @@
return global.int8Array;
}
+ /**
+ * Setter for the Int8Array property.
+ * @param self self reference
+ * @param value value of the Int8Array property
+ */
@Setter(name = "Int8Array", attributes = Attribute.NOT_ENUMERABLE)
public static void setInt8Array(final Object self, final Object value) {
final Global global = Global.instanceFrom(self);
@@ -420,7 +516,11 @@
private volatile Object int8Array;
- /** TypedArray (uint8) */
+ /**
+ * Getter for the Uin8Array property.
+ * @param self self reference
+ * @return the value of the Uint8Array property
+ */
@Getter(name = "Uint8Array", attributes = Attribute.NOT_ENUMERABLE)
public static Object getUint8Array(final Object self) {
final Global global = Global.instanceFrom(self);
@@ -430,6 +530,11 @@
return global.uint8Array;
}
+ /**
+ * Setter for the Uin8Array property.
+ * @param self self reference
+ * @param value value of the Uin8Array property
+ */
@Setter(name = "Uint8Array", attributes = Attribute.NOT_ENUMERABLE)
public static void setUint8Array(final Object self, final Object value) {
final Global global = Global.instanceFrom(self);
@@ -438,7 +543,11 @@
private volatile Object uint8Array;
- /** TypedArray (uint8) - Clamped */
+ /**
+ * Getter for the Uint8ClampedArray property.
+ * @param self self reference
+ * @return the value of the Uint8ClampedArray property
+ */
@Getter(name = "Uint8ClampedArray", attributes = Attribute.NOT_ENUMERABLE)
public static Object getUint8ClampedArray(final Object self) {
final Global global = Global.instanceFrom(self);
@@ -448,6 +557,11 @@
return global.uint8ClampedArray;
}
+ /**
+ * Setter for the Uint8ClampedArray property.
+ * @param self self reference
+ * @param value value of the Uint8ClampedArray property
+ */
@Setter(name = "Uint8ClampedArray", attributes = Attribute.NOT_ENUMERABLE)
public static void setUint8ClampedArray(final Object self, final Object value) {
final Global global = Global.instanceFrom(self);
@@ -456,7 +570,11 @@
private volatile Object uint8ClampedArray;
- /** TypedArray (int16) */
+ /**
+ * Getter for the Int16Array property.
+ * @param self self reference
+ * @return the value of the Int16Array property
+ */
@Getter(name = "Int16Array", attributes = Attribute.NOT_ENUMERABLE)
public static Object getInt16Array(final Object self) {
final Global global = Global.instanceFrom(self);
@@ -466,6 +584,11 @@
return global.int16Array;
}
+ /**
+ * Setter for the Int16Array property.
+ * @param self self reference
+ * @param value value of the Int16Array property
+ */
@Setter(name = "Int16Array", attributes = Attribute.NOT_ENUMERABLE)
public static void setInt16Array(final Object self, final Object value) {
final Global global = Global.instanceFrom(self);
@@ -474,7 +597,11 @@
private volatile Object int16Array;
- /** TypedArray (uint16) */
+ /**
+ * Getter for the Uint16Array property.
+ * @param self self reference
+ * @return the value of the Uint16Array property
+ */
@Getter(name = "Uint16Array", attributes = Attribute.NOT_ENUMERABLE)
public static Object getUint16Array(final Object self) {
final Global global = Global.instanceFrom(self);
@@ -484,6 +611,11 @@
return global.uint16Array;
}
+ /**
+ * Setter for the Uint16Array property.
+ * @param self self reference
+ * @param value value of the Uint16Array property
+ */
@Setter(name = "Uint16Array", attributes = Attribute.NOT_ENUMERABLE)
public static void setUint16Array(final Object self, final Object value) {
final Global global = Global.instanceFrom(self);
@@ -492,7 +624,12 @@
private volatile Object uint16Array;
- /** TypedArray (int32) */
+ /**
+ * Getter for the Int32Array property.
+ *
+ * @param self self reference
+ * @return the value of the Int32Array property
+ */
@Getter(name = "Int32Array", attributes = Attribute.NOT_ENUMERABLE)
public static Object getInt32Array(final Object self) {
final Global global = Global.instanceFrom(self);
@@ -502,6 +639,13 @@
return global.int32Array;
}
+
+ /**
+ * Setter for the Int32Array property.
+ *
+ * @param self self reference
+ * @param value value of the Int32Array property
+ */
@Setter(name = "Int32Array", attributes = Attribute.NOT_ENUMERABLE)
public static void setInt32Array(final Object self, final Object value) {
final Global global = Global.instanceFrom(self);
@@ -510,7 +654,12 @@
private volatile Object int32Array;
- /** TypedArray (uint32) */
+ /**
+ * Getter of the Uint32Array property.
+ *
+ * @param self self reference
+ * @return the value of the Uint32Array property
+ */
@Getter(name = "Uint32Array", attributes = Attribute.NOT_ENUMERABLE)
public static Object getUint32Array(final Object self) {
final Global global = Global.instanceFrom(self);
@@ -520,6 +669,13 @@
return global.uint32Array;
}
+
+ /**
+ * Setter of the Uint32Array property.
+ *
+ * @param self self reference
+ * @param value value of the Uint32Array property
+ */
@Setter(name = "Uint32Array", attributes = Attribute.NOT_ENUMERABLE)
public static void setUint32Array(final Object self, final Object value) {
final Global global = Global.instanceFrom(self);
@@ -528,7 +684,12 @@
private volatile Object uint32Array;
- /** TypedArray (float32) */
+ /**
+ * Getter for the Float32Array property.
+ *
+ * @param self self reference
+ * @return the value of the Float32Array property
+ */
@Getter(name = "Float32Array", attributes = Attribute.NOT_ENUMERABLE)
public static Object getFloat32Array(final Object self) {
final Global global = Global.instanceFrom(self);
@@ -538,6 +699,12 @@
return global.float32Array;
}
+ /**
+ * Setter for the Float32Array property.
+ *
+ * @param self self reference
+ * @param value value of the Float32Array property
+ */
@Setter(name = "Float32Array", attributes = Attribute.NOT_ENUMERABLE)
public static void setFloat32Array(final Object self, final Object value) {
final Global global = Global.instanceFrom(self);
@@ -546,7 +713,12 @@
private volatile Object float32Array;
- /** TypedArray (float64) */
+ /**
+ * Getter for the Float64Array property.
+ *
+ * @param self self reference
+ * @return the value of the Float64Array property
+ */
@Getter(name = "Float64Array", attributes = Attribute.NOT_ENUMERABLE)
public static Object getFloat64Array(final Object self) {
final Global global = Global.instanceFrom(self);
@@ -556,6 +728,12 @@
return global.float64Array;
}
+ /**
+ * Setter for the Float64Array property.
+ *
+ * @param self self reference
+ * @param value value of the Float64Array property
+ */
@Setter(name = "Float64Array", attributes = Attribute.NOT_ENUMERABLE)
public static void setFloat64Array(final Object self, final Object value) {
final Global global = Global.instanceFrom(self);
@@ -592,7 +770,12 @@
@Property(attributes = Attribute.NOT_ENUMERABLE)
public volatile Object org;
- /** Nashorn extension: Java access - global.javaImporter */
+ /**
+ * Getter for the Nashorn extension: Java access - global.javaImporter.
+ *
+ * @param self self reference
+ * @return the value of the JavaImporter property
+ */
@Getter(name = "JavaImporter", attributes = Attribute.NOT_ENUMERABLE)
public static Object getJavaImporter(final Object self) {
final Global global = Global.instanceFrom(self);
@@ -602,6 +785,12 @@
return global.javaImporter;
}
+ /**
+ * Setter for the Nashorn extension: Java access - global.javaImporter.
+ *
+ * @param self self reference
+ * @param value value of the JavaImporter property
+ */
@Setter(name = "JavaImporter", attributes = Attribute.NOT_ENUMERABLE)
public static void setJavaImporter(final Object self, final Object value) {
final Global global = Global.instanceFrom(self);
@@ -610,7 +799,12 @@
private volatile Object javaImporter;
- /** Nashorn extension: global.Java Object constructor. */
+ /**
+ * Getter for the Nashorn extension: global.Java property.
+ *
+ * @param self self reference
+ * @return the value of the Java property
+ */
@Getter(name = "Java", attributes = Attribute.NOT_ENUMERABLE)
public static Object getJavaApi(final Object self) {
final Global global = Global.instanceFrom(self);
@@ -620,6 +814,12 @@
return global.javaApi;
}
+ /**
+ * Setter for the Nashorn extension: global.Java property.
+ *
+ * @param self self reference
+ * @param value value of the Java property
+ */
@Setter(name = "Java", attributes = Attribute.NOT_ENUMERABLE)
public static void setJavaApi(final Object self, final Object value) {
final Global global = Global.instanceFrom(self);
@@ -2140,13 +2340,13 @@
@Override
public void addBoundProperties(final ScriptObject source, final jdk.nashorn.internal.runtime.Property[] properties) {
PropertyMap ownMap = getMap();
- LexicalScope lexicalScope = null;
+ LexicalScope lexScope = null;
PropertyMap lexicalMap = null;
boolean hasLexicalDefinitions = false;
if (context.getEnv()._es6) {
- lexicalScope = (LexicalScope) getLexicalScope();
- lexicalMap = lexicalScope.getMap();
+ lexScope = (LexicalScope) getLexicalScope();
+ lexicalMap = lexScope.getMap();
for (final jdk.nashorn.internal.runtime.Property property : properties) {
if (property.isLexicalBinding()) {
@@ -2166,8 +2366,8 @@
for (final jdk.nashorn.internal.runtime.Property property : properties) {
if (property.isLexicalBinding()) {
- assert lexicalScope != null;
- lexicalMap = lexicalScope.addBoundProperty(lexicalMap, source, property);
+ assert lexScope != null;
+ lexicalMap = lexScope.addBoundProperty(lexicalMap, source, property);
if (ownMap.findProperty(property.getKey()) != null) {
// If property exists in the global object invalidate any global constant call sites.
@@ -2181,7 +2381,8 @@
setMap(ownMap);
if (hasLexicalDefinitions) {
- lexicalScope.setMap(lexicalMap);
+ assert lexScope != null;
+ lexScope.setMap(lexicalMap);
invalidateLexicalSwitchPoint();
}
}
diff -r dc07d2b95013 -r 676ce2f6b277 src/jdk/nashorn/internal/objects/NativeJava.java
--- a/src/jdk/nashorn/internal/objects/NativeJava.java Thu May 28 20:55:21 2015 -0700
+++ b/src/jdk/nashorn/internal/objects/NativeJava.java Wed Jun 03 20:30:20 2015 -0700
@@ -33,10 +33,10 @@
import java.util.Collection;
import java.util.Deque;
import java.util.List;
+import java.util.Queue;
import jdk.internal.dynalink.beans.StaticClass;
import jdk.internal.dynalink.support.TypeUtilities;
import jdk.nashorn.api.scripting.JSObject;
-import jdk.nashorn.api.scripting.ScriptUtils;
import jdk.nashorn.internal.objects.annotations.Attribute;
import jdk.nashorn.internal.objects.annotations.Function;
import jdk.nashorn.internal.objects.annotations.ScriptClass;
@@ -339,7 +339,8 @@
/**
* Given a script object and a Java type, converts the script object into the desired Java type. Currently it
- * performs shallow creation of Java arrays, as well as wrapping of objects in Lists and Dequeues. Example:
+ * performs shallow creation of Java arrays, as well as wrapping of objects in Lists, Dequeues, Queues,
+ * and Collections. Example:
*
* var anArray = [1, "13", false]
* var javaIntArray = Java.to(anArray, "int[]")
@@ -353,9 +354,10 @@
* object to create. Can not be null. If undefined, a "default" conversion is presumed (allowing the argument to be
* omitted).
* @return a Java object whose value corresponds to the original script object's value. Specifically, for array
- * target types, returns a Java array of the same type with contents converted to the array's component type. Does
- * not recursively convert for multidimensional arrays. For {@link List} or {@link Deque}, returns a live wrapper
- * around the object, see {@link ListAdapter} for details. Returns null if obj is null.
+ * target types, returns a Java array of the same type with contents converted to the array's component type.
+ * Converts recursively when the target type is multidimensional array. For {@link List}, {@link Deque},
+ * {@link Queue}, or {@link Collection}, returns a live wrapper around the object, see {@link ListAdapter} for
+ * details. Returns null if obj is null.
* @throws ClassNotFoundException if the class described by objType is not found
*/
@Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
@@ -385,7 +387,7 @@
return JSType.toJavaArray(obj, targetClass.getComponentType());
}
- if(targetClass == List.class || targetClass == Deque.class) {
+ if (targetClass == List.class || targetClass == Deque.class || targetClass == Queue.class || targetClass == Collection.class) {
return ListAdapter.create(obj);
}
diff -r dc07d2b95013 -r 676ce2f6b277 src/jdk/nashorn/internal/objects/NativeObject.java
--- a/src/jdk/nashorn/internal/objects/NativeObject.java Thu May 28 20:55:21 2015 -0700
+++ b/src/jdk/nashorn/internal/objects/NativeObject.java Wed Jun 03 20:30:20 2015 -0700
@@ -765,7 +765,7 @@
continue;
}
properties.add(AccessorProperty.create(methodName, Property.NOT_WRITABLE, getBoundBeanMethodGetter(source,
- method), null));
+ method), Lookup.EMPTY_SETTER));
}
for(final String propertyName: propertyNames) {
MethodHandle getter;
diff -r dc07d2b95013 -r 676ce2f6b277 src/jdk/nashorn/internal/parser/Parser.java
--- a/src/jdk/nashorn/internal/parser/Parser.java Thu May 28 20:55:21 2015 -0700
+++ b/src/jdk/nashorn/internal/parser/Parser.java Wed Jun 03 20:30:20 2015 -0700
@@ -607,7 +607,7 @@
* @return whether the ident can be used as L-value
*/
private static boolean checkIdentLValue(final IdentNode ident) {
- return Token.descType(ident.getToken()).getKind() != TokenKind.KEYWORD;
+ return ident.tokenType().getKind() != TokenKind.KEYWORD;
}
/**
diff -r dc07d2b95013 -r 676ce2f6b277 src/jdk/nashorn/internal/runtime/CodeInstaller.java
--- a/src/jdk/nashorn/internal/runtime/CodeInstaller.java Thu May 28 20:55:21 2015 -0700
+++ b/src/jdk/nashorn/internal/runtime/CodeInstaller.java Wed Jun 03 20:30:20 2015 -0700
@@ -86,7 +86,7 @@
* @param source the script source
* @param mainClassName the main class name
* @param classBytes map of class names to class bytes
- * @param initializers compilation id -> FunctionInitializer map
+ * @param initializers compilation id -> FunctionInitializer map
* @param constants constants array
* @param compilationId compilation id
*/
diff -r dc07d2b95013 -r 676ce2f6b277 src/jdk/nashorn/internal/runtime/JSObjectListAdapter.java
--- a/src/jdk/nashorn/internal/runtime/JSObjectListAdapter.java Thu May 28 20:55:21 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package jdk.nashorn.internal.runtime;
-
-import jdk.nashorn.api.scripting.JSObject;
-
-/**
- * A ListAdapter that can wraps a JSObject.
- */
-public final class JSObjectListAdapter extends ListAdapter {
- /**
- * Creates a new list wrapper for the specified JSObject.
- * @param obj JSOcript the object to wrap
- */
- public JSObjectListAdapter(final JSObject obj) {
- super(obj);
- }
-
- @Override
- public int size() {
- return JSType.toInt32(((JSObject)obj).getMember("length"));
- }
-
- @Override
- protected Object getAt(final int index) {
- return ((JSObject)obj).getSlot(index);
- }
-
- @Override
- protected void setAt(final int index, final Object element) {
- ((JSObject)obj).setSlot(index, element);
- }
-}
diff -r dc07d2b95013 -r 676ce2f6b277 src/jdk/nashorn/internal/runtime/JSType.java
--- a/src/jdk/nashorn/internal/runtime/JSType.java Thu May 28 20:55:21 2015 -0700
+++ b/src/jdk/nashorn/internal/runtime/JSType.java Wed Jun 03 20:30:20 2015 -0700
@@ -34,7 +34,6 @@
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Collections;
-import java.util.Deque;
import java.util.List;
import jdk.internal.dynalink.beans.StaticClass;
import jdk.nashorn.api.scripting.AbstractJSObject;
@@ -181,10 +180,10 @@
/** Div exact wrapper for potentially integer division that turns into float point */
public static final Call DIV_EXACT_LONG = staticCall(JSTYPE_LOOKUP, JSType.class, "divExact", long.class, long.class, long.class, int.class);
- /** Div zero wrapper for long division that handles (0/0) >>> 0 == 0 */
+ /** Div zero wrapper for long division that handles (0/0) >>> 0 == 0 */
public static final Call DIV_ZERO_LONG = staticCall(JSTYPE_LOOKUP, JSType.class, "divZero", long.class, long.class, long.class);
- /** Mod zero wrapper for long division that handles (0%0) >>> 0 == 0 */
+ /** Mod zero wrapper for long division that handles (0%0) >>> 0 == 0 */
public static final Call REM_ZERO_LONG = staticCall(JSTYPE_LOOKUP, JSType.class, "remZero", long.class, long.class, long.class);
/** Mod exact wrapper for potentially integer remainders that turns into float point */
@@ -202,12 +201,6 @@
/** Method handle to convert a JS Object to a Java array. */
public static final Call TO_JAVA_ARRAY = staticCall(JSTYPE_LOOKUP, JSType.class, "toJavaArray", Object.class, Object.class, Class.class);
- /** Method handle to convert a JS Object to a Java List. */
- public static final Call TO_JAVA_LIST = staticCall(JSTYPE_LOOKUP, JSType.class, "toJavaList", List.class, Object.class);
-
- /** Method handle to convert a JS Object to a Java deque. */
- public static final Call TO_JAVA_DEQUE = staticCall(JSTYPE_LOOKUP, JSType.class, "toJavaDeque", Deque.class, Object.class);
-
/** Method handle for void returns. */
public static final Call VOID_RETURN = staticCall(JSTYPE_LOOKUP, JSType.class, "voidReturn", void.class);
@@ -1352,24 +1345,6 @@
}
/**
- * Converts a JavaScript object to a Java List. See {@link ListAdapter} for details.
- * @param obj the object to convert. Can be any array-like object.
- * @return a List that is live-backed by the JavaScript object.
- */
- public static List> toJavaList(final Object obj) {
- return ListAdapter.create(obj);
- }
-
- /**
- * Converts a JavaScript object to a Java Deque. See {@link ListAdapter} for details.
- * @param obj the object to convert. Can be any array-like object.
- * @return a Deque that is live-backed by the JavaScript object.
- */
- public static Deque> toJavaDeque(final Object obj) {
- return ListAdapter.create(obj);
- }
-
- /**
* Check if an object is null or undefined
*
* @param obj object to check
diff -r dc07d2b95013 -r 676ce2f6b277 src/jdk/nashorn/internal/runtime/ListAdapter.java
--- a/src/jdk/nashorn/internal/runtime/ListAdapter.java Thu May 28 20:55:21 2015 -0700
+++ b/src/jdk/nashorn/internal/runtime/ListAdapter.java Wed Jun 03 20:30:20 2015 -0700
@@ -25,17 +25,18 @@
package jdk.nashorn.internal.runtime;
+import java.lang.invoke.MethodHandle;
import java.util.AbstractList;
import java.util.Deque;
import java.util.Iterator;
import java.util.ListIterator;
import java.util.NoSuchElementException;
+import java.util.Objects;
import java.util.RandomAccess;
import java.util.concurrent.Callable;
import jdk.nashorn.api.scripting.JSObject;
import jdk.nashorn.api.scripting.ScriptObjectMirror;
import jdk.nashorn.internal.runtime.linker.Bootstrap;
-import jdk.nashorn.internal.runtime.linker.InvokeByName;
/**
* An adapter that can wrap any ECMAScript Array-like object (that adheres to the array rules for the property
@@ -50,81 +51,56 @@
* operations respectively, while {@link #addLast(Object)} and {@link #removeLast()} will translate to {@code push} and
* {@code pop}.
*/
-public abstract class ListAdapter extends AbstractList