8142968: Module System implementation
Summary: Initial integration of JEP 200, JEP 260, JEP 261, and JEP 282
Reviewed-by: mhaupt, hannesw
Contributed-by: alan.bateman@oracle.com, alex.buckley@oracle.com, jonathan.gibbons@oracle.com, karen.kinnear@oracle.com, mandy.chung@oracle.com, mark.reinhold@oracle.com, sundararajan.athijegannathan@oracle.com, erik.joelsson@oracle.com
--- a/nashorn/buildtools/nasgen/build.xml Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/buildtools/nasgen/build.xml Thu Mar 17 19:04:35 2016 +0000
@@ -40,10 +40,9 @@
<target name="compile" depends="prepare" description="Compiles the nasgen sources">
<javac srcdir="${src.dir}"
destdir="${build.classes.dir}"
- classpath="${javac.classpath}"
debug="${javac.debug}"
includeantruntime="false" fork="true">
- <compilerarg value="-J-Xbootclasspath/p:${javac.classpath}"/>
+ <compilerarg value="-XaddExports:${nasgen.module.imports}"/>
<compilerarg value="-Xlint:unchecked"/>
<compilerarg value="-Xlint:deprecation"/>
<compilerarg value="-XDignore.symbol.file"/>
--- a/nashorn/buildtools/nasgen/project.properties Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/buildtools/nasgen/project.properties Thu Mar 17 19:04:35 2016 +0000
@@ -37,12 +37,11 @@
dist.jar=${dist.dir}/nasgen.jar
dist.javadoc.dir=${dist.dir}/javadoc
-nashorn.dir=../../
-
javac.debug=true
-javac.classpath=\
- ${nashorn.dir}/build/classes
+nasgen.module.imports=\
+ java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED,\
+ java.base/jdk.internal.org.objectweb.asm.util=ALL-UNNAMED
meta.inf.dir=${src.dir}/META-INF
run.classpath=\
--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ClassGenerator.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ClassGenerator.java Thu Mar 17 19:04:35 2016 +0000
@@ -143,6 +143,9 @@
try {
return super.getCommonSuperClass(type1, type2);
} catch (final RuntimeException | LinkageError e) {
+ if (MemberInfo.isScriptObject(type1) && MemberInfo.isScriptObject(type2)) {
+ return StringConstants.SCRIPTOBJECT_TYPE;
+ }
return StringConstants.OBJECT_TYPE;
}
}
--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MemberInfo.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MemberInfo.java Thu Mar 17 19:04:35 2016 +0000
@@ -26,14 +26,15 @@
import static jdk.nashorn.internal.tools.nasgen.StringConstants.OBJECT_ARRAY_DESC;
import static jdk.nashorn.internal.tools.nasgen.StringConstants.OBJECT_DESC;
+import static jdk.nashorn.internal.tools.nasgen.StringConstants.OBJ_PKG;
+import static jdk.nashorn.internal.tools.nasgen.StringConstants.RUNTIME_PKG;
+import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTS_PKG;
import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTOBJECT_DESC;
import static jdk.nashorn.internal.tools.nasgen.StringConstants.STRING_DESC;
import static jdk.nashorn.internal.tools.nasgen.StringConstants.TYPE_SYMBOL;
import jdk.internal.org.objectweb.asm.Opcodes;
import jdk.internal.org.objectweb.asm.Type;
-import jdk.nashorn.internal.objects.annotations.Where;
-import jdk.nashorn.internal.runtime.ScriptObject;
/**
* Details about a Java method or field annotated with any of the field/method
@@ -460,6 +461,40 @@
}
}
+ /**
+ * Returns if the given (internal) name of a class represents a ScriptObject subtype.
+ */
+ public static boolean isScriptObject(final String name) {
+ // very crude check for ScriptObject subtype!
+ if (name.startsWith(OBJ_PKG + "Native") ||
+ name.equals(OBJ_PKG + "Global") ||
+ name.equals(OBJ_PKG + "ArrayBufferView")) {
+ return true;
+ }
+
+ if (name.startsWith(RUNTIME_PKG)) {
+ final String simpleName = name.substring(name.lastIndexOf('/') + 1);
+ switch (simpleName) {
+ case "ScriptObject":
+ case "ScriptFunction":
+ case "NativeJavaPackage":
+ case "Scope":
+ return true;
+ }
+ }
+
+ if (name.startsWith(SCRIPTS_PKG)) {
+ final String simpleName = name.substring(name.lastIndexOf('/') + 1);
+ switch (simpleName) {
+ case "JD":
+ case "JO":
+ return true;
+ }
+ }
+
+ return false;
+ }
+
private static boolean isValidJSType(final Type type) {
return isJSPrimitiveType(type) || isJSObjectType(type);
}
@@ -488,20 +523,11 @@
}
private static boolean isScriptObject(final Type type) {
- if (type.getDescriptor().equals(SCRIPTOBJECT_DESC)) {
- return true;
+ if (type.getSort() != Type.OBJECT) {
+ return false;
}
- if (type.getSort() == Type.OBJECT) {
- try {
- final Class<?> clazz = Class.forName(type.getClassName(), false, MY_LOADER);
- return ScriptObject.class.isAssignableFrom(clazz);
- } catch (final ClassNotFoundException cnfe) {
- return false;
- }
- }
-
- return false;
+ return isScriptObject(type.getInternalName());
}
private void error(final String msg) {
--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MethodGenerator.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MethodGenerator.java Thu Mar 17 19:04:35 2016 +0000
@@ -77,6 +77,7 @@
import static jdk.internal.org.objectweb.asm.Opcodes.SIPUSH;
import static jdk.internal.org.objectweb.asm.Opcodes.SWAP;
import static jdk.nashorn.internal.tools.nasgen.StringConstants.INIT;
+import static jdk.nashorn.internal.tools.nasgen.StringConstants.OBJ_ANNO_PKG;
import static jdk.nashorn.internal.tools.nasgen.StringConstants.SPECIALIZATION_INIT2;
import static jdk.nashorn.internal.tools.nasgen.StringConstants.SPECIALIZATION_INIT3;
import static jdk.nashorn.internal.tools.nasgen.StringConstants.SPECIALIZATION_TYPE;
@@ -85,7 +86,6 @@
import jdk.internal.org.objectweb.asm.Handle;
import jdk.internal.org.objectweb.asm.MethodVisitor;
import jdk.internal.org.objectweb.asm.Type;
-import jdk.nashorn.internal.objects.annotations.SpecializedFunction.LinkLogic;
/**
* Base class for all method generating classes.
@@ -98,7 +98,7 @@
private final Type returnType;
private final Type[] argumentTypes;
- static final Type EMPTY_LINK_LOGIC_TYPE = Type.getType(LinkLogic.getEmptyLinkLogicClass());
+ static final Type EMPTY_LINK_LOGIC_TYPE = Type.getType("L" + OBJ_ANNO_PKG + "SpecializedFunction$LinkLogic$Empty;");
MethodGenerator(final MethodVisitor mv, final int access, final String name, final String descriptor) {
super(Main.ASM_VERSION, mv);
--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ScriptClassInfo.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ScriptClassInfo.java Thu Mar 17 19:04:35 2016 +0000
@@ -31,33 +31,31 @@
import java.util.List;
import java.util.Map;
import jdk.internal.org.objectweb.asm.Type;
-import jdk.nashorn.internal.objects.annotations.Constructor;
-import jdk.nashorn.internal.objects.annotations.Function;
-import jdk.nashorn.internal.objects.annotations.Getter;
-import jdk.nashorn.internal.objects.annotations.Property;
-import jdk.nashorn.internal.objects.annotations.ScriptClass;
-import jdk.nashorn.internal.objects.annotations.Setter;
-import jdk.nashorn.internal.objects.annotations.SpecializedFunction;
-import jdk.nashorn.internal.objects.annotations.SpecializedFunction.LinkLogic;
-import jdk.nashorn.internal.objects.annotations.Where;
import jdk.nashorn.internal.tools.nasgen.MemberInfo.Kind;
+import static jdk.nashorn.internal.tools.nasgen.StringConstants.OBJ_ANNO_PKG;
+import static jdk.nashorn.internal.tools.nasgen.StringConstants.RUNTIME_PKG;
+
/**
* All annotation information from a class that is annotated with
* the annotation com.sun.oracle.objects.annotations.ScriptClass.
*
*/
public final class ScriptClassInfo {
+ private static String getTypeDescriptor(String pkg, String name) {
+ return "L" + pkg + name + ";";
+ }
+
// descriptors for various annotations
- static final String SCRIPT_CLASS_ANNO_DESC = Type.getDescriptor(ScriptClass.class);
- static final String CONSTRUCTOR_ANNO_DESC = Type.getDescriptor(Constructor.class);
- static final String FUNCTION_ANNO_DESC = Type.getDescriptor(Function.class);
- static final String GETTER_ANNO_DESC = Type.getDescriptor(Getter.class);
- static final String SETTER_ANNO_DESC = Type.getDescriptor(Setter.class);
- static final String PROPERTY_ANNO_DESC = Type.getDescriptor(Property.class);
- static final String WHERE_ENUM_DESC = Type.getDescriptor(Where.class);
- static final String LINK_LOGIC_DESC = Type.getDescriptor(LinkLogic.class);
- static final String SPECIALIZED_FUNCTION = Type.getDescriptor(SpecializedFunction.class);
+ static final String SCRIPT_CLASS_ANNO_DESC = getTypeDescriptor(OBJ_ANNO_PKG, "ScriptClass");
+ static final String CONSTRUCTOR_ANNO_DESC = getTypeDescriptor(OBJ_ANNO_PKG, "Constructor");
+ static final String FUNCTION_ANNO_DESC = getTypeDescriptor(OBJ_ANNO_PKG, "Function");
+ static final String GETTER_ANNO_DESC = getTypeDescriptor(OBJ_ANNO_PKG, "Getter");
+ static final String SETTER_ANNO_DESC = getTypeDescriptor(OBJ_ANNO_PKG, "Setter");
+ static final String PROPERTY_ANNO_DESC = getTypeDescriptor(OBJ_ANNO_PKG, "Property");
+ static final String WHERE_ENUM_DESC = getTypeDescriptor(OBJ_ANNO_PKG, "Where");
+ static final String LINK_LOGIC_DESC = getTypeDescriptor(OBJ_ANNO_PKG, "SpecializedFunction$LinkLogic");
+ static final String SPECIALIZED_FUNCTION = getTypeDescriptor(OBJ_ANNO_PKG, "SpecializedFunction");
static final Map<String, Kind> annotations = new HashMap<>();
@@ -276,6 +274,7 @@
try {
memInfo.verify();
} catch (final Exception e) {
+ e.printStackTrace();
error(e.getMessage());
}
}
--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ScriptClassInfoCollector.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ScriptClassInfoCollector.java Thu Mar 17 19:04:35 2016 +0000
@@ -41,7 +41,6 @@
import jdk.internal.org.objectweb.asm.MethodVisitor;
import jdk.internal.org.objectweb.asm.Opcodes;
import jdk.internal.org.objectweb.asm.Type;
-import jdk.nashorn.internal.objects.annotations.Where;
import jdk.nashorn.internal.tools.nasgen.MemberInfo.Kind;
/**
--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ScriptClassInstrumentor.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ScriptClassInstrumentor.java Thu Mar 17 19:04:35 2016 +0000
@@ -50,7 +50,6 @@
import jdk.internal.org.objectweb.asm.FieldVisitor;
import jdk.internal.org.objectweb.asm.MethodVisitor;
import jdk.internal.org.objectweb.asm.util.CheckClassAdapter;
-import jdk.nashorn.internal.objects.annotations.Where;
import jdk.nashorn.internal.tools.nasgen.MemberInfo.Kind;
/**
--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/StringConstants.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/StringConstants.java Thu Mar 17 19:04:35 2016 +0000
@@ -31,25 +31,23 @@
import java.util.Collections;
import java.util.List;
import jdk.internal.org.objectweb.asm.Type;
-import jdk.nashorn.internal.objects.NativeSymbol;
-import jdk.nashorn.internal.runtime.AccessorProperty;
-import jdk.nashorn.internal.runtime.PropertyMap;
-import jdk.nashorn.internal.runtime.PrototypeObject;
-import jdk.nashorn.internal.runtime.ScriptFunction;
-import jdk.nashorn.internal.runtime.ScriptObject;
-import jdk.nashorn.internal.runtime.Specialization;
-import jdk.nashorn.internal.runtime.Symbol;
/**
* String constants used for code generation/instrumentation.
*/
@SuppressWarnings("javadoc")
public interface StringConstants {
+ static final String NASHORN_INTERNAL = "jdk/nashorn/internal/";
+ static final String OBJ_PKG = NASHORN_INTERNAL + "objects/";
+ static final String OBJ_ANNO_PKG = OBJ_PKG + "annotations/";
+ static final String RUNTIME_PKG = NASHORN_INTERNAL + "runtime/";
+ static final String SCRIPTS_PKG = NASHORN_INTERNAL + "scripts/";
+
// standard jdk types, methods
static final Type TYPE_METHODHANDLE = Type.getType(MethodHandle.class);
static final Type TYPE_METHODHANDLE_ARRAY = Type.getType(MethodHandle[].class);
- static final Type TYPE_SPECIALIZATION = Type.getType(Specialization.class);
- static final Type TYPE_SPECIALIZATION_ARRAY = Type.getType(Specialization[].class);
+ static final Type TYPE_SPECIALIZATION = Type.getType("L" + RUNTIME_PKG + "Specialization;");
+ static final Type TYPE_SPECIALIZATION_ARRAY = Type.getType("[L" + RUNTIME_PKG + "Specialization;");
static final Type TYPE_OBJECT = Type.getType(Object.class);
static final Type TYPE_STRING = Type.getType(String.class);
static final Type TYPE_CLASS = Type.getType(Class.class);
@@ -85,13 +83,13 @@
static final String LIST_DESC = TYPE_LIST.getDescriptor();
// Nashorn types, methods
- static final Type TYPE_ACCESSORPROPERTY = Type.getType(AccessorProperty.class);
- static final Type TYPE_PROPERTYMAP = Type.getType(PropertyMap.class);
- static final Type TYPE_PROTOTYPEOBJECT = Type.getType(PrototypeObject.class);
- static final Type TYPE_SCRIPTFUNCTION = Type.getType(ScriptFunction.class);
- static final Type TYPE_SCRIPTOBJECT = Type.getType(ScriptObject.class);
- static final Type TYPE_NATIVESYMBOL = Type.getType(NativeSymbol.class);
- static final Type TYPE_SYMBOL = Type.getType(Symbol.class);
+ static final Type TYPE_ACCESSORPROPERTY = Type.getType("L" + RUNTIME_PKG + "AccessorProperty;");
+ static final Type TYPE_PROPERTYMAP = Type.getType("L" + RUNTIME_PKG + "PropertyMap;");
+ static final Type TYPE_PROTOTYPEOBJECT = Type.getType("L" + RUNTIME_PKG + "PrototypeObject;");
+ static final Type TYPE_SCRIPTFUNCTION = Type.getType("L" + RUNTIME_PKG + "ScriptFunction;");
+ static final Type TYPE_SCRIPTOBJECT = Type.getType("L" + RUNTIME_PKG + "ScriptObject;");
+ static final Type TYPE_NATIVESYMBOL = Type.getType("L" + OBJ_PKG + "NativeSymbol;");
+ static final Type TYPE_SYMBOL = Type.getType("L" + RUNTIME_PKG + "Symbol;");
static final String PROTOTYPE_SUFFIX = "$Prototype";
static final String CONSTRUCTOR_SUFFIX = "$Constructor";
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/Where.java Thu Mar 17 19:04:35 2016 +0000
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2016, 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.tools.nasgen;
+
+/**
+ * Enum to tell where a Function or Property belongs.
+ * Note: keep this in sync. with jdk.nashorn.internal.objects.annotations.Where.
+ */
+public enum Where {
+ /** this means that the item belongs in the Constructor of an object */
+ CONSTRUCTOR,
+ /** this means that the item belongs in the Prototype of an object */
+ PROTOTYPE,
+ /** this means that the item belongs in the Instance of an object */
+ INSTANCE
+}
--- a/nashorn/make/BuildNashorn.gmk Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/make/BuildNashorn.gmk Thu Mar 17 19:04:35 2016 +0000
@@ -38,11 +38,14 @@
NASHORN_JAR := $(IMAGES_OUTPUTDIR)/nashorn.jar
+MODULESOURCEPATH := $(NASHORN_TOPDIR)/src/*/share/classes
+
# Need to use source and target 8 for nasgen to work.
$(eval $(call SetupJavaCompiler,GENERATE_NEWBYTECODE_DEBUG, \
JVM := $(JAVA), \
JAVAC := $(NEW_JAVAC), \
- FLAGS := -g -source 8 -target 8 -bootclasspath $(JDK_CLASSES), \
+ FLAGS := -g -source 9 -target 9 -upgrademodulepath "$(JDK_OUTPUTDIR)/modules/" \
+ -system none -modulesourcepath "$(MODULESOURCEPATH)", \
SERVER_DIR := $(SJAVAC_SERVER_DIR), \
SERVER_JVM := $(SJAVAC_SERVER_JAVA)))
@@ -52,10 +55,11 @@
# seamlessly.
$(eval $(call SetupJavaCompilation,jdk.scripting.nashorn, \
SETUP := GENERATE_NEWBYTECODE_DEBUG, \
+ MODULE := jdk.scripting.nashorn, \
SRC := $(NASHORN_TOPDIR)/src/jdk.scripting.nashorn/share/classes, \
EXCLUDE_FILES := META-INF/MANIFEST.MF, \
COPY := .properties .js, \
- BIN := $(SUPPORT_OUTPUTDIR)/special_classes/jdk.scripting.nashorn/classes))
+ BIN := $(SUPPORT_OUTPUTDIR)/special_classes))
NASGEN_SRC := $(NASHORN_TOPDIR)/buildtools/nasgen/src
ASM_SRC := $(JDK_TOPDIR)/src/java.base/share/classes/jdk/internal/org/objectweb/asm
@@ -64,24 +68,31 @@
$(eval $(call SetupJavaCompilation,BUILD_NASGEN, \
SETUP := GENERATE_OLDBYTECODE, \
SRC := $(NASGEN_SRC) $(ASM_SRC), \
- BIN := $(BUILDTOOLS_OUTPUTDIR)/nasgen_classes, \
- ADD_JAVAC_FLAGS := -Xbootclasspath/p:"$(SUPPORT_OUTPUTDIR)/special_classes/jdk.scripting.nashorn/classes"))
-
-# Nasgen needs nashorn classes
-$(BUILD_NASGEN): $(jdk.scripting.nashorn)
+ BIN := $(BUILDTOOLS_OUTPUTDIR)/nasgen_classes))
NASHORN_CLASSES_DIR := $(JDK_OUTPUTDIR)/modules/jdk.scripting.nashorn
NASGEN_RUN_FILE := $(NASHORN_CLASSES_DIR)/_the.nasgen.run
+ifeq ($(BOOT_JDK_MODULAR), true)
+ NASGEN_OPTIONS := \
+ -cp $(BUILDTOOLS_OUTPUTDIR)/nasgen_classes \
+ -Xpatch:$(BUILDTOOLS_OUTPUTDIR)/nasgen_classes \
+ -XaddExports:$(subst $(SPACE),$(COMMA),$(strip \
+ java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED \
+ java.base/jdk.internal.org.objectweb.asm.util=ALL-UNNAMED \
+ ))
+else
+ NASGEN_OPTIONS := \
+ -Xbootclasspath/p:$(BUILDTOOLS_OUTPUTDIR)/nasgen_classes
+endif
+
# Copy classes to final classes dir and run nasgen to modify classes in jdk.nashorn.internal.objects package
-$(NASGEN_RUN_FILE): $(BUILD_NASGEN)
+$(NASGEN_RUN_FILE): $(BUILD_NASGEN) $(jdk.scripting.nashorn)
$(ECHO) Running nasgen
$(MKDIR) -p $(@D)
$(RM) -rf $(@D)/jdk $(@D)/netscape
- $(CP) -R -p $(SUPPORT_OUTPUTDIR)/special_classes/jdk.scripting.nashorn/classes/* $(@D)/
- $(FIXPATH) $(JAVA) \
- -Xbootclasspath/p:$(call PathList, $(BUILDTOOLS_OUTPUTDIR)/nasgen_classes \
- $(SUPPORT_OUTPUTDIR)/special_classes/jdk.scripting.nashorn/classes) \
+ $(CP) -R -p $(SUPPORT_OUTPUTDIR)/special_classes/jdk.scripting.nashorn/* $(@D)/
+ $(JAVA) $(NASGEN_OPTIONS) \
jdk.nashorn.internal.tools.nasgen.Main $(@D) jdk.nashorn.internal.objects $(@D)
$(TOUCH) $@
--- a/nashorn/make/build-nasgen.xml Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/make/build-nasgen.xml Thu Mar 17 19:04:35 2016 +0000
@@ -35,13 +35,11 @@
<classpath>
<pathelement location="${basedir}/jcov2/lib/jcov_j2se_rt.jar"/>
<pathelement location="${basedir}/buildtools/nasgen/dist/nasgen.jar"/>
- <pathelement location="${dist.dir}/nasgen.jar"/>
- <pathelement path="${build.dir}/classes"/>
</classpath>
- <jvmarg value="-Xbootclasspath/p:${basedir}/build/classes"/>
- <arg value="${build.dir}/classes"/>
+ <jvmarg value="-XaddExports:${nasgen.module.imports}"/>
+ <arg value="${nashorn.module.classes.dir}"/>
<arg value="jdk.nashorn.internal.objects"/>
- <arg value="${build.dir}/classes"/>
+ <arg value="${nashorn.module.classes.dir}"/>
</java>
</target>
--- a/nashorn/make/build.xml Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/make/build.xml Thu Mar 17 19:04:35 2016 +0000
@@ -32,13 +32,10 @@
<property file="${user.home}/.nashorn.project.local.properties"/>
<loadproperties srcFile="make/project.properties"/>
- <path id="dist.path">
- <pathelement location="${dist.dir}"/>
+ <path id="nashorn.jar.path">
+ <pathelement location="${nashorn.jar}"/>
</path>
- <path id="nashorn.boot.prefix.path">
- <pathelement location="${dist.jar}"/>
- </path>
- <property name="boot.class.path" value="-Xbootclasspath/p:${toString:nashorn.boot.prefix.path}"/>
+ <property name="nashorn.override.option" value="-Xpatch:${build.classes.dir}"/>
<condition property="svn.executable" value="/usr/local/bin/svn" else="svn">
<available file="/usr/local/bin/svn"/>
</condition>
@@ -136,7 +133,10 @@
<target name="prepare" depends="init">
<mkdir dir="${build.dir}"/>
<mkdir dir="${build.classes.dir}"/>
- <mkdir dir="${build.classes.dir}/META-INF/services"/>
+ <mkdir dir="${nashorn.module.classes.dir}"/>
+ <mkdir dir="${dynalink.module.classes.dir}"/>
+ <mkdir dir="${nashorn.shell.module.classes.dir}"/>
+ <mkdir dir="${nashorn.module.classes.dir}/META-INF/services"/>
<mkdir dir="${build.test.classes.dir}"/>
<mkdir dir="${dist.dir}"/>
<mkdir dir="${dist.javadoc.dir}"/>
@@ -150,9 +150,8 @@
</target>
<target name="compile" depends="prepare" description="Compiles nashorn">
- <javac srcdir="${src.dir}"
- destdir="${build.classes.dir}"
- classpath="${javac.classpath}"
+ <javac srcdir="${dynalink.module.src.dir}"
+ destdir="${dynalink.module.classes.dir}"
source="${javac.source}"
target="${javac.target}"
debug="${javac.debug}"
@@ -163,36 +162,59 @@
<compilerarg value="-Xdiags:verbose"/>
<compilerarg value="-parameters"/>
</javac>
- <copy todir="${build.classes.dir}/META-INF/services">
- <fileset dir="${meta.inf.dir}/services/"/>
- </copy>
- <copy todir="${build.classes.dir}/jdk/nashorn/api/scripting/resources">
+ <javac srcdir="${nashorn.module.src.dir}"
+ destdir="${nashorn.module.classes.dir}"
+ source="${javac.source}"
+ target="${javac.target}"
+ debug="${javac.debug}"
+ encoding="${javac.encoding}"
+ includeantruntime="false" fork="true">
+ <compilerarg value="-Xlint:all"/>
+ <compilerarg value="-XDignore.symbol.file"/>
+ <compilerarg value="-Xdiags:verbose"/>
+ <compilerarg value="-parameters"/>
+ <compilerarg value="${nashorn.override.option}"/>
+ </javac>
+ <javac srcdir="${nashorn.shell.module.src.dir}"
+ destdir="${nashorn.shell.module.classes.dir}"
+ source="${javac.source}"
+ target="${javac.target}"
+ debug="${javac.debug}"
+ encoding="${javac.encoding}"
+ includeantruntime="false" fork="true">
+ <compilerarg value="-Xlint:all"/>
+ <compilerarg value="-XDignore.symbol.file"/>
+ <compilerarg value="-Xdiags:verbose"/>
+ <compilerarg value="-parameters"/>
+ <compilerarg value="${nashorn.override.option}"/>
+ </javac>
+ <!-- -Xpatch does not like module-info.class files! -->
+ <delete>
+ <fileset dir="${build.classes.dir}" includes="**/module-info.class"/>
+ </delete>
+ <copy todir="${nashorn.module.classes.dir}/jdk/nashorn/api/scripting/resources">
<fileset dir="${nashorn.module.src.dir}/jdk/nashorn/api/scripting/resources/"/>
</copy>
- <copy todir="${build.classes.dir}/jdk/nashorn/internal/runtime/resources">
+ <copy todir="${nashorn.module.classes.dir}/jdk/nashorn/internal/runtime/resources">
<fileset dir="${nashorn.module.src.dir}/jdk/nashorn/internal/runtime/resources/"/>
</copy>
- <copy todir="${build.classes.dir}/jdk/nashorn/tools/resources">
+ <copy todir="${nashorn.module.classes.dir}/jdk/nashorn/tools/resources">
<fileset dir="${nashorn.module.src.dir}/jdk/nashorn/tools/resources/"/>
</copy>
- <copy file="${dynalink.module.src.dir}/jdk/dynalink/support/messages.properties" todir="${build.classes.dir}/jdk/dynalink/support"/>
- <copy file="${nashorn.module.src.dir}/jdk/nashorn/internal/codegen/anchor.properties" todir="${build.classes.dir}/jdk/nashorn/internal/codegen"/>
+ <copy file="${dynalink.module.src.dir}/jdk/dynalink/support/messages.properties" todir="${dynalink.module.classes.dir}/jdk/dynalink/support"/>
+ <copy file="${nashorn.module.src.dir}/jdk/nashorn/internal/codegen/anchor.properties" todir="${nashorn.module.classes.dir}/jdk/nashorn/internal/codegen"/>
- <echo message="version_string=${nashorn.fullversion}" file="${build.classes.dir}/jdk/nashorn/internal/runtime/resources/version.properties"/>
- <echo file="${build.classes.dir}/jdk/nashorn/internal/runtime/resources/version.properties" append="true">${line.separator}</echo>
- <echo message="version_short=${nashorn.version}" file="${build.classes.dir}/jdk/nashorn/internal/runtime/resources/version.properties" append="true"/>
+ <echo message="version_string=${nashorn.fullversion}" file="${nashorn.module.classes.dir}/jdk/nashorn/internal/runtime/resources/version.properties"/>
+ <echo file="${nashorn.module.classes.dir}/jdk/nashorn/internal/runtime/resources/version.properties" append="true">${line.separator}</echo>
+ <echo message="version_short=${nashorn.version}" file="${nashorn.module.classes.dir}/jdk/nashorn/internal/runtime/resources/version.properties" append="true"/>
</target>
<target name="jar" depends="compile, run-nasgen, generate-cc-template" description="Creates nashorn.jar" unless="compile.suppress.jar">
- <jar jarfile="${dist.jar}" manifest="${meta.inf.dir}/MANIFEST.MF" index="true" filesetmanifest="merge">
- <!--
- Exclude jjs classes from nashorn.jar to avoid desktop dependency.
- We have a test to make sure basic nashorn code has only "compact1"
- dependency - except for jjs shell code which has desktop dependency.
- -->
- <fileset dir="${build.classes.dir}">
- <exclude name="**/jdk/nashorn/tools/jjs/*"/>
- </fileset>
+ <jar jarfile="${dynalink.jar}">
+ <fileset dir="${dynalink.module.classes.dir}"/>
+ </jar>
+ <jar jarfile="${nashorn.jar}" index="true" filesetmanifest="merge">
+ <fileset dir="${nashorn.module.classes.dir}"/>
<manifest>
<attribute name="Archiver-Version" value="n/a"/>
<attribute name="Build-Jdk" value="${java.runtime.version}"/>
@@ -204,6 +226,9 @@
</section>
</manifest>
</jar>
+ <jar jarfile="${jjs.jar}">
+ <fileset dir="${nashorn.shell.module.classes.dir}"/>
+ </jar>
</target>
<target name="use-promoted-nashorn" depends="init">
@@ -212,35 +237,10 @@
<property name="compile.suppress.jar" value="defined"/>
</target>
- <target name="build-fxshell" depends="jar">
- <description>Builds the javafx shell.</description>
- <mkdir dir="${fxshell.classes.dir}"/>
- <javac srcdir="${fxshell.dir}"
- destdir="${fxshell.classes.dir}"
- classpath="${dist.jar}${path.separator}${javac.classpath}"
- debug="${javac.debug}"
- encoding="${javac.encoding}"
- includeantruntime="false">
- </javac>
- <jar jarfile="${fxshell.jar}" manifest="${meta.inf.dir}/MANIFEST.MF" index="true" filesetmanifest="merge">
- <fileset dir="${fxshell.classes.dir}"/>
- <manifest>
- <attribute name="Archiver-Version" value="n/a"/>
- <attribute name="Build-Jdk" value="${java.runtime.version}"/>
- <attribute name="Built-By" value="n/a"/>
- <attribute name="Created-By" value="Ant jar task"/>
- <section name="jdk/nashorn/">
- <attribute name="Implementation-Title" value="Oracle Nashorn FXShell"/>
- <attribute name="Implementation-Version" value="${nashorn.version}"/>
- </section>
- </manifest>
- </jar>
- </target>
-
<!-- generate javadoc for all Nashorn and ASM classes -->
<target name="javadoc" depends="jar">
<javadoc destdir="${dist.javadoc.dir}" use="yes" overview="${nashorn.module.src.dir}/overview.html"
- extdirs="${nashorn.ext.path}" windowtitle="${nashorn.product.name} ${nashorn.version}"
+ windowtitle="${nashorn.product.name} ${nashorn.version}"
additionalparam="-quiet" failonerror="true" useexternalfile="true">
<arg value="${javadoc.option}"/>
<classpath>
@@ -260,7 +260,7 @@
<!-- generate javadoc for Nashorn classes -->
<target name="javadocnh" depends="jar">
<javadoc destdir="${dist.javadoc.dir}" use="yes" overview="${nashorn.module.src.dir}/overview.html"
- extdirs="${nashorn.ext.path}" windowtitle="${nashorn.product.name} ${nashorn.version}"
+ windowtitle="${nashorn.product.name} ${nashorn.version}"
additionalparam="-quiet" failonerror="true" useexternalfile="true">
<arg value="${javadoc.option}"/>
<classpath>
@@ -304,7 +304,7 @@
<!-- generate shell.html for shell tool documentation -->
<target name="shelldoc" depends="jar">
<java classname="${nashorn.shell.tool}" dir="${basedir}" output="${dist.dir}/shell.html" failonerror="true" fork="true">
- <jvmarg line="${boot.class.path}"/>
+ <jvmarg line="${nashorn.override.option}"/>
<arg value="-scripting"/>
<arg value="docs/genshelldoc.js"/>
</java>
@@ -334,10 +334,11 @@
debug="${javac.debug}"
encoding="${javac.encoding}"
includeantruntime="false" fork="true">
- <compilerarg value="${boot.class.path}"/>
+ <compilerarg value="${nashorn.override.option}"/>
<compilerarg value="-Xlint:unchecked"/>
<compilerarg value="-Xlint:deprecation"/>
<compilerarg value="-Xdiags:verbose"/>
+ <compilerarg value="-XaddExports:${test.module.imports}"/>
</javac>
<copy todir="${build.test.classes.dir}/META-INF/services">
@@ -379,7 +380,11 @@
<target name="generate-policy-file" depends="prepare">
<echo file="${build.dir}/nashorn.policy">
-grant codeBase "file:/${toString:dist.path}/nashorn.jar" {
+grant codeBase "file:/${basedir}/${dynalink.module.classes.dir}" {
+ permission java.security.AllPermission;
+};
+
+grant codeBase "file:/${basedir}/${nashorn.module.classes.dir}" {
permission java.security.AllPermission;
};
@@ -530,7 +535,6 @@
</fileset>
<testng outputdir="${build.nosecurity.test.results.dir}/${testResultsSubDir}" classfilesetref="test.nosecurity.classes"
verbose="${testng.verbose}" haltonfailure="true" useDefaultListeners="false" listeners="${testng.listeners}" workingDir="${basedir}">
- <jvmarg line="${boot.class.path}"/>
<jvmarg line="${run.test.jvmargs} -Xmx${run.test.xmx} -Dbuild.dir=${build.dir}"/>
<sysproperty key="nashorn.jar" value="${dist.dir}/nashorn.jar"/>
<propertyset>
@@ -553,7 +557,6 @@
<property name="debug.test.jvmargs" value=""/>
<testng outputdir="${build.test.results.dir}/${testResultsSubDir}" classfilesetref="test.classes"
verbose="${testng.verbose}" haltonfailure="true" useDefaultListeners="false" listeners="${testng.listeners}" workingDir="${basedir}">
- <jvmarg line="${boot.class.path}"/>
<jvmarg line="${run.test.jvmargs} -Xmx${run.test.xmx} ${run.test.jvmsecurityargs} -Dbuild.dir=${build.dir}"/>
<jvmarg line="${debug.test.jvmargs}"/>
<propertyset>
@@ -571,7 +574,7 @@
</testng>
</target>
- <target name="test" depends="prepare, javadocnh, test-pessimistic, test-optimistic"/>
+ <target name="test" depends="prepare, test-pessimistic, test-optimistic"/>
<target name="test-optimistic" depends="jar, -test-classes-all,-test-classes-single, check-testng, check-external-tests, compile-test, generate-policy-file" if="testng.available">
<echo message="Running test suite in OPTIMISTIC mode..."/>
@@ -616,7 +619,6 @@
<testng outputdir="${build.test.results.dir}" classfilesetref="test.classes"
verbose="${testng.verbose}" haltonfailure="true" useDefaultListeners="false" listeners="${testng.listeners}" workingDir="${basedir}">
- <jvmarg line="${boot.class.path}"/>
<jvmarg line="${run.test.jvmargs} -Xmx${run.test.xmx} -Dbuild.dir=${build.dir}"/>
<propertyset>
<propertyref prefix="testjfx-test-sys-prop."/>
@@ -636,7 +638,6 @@
<testng outputdir="${build.test.results.dir}" classfilesetref="test.classes"
verbose="${testng.verbose}" haltonfailure="true" useDefaultListeners="false" listeners="${testng.listeners}" workingDir="${basedir}">
- <jvmarg line="${boot.class.path}"/>
<jvmarg line="${run.test.jvmargs} -Xmx${run.test.xmx} ${run.test.jvmsecurityargs} -Dbuild.dir=${build.dir}"/>
<propertyset>
<propertyref prefix="testmarkdown-test-sys-prop."/>
@@ -655,7 +656,6 @@
<testng outputdir="${build.test.results.dir}" classfilesetref="test.classes"
verbose="${testng.verbose}" haltonfailure="true" useDefaultListeners="false" listeners="${testng.listeners}" workingDir="${basedir}">
- <jvmarg line="${boot.class.path}"/>
<jvmarg line="${run.test.jvmargs} -Xmx${run.test.xmx} ${run.test.jvmsecurityargs} -Dbuild.dir=${build.dir}"/>
<propertyset>
<propertyref prefix="nashorn."/>
@@ -675,7 +675,6 @@
<target name="test262-parallel" depends="jar, check-testng, check-external-tests, compile-test, generate-policy-file" if="testng.available">
<!-- use just build.test.classes.dir to avoid referring to TestNG -->
<java classname="${parallel.test.runner}" dir="${basedir}" fork="true" failonerror="true">
- <jvmarg line="${boot.class.path}"/>
<jvmarg line="${run.test.jvmargs} -Xmx${run.test.xmx} ${run.test.jvmsecurityargs} -Dbuild.dir=${build.dir}"/>
<!-- avoid too many typeinfo cache files. Each script is run only once anyway -->
<jvmarg line="-Dnashorn.typeInfo.disabled=true"/>
@@ -696,7 +695,6 @@
<java classname="${parallel.test.runner}" dir="${basedir}"
failonerror="true"
fork="true">
- <jvmarg line="${boot.class.path}"/>
<jvmarg line="${run.test.jvmargs} -Xmx${run.test.xmx} ${run.test.jvmsecurityargs}"/>
<classpath>
<pathelement path="${run.test.classpath}"/>
@@ -715,7 +713,6 @@
<target name="run" depends="jar"
description="Run the shell with a sample script">
<java classname="${nashorn.shell.tool}" fork="true" dir="samples">
- <jvmarg line="${boot.class.path}"/>
<jvmarg line="${run.test.jvmargs} -Xmx${run.test.xmx}"/>
<arg value="-dump-on-error"/>
<arg value="test.js"/>
@@ -725,7 +722,6 @@
<target name="debug" depends="jar"
description="Debug the shell with a sample script">
<java classname="${nashorn.shell.tool}" fork="true" dir="samples">
- <jvmarg line="${boot.class.path}"/>
<jvmarg line="${run.test.jvmargs} -Xmx${run.test.xmx}"/>
<arg value="--print-code"/>
<arg value="--verify-code"/>
--- a/nashorn/make/nbproject/ide-targets.xml Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/make/nbproject/ide-targets.xml Thu Mar 17 19:04:35 2016 +0000
@@ -32,7 +32,7 @@
</nbjpdastart>
<java classname="jdk.nashorn.tools.Shell" classpath="${run.test.classpath}" dir="samples" fork="true">
<jvmarg line="-Dnashorn.optimistic"/>
- <jvmarg line="${boot.class.path}"/>
+ <jvmarg line="${nashorn.override.path}"/>
<jvmarg line="${run.test.jvmargs}"/>
<jvmarg value="-Xdebug"/>
<jvmarg value="-Xrunjdwp:transport=dt_socket,address=${jpda.address}"/>
--- a/nashorn/make/project.properties Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/make/project.properties Thu Mar 17 19:04:35 2016 +0000
@@ -31,8 +31,8 @@
# source and target levels
build.compiler=modern
-javac.source=1.8
-javac.target=1.8
+javac.source=1.9
+javac.target=1.9
javadoc.option=-tag "implSpec:a:Implementation Requirements:"
@@ -53,6 +53,12 @@
# nasgen tool
nasgen.tool=jdk.nashorn.internal.tools.nasgen.Main
+nasgen.module.imports=\
+
+nasgen.module.imports=\
+ java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED,\
+ java.base/jdk.internal.org.objectweb.asm.util=ALL-UNNAMED
+
# parallel test runner tool
parallel.test.runner=jdk.nashorn.internal.test.framework.ParallelTestRunner
@@ -70,15 +76,11 @@
# This directory is removed when the project is cleaned:
dist.dir=dist
-dist.jar=${dist.dir}/nashorn.jar
+dynalink.jar=${dist.dir}/dynalink.jar
+nashorn.jar=${dist.dir}/nashorn.jar
+jjs.jar=${dist.dir}/jjs.jar
dist.javadoc.dir=${dist.dir}/javadoc
-# nashorn javafx shell
-fxshell.tool = jdk.nashorn.tools.FXShell
-fxshell.classes.dir = ${build.dir}/fxshell/classes
-fxshell.dir = tools/fxshell
-fxshell.jar = ${dist.dir}/nashornfx.jar
-
# configuration for java flight recorder
run.test.jvmargs.jfr=-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:FlightRecorderOptions=defaultrecording=true,disk=true,dumponexit=true,dumponexitpath=${build.dir},stackdepth=128
@@ -121,16 +123,28 @@
javac.debug=true
javac.encoding=ascii
-javac.classpath=\
- ${build.classes.dir}
javac.test.classpath=\
- ${build.classes.dir}${path.separator}\
${build.test.classes.dir}${path.separator}\
${file.reference.testng.jar}${path.separator}\
${file.reference.jcommander.jar}${path.separator}\
${file.reference.bsh.jar}${path.separator}\
${file.reference.snakeyaml.jar}
+test.module.imports=\
+ jdk.scripting.nashorn/jdk.nashorn.internal.ir=ALL-UNNAMED,\
+ jdk.scripting.nashorn/jdk.nashorn.internal.codegen=ALL-UNNAMED,\
+ jdk.scripting.nashorn/jdk.nashorn.internal.parser=ALL-UNNAMED,\
+ jdk.scripting.nashorn/jdk.nashorn.internal.objects=ALL-UNNAMED,\
+ jdk.scripting.nashorn/jdk.nashorn.internal.runtime=ALL-UNNAMED,\
+ jdk.scripting.nashorn/jdk.nashorn.internal.runtime.doubleconv=ALL-UNNAMED,\
+ jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker=ALL-UNNAMED,\
+ jdk.scripting.nashorn/jdk.nashorn.internal.runtime.events=ALL-UNNAMED,\
+ jdk.scripting.nashorn/jdk.nashorn.internal.runtime.options=ALL-UNNAMED,\
+ jdk.scripting.nashorn/jdk.nashorn.internal.runtime.regexp=ALL-UNNAMED,\
+ jdk.scripting.nashorn/jdk.nashorn.internal.runtime.regexp.joni=ALL-UNNAMED,\
+ jdk.scripting.nashorn/jdk.nashorn.tools=ALL-UNNAMED,\
+ java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED
+
meta.inf.dir=${nashorn.module.src.dir}/META-INF
run.classpath=\
@@ -298,8 +312,11 @@
${nashorn.api.tests.jar}
dynalink.module.src.dir=src/jdk.dynalink/share/classes
+dynalink.module.classes.dir=${build.classes.dir}/jdk.dynalink
nashorn.module.src.dir=src/jdk.scripting.nashorn/share/classes
+nashorn.module.classes.dir=${build.classes.dir}/jdk.scripting.nashorn
nashorn.shell.module.src.dir=src/jdk.scripting.nashorn.shell/share/classes
+nashorn.shell.module.classes.dir=${build.classes.dir}/jdk.scripting.nashorn.shell
src.dir=${dynalink.module.src.dir}${path.separator}\
${nashorn.module.src.dir}${path.separator}\
@@ -324,6 +341,8 @@
run.test.jvmargs.common=\
-server \
+ -XaddExports:${test.module.imports} \
+ -Xpatch:${build.classes.dir} \
-Dfile.encoding=UTF-8 \
-Duser.language=${run.test.user.language} \
-Duser.country=${run.test.user.country} \
--- a/nashorn/samples/test.js Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/samples/test.js Thu Mar 17 19:04:35 2016 +0000
@@ -30,3 +30,5 @@
*/
print("Hello World");
+var System = Java.type("java.lang.System");
+print(System.getProperty("jdk.launcher.patch.0"));
--- a/nashorn/src/jdk.dynalink/share/classes/jdk/dynalink/DynamicLinkerFactory.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/src/jdk.dynalink/share/classes/jdk/dynalink/DynamicLinkerFactory.java Thu Mar 17 19:04:35 2016 +0000
@@ -384,7 +384,6 @@
addClasses(knownLinkerClasses, fallbackLinkers);
final List<GuardingDynamicLinker> discovered = discoverAutoLoadLinkers();
-
// Now, concatenate ...
final List<GuardingDynamicLinker> linkers =
new ArrayList<>(prioritizedLinkers.size() + discovered.size()
--- a/nashorn/src/jdk.dynalink/share/classes/jdk/dynalink/beans/CallerSensitiveDynamicMethod.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/src/jdk.dynalink/share/classes/jdk/dynalink/beans/CallerSensitiveDynamicMethod.java Thu Mar 17 19:04:35 2016 +0000
@@ -158,13 +158,13 @@
GET_LOOKUP_CONTEXT);
if(target instanceof Method) {
- final MethodHandle mh = Lookup.unreflect(lookup, (Method)target);
+ final MethodHandle mh = Lookup.unreflectCallerSensitive(lookup, (Method)target);
if(Modifier.isStatic(((Member)target).getModifiers())) {
return StaticClassIntrospector.editStaticMethodHandle(mh);
}
return mh;
}
- return StaticClassIntrospector.editConstructorMethodHandle(Lookup.unreflectConstructor(lookup,
+ return StaticClassIntrospector.editConstructorMethodHandle(Lookup.unreflectConstructorCallerSensitive(lookup,
(Constructor<?>)target));
}
--- a/nashorn/src/jdk.dynalink/share/classes/jdk/dynalink/beans/CheckRestrictedPackage.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/src/jdk.dynalink/share/classes/jdk/dynalink/beans/CheckRestrictedPackage.java Thu Mar 17 19:04:35 2016 +0000
@@ -84,6 +84,7 @@
package jdk.dynalink.beans;
import java.lang.reflect.Modifier;
+import java.lang.reflect.Module;
import java.security.AccessControlContext;
import java.security.AccessController;
import java.security.PrivilegedAction;
@@ -106,23 +107,29 @@
// Non-public classes are always restricted
return true;
}
- final SecurityManager sm = System.getSecurityManager();
- if(sm == null) {
- // No further restrictions if we don't have a security manager
- return false;
- }
final String name = clazz.getName();
final int i = name.lastIndexOf('.');
if (i == -1) {
// Classes in default package are never restricted
return false;
}
+ final String pkgName = name.substring(0, i);
+ final Module module = clazz.getModule();
+ if (module != null && !module.isExported(pkgName)) {
+ return true;
+ }
+
+ final SecurityManager sm = System.getSecurityManager();
+ if(sm == null) {
+ // No further restrictions if we don't have a security manager
+ return false;
+ }
// Do a package access check from within an access control context with no permissions
try {
AccessController.doPrivileged(new PrivilegedAction<Void>() {
@Override
public Void run() {
- sm.checkPackageAccess(name.substring(0, i));
+ sm.checkPackageAccess(pkgName);
return null;
}
}, NO_PERMISSIONS_CONTEXT);
--- a/nashorn/src/jdk.dynalink/share/classes/jdk/dynalink/linker/support/Lookup.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/src/jdk.dynalink/share/classes/jdk/dynalink/linker/support/Lookup.java Thu Mar 17 19:04:35 2016 +0000
@@ -87,8 +87,11 @@
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.Constructor;
+import java.lang.reflect.Executable;
import java.lang.reflect.Field;
+import java.lang.reflect.Module;
import java.lang.reflect.Method;
+import jdk.internal.module.Modules;
/**
* A wrapper around {@link java.lang.invoke.MethodHandles.Lookup} that masks
@@ -127,6 +130,42 @@
return unreflect(lookup, m);
}
+ private static boolean addModuleRead(final MethodHandles.Lookup lookup, final Executable e) {
+ // may be module read missing from a script class!
+ final Class<?> declClass = e.getDeclaringClass();
+ final Module from = lookup.lookupClass().getModule();
+ final Module to = declClass.getModule();
+ if (from != null && to != null) {
+ Modules.addReads(from, to);
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Performs a {@link java.lang.invoke.MethodHandles.Lookup#unreflect(Method)}, of a caller sensitive method
+ * converting any encountered {@link IllegalAccessException} into an {@link IllegalAccessError}.
+ *
+ * @param lookup the lookup used to unreflect
+ * @param m the method to unreflect
+ * @return the unreflected method handle.
+ */
+ public static MethodHandle unreflectCallerSensitive(final MethodHandles.Lookup lookup, final Method m) {
+ try {
+ return unreflect(lookup, m);
+ } catch (final IllegalAccessError iae) {
+ if (addModuleRead(lookup, m)) {
+ try {
+ return unreflect(lookup, m);
+ } catch (final IllegalAccessError e2) {
+ // fall through and throw original error as cause
+ }
+ }
+ throw iae;
+ }
+ }
+
/**
* Performs a {@link java.lang.invoke.MethodHandles.Lookup#unreflect(Method)},
* converting any encountered {@link IllegalAccessException} into an
@@ -228,6 +267,29 @@
}
/**
+ * Performs a caller sensitive {@link java.lang.invoke.MethodHandles.Lookup#unreflectConstructor(Constructor)}, converting any
+ * encountered {@link IllegalAccessException} into an {@link IllegalAccessError}.
+ *
+ * @param lookup the lookup used to unreflect
+ * @param c the constructor to unreflect
+ * @return the unreflected constructor handle.
+ */
+ public static MethodHandle unreflectConstructorCallerSensitive(final MethodHandles.Lookup lookup, final Constructor<?> c) {
+ try {
+ return unreflectConstructor(lookup, c);
+ } catch (final IllegalAccessError iae) {
+ if (addModuleRead(lookup, c)) {
+ try {
+ return unreflectConstructor(lookup, c);
+ } catch (final IllegalAccessError e2) {
+ // fall through and throw original error as cause
+ }
+ }
+ throw iae;
+ }
+ }
+
+ /**
* Performs a {@link java.lang.invoke.MethodHandles.Lookup#unreflectConstructor(Constructor)},
* converting any encountered {@link IllegalAccessException} into an
* {@link IllegalAccessError}.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.dynalink/share/classes/module-info.java Thu Mar 17 19:04:35 2016 +0000
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2015, 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.
+ */
+
+module jdk.dynalink {
+ requires java.logging;
+
+ exports jdk.dynalink;
+ exports jdk.dynalink.beans;
+ exports jdk.dynalink.linker;
+ exports jdk.dynalink.linker.support;
+ exports jdk.dynalink.support;
+
+ uses jdk.dynalink.linker.GuardingDynamicLinkerExporter;
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn.shell/share/classes/module-info.java Thu Mar 17 19:04:35 2016 +0000
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2014, 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.
+ */
+
+module jdk.scripting.nashorn.shell {
+ requires java.desktop;
+ requires java.compiler;
+ requires jdk.scripting.nashorn;
+ requires jdk.internal.le;
+}
+
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/META-INF/MANIFEST.MF Tue Mar 15 13:48:31 2016 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-Manifest-Version: 1.0
-Main-Class: jdk.nashorn.tools.Shell
-
-Name: jdk/nashorn/
-Implementation-Vendor: Oracle Corporation
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/META-INF/services/javax.script.ScriptEngineFactory Tue Mar 15 13:48:31 2016 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +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.
-#
-jdk.nashorn.api.scripting.NashornScriptEngineFactory
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/OptimisticTypesPersistence.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/OptimisticTypesPersistence.java Thu Mar 17 19:04:35 2016 +0000
@@ -353,6 +353,8 @@
}
}
+ private static final String ANCHOR_PROPS = "anchor.properties";
+
/**
* In order to ensure that changes in Nashorn code don't cause corruption in the data, we'll create a
* per-code-version directory. Normally, this will create the SHA-1 digest of the nashorn.jar. In case the classpath
@@ -368,7 +370,7 @@
// getResource("OptimisticTypesPersistence.class") but behavior of getResource with regard to its willingness
// to hand out URLs to .class files is also unspecified. Therefore, the most robust way to obtain an URL to our
// package is to have a small non-class anchor file and start out from its URL.
- final URL url = OptimisticTypesPersistence.class.getResource("anchor.properties");
+ final URL url = OptimisticTypesPersistence.class.getResource(ANCHOR_PROPS);
final String protocol = url.getProtocol();
if (protocol.equals("jar")) {
// Normal deployment: nashorn.jar
@@ -391,7 +393,7 @@
final String fileStr = url.getFile();
final String className = OptimisticTypesPersistence.class.getName();
final int packageNameLen = className.lastIndexOf('.');
- final String dirStr = fileStr.substring(0, fileStr.length() - packageNameLen - 1);
+ final String dirStr = fileStr.substring(0, fileStr.length() - packageNameLen - 1 - ANCHOR_PROPS.length());
final File dir = new File(dirStr);
return "dev-" + new SimpleDateFormat("yyyyMMdd-HHmmss").format(new Date(getLastModifiedClassFile(
dir, 0L)));
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Context.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Context.java Thu Mar 17 19:04:35 2016 +0000
@@ -36,6 +36,7 @@
import static jdk.nashorn.internal.runtime.Source.sourceFor;
import java.io.File;
+import java.io.InputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.invoke.MethodHandle;
@@ -490,7 +491,7 @@
private static final ConcurrentMap<String, Class<?>> structureClasses = new ConcurrentHashMap<>();
/*package-private*/ @SuppressWarnings("static-method")
- ClassLoader getSharedLoader() {
+ StructureLoader getSharedLoader() {
return sharedLoader;
}
@@ -842,8 +843,8 @@
@Override
public Source run() {
try {
- final URL resURL = Context.class.getResource(resource);
- return resURL != null ? sourceFor(srcStr, resURL) : null;
+ final InputStream resStream = Context.class.getResourceAsStream(resource);
+ return resStream != null ? sourceFor(srcStr, Source.readFully(resStream)) : null;
} catch (final IOException exp) {
return null;
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/NashornLoader.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/NashornLoader.java Thu Mar 17 19:04:35 2016 +0000
@@ -30,25 +30,40 @@
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
+import java.lang.reflect.Module;
import java.security.CodeSource;
import java.security.Permission;
import java.security.PermissionCollection;
import java.security.Permissions;
import java.security.SecureClassLoader;
+import java.util.HashSet;
+import java.util.Set;
+import jdk.internal.module.Modules;
/**
* Superclass for Nashorn class loader classes.
*/
abstract class NashornLoader extends SecureClassLoader {
- private static final String OBJECTS_PKG = "jdk.nashorn.internal.objects";
- private static final String RUNTIME_PKG = "jdk.nashorn.internal.runtime";
- private static final String RUNTIME_ARRAYS_PKG = "jdk.nashorn.internal.runtime.arrays";
- private static final String RUNTIME_LINKER_PKG = "jdk.nashorn.internal.runtime.linker";
- private static final String SCRIPTS_PKG = "jdk.nashorn.internal.scripts";
+ protected static final String OBJECTS_PKG = "jdk.nashorn.internal.objects";
+ protected static final String RUNTIME_PKG = "jdk.nashorn.internal.runtime";
+ protected static final String RUNTIME_ARRAYS_PKG = "jdk.nashorn.internal.runtime.arrays";
+ protected static final String RUNTIME_LINKER_PKG = "jdk.nashorn.internal.runtime.linker";
+ protected static final String SCRIPTS_PKG = "jdk.nashorn.internal.scripts";
+ protected static final String OBJECTS_PKG_INTERNAL = "jdk/nashorn/internal/objects";
+ protected static final String RUNTIME_PKG_INTERNAL = "jdk/nashorn/internal/runtime";
+ protected static final String RUNTIME_ARRAYS_PKG_INTERNAL = "jdk/nashorn/internal/runtime/arrays";
+ protected static final String RUNTIME_LINKER_PKG_INTERNAL = "jdk/nashorn/internal/runtime/linker";
+ protected static final String SCRIPTS_PKG_INTERNAL = "jdk/nashorn/internal/scripts";
+
+ protected static final Module nashornModule = NashornLoader.class.getModule();
private static final Permission[] SCRIPT_PERMISSIONS;
+ private static final Set<String> scriptsPkgSet = new HashSet<>();
+
static {
+ scriptsPkgSet.add(SCRIPTS_PKG);
+
/*
* Generated classes get access to runtime, runtime.linker, objects, scripts packages.
* Note that the actual scripts can not access these because Java.type, Packages
@@ -69,6 +84,22 @@
super(parent);
}
+ protected static Module defineModule(final String moduleName, final ClassLoader loader) {
+ return Modules.defineModule(loader, moduleName, scriptsPkgSet);
+ }
+
+ protected static void addReadsModule(final Module from, final Module to) {
+ Modules.addReads(from, to);
+ }
+
+ protected static void addModuleExports(final Module from, final String pkg, final Module to) {
+ if (to == null) {
+ Modules.addExportsToAll(from, pkg);
+ } else {
+ Modules.addExports(from, pkg, to);
+ }
+ }
+
protected static void checkPackageAccess(final String name) {
final int i = name.lastIndexOf('.');
if (i != -1) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptLoader.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptLoader.java Thu Mar 17 19:04:35 2016 +0000
@@ -25,6 +25,7 @@
package jdk.nashorn.internal.runtime;
+import java.lang.reflect.Module;
import java.security.CodeSource;
import java.util.Objects;
@@ -35,6 +36,8 @@
final class ScriptLoader extends NashornLoader {
private static final String NASHORN_PKG_PREFIX = "jdk.nashorn.internal.";
+ private volatile boolean structureAccessAdded;
+ private final Module scriptModule;
private final Context context;
/*package-private*/ Context getContext() {
@@ -47,13 +50,39 @@
ScriptLoader(final ClassLoader parent, final Context context) {
super(parent);
this.context = context;
+
+ // new scripts module, it's specific exports and read-edges
+ scriptModule = defineModule("jdk.scripting.nashorn.scripts", this);
+ addModuleExports(scriptModule, SCRIPTS_PKG, nashornModule);
+ addReadsModule(scriptModule, nashornModule);
+ addReadsModule(scriptModule, Object.class.getModule());
+
+ // specific exports from nashorn to new scripts module
+ nashornModule.addExports(OBJECTS_PKG, scriptModule);
+ nashornModule.addExports(RUNTIME_PKG, scriptModule);
+ nashornModule.addExports(RUNTIME_ARRAYS_PKG, scriptModule);
+ nashornModule.addExports(RUNTIME_LINKER_PKG, scriptModule);
+ nashornModule.addExports(SCRIPTS_PKG, scriptModule);
+
+ // nashorn needs to read scripts module methods,fields
+ nashornModule.addReads(scriptModule);
}
@Override
protected Class<?> loadClass(final String name, final boolean resolve) throws ClassNotFoundException {
checkPackageAccess(name);
if (name.startsWith(NASHORN_PKG_PREFIX)) {
- return context.getSharedLoader().loadClass(name);
+ final StructureLoader sharedCl = context.getSharedLoader();
+ final Class<?> cl = sharedCl.loadClass(name);
+ if (! structureAccessAdded) {
+ if (cl.getClassLoader() == sharedCl) {
+ structureAccessAdded = true;
+ final Module structModule = sharedCl.getModule();
+ addModuleExports(structModule, SCRIPTS_PKG, scriptModule);
+ addReadsModule(scriptModule, structModule);
+ }
+ }
+ return cl;
}
return super.loadClass(name, resolve);
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Source.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Source.java Thu Mar 17 19:04:35 2016 +0000
@@ -922,7 +922,7 @@
return (cs != null) ? new String(readBytes(is), cs).toCharArray() : readFully(is);
}
- private static char[] readFully(final InputStream is) throws IOException {
+ public static char[] readFully(final InputStream is) throws IOException {
return byteToCharArray(readBytes(is));
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/StructureLoader.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/StructureLoader.java Thu Mar 17 19:04:35 2016 +0000
@@ -30,6 +30,7 @@
import static jdk.nashorn.internal.codegen.CompilerConstants.JS_OBJECT_DUAL_FIELD_PREFIX;
import static jdk.nashorn.internal.codegen.CompilerConstants.JS_OBJECT_SINGLE_FIELD_PREFIX;
+import java.lang.reflect.Module;
import java.security.ProtectionDomain;
import jdk.nashorn.internal.codegen.ObjectClassGenerator;
@@ -40,11 +41,26 @@
private static final String SINGLE_FIELD_PREFIX = binaryName(SCRIPTS_PACKAGE) + '.' + JS_OBJECT_SINGLE_FIELD_PREFIX.symbolName();
private static final String DUAL_FIELD_PREFIX = binaryName(SCRIPTS_PACKAGE) + '.' + JS_OBJECT_DUAL_FIELD_PREFIX.symbolName();
+ private final Module structuresModule;
+
/**
* Constructor.
*/
StructureLoader(final ClassLoader parent) {
super(parent);
+
+ // new structures module, it's exports, read edges
+ structuresModule = defineModule("jdk.scripting.nashorn.structures", this);
+ addModuleExports(structuresModule, SCRIPTS_PKG, nashornModule);
+ addReadsModule(structuresModule, nashornModule);
+ addReadsModule(structuresModule, Object.class.getModule());
+
+ // specific exports from nashorn to the structures module
+ nashornModule.addExports(SCRIPTS_PKG, structuresModule);
+ nashornModule.addExports(RUNTIME_PKG, structuresModule);
+
+ // nashorn has to read fields from classes of the new module
+ nashornModule.addReads(structuresModule);
}
/**
@@ -74,6 +90,10 @@
return isDualFieldStructure(name) || isSingleFieldStructure(name);
}
+ protected Module getModule() {
+ return structuresModule;
+ }
+
@Override
protected Class<?> findClass(final String name) throws ClassNotFoundException {
if (isDualFieldStructure(name)) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaAdapterBytecodeGenerator.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaAdapterBytecodeGenerator.java Thu Mar 17 19:04:35 2016 +0000
@@ -51,6 +51,7 @@
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
+import java.lang.reflect.Module;
import java.security.AccessControlContext;
import java.security.AccessController;
import java.security.PrivilegedAction;
@@ -197,12 +198,8 @@
private static final String GET_METHOD_PROPERTY_METHOD_DESCRIPTOR = Type.getMethodDescriptor(OBJECT_TYPE, SCRIPT_OBJECT_TYPE);
private static final String VOID_METHOD_DESCRIPTOR = Type.getMethodDescriptor(Type.VOID_TYPE);
- // Package used when the adapter can't be defined in the adaptee's package (either because it's sealed, or because
- // it's a java.* package.
- private static final String ADAPTER_PACKAGE_PREFIX = "jdk/nashorn/javaadapters/";
- // Class name suffix used to append to the adaptee class name, when it can be defined in the adaptee's package.
- private static final String ADAPTER_CLASS_NAME_SUFFIX = "$$NashornJavaAdapter";
- private static final String JAVA_PACKAGE_PREFIX = "java/";
+ static final String ADAPTER_PACKAGE_INTERNAL = "jdk/nashorn/javaadapters/";
+ static final String ADAPTER_PACKAGE = "jdk.nashorn.javaadapters";
private static final int MAX_GENERATED_TYPE_NAME_LENGTH = 255;
// Method name prefix for invoking super-methods
@@ -237,6 +234,7 @@
private final Set<MethodInfo> methodInfos = new HashSet<>();
private final boolean autoConvertibleFromFunction;
private boolean hasExplicitFinalizer = false;
+ private final Set<Module> accessedModules = new HashSet<>();
private final ClassWriter cw;
@@ -300,7 +298,7 @@
}
JavaAdapterClassLoader createAdapterClassLoader() {
- return new JavaAdapterClassLoader(generatedClassName, cw.toByteArray());
+ return new JavaAdapterClassLoader(generatedClassName, cw.toByteArray(), accessedModules);
}
boolean isAutoConvertibleFromFunction() {
@@ -314,12 +312,7 @@
final Package pkg = namingType.getPackage();
final String namingTypeName = Type.getInternalName(namingType);
final StringBuilder buf = new StringBuilder();
- if (namingTypeName.startsWith(JAVA_PACKAGE_PREFIX) || pkg == null || pkg.isSealed()) {
- // Can't define new classes in java.* packages
- buf.append(ADAPTER_PACKAGE_PREFIX).append(namingTypeName);
- } else {
- buf.append(namingTypeName).append(ADAPTER_CLASS_NAME_SUFFIX);
- }
+ buf.append(ADAPTER_PACKAGE_INTERNAL).append(namingTypeName.replace('/', '_'));
final Iterator<Class<?>> it = interfaces.iterator();
if(superType == Object.class && it.hasNext()) {
it.next(); // Skip first interface, it was used to primarily name the adapter
@@ -359,7 +352,7 @@
// If the class is a SAM, allow having ScriptFunction passed as class overrides
mv.dup();
mv.instanceOf(SCRIPT_FUNCTION_TYPE);
- mv.dup();
+ mv.dup();
mv.putstatic(generatedClassName, IS_FUNCTION_FIELD_NAME, BOOLEAN_TYPE_DESCRIPTOR);
final Label notFunction = new Label();
mv.ifeq(notFunction);
@@ -379,9 +372,9 @@
private void emitInitCallThis(final InstructionAdapter mv) {
loadField(mv, GLOBAL_FIELD_NAME, SCRIPT_OBJECT_TYPE_DESCRIPTOR);
GET_CALL_THIS.invoke(mv);
- if(classOverride) {
+ if(classOverride) {
mv.putstatic(generatedClassName, CALL_THIS_FIELD_NAME, OBJECT_TYPE_DESCRIPTOR);
- } else {
+ } else {
// It is presumed ALOAD 0 was already executed
mv.putfield(generatedClassName, CALL_THIS_FIELD_NAME, OBJECT_TYPE_DESCRIPTOR);
}
@@ -404,6 +397,14 @@
}
private boolean generateConstructors(final Constructor<?> ctor) {
+ for (final Class<?> pt : ctor.getParameterTypes()) {
+ if (pt.isPrimitive()) continue;
+ final Module ptMod = pt.getModule();
+ if (ptMod != null) {
+ accessedModules.add(ptMod);
+ }
+ }
+
if(classOverride) {
// Generate a constructor that just delegates to ctor. This is used with class-level overrides, when we want
// to create instances without further per-instance overrides.
@@ -411,16 +412,16 @@
return false;
}
- // Generate a constructor that delegates to ctor, but takes an additional ScriptObject parameter at the
- // beginning of its parameter list.
- generateOverridingConstructor(ctor, false);
+ // Generate a constructor that delegates to ctor, but takes an additional ScriptObject parameter at the
+ // beginning of its parameter list.
+ generateOverridingConstructor(ctor, false);
if (samName == null) {
return false;
- }
- // If all our abstract methods have a single name, generate an additional constructor, one that takes a
- // ScriptFunction as its first parameter and assigns it as the implementation for all abstract methods.
- generateOverridingConstructor(ctor, true);
+ }
+ // If all our abstract methods have a single name, generate an additional constructor, one that takes a
+ // ScriptFunction as its first parameter and assigns it as the implementation for all abstract methods.
+ generateOverridingConstructor(ctor, true);
// If the original type only has a single abstract method name, as well as a default ctor, then it can
// be automatically converted from JS function.
return ctor.getParameterTypes().length == 0;
@@ -499,7 +500,7 @@
mv.iconst(1);
mv.putfield(generatedClassName, IS_FUNCTION_FIELD_NAME, BOOLEAN_TYPE_DESCRIPTOR);
- mv.visitVarInsn(ALOAD, 0);
+ mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, extraArgOffset);
emitInitCallThis(mv);
}
@@ -668,7 +669,7 @@
// stack: [callThis, delegate]
mv.goTo(callCallee);
mv.visitLabel(notFunction);
- } else {
+ } else {
// If it's not a SAM method, and the delegate is a function,
// it'll fall back to default behavior
mv.ifne(defaultBehavior);
@@ -808,7 +809,7 @@
if (isVarArgCall) {
// Variable arity calls are always (Object callee, Object this, Object[] params)
callParamTypes = new Class<?>[] { Object.class, Object.class, Object[].class };
- } else {
+ } else {
// Adjust invocation type signature for conversions we instituted in
// convertParam; also, byte and short get passed as ints.
final Class<?>[] origParamTypes = type.parameterArray();
@@ -858,13 +859,13 @@
private void loadField(final InstructionAdapter mv, final String name, final String desc) {
- if(classOverride) {
+ if(classOverride) {
mv.getstatic(generatedClassName, name, desc);
- } else {
- mv.visitVarInsn(ALOAD, 0);
+ } else {
+ mv.visitVarInsn(ALOAD, 0);
mv.getfield(generatedClassName, name, desc);
- }
- }
+ }
+ }
private static void convertReturnValue(final InstructionAdapter mv, final Class<?> origReturnType) {
if (origReturnType == void.class) {
@@ -1082,6 +1083,11 @@
*/
private void gatherMethods(final Class<?> type) throws AdaptationException {
if (Modifier.isPublic(type.getModifiers())) {
+ final Module module = type.getModule();
+ if (module != null) {
+ accessedModules.add(module);
+ }
+
final Method[] typeMethods = type.isInterface() ? type.getMethods() : type.getDeclaredMethods();
for (final Method typeMethod: typeMethods) {
@@ -1106,12 +1112,26 @@
continue;
}
+ for (final Class<?> pt : typeMethod.getParameterTypes()) {
+ if (pt.isPrimitive()) continue;
+ final Module ptMod = pt.getModule();
+ if (ptMod != null) {
+ accessedModules.add(ptMod);
+ }
+ }
+
+ final Class<?> rt = typeMethod.getReturnType();
+ if (!rt.isPrimitive()) {
+ final Module rtMod = rt.getModule();
+ if (rtMod != null) accessedModules.add(rtMod);
+ }
+
final MethodInfo mi = new MethodInfo(typeMethod);
if (Modifier.isFinal(m) || isCallerSensitive(typeMethod)) {
finalMethods.add(mi);
} else if (!finalMethods.contains(mi) && methodInfos.add(mi) && Modifier.isAbstract(m)) {
- abstractMethodNames.add(mi.getName());
- }
+ abstractMethodNames.add(mi.getName());
+ }
}
}
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaAdapterClassLoader.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaAdapterClassLoader.java Thu Mar 17 19:04:35 2016 +0000
@@ -25,6 +25,7 @@
package jdk.nashorn.internal.runtime.linker;
+import java.lang.reflect.Module;
import java.security.AccessControlContext;
import java.security.AccessController;
import java.security.PrivilegedAction;
@@ -34,12 +35,14 @@
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
+import java.util.Set;
import jdk.dynalink.beans.StaticClass;
import jdk.nashorn.internal.codegen.DumpBytecode;
import jdk.nashorn.internal.runtime.Context;
import jdk.nashorn.internal.runtime.JSType;
import jdk.nashorn.internal.runtime.ScriptFunction;
import jdk.nashorn.internal.runtime.ScriptObject;
+import jdk.internal.module.Modules;
/**
* This class encapsulates the bytecode of the adapter class and can be used to load it into the JVM as an actual Class.
@@ -49,6 +52,12 @@
* class are normally created by {@code JavaAdapterBytecodeGenerator}.
*/
final class JavaAdapterClassLoader {
+ private static final Module nashornModule = JavaAdapterClassLoader.class.getModule();
+ private static final Set<String> adapterPkgs = new HashSet<>();
+ static {
+ adapterPkgs.add(JavaAdapterBytecodeGenerator.ADAPTER_PACKAGE);
+ }
+
private static final AccessControlContext CREATE_LOADER_ACC_CTXT = ClassAndLoader.createPermAccCtxt("createClassLoader");
private static final AccessControlContext GET_CONTEXT_ACC_CTXT = ClassAndLoader.createPermAccCtxt(Context.NASHORN_GET_CONTEXT);
private static final Collection<String> VISIBLE_INTERNAL_CLASS_NAMES = Collections.unmodifiableCollection(new HashSet<>(
@@ -56,10 +65,12 @@
private final String className;
private final byte[] classBytes;
+ private final Set<Module> accessedModules;
- JavaAdapterClassLoader(final String className, final byte[] classBytes) {
+ JavaAdapterClassLoader(final String className, final byte[] classBytes, final Set<Module> accessedModules) {
this.className = className.replace('/', '.');
this.classBytes = classBytes;
+ this.accessedModules = accessedModules;
}
/**
@@ -82,6 +93,14 @@
}, CREATE_LOADER_ACC_CTXT);
}
+ private static void addExports(final Module from, final String pkg, final Module to) {
+ if (to == null) {
+ Modules.addExportsToAll(from, pkg);
+ } else {
+ Modules.addExports(from, pkg, to);
+ }
+ }
+
// Note that the adapter class is created in the protection domain of the class/interface being
// extended/implemented, and only the privileged global setter action class is generated in the protection domain
// of Nashorn itself. Also note that the creation and loading of the global setter is deferred until it is
@@ -93,6 +112,26 @@
return new SecureClassLoader(parentLoader) {
private final ClassLoader myLoader = getClass().getClassLoader();
+ // new adapter module
+ private final Module adapterModule = Modules.defineModule(this, "jdk.scripting.nashorn.javaadapters", adapterPkgs);
+
+ {
+ // new adapter module exports and read-edges
+ addExports(adapterModule, JavaAdapterBytecodeGenerator.ADAPTER_PACKAGE, null);
+ Modules.addReads(adapterModule, nashornModule);
+ Modules.addReads(adapterModule, Object.class.getModule());
+ for (Module mod : accessedModules) {
+ Modules.addReads(adapterModule, mod);
+ }
+
+ // specific exports from nashorn to the new adapter module
+ nashornModule.addExports("jdk.nashorn.internal.runtime", adapterModule);
+ nashornModule.addExports("jdk.nashorn.internal.runtime.linker", adapterModule);
+
+ // nashorn should be be able to read methods of classes loaded in adapter module
+ nashornModule.addReads(adapterModule);
+ }
+
@Override
public Class<?> loadClass(final String name, final boolean resolve) throws ClassNotFoundException {
try {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaAdapterServices.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaAdapterServices.java Thu Mar 17 19:04:35 2016 +0000
@@ -228,7 +228,7 @@
});
try {
- return MethodHandles.lookup().findStatic(Class.forName(className, true, loader), "invoke",
+ return MethodHandles.publicLookup().findStatic(Class.forName(className, true, loader), "invoke",
MethodType.methodType(void.class, MethodHandle.class, Object.class));
} catch(final ReflectiveOperationException e) {
throw new AssertionError(e.getMessage(), e);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornStaticClassLinker.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornStaticClassLinker.java Thu Mar 17 19:04:35 2016 +0000
@@ -25,7 +25,9 @@
package jdk.nashorn.internal.runtime.linker;
+import java.lang.invoke.MethodHandles;
import java.lang.reflect.Modifier;
+import jdk.internal.module.Modules;
import jdk.dynalink.CallSiteDescriptor;
import jdk.dynalink.NamedOperation;
import jdk.dynalink.StandardOperation;
@@ -87,8 +89,11 @@
if (NashornLinker.isAbstractClass(receiverClass)) {
// Change this link request into a link request on the adapter class.
final Object[] args = request.getArguments();
- args[0] = JavaAdapterFactory.getAdapterClassFor(new Class<?>[] { receiverClass }, null,
- NashornCallSiteDescriptor.getLookupInternal(request.getCallSiteDescriptor()));
+ final MethodHandles.Lookup lookup =
+ NashornCallSiteDescriptor.getLookupInternal(request.getCallSiteDescriptor());
+
+ args[0] = JavaAdapterFactory.getAdapterClassFor(new Class<?>[] { receiverClass }, null, lookup);
+ Modules.addReads(lookup.lookupClass().getModule(), ((StaticClass)args[0]).getRepresentedClass().getModule());
final LinkRequest adapterRequest = request.replaceArguments(request.getCallSiteDescriptor(), args);
final GuardedInvocation gi = checkNullConstructor(delegate(linkerServices, adapterRequest), receiverClass);
// Finally, modify the guard to test for the original abstract class.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/module-info.java Thu Mar 17 19:04:35 2016 +0000
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2014, 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.
+ */
+
+module jdk.scripting.nashorn {
+ requires java.logging;
+ requires public java.scripting;
+ requires jdk.dynalink;
+
+ exports jdk.nashorn.api.scripting;
+ exports jdk.nashorn.api.tree;
+
+ exports jdk.nashorn.internal.runtime to
+ jdk.scripting.nashorn.shell;
+ exports jdk.nashorn.internal.objects to
+ jdk.scripting.nashorn.shell;
+ exports jdk.nashorn.tools to
+ jdk.scripting.nashorn.shell;
+
+ provides javax.script.ScriptEngineFactory with jdk.nashorn.api.scripting.NashornScriptEngineFactory;
+}
+
--- a/nashorn/test/TEST.ROOT Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/test/TEST.ROOT Thu Mar 17 19:04:35 2016 +0000
@@ -8,4 +8,4 @@
groups=TEST.groups
# Minimum jtreg version
-requiredVersion=4.1 b12
+requiredVersion=4.2 b01
--- a/nashorn/test/script/currently-failing/JDK-8055034.js Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/test/script/currently-failing/JDK-8055034.js Thu Mar 17 19:04:35 2016 +0000
@@ -51,7 +51,7 @@
jjsCmd = javahome + "/bin/jjs";
jjsCmd = jjsCmd.toString().replace(/\//g, File.separator);
}
-jjsCmd += " -J-Xbootclasspath/p:" + nashornJar;
+jjsCmd += " -J-Xpatch:" + nashornJar;
$ENV.PWD=System.getProperty("user.dir") // to avoid RE on Cygwin
$EXEC(jjsCmd, "var x = Object.create(null);\nx;\nprint('PASSED');\nexit(0)");
--- a/nashorn/test/script/nosecurity/JDK-8044798.js Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/test/script/nosecurity/JDK-8044798.js Thu Mar 17 19:04:35 2016 +0000
@@ -27,7 +27,6 @@
* @test
* @option -Dnashorn.mirror.always=false
* @fork
- * @run
*/
// basic API exercise checks
@@ -120,18 +119,25 @@
var Source = Java.type("jdk.nashorn.internal.runtime.Source");
var Context = Java.type("jdk.nashorn.internal.runtime.Context");
+var ThrowErrorManager = Java.type("jdk.nashorn.internal.runtime.Context.ThrowErrorManager");
+var contextCls = java.lang.Class.forName("jdk.nashorn.internal.runtime.Context");
var sourceCls = Source.class;
var errorMgrCls = Java.type("jdk.nashorn.internal.runtime.ErrorManager").class;
var booleanCls = Java.type("java.lang.Boolean").TYPE;
+var stringCls = Java.type("java.lang.String").class;
// private compile method of Context class
-var compileMethod = Context.class.getDeclaredMethod("compile",
+var compileMethod = contextCls.getDeclaredMethod("compile",
sourceCls, errorMgrCls, booleanCls, booleanCls);
compileMethod.accessible = true;
-var scriptCls = compileMethod.invoke(Context.context,
- Source.sourceFor("test", "print('hello')"),
- new Context.ThrowErrorManager(), false, false);
+var getContextMethod = contextCls.getMethod("getContext");
+getContextMethod.accessible = true;
+
+var sourceForMethod = sourceCls.getMethod("sourceFor", stringCls, stringCls);
+var scriptCls = compileMethod.invoke(getContextMethod.invoke(null),
+ sourceForMethod.invoke(null, "test", "print('hello')"),
+ ThrowErrorManager.class.newInstance(), false, false);
var SCRIPT_CLASS_NAME_PREFIX = "jdk.nashorn.internal.scripts.Script$";
print("script class name pattern satisfied? " +
--- a/nashorn/test/script/nosecurity/JDK-8044851.js Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/test/script/nosecurity/JDK-8044851.js Thu Mar 17 19:04:35 2016 +0000
@@ -25,13 +25,32 @@
* JDK-8044851: nashorn properties leak memory
*
* @test
- * @run
* @option -Dnashorn.debug=true
* @fork
*/
+var Property = Java.type("jdk.nashorn.internal.runtime.Property");
+var PropertyMap = Java.type("jdk.nashorn.internal.runtime.PropertyMap");
+
+// Class objects
+var objectCls = Java.type("java.lang.Object").class;
+var propertyCls = Property.class;
+var propertyMapCls = PropertyMap.class;
+
+// Method objects
+var findPropertyMethod = propertyMapCls.getMethod("findProperty", objectCls);
+var getKeyMethod = propertyCls.getMethod("getKey");
+var isSpillMethod = propertyCls.getMethod("isSpill");
+var getSlotMethod = propertyCls.getMethod("getSlot");
+
function printProperty(value, property) {
- print(value, property.getKey(), property.isSpill() ? "spill" : "field", property.getSlot());
+ print(value, getKeyMethod.invoke(property),
+ isSpillMethod.invoke(property) ? "spill" : "field", getSlotMethod.invoke(property));
+}
+
+function findProperty(obj, name) {
+ var map = Debug.map(obj);
+ return findPropertyMethod.invoke(map, name);
}
var obj = {}, i, name;
@@ -39,7 +58,7 @@
for (i = 0; i < 8; ++i) {
name = 'property' + i;
obj[name] = 'a' + i;
- printProperty(obj[name], Debug.map(obj).findProperty(name));
+ printProperty(obj[name], findProperty(obj, name));
}
print();
@@ -51,14 +70,14 @@
for (i = 0; i < 8; ++i) {
name = 'property' + i;
obj[name] = 'b' + i;
- printProperty(obj[name], Debug.map(obj).findProperty(name));
+ printProperty(obj[name], findProperty(obj, name));
}
print();
for (i = 0; i < 8; ++i) {
name = 'property' + i;
Object.defineProperty(obj, name, {get: function() {return i;}, set: function(v) {}, configurable: true});
- printProperty(obj[name], Debug.map(obj).findProperty(name));
+ printProperty(obj[name], findProperty(obj, name));
}
print();
@@ -70,7 +89,7 @@
for (i = 0; i < 8; ++i) {
name = 'property' + i;
obj[name] = 'c' + i;
- printProperty(obj[name], Debug.map(obj).findProperty(name));
+ printProperty(obj[name], findProperty(obj, name));
}
print();
@@ -82,12 +101,12 @@
for (i = 0; i < 8; ++i) {
name = 'property' + i;
obj[name] = 'd' + i;
- printProperty(obj[name], Debug.map(obj).findProperty(name));
+ printProperty(obj[name], findProperty(obj, name));
}
print();
for (i = 0; i < 8; ++i) {
name = 'property' + i;
Object.defineProperty(obj, name, {get: function() {return i;}, set: function(v) {}});
- printProperty(obj[name], Debug.map(obj).findProperty(name));
+ printProperty(obj[name], findProperty(obj, name));
}
--- a/nashorn/test/script/nosecurity/JDK-8067215.js Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/test/script/nosecurity/JDK-8067215.js Thu Mar 17 19:04:35 2016 +0000
@@ -27,6 +27,7 @@
* @test
* @run
* @option -Dnashorn.debug=true
+ * @option -scripting
* @fork
*/
@@ -36,10 +37,27 @@
var Context = Java.type("jdk.nashorn.internal.runtime.Context");
var JSType = Java.type("jdk.nashorn.internal.runtime.JSType");
+var Property = Java.type("jdk.nashorn.internal.runtime.Property");
+var PropertyMap = Java.type("jdk.nashorn.internal.runtime.PropertyMap");
-var context = Context.getContext();
-var dualFields = context.useDualFields();
-var optimisticTypes = context.getEnv()._optimistic_types;
+// Class objects
+var objectCls = Java.type("java.lang.Object").class;
+var contextCls = Context.class;
+var JSTypeCls = JSType.class;
+var propertyCls = Property.class;
+var propertyMapCls = PropertyMap.class;
+
+// Method objects
+var getContextMethod = contextCls.getMethod("getContext");
+var isRepresentableAsIntMethod = JSTypeCls.getMethod("isRepresentableAsInt", java.lang.Double.TYPE);
+var hasDualFieldsMethod = propertyCls.getMethod("hasDualFields");
+var getTypeMethod = propertyCls.getMethod("getType");
+var findPropertyMethod = propertyMapCls.getMethod("findProperty", objectCls);
+
+var context = getContextMethod.invoke(null);
+var useDualFieldsMethod = contextCls.getMethod("useDualFields");
+var dualFields = useDualFieldsMethod.invoke(context);
+var optimisticTypes = $OPTIONS._optimistic_types;
if (dualFields != optimisticTypes) {
throw new Error("Wrong dual fields setting");
@@ -51,11 +69,11 @@
Object.defineProperty(obj, "z", {value: 0.5});
var map = Debug.map(obj);
for (var key in obj) {
- var prop = map.findProperty(key);
- if (prop.hasDualFields() !== dualFields) {
+ var prop = findPropertyMethod.invoke(map, key);
+ if (hasDualFieldsMethod.invoke(prop) !== dualFields) {
throw new Error("Wrong property flags: " + prop);
}
- if (prop.getType() != getExpectedType(obj[key])) {
+ if (getTypeMethod.invoke(prop) != getExpectedType(obj[key])) {
throw new Error("Wrong property type: " + prop.getType() + " // " + getExpectedType(obj[key]));
}
}
@@ -66,7 +84,7 @@
return objectType.class;
}
if (typeof value === "number") {
- return JSType.isRepresentableAsInt(value) ? intType.class : doubleType.class;
+ return isRepresentableAsIntMethod.invoke(null, value) ? intType.class : doubleType.class;
}
return objectType.class;
}
--- a/nashorn/test/script/nosecurity/JDK-8078049.js Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/test/script/nosecurity/JDK-8078049.js Thu Mar 17 19:04:35 2016 +0000
@@ -543,11 +543,14 @@
var AccessorProperty = Java.type("jdk.nashorn.internal.runtime.AccessorProperty");
var SpillProperty = Java.type("jdk.nashorn.internal.runtime.SpillProperty");
+var PropertyMap = Java.type("jdk.nashorn.internal.runtime.PropertyMap");
+var findPropertyMethod = PropertyMap.class.getMethod("findProperty", java.lang.Object.class);
Assert.assertTrue(Object.keys(fields).length === 3);
-Assert.assertTrue(Debug.map(fields).findProperty("p0").getClass() === AccessorProperty.class);
-Assert.assertTrue(Debug.map(fields).findProperty("p2").getClass() === AccessorProperty.class);
+Assert.assertTrue(findPropertyMethod.invoke(Debug.map(fields), "p0").getClass() === AccessorProperty.class);
+Assert.assertTrue(findPropertyMethod.invoke(Debug.map(fields), "p2").getClass() === AccessorProperty.class);
Assert.assertTrue(Object.keys(spill).length === 500);
-Assert.assertTrue(Debug.map(spill).findProperty("p0").getClass() === SpillProperty.class);
-Assert.assertTrue(Debug.map(spill).findProperty("p499").getClass() === SpillProperty.class);
+
+Assert.assertTrue(findPropertyMethod.invoke(Debug.map(spill), "p0").getClass() === SpillProperty.class);
+Assert.assertTrue(findPropertyMethod.invoke(Debug.map(spill), "p499").getClass() === SpillProperty.class);
--- a/nashorn/test/script/trusted/classfilter_extends.js.EXPECTED Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/test/script/trusted/classfilter_extends.js.EXPECTED Thu Mar 17 19:04:35 2016 +0000
@@ -6,9 +6,9 @@
[JavaClass java.util.ArrayList]
[JavaClass java.lang.String]
[JavaPackage java.lang.String]
-[JavaClass jdk.nashorn.javaadapters.java.util.ArrayList]
-[JavaClass jdk.nashorn.javaadapters.java.util.ArrayList]
-[JavaClass jdk.nashorn.javaadapters.java.io.File]
+[JavaClass jdk.nashorn.javaadapters.java_util_ArrayList]
+[JavaClass jdk.nashorn.javaadapters.java_util_ArrayList]
+[JavaClass jdk.nashorn.javaadapters.java_io_File]
TypeError: Java.extend needs Java types as its arguments. in <eval> at line number 1
java.lang.NullPointerException
java.lang.ClassNotFoundException: java.lang.NullPointerException
--- a/nashorn/test/script/trusted/classfilter_mozilla_compat.js.EXPECTED Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/test/script/trusted/classfilter_mozilla_compat.js.EXPECTED Thu Mar 17 19:04:35 2016 +0000
@@ -1,7 +1,7 @@
-class javax.script.ScriptContext$$NashornJavaAdapter
+class jdk.nashorn.javaadapters.javax_script_ScriptContext
TypeError: Java.extend needs at least one type argument. in nashorn:mozilla_compat.js at line number 39
-class jdk.nashorn.javaadapters.java.util.ArrayList
-class jdk.nashorn.javaadapters.java.util.ArrayList
+class jdk.nashorn.javaadapters.java_util_ArrayList
+class jdk.nashorn.javaadapters.java_util_ArrayList
[JavaClass java.lang.Integer]
TypeError: [object JavaPackage] is not a Java class in nashorn:mozilla_compat.js at line number 373 at column number 16
[JavaClass java.util.HashSet]
--- a/nashorn/test/script/trusted/event_queue.js Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/test/script/trusted/event_queue.js Thu Mar 17 19:04:35 2016 +0000
@@ -30,6 +30,7 @@
* @option -Dnashorn.debug=true
* @option --log=recompile:quiet
* @option --optimistic-types=true
+ * @run
*/
print(Debug);
--- a/nashorn/test/script/trusted/optimistic_recompilation.js Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/test/script/trusted/optimistic_recompilation.js Thu Mar 17 19:04:35 2016 +0000
@@ -29,6 +29,7 @@
* @option -Dnashorn.debug=true
* @option --log=recompile:quiet
* @option --optimistic-types=true
+ * @run
*/
var forName = java.lang.Class["forName(String)"];
--- a/nashorn/test/src/jdk/nashorn/internal/runtime/doubleconv/test/BignumTest.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/test/src/jdk/nashorn/internal/runtime/doubleconv/test/BignumTest.java Thu Mar 17 19:04:35 2016 +0000
@@ -69,6 +69,7 @@
* Bignum class tests
*
* @test
+ * @modules jdk.scripting.nashorn/jdk.nashorn.internal.runtime.doubleconv
* @run testng jdk.nashorn.internal.runtime.doubleconv.test.BignumTest
*/
@SuppressWarnings("javadoc")
--- a/nashorn/test/src/jdk/nashorn/internal/runtime/doubleconv/test/DiyFpTest.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/test/src/jdk/nashorn/internal/runtime/doubleconv/test/DiyFpTest.java Thu Mar 17 19:04:35 2016 +0000
@@ -44,6 +44,7 @@
* DiyFp class tests
*
* @test
+ * @modules jdk.scripting.nashorn/jdk.nashorn.internal.runtime.doubleconv
* @run testng jdk.nashorn.internal.runtime.doubleconv.test.DiyFpTest
*/
@SuppressWarnings("javadoc")
--- a/nashorn/test/src/jdk/nashorn/internal/runtime/regexp/joni/test/JoniTest.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/test/src/jdk/nashorn/internal/runtime/regexp/joni/test/JoniTest.java Thu Mar 17 19:04:35 2016 +0000
@@ -32,6 +32,7 @@
* Joni coverage tests
*
* @test
+ * @modules jdk.scripting.nashorn/jdk.nashorn.internal.runtime.regexp.joni
* @run testng jdk.nashorn.internal.runtime.regexp.joni.test.JoniTest
*/
@SuppressWarnings("javadoc")
--- a/nashorn/test/src/jdk/nashorn/internal/runtime/regexp/test/JdkRegExpTest.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/test/src/jdk/nashorn/internal/runtime/regexp/test/JdkRegExpTest.java Thu Mar 17 19:04:35 2016 +0000
@@ -38,6 +38,7 @@
* Basic tests for the JDK based RegExp implementation.
*
* @test
+ * @modules jdk.scripting.nashorn/jdk.nashorn.internal.runtime.regexp
* @run testng jdk.nashorn.internal.runtime.regexp.test.JdkRegExpTest
*/
public class JdkRegExpTest {
--- a/nashorn/test/src/jdk/nashorn/internal/runtime/test/ConsStringTest.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/test/src/jdk/nashorn/internal/runtime/test/ConsStringTest.java Thu Mar 17 19:04:35 2016 +0000
@@ -34,6 +34,7 @@
* Tests for JSType methods.
*
* @test
+ * @modules jdk.scripting.nashorn/jdk.nashorn.internal.runtime
* @run testng jdk.nashorn.internal.runtime.test.ConsStringTest
*/
public class ConsStringTest {
--- a/nashorn/test/src/jdk/nashorn/internal/runtime/test/ContextTest.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/test/src/jdk/nashorn/internal/runtime/test/ContextTest.java Thu Mar 17 19:04:35 2016 +0000
@@ -44,6 +44,9 @@
* Basic Context API tests.
*
* @test
+ * @modules jdk.scripting.nashorn/jdk.nashorn.internal.runtime
+ * jdk.scripting.nashorn/jdk.nashorn.internal.runtime.options
+ * jdk.scripting.nashorn/jdk.nashorn.internal.objects
* @run testng jdk.nashorn.internal.runtime.test.ContextTest
*/
@SuppressWarnings("javadoc")
--- a/nashorn/test/src/jdk/nashorn/internal/runtime/test/ExceptionsNotSerializable.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/test/src/jdk/nashorn/internal/runtime/test/ExceptionsNotSerializable.java Thu Mar 17 19:04:35 2016 +0000
@@ -42,6 +42,7 @@
* JDK-8044518: Ensure exceptions related to optimistic recompilation are not serializable
*
* @test
+ * @modules jdk.scripting.nashorn/jdk.nashorn.internal.runtime
* @run testng jdk.nashorn.internal.runtime.test.ExceptionsNotSerializable
*/
@SuppressWarnings("javadoc")
--- a/nashorn/test/src/jdk/nashorn/internal/runtime/test/JDK_8078414_Test.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/test/src/jdk/nashorn/internal/runtime/test/JDK_8078414_Test.java Thu Mar 17 19:04:35 2016 +0000
@@ -47,6 +47,10 @@
* @test
* @bug 8078414
* @summary Test that arbitrary classes can't be converted to mirror's superclasses/interfaces.
+ * @modules jdk.scripting.nashorn/jdk.nashorn.internal.runtime
+ * @modules jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker
+ * @modules jdk.scripting.nashorn/jdk.nashorn.internal.runtime.options
+ * @modules jdk.scripting.nashorn/jdk.nashorn.internal.objects
* @run testng jdk.nashorn.internal.runtime.test.JDK_8078414_Test
*/
public class JDK_8078414_Test {
--- a/nashorn/test/src/jdk/nashorn/internal/runtime/test/JSTypeTest.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/test/src/jdk/nashorn/internal/runtime/test/JSTypeTest.java Thu Mar 17 19:04:35 2016 +0000
@@ -37,6 +37,7 @@
* Tests for JSType methods.
*
* @test
+ * @modules jdk.scripting.nashorn/jdk.nashorn.internal.runtime
* @run testng jdk.nashorn.internal.runtime.test.JSTypeTest
*/
public class JSTypeTest {
--- a/nashorn/test/src/jdk/nashorn/internal/test/framework/ScriptRunnable.java Tue Mar 15 13:48:31 2016 -0700
+++ b/nashorn/test/src/jdk/nashorn/internal/test/framework/ScriptRunnable.java Thu Mar 17 19:04:35 2016 +0000
@@ -176,8 +176,6 @@
final List<String> cmd = new ArrayList<>();
cmd.add(System.getProperty("java.home") + separator + "bin" + separator + "java");
- // cmd.add("-Djava.ext.dirs=dist");
- cmd.add("-Xbootclasspath/a:dist/nashorn.jar");
for (final String str : forkJVMOptions) {
if(!str.isEmpty()) {
cmd.add(str);