--- a/.hgtags Thu Jun 23 17:07:31 2016 -0700
+++ b/.hgtags Wed Jun 29 21:49:41 2016 -0700
@@ -366,3 +366,4 @@
18e5cdecb37a2f03ba74f6c8f022858bcbaacf56 jdk-9+121
7693aa00e131493ceb42b93305e2f014c9922a3b jdk-9+122
d53037a90c441cb528dc41c30827985de0e67c62 jdk-9+123
+2a5697a98620c4f40e4a1a71478464399b8878de jdk-9+124
--- a/.hgtags-top-repo Thu Jun 23 17:07:31 2016 -0700
+++ b/.hgtags-top-repo Wed Jun 29 21:49:41 2016 -0700
@@ -366,3 +366,4 @@
cae471d3b87783e0a3deea658e1e1c84b2485b6c jdk-9+121
346be2df0f5b31d423807f53a719d1b9a67f3354 jdk-9+122
405d811c0d7b9b48ff718ae6c240b732f098c028 jdk-9+123
+f80c841ae2545eaf9acd2724bccc305d98cefbe2 jdk-9+124
--- a/common/autoconf/generated-configure.sh Thu Jun 23 17:07:31 2016 -0700
+++ b/common/autoconf/generated-configure.sh Wed Jun 29 21:49:41 2016 -0700
@@ -5094,7 +5094,7 @@
#CUSTOM_AUTOCONF_INCLUDE
# Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1466007828
+DATE_WHEN_GENERATED=1467039751
###############################################################################
#
@@ -36621,7 +36621,6 @@
# Setup the assembler (AS)
#
if test "x$OPENJDK_TARGET_OS" = xsolaris; then
- # FIXME: should this really be solaris, or solstudio?
# Publish this variable in the help.
@@ -37105,6 +37104,9 @@
fi
fi
+ if test "x$AS" = x; then
+ as_fn_error $? "Solaris assembler (as) is required. Please install via \"pkg install pkg:/developer/assembler\"." "$LINENO" 5
+ fi
else
# FIXME: is this correct for microsoft?
AS="$CC -c"
--- a/common/autoconf/toolchain.m4 Thu Jun 23 17:07:31 2016 -0700
+++ b/common/autoconf/toolchain.m4 Wed Jun 29 21:49:41 2016 -0700
@@ -597,9 +597,11 @@
# Setup the assembler (AS)
#
if test "x$OPENJDK_TARGET_OS" = xsolaris; then
- # FIXME: should this really be solaris, or solstudio?
BASIC_PATH_PROGS(AS, as)
BASIC_FIXUP_EXECUTABLE(AS)
+ if test "x$AS" = x; then
+ AC_MSG_ERROR([Solaris assembler (as) is required. Please install via "pkg install pkg:/developer/assembler".])
+ fi
else
# FIXME: is this correct for microsoft?
AS="$CC -c"
--- a/common/bin/compare.sh Thu Jun 23 17:07:31 2016 -0700
+++ b/common/bin/compare.sh Wed Jun 29 21:49:41 2016 -0700
@@ -360,9 +360,11 @@
$RM $OTHER_FILE $THIS_FILE
#Note that | doesn't work on mac sed.
HTML_FILTER="$SED \
- -e 's/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{6\}/<DATE>/g' \
+ -e 's/20[0-9]\{2\}-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{6\}/<DATE>/g' \
+ -e 's/20[0-9]\{2\}-[0-9]\{2\}-[0-9]\{2\}/<DATE>/g' \
-e 's/\(-- Generated by javadoc \).*\( --\)/\1(removed)\2/' \
- -e 's/[A-Z][a-z]*, [A-Z][a-z]* [0-9][0-9]*, [0-9]\{4\} [0-9][0-9:]* [AMP]\{2,2\} [A-Z][A-Z]*/<DATE>/'
+ -e 's/[A-Z][a-z]*, [A-Z][a-z]* [0-9][0-9]*, [0-9]\{4\} [0-9][0-9:]* [AMP]\{2,2\} [A-Z][A-Z]*/<DATE>/' \
+ -e 's/from .*\.idl/\.idl/' \
"
$CAT $OTHER_DIR/$f | eval "$HTML_FILTER" > $OTHER_FILE &
$CAT $THIS_DIR/$f | eval "$HTML_FILTER" > $THIS_FILE &
--- a/corba/.hgtags Thu Jun 23 17:07:31 2016 -0700
+++ b/corba/.hgtags Wed Jun 29 21:49:41 2016 -0700
@@ -366,3 +366,4 @@
9a5fc5a27560ac272c1341f8f3838338fba49059 jdk-9+121
a39131aafc51a6fd8836e6ebe1b04458702ce7d6 jdk-9+122
e33a34cc551907617d8129c4faaf1a5a7e61d21c jdk-9+123
+45121d5afb9d5bfadab75378572ad96832e0809e jdk-9+124
--- a/corba/src/java.corba/share/classes/com/sun/corba/se/impl/io/IIOPInputStream.java Thu Jun 23 17:07:31 2016 -0700
+++ b/corba/src/java.corba/share/classes/com/sun/corba/se/impl/io/IIOPInputStream.java Wed Jun 29 21:49:41 2016 -0700
@@ -2230,7 +2230,7 @@
* REVISIT -- This code doesn't do what the comment says to when
* getField() is null!
*/
- private void inputClassFields(Object o, Class cl,
+ private void inputClassFields(Object o, Class<?> cl,
ObjectStreamField[] fields,
com.sun.org.omg.SendingContext.CodeBase sender)
throws InvalidClassException, StreamCorruptedException,
@@ -2239,6 +2239,8 @@
int primFields = fields.length - currentClassDesc.objFields;
+ // this will leave primitives in the inputstream
+ // should really consume and discard where necessary
if (o != null) {
for (int i = 0; i < primFields; ++i) {
inputPrimitiveField(o, cl, fields[i]);
@@ -2264,21 +2266,32 @@
}
try {
- Class fieldCl = fields[i].getClazz();
+ Class<?> fieldCl = fields[i].getClazz();
if ((objectValue != null)
&& (!fieldCl.isAssignableFrom(
objectValue.getClass()))) {
throw new IllegalArgumentException("Field mismatch");
}
- Field classField = null;
+ Field declaredClassField = null;
+ final String inputStreamFieldName = fields[i].getName();
try {
- classField = cl.getDeclaredField(fields[i].getName());
- } catch (NoSuchFieldException nsfEx) {
- throw new IllegalArgumentException(nsfEx);
+ declaredClassField = getDeclaredField( cl, inputStreamFieldName);
+ } catch (PrivilegedActionException paEx) {
+ throw new IllegalArgumentException(
+ (NoSuchFieldException) paEx.getException());
} catch (SecurityException secEx) {
- throw new IllegalArgumentException(secEx.getCause());
+ throw new IllegalArgumentException(secEx);
+ } catch (NullPointerException npEx) {
+ continue;
+ } catch (NoSuchFieldException e) {
+ continue;
}
- Class<?> declaredFieldClass = classField.getType();
+
+ if (declaredClassField == null) {
+ continue;
+ }
+
+ Class<?> declaredFieldClass = declaredClassField.getType();
// check input field type is a declared field type
// input field is a subclass of the declared field
@@ -2291,15 +2304,24 @@
}
bridge.putObject( o, fields[i].getFieldID(), objectValue ) ;
// reflective code: fields[i].getField().set( o, objectValue ) ;
- } catch (IllegalArgumentException e) {
- ClassCastException exc = new ClassCastException("Assigning instance of class " +
- objectValue.getClass().getName() +
- " to field " +
- currentClassDesc.getName() +
- '#' +
- fields[i].getField().getName());
- exc.initCause( e ) ;
- throw exc ;
+ } catch (IllegalArgumentException iaEx) {
+ String objectValueClassName = "null";
+ String currentClassDescClassName = "null";
+ String fieldName = "null";
+ if (objectValue != null) {
+ objectValueClassName = objectValue.getClass().getName();
+ }
+ if (currentClassDesc != null) {
+ currentClassDescClassName = currentClassDesc.getName();
+ }
+ if (fields[i] != null && fields[i].getField() != null) {
+ fieldName = fields[i].getField().getName();
+ }
+ ClassCastException ccEx = new ClassCastException(
+ "Assigning instance of class " + objectValueClassName
+ + " to field " + currentClassDescClassName + '#' + fieldName);
+ ccEx.initCause( iaEx ) ;
+ throw ccEx ;
}
} // end : for loop
}
@@ -2592,12 +2614,11 @@
throw cce ;
}
}
-
}
- private static void setObjectField(Object o, Class c, String fieldName, Object v) {
+ private static void setObjectField(Object o, Class<?> c, String fieldName, Object v) {
try {
- Field fld = c.getDeclaredField( fieldName ) ;
+ Field fld = getDeclaredField( c, fieldName ) ;
Class fieldCl = fld.getType();
if(v != null && !fieldCl.isInstance(v)) {
throw new Exception();
@@ -2617,10 +2638,10 @@
}
}
- private static void setBooleanField(Object o, Class c, String fieldName, boolean v)
+ private static void setBooleanField(Object o, Class<?> c, String fieldName, boolean v)
{
try {
- Field fld = c.getDeclaredField( fieldName ) ;
+ Field fld = getDeclaredField( c, fieldName ) ;
if ((fld != null) && (fld.getType() == Boolean.TYPE)) {
long key = bridge.objectFieldOffset( fld ) ;
bridge.putBoolean( o, key, v ) ;
@@ -2640,10 +2661,10 @@
}
}
- private static void setByteField(Object o, Class c, String fieldName, byte v)
+ private static void setByteField(Object o, Class<?> c, String fieldName, byte v)
{
try {
- Field fld = c.getDeclaredField( fieldName ) ;
+ Field fld = getDeclaredField( c, fieldName ) ;
if ((fld != null) && (fld.getType() == Byte.TYPE)) {
long key = bridge.objectFieldOffset( fld ) ;
bridge.putByte( o, key, v ) ;
@@ -2663,10 +2684,10 @@
}
}
- private static void setCharField(Object o, Class c, String fieldName, char v)
+ private static void setCharField(Object o, Class<?> c, String fieldName, char v)
{
try {
- Field fld = c.getDeclaredField( fieldName ) ;
+ Field fld = getDeclaredField( c, fieldName ) ;
if ((fld != null) && (fld.getType() == Character.TYPE)) {
long key = bridge.objectFieldOffset( fld ) ;
bridge.putChar( o, key, v ) ;
@@ -2686,10 +2707,10 @@
}
}
- private static void setShortField(Object o, Class c, String fieldName, short v)
+ private static void setShortField(Object o, Class<?> c, String fieldName, short v)
{
try {
- Field fld = c.getDeclaredField( fieldName ) ;
+ Field fld = getDeclaredField( c, fieldName ) ;
if ((fld != null) && (fld.getType() == Short.TYPE)) {
long key = bridge.objectFieldOffset( fld ) ;
bridge.putShort( o, key, v ) ;
@@ -2709,10 +2730,10 @@
}
}
- private static void setIntField(Object o, Class c, String fieldName, int v)
+ private static void setIntField(Object o, Class<?> c, String fieldName, int v)
{
try {
- Field fld = c.getDeclaredField( fieldName ) ;
+ Field fld = getDeclaredField( c, fieldName ) ;
if ((fld != null) && (fld.getType() == Integer.TYPE)) {
long key = bridge.objectFieldOffset( fld ) ;
bridge.putInt( o, key, v ) ;
@@ -2732,10 +2753,10 @@
}
}
- private static void setLongField(Object o, Class c, String fieldName, long v)
+ private static void setLongField(Object o, Class<?> c, String fieldName, long v)
{
try {
- Field fld = c.getDeclaredField( fieldName ) ;
+ Field fld = getDeclaredField( c, fieldName ) ;
if ((fld != null) && (fld.getType() == Long.TYPE)) {
long key = bridge.objectFieldOffset( fld ) ;
bridge.putLong( o, key, v ) ;
@@ -2755,10 +2776,10 @@
}
}
- private static void setFloatField(Object o, Class c, String fieldName, float v)
+ private static void setFloatField(Object o, Class<?> c, String fieldName, float v)
{
try {
- Field fld = c.getDeclaredField( fieldName ) ;
+ Field fld = getDeclaredField( c, fieldName ) ;
if ((fld != null) && (fld.getType() == Float.TYPE)) {
long key = bridge.objectFieldOffset( fld ) ;
bridge.putFloat( o, key, v ) ;
@@ -2778,10 +2799,10 @@
}
}
- private static void setDoubleField(Object o, Class c, String fieldName, double v)
+ private static void setDoubleField(Object o, Class<?> c, String fieldName, double v)
{
try {
- Field fld = c.getDeclaredField( fieldName ) ;
+ Field fld = getDeclaredField( c, fieldName ) ;
if ((fld != null) && (fld.getType() == Double.TYPE)) {
long key = bridge.objectFieldOffset( fld ) ;
bridge.putDouble( o, key, v ) ;
@@ -2801,6 +2822,22 @@
}
}
+
+ private static Field getDeclaredField(final Class<?> c,
+ final String fieldName)
+ throws PrivilegedActionException, NoSuchFieldException, SecurityException {
+ if (System.getSecurityManager() == null) {
+ return c.getDeclaredField(fieldName);
+ } else {
+ return AccessController
+ .doPrivileged(new PrivilegedExceptionAction<Field>() {
+ public Field run() throws NoSuchFieldException {
+ return c.getDeclaredField(fieldName);
+ }
+ });
+ }
+ }
+
/**
* This class maintains a map of stream position to
* an Object currently being deserialized. It is used
@@ -2811,12 +2848,12 @@
*/
static class ActiveRecursionManager
{
- private Map offsetToObjectMap;
+ private Map<Integer, Object> offsetToObjectMap;
public ActiveRecursionManager() {
// A hash map is unsynchronized and allows
// null values
- offsetToObjectMap = new HashMap();
+ offsetToObjectMap = new HashMap<>();
}
// Called right after allocating a new object.
--- a/hotspot/.hgtags Thu Jun 23 17:07:31 2016 -0700
+++ b/hotspot/.hgtags Wed Jun 29 21:49:41 2016 -0700
@@ -526,3 +526,4 @@
7e293105dbb0789a468655f81320c891f491f371 jdk-9+121
af6b4ad908e732d23021f12e8322b204433d5cf6 jdk-9+122
75f81e1fecfb444f34f357295fe06af60e2762d9 jdk-9+123
+479631362b4930be985245ea063d87d821a472eb jdk-9+124
--- a/hotspot/src/os/aix/vm/globals_aix.hpp Thu Jun 23 17:07:31 2016 -0700
+++ b/hotspot/src/os/aix/vm/globals_aix.hpp Wed Jun 29 21:49:41 2016 -0700
@@ -35,6 +35,7 @@
product, \
product_pd, \
diagnostic, \
+ diagnostic_pd, \
notproduct, \
range, \
constraint, \
--- a/hotspot/src/os/bsd/vm/globals_bsd.hpp Thu Jun 23 17:07:31 2016 -0700
+++ b/hotspot/src/os/bsd/vm/globals_bsd.hpp Wed Jun 29 21:49:41 2016 -0700
@@ -33,6 +33,7 @@
product, \
product_pd, \
diagnostic, \
+ diagnostic_pd, \
notproduct, \
range, \
constraint, \
--- a/hotspot/src/os/linux/vm/globals_linux.hpp Thu Jun 23 17:07:31 2016 -0700
+++ b/hotspot/src/os/linux/vm/globals_linux.hpp Wed Jun 29 21:49:41 2016 -0700
@@ -33,6 +33,7 @@
product, \
product_pd, \
diagnostic, \
+ diagnostic_pd, \
notproduct, \
range, \
constraint, \
--- a/hotspot/src/os/solaris/vm/globals_solaris.hpp Thu Jun 23 17:07:31 2016 -0700
+++ b/hotspot/src/os/solaris/vm/globals_solaris.hpp Wed Jun 29 21:49:41 2016 -0700
@@ -33,6 +33,7 @@
product, \
product_pd, \
diagnostic, \
+ diagnostic_pd, \
notproduct, \
range, \
constraint, \
--- a/hotspot/src/os/windows/vm/globals_windows.hpp Thu Jun 23 17:07:31 2016 -0700
+++ b/hotspot/src/os/windows/vm/globals_windows.hpp Wed Jun 29 21:49:41 2016 -0700
@@ -33,6 +33,7 @@
product, \
product_pd, \
diagnostic, \
+ diagnostic_pd, \
notproduct, \
range, \
constraint, \
--- a/hotspot/src/share/vm/c1/c1_globals.cpp Thu Jun 23 17:07:31 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_globals.cpp Wed Jun 29 21:49:41 2016 -0700
@@ -30,6 +30,7 @@
MATERIALIZE_PRODUCT_FLAG, \
MATERIALIZE_PD_PRODUCT_FLAG, \
MATERIALIZE_DIAGNOSTIC_FLAG, \
+ MATERIALIZE_PD_DIAGNOSTIC_FLAG, \
MATERIALIZE_NOTPRODUCT_FLAG, \
IGNORE_RANGE, \
IGNORE_CONSTRAINT, \
--- a/hotspot/src/share/vm/c1/c1_globals.hpp Thu Jun 23 17:07:31 2016 -0700
+++ b/hotspot/src/share/vm/c1/c1_globals.hpp Wed Jun 29 21:49:41 2016 -0700
@@ -65,6 +65,7 @@
product, \
product_pd, \
diagnostic, \
+ diagnostic_pd, \
notproduct, \
range, \
constraint, \
@@ -356,6 +357,7 @@
DECLARE_PRODUCT_FLAG, \
DECLARE_PD_PRODUCT_FLAG, \
DECLARE_DIAGNOSTIC_FLAG, \
+ DECLARE_PD_DIAGNOSTIC_FLAG, \
DECLARE_NOTPRODUCT_FLAG, \
IGNORE_RANGE, \
IGNORE_CONSTRAINT, \
--- a/hotspot/src/share/vm/gc/g1/g1_globals.cpp Thu Jun 23 17:07:31 2016 -0700
+++ b/hotspot/src/share/vm/gc/g1/g1_globals.cpp Wed Jun 29 21:49:41 2016 -0700
@@ -30,6 +30,7 @@
MATERIALIZE_PRODUCT_FLAG, \
MATERIALIZE_PD_PRODUCT_FLAG, \
MATERIALIZE_DIAGNOSTIC_FLAG, \
+ MATERIALIZE_PD_DIAGNOSTIC_FLAG, \
MATERIALIZE_EXPERIMENTAL_FLAG, \
MATERIALIZE_NOTPRODUCT_FLAG, \
MATERIALIZE_MANAGEABLE_FLAG, \
--- a/hotspot/src/share/vm/gc/g1/g1_globals.hpp Thu Jun 23 17:07:31 2016 -0700
+++ b/hotspot/src/share/vm/gc/g1/g1_globals.hpp Wed Jun 29 21:49:41 2016 -0700
@@ -36,6 +36,7 @@
product, \
product_pd, \
diagnostic, \
+ diagnostic_pd, \
experimental, \
notproduct, \
manageable, \
@@ -323,6 +324,7 @@
DECLARE_PRODUCT_FLAG, \
DECLARE_PD_PRODUCT_FLAG, \
DECLARE_DIAGNOSTIC_FLAG, \
+ DECLARE_PD_DIAGNOSTIC_FLAG, \
DECLARE_EXPERIMENTAL_FLAG, \
DECLARE_NOTPRODUCT_FLAG, \
DECLARE_MANAGEABLE_FLAG, \
--- a/hotspot/src/share/vm/jvmci/jvmci_globals.cpp Thu Jun 23 17:07:31 2016 -0700
+++ b/hotspot/src/share/vm/jvmci/jvmci_globals.cpp Wed Jun 29 21:49:41 2016 -0700
@@ -32,6 +32,7 @@
MATERIALIZE_PRODUCT_FLAG, \
MATERIALIZE_PD_PRODUCT_FLAG, \
MATERIALIZE_DIAGNOSTIC_FLAG, \
+ MATERIALIZE_PD_DIAGNOSTIC_FLAG, \
MATERIALIZE_EXPERIMENTAL_FLAG, \
MATERIALIZE_NOTPRODUCT_FLAG,
IGNORE_RANGE, \
@@ -89,6 +90,7 @@
JVMCI_IGNORE_FLAG_FOUR_PARAM, \
JVMCI_IGNORE_FLAG_THREE_PARAM, \
JVMCI_DIAGNOSTIC_FLAG_VALUE_CHANGED_CHECK_CODE, \
+ JVMCI_IGNORE_FLAG_THREE_PARAM, \
JVMCI_IGNORE_FLAG_FOUR_PARAM, \
JVMCI_IGNORE_FLAG_FOUR_PARAM, \
IGNORE_RANGE, \
@@ -104,6 +106,7 @@
JVMCI_IGNORE_FLAG_FOUR_PARAM, \
JVMCI_IGNORE_FLAG_THREE_PARAM, \
JVMCI_IGNORE_FLAG_FOUR_PARAM, \
+ JVMCI_IGNORE_FLAG_THREE_PARAM, \
JVMCI_EXPERIMENTAL_FLAG_VALUE_CHANGED_CHECK_CODE, \
JVMCI_IGNORE_FLAG_FOUR_PARAM, \
IGNORE_RANGE, \
@@ -129,6 +132,7 @@
JVMCI_PRODUCT_FLAG_VALUE_CHANGED_CHECK_CODE, \
JVMCI_PD_PRODUCT_FLAG_VALUE_CHANGED_CHECK_CODE, \
JVMCI_IGNORE_FLAG_FOUR_PARAM, \
+ JVMCI_IGNORE_FLAG_THREE_PARAM, \
JVMCI_IGNORE_FLAG_FOUR_PARAM, \
JVMCI_NOTPRODUCT_FLAG_VALUE_CHANGED_CHECK_CODE, \
IGNORE_RANGE, \
@@ -168,6 +172,7 @@
JVMCI_IGNORE_FLAG_FOUR_PARAM, \
JVMCI_IGNORE_FLAG_THREE_PARAM, \
JVMCI_DIAGNOSTIC_FLAG_CHECK_PRINT_ERR_MSG_CODE, \
+ JVMCI_IGNORE_FLAG_THREE_PARAM, \
JVMCI_IGNORE_FLAG_FOUR_PARAM, \
JVMCI_IGNORE_FLAG_FOUR_PARAM, \
IGNORE_RANGE, \
@@ -181,6 +186,7 @@
JVMCI_IGNORE_FLAG_FOUR_PARAM, \
JVMCI_IGNORE_FLAG_THREE_PARAM, \
JVMCI_IGNORE_FLAG_FOUR_PARAM, \
+ JVMCI_IGNORE_FLAG_THREE_PARAM, \
JVMCI_EXPERIMENTAL_FLAG_CHECK_PRINT_ERR_MSG_CODE, \
JVMCI_IGNORE_FLAG_FOUR_PARAM, \
IGNORE_RANGE, \
@@ -206,6 +212,7 @@
JVMCI_PRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE, \
JVMCI_PD_PRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE, \
JVMCI_IGNORE_FLAG_FOUR_PARAM, \
+ JVMCI_IGNORE_FLAG_THREE_PARAM, \
JVMCI_IGNORE_FLAG_FOUR_PARAM, \
JVMCI_NOTPRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE, \
IGNORE_RANGE, \
--- a/hotspot/src/share/vm/jvmci/jvmci_globals.hpp Thu Jun 23 17:07:31 2016 -0700
+++ b/hotspot/src/share/vm/jvmci/jvmci_globals.hpp Wed Jun 29 21:49:41 2016 -0700
@@ -37,6 +37,7 @@
product, \
product_pd, \
diagnostic, \
+ diagnostic_pd, \
experimental, \
notproduct, \
range, \
@@ -102,6 +103,7 @@
DECLARE_PRODUCT_FLAG, \
DECLARE_PD_PRODUCT_FLAG, \
DECLARE_DIAGNOSTIC_FLAG, \
+ DECLARE_PD_DIAGNOSTIC_FLAG, \
DECLARE_EXPERIMENTAL_FLAG, \
DECLARE_NOTPRODUCT_FLAG, \
IGNORE_RANGE, \
--- a/hotspot/src/share/vm/opto/c2_globals.cpp Thu Jun 23 17:07:31 2016 -0700
+++ b/hotspot/src/share/vm/opto/c2_globals.cpp Wed Jun 29 21:49:41 2016 -0700
@@ -30,6 +30,7 @@
MATERIALIZE_PRODUCT_FLAG, \
MATERIALIZE_PD_PRODUCT_FLAG, \
MATERIALIZE_DIAGNOSTIC_FLAG, \
+ MATERIALIZE_PD_DIAGNOSTIC_FLAG, \
MATERIALIZE_EXPERIMENTAL_FLAG, \
MATERIALIZE_NOTPRODUCT_FLAG, \
IGNORE_RANGE, \
--- a/hotspot/src/share/vm/opto/c2_globals.hpp Thu Jun 23 17:07:31 2016 -0700
+++ b/hotspot/src/share/vm/opto/c2_globals.hpp Wed Jun 29 21:49:41 2016 -0700
@@ -66,6 +66,7 @@
product, \
product_pd, \
diagnostic, \
+ diagnostic_pd, \
experimental, \
notproduct, \
range, \
@@ -203,7 +204,7 @@
"Map number of unrolls for main loop via " \
"Superword Level Parallelism analysis") \
\
- product_pd(bool, PostLoopMultiversioning, \
+ diagnostic_pd(bool, PostLoopMultiversioning, \
"Multi versioned post loops to eliminate range checks") \
\
notproduct(bool, TraceSuperWordLoopUnrollAnalysis, false, \
@@ -764,6 +765,7 @@
DECLARE_PRODUCT_FLAG, \
DECLARE_PD_PRODUCT_FLAG, \
DECLARE_DIAGNOSTIC_FLAG, \
+ DECLARE_PD_DIAGNOSTIC_FLAG, \
DECLARE_EXPERIMENTAL_FLAG, \
DECLARE_NOTPRODUCT_FLAG, \
IGNORE_RANGE, \
--- a/hotspot/src/share/vm/runtime/commandLineFlagConstraintList.cpp Thu Jun 23 17:07:31 2016 -0700
+++ b/hotspot/src/share/vm/runtime/commandLineFlagConstraintList.cpp Wed Jun 29 21:49:41 2016 -0700
@@ -211,6 +211,7 @@
#define EMIT_CONSTRAINT_MANAGEABLE_FLAG(type, name, value, doc) ); emit_constraint_##type(#name
#define EMIT_CONSTRAINT_PRODUCT_RW_FLAG(type, name, value, doc) ); emit_constraint_##type(#name
#define EMIT_CONSTRAINT_PD_PRODUCT_FLAG(type, name, doc) ); emit_constraint_##type(#name
+#define EMIT_CONSTRAINT_PD_DIAGNOSTIC_FLAG(type, name, doc) ); emit_constraint_##type(#name
#define EMIT_CONSTRAINT_DEVELOPER_FLAG(type, name, value, doc) ); emit_constraint_##type(#name
#define EMIT_CONSTRAINT_PD_DEVELOPER_FLAG(type, name, doc) ); emit_constraint_##type(#name
#define EMIT_CONSTRAINT_NOTPRODUCT_FLAG(type, name, value, doc) ); emit_constraint_##type(#name
@@ -233,6 +234,7 @@
EMIT_CONSTRAINT_PRODUCT_FLAG,
EMIT_CONSTRAINT_PD_PRODUCT_FLAG,
EMIT_CONSTRAINT_DIAGNOSTIC_FLAG,
+ EMIT_CONSTRAINT_PD_DIAGNOSTIC_FLAG,
EMIT_CONSTRAINT_EXPERIMENTAL_FLAG,
EMIT_CONSTRAINT_NOTPRODUCT_FLAG,
EMIT_CONSTRAINT_MANAGEABLE_FLAG,
@@ -260,6 +262,7 @@
EMIT_CONSTRAINT_PRODUCT_FLAG,
EMIT_CONSTRAINT_PD_PRODUCT_FLAG,
EMIT_CONSTRAINT_DIAGNOSTIC_FLAG,
+ EMIT_CONSTRAINT_PD_DIAGNOSTIC_FLAG,
EMIT_CONSTRAINT_NOTPRODUCT_FLAG,
IGNORE_RANGE,
EMIT_CONSTRAINT_CHECK,
@@ -272,6 +275,7 @@
EMIT_CONSTRAINT_PRODUCT_FLAG,
EMIT_CONSTRAINT_PD_PRODUCT_FLAG,
EMIT_CONSTRAINT_DIAGNOSTIC_FLAG,
+ EMIT_CONSTRAINT_PD_DIAGNOSTIC_FLAG,
EMIT_CONSTRAINT_EXPERIMENTAL_FLAG,
EMIT_CONSTRAINT_NOTPRODUCT_FLAG,
IGNORE_RANGE,
@@ -285,6 +289,7 @@
EMIT_CONSTRAINT_PRODUCT_FLAG,
EMIT_CONSTRAINT_PD_PRODUCT_FLAG,
EMIT_CONSTRAINT_DIAGNOSTIC_FLAG,
+ EMIT_CONSTRAINT_PD_DIAGNOSTIC_FLAG,
EMIT_CONSTRAINT_EXPERIMENTAL_FLAG,
EMIT_CONSTRAINT_NOTPRODUCT_FLAG,
EMIT_CONSTRAINT_MANAGEABLE_FLAG,
--- a/hotspot/src/share/vm/runtime/commandLineFlagRangeList.cpp Thu Jun 23 17:07:31 2016 -0700
+++ b/hotspot/src/share/vm/runtime/commandLineFlagRangeList.cpp Wed Jun 29 21:49:41 2016 -0700
@@ -278,6 +278,7 @@
#define EMIT_RANGE_MANAGEABLE_FLAG(type, name, value, doc) ); emit_range_##type(#name
#define EMIT_RANGE_PRODUCT_RW_FLAG(type, name, value, doc) ); emit_range_##type(#name
#define EMIT_RANGE_PD_PRODUCT_FLAG(type, name, doc) ); emit_range_##type(#name
+#define EMIT_RANGE_PD_DIAGNOSTIC_FLAG(type, name, doc) ); emit_range_##type(#name
#define EMIT_RANGE_DEVELOPER_FLAG(type, name, value, doc) ); emit_range_##type(#name
#define EMIT_RANGE_PD_DEVELOPER_FLAG(type, name, doc) ); emit_range_##type(#name
#define EMIT_RANGE_NOTPRODUCT_FLAG(type, name, value, doc) ); emit_range_##type(#name
@@ -299,6 +300,7 @@
EMIT_RANGE_PRODUCT_FLAG,
EMIT_RANGE_PD_PRODUCT_FLAG,
EMIT_RANGE_DIAGNOSTIC_FLAG,
+ EMIT_RANGE_PD_DIAGNOSTIC_FLAG,
EMIT_RANGE_EXPERIMENTAL_FLAG,
EMIT_RANGE_NOTPRODUCT_FLAG,
EMIT_RANGE_MANAGEABLE_FLAG,
@@ -325,6 +327,7 @@
EMIT_RANGE_PRODUCT_FLAG,
EMIT_RANGE_PD_PRODUCT_FLAG,
EMIT_RANGE_DIAGNOSTIC_FLAG,
+ EMIT_RANGE_PD_DIAGNOSTIC_FLAG,
EMIT_RANGE_EXPERIMENTAL_FLAG,
EMIT_RANGE_NOTPRODUCT_FLAG,
EMIT_RANGE_CHECK,
@@ -338,6 +341,7 @@
EMIT_RANGE_PRODUCT_FLAG,
EMIT_RANGE_PD_PRODUCT_FLAG,
EMIT_RANGE_DIAGNOSTIC_FLAG,
+ EMIT_RANGE_PD_DIAGNOSTIC_FLAG,
EMIT_RANGE_NOTPRODUCT_FLAG,
EMIT_RANGE_CHECK,
IGNORE_CONSTRAINT,
@@ -350,6 +354,7 @@
EMIT_RANGE_PRODUCT_FLAG,
EMIT_RANGE_PD_PRODUCT_FLAG,
EMIT_RANGE_DIAGNOSTIC_FLAG,
+ EMIT_RANGE_PD_DIAGNOSTIC_FLAG,
EMIT_RANGE_EXPERIMENTAL_FLAG,
EMIT_RANGE_NOTPRODUCT_FLAG,
EMIT_RANGE_CHECK,
@@ -363,6 +368,7 @@
EMIT_RANGE_PRODUCT_FLAG,
EMIT_RANGE_PD_PRODUCT_FLAG,
EMIT_RANGE_DIAGNOSTIC_FLAG,
+ EMIT_RANGE_PD_DIAGNOSTIC_FLAG,
EMIT_RANGE_EXPERIMENTAL_FLAG,
EMIT_RANGE_NOTPRODUCT_FLAG,
EMIT_RANGE_MANAGEABLE_FLAG,
--- a/hotspot/src/share/vm/runtime/commandLineFlagWriteableList.cpp Thu Jun 23 17:07:31 2016 -0700
+++ b/hotspot/src/share/vm/runtime/commandLineFlagWriteableList.cpp Wed Jun 29 21:49:41 2016 -0700
@@ -108,6 +108,7 @@
#define EMIT_WRITEABLE_PD_PRODUCT_FLAG(type, name, doc) ); emit_writeable_##type(#name
#define EMIT_WRITEABLE_DEVELOPER_FLAG(type, name, value, doc) ); emit_writeable_##type(#name
#define EMIT_WRITEABLE_PD_DEVELOPER_FLAG(type, name, doc) ); emit_writeable_##type(#name
+#define EMIT_WRITEABLE_PD_DIAGNOSTIC_FLAG(type, name, doc) ); emit_writeable_##type(#name
#define EMIT_WRITEABLE_NOTPRODUCT_FLAG(type, name, value, doc) ); emit_writeable_##type(#name
#define EMIT_WRITEABLE_LP64_PRODUCT_FLAG(type, name, value, doc) ); emit_writeable_##type(#name
@@ -126,6 +127,7 @@
EMIT_WRITEABLE_PRODUCT_FLAG,
EMIT_WRITEABLE_PD_PRODUCT_FLAG,
EMIT_WRITEABLE_DIAGNOSTIC_FLAG,
+ EMIT_WRITEABLE_PD_DIAGNOSTIC_FLAG,
EMIT_WRITEABLE_EXPERIMENTAL_FLAG,
EMIT_WRITEABLE_NOTPRODUCT_FLAG,
EMIT_WRITEABLE_MANAGEABLE_FLAG,
@@ -152,6 +154,7 @@
EMIT_WRITEABLE_PRODUCT_FLAG,
EMIT_WRITEABLE_PD_PRODUCT_FLAG,
EMIT_WRITEABLE_DIAGNOSTIC_FLAG,
+ EMIT_WRITEABLE_PD_DIAGNOSTIC_FLAG,
EMIT_WRITEABLE_EXPERIMENTAL_FLAG,
EMIT_WRITEABLE_NOTPRODUCT_FLAG,
IGNORE_RANGE,
@@ -165,6 +168,7 @@
EMIT_WRITEABLE_PRODUCT_FLAG,
EMIT_WRITEABLE_PD_PRODUCT_FLAG,
EMIT_WRITEABLE_DIAGNOSTIC_FLAG,
+ EMIT_WRITEABLE_PD_DIAGNOSTIC_FLAG,
EMIT_WRITEABLE_NOTPRODUCT_FLAG,
IGNORE_RANGE,
IGNORE_CONSTRAINT,
@@ -177,6 +181,7 @@
EMIT_WRITEABLE_PRODUCT_FLAG,
EMIT_WRITEABLE_PD_PRODUCT_FLAG,
EMIT_WRITEABLE_DIAGNOSTIC_FLAG,
+ EMIT_WRITEABLE_PD_DIAGNOSTIC_FLAG,
EMIT_WRITEABLE_EXPERIMENTAL_FLAG,
EMIT_WRITEABLE_NOTPRODUCT_FLAG,
IGNORE_RANGE,
@@ -190,6 +195,7 @@
EMIT_WRITEABLE_PRODUCT_FLAG,
EMIT_WRITEABLE_PD_PRODUCT_FLAG,
EMIT_WRITEABLE_DIAGNOSTIC_FLAG,
+ EMIT_WRITEABLE_PD_DIAGNOSTIC_FLAG,
EMIT_WRITEABLE_EXPERIMENTAL_FLAG,
EMIT_WRITEABLE_NOTPRODUCT_FLAG,
EMIT_WRITEABLE_MANAGEABLE_FLAG,
--- a/hotspot/src/share/vm/runtime/globals.cpp Thu Jun 23 17:07:31 2016 -0700
+++ b/hotspot/src/share/vm/runtime/globals.cpp Wed Jun 29 21:49:41 2016 -0700
@@ -58,6 +58,7 @@
MATERIALIZE_PRODUCT_FLAG, \
MATERIALIZE_PD_PRODUCT_FLAG, \
MATERIALIZE_DIAGNOSTIC_FLAG, \
+ MATERIALIZE_PD_DIAGNOSTIC_FLAG, \
MATERIALIZE_EXPERIMENTAL_FLAG, \
MATERIALIZE_NOTPRODUCT_FLAG, \
MATERIALIZE_MANAGEABLE_FLAG, \
@@ -72,6 +73,7 @@
MATERIALIZE_PRODUCT_FLAG, \
MATERIALIZE_PD_PRODUCT_FLAG, \
MATERIALIZE_DIAGNOSTIC_FLAG, \
+ MATERIALIZE_PD_DIAGNOSTIC_FLAG, \
MATERIALIZE_NOTPRODUCT_FLAG, \
IGNORE_RANGE, \
IGNORE_CONSTRAINT, \
@@ -650,6 +652,7 @@
#define RUNTIME_PRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_PRODUCT) },
#define RUNTIME_PD_PRODUCT_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_PRODUCT | Flag::KIND_PLATFORM_DEPENDENT) },
#define RUNTIME_DIAGNOSTIC_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_DIAGNOSTIC) },
+#define RUNTIME_PD_DIAGNOSTIC_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_DIAGNOSTIC | Flag::KIND_PLATFORM_DEPENDENT) },
#define RUNTIME_EXPERIMENTAL_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_EXPERIMENTAL) },
#define RUNTIME_MANAGEABLE_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_MANAGEABLE) },
#define RUNTIME_PRODUCT_RW_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_PRODUCT | Flag::KIND_READ_WRITE) },
@@ -660,6 +663,7 @@
#define JVMCI_PRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_JVMCI | Flag::KIND_PRODUCT) },
#define JVMCI_PD_PRODUCT_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_JVMCI | Flag::KIND_PRODUCT | Flag::KIND_PLATFORM_DEPENDENT) },
#define JVMCI_DIAGNOSTIC_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_JVMCI | Flag::KIND_DIAGNOSTIC) },
+#define JVMCI_PD_DIAGNOSTIC_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_JVMCI | Flag::KIND_DIAGNOSTIC | Flag::KIND_PLATFORM_DEPENDENT) },
#define JVMCI_EXPERIMENTAL_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_JVMCI | Flag::KIND_EXPERIMENTAL) },
#define JVMCI_DEVELOP_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), (void*) &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_JVMCI | Flag::KIND_DEVELOP) },
#define JVMCI_PD_DEVELOP_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), (void*) &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_JVMCI | Flag::KIND_DEVELOP | Flag::KIND_PLATFORM_DEPENDENT) },
@@ -674,6 +678,7 @@
#define C1_PRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_PRODUCT) },
#define C1_PD_PRODUCT_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_PRODUCT | Flag::KIND_PLATFORM_DEPENDENT) },
#define C1_DIAGNOSTIC_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_DIAGNOSTIC) },
+#define C1_PD_DIAGNOSTIC_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_DIAGNOSTIC | Flag::KIND_PLATFORM_DEPENDENT) },
#define C1_DEVELOP_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), (void*) &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_DEVELOP) },
#define C1_PD_DEVELOP_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), (void*) &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_DEVELOP | Flag::KIND_PLATFORM_DEPENDENT) },
#define C1_NOTPRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), (void*) &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_NOT_PRODUCT) },
@@ -681,6 +686,7 @@
#define C2_PRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_PRODUCT) },
#define C2_PD_PRODUCT_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_PRODUCT | Flag::KIND_PLATFORM_DEPENDENT) },
#define C2_DIAGNOSTIC_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_DIAGNOSTIC) },
+#define C2_PD_DIAGNOSTIC_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_DIAGNOSTIC | Flag::KIND_PLATFORM_DEPENDENT) },
#define C2_EXPERIMENTAL_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_EXPERIMENTAL) },
#define C2_DEVELOP_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), (void*) &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_DEVELOP) },
#define C2_PD_DEVELOP_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), (void*) &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_DEVELOP | Flag::KIND_PLATFORM_DEPENDENT) },
@@ -695,6 +701,7 @@
#define SHARK_PRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_PRODUCT) },
#define SHARK_PD_PRODUCT_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_PRODUCT | Flag::KIND_PLATFORM_DEPENDENT) },
#define SHARK_DIAGNOSTIC_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_DIAGNOSTIC) },
+#define SHARK_PD_DIAGNOSTIC_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_DIAGNOSTIC | Flag::KIND_PLATFORM_DEPENDENT) },
#define SHARK_DEVELOP_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), (void*) &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_DEVELOP) },
#define SHARK_PD_DEVELOP_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), (void*) &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_DEVELOP | Flag::KIND_PLATFORM_DEPENDENT) },
#define SHARK_NOTPRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), (void*) &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_NOT_PRODUCT) },
@@ -705,6 +712,7 @@
RUNTIME_PRODUCT_FLAG_STRUCT, \
RUNTIME_PD_PRODUCT_FLAG_STRUCT, \
RUNTIME_DIAGNOSTIC_FLAG_STRUCT, \
+ RUNTIME_PD_DIAGNOSTIC_FLAG_STRUCT, \
RUNTIME_EXPERIMENTAL_FLAG_STRUCT, \
RUNTIME_NOTPRODUCT_FLAG_STRUCT, \
RUNTIME_MANAGEABLE_FLAG_STRUCT, \
@@ -718,6 +726,7 @@
RUNTIME_PRODUCT_FLAG_STRUCT, \
RUNTIME_PD_PRODUCT_FLAG_STRUCT, \
RUNTIME_DIAGNOSTIC_FLAG_STRUCT, \
+ RUNTIME_PD_DIAGNOSTIC_FLAG_STRUCT, \
RUNTIME_NOTPRODUCT_FLAG_STRUCT, \
IGNORE_RANGE, \
IGNORE_CONSTRAINT, \
@@ -728,6 +737,7 @@
RUNTIME_PRODUCT_FLAG_STRUCT, \
RUNTIME_PD_PRODUCT_FLAG_STRUCT, \
RUNTIME_DIAGNOSTIC_FLAG_STRUCT, \
+ RUNTIME_PD_DIAGNOSTIC_FLAG_STRUCT, \
RUNTIME_EXPERIMENTAL_FLAG_STRUCT, \
RUNTIME_NOTPRODUCT_FLAG_STRUCT, \
RUNTIME_MANAGEABLE_FLAG_STRUCT, \
@@ -742,6 +752,7 @@
JVMCI_PRODUCT_FLAG_STRUCT, \
JVMCI_PD_PRODUCT_FLAG_STRUCT, \
JVMCI_DIAGNOSTIC_FLAG_STRUCT, \
+ JVMCI_PD_DIAGNOSTIC_FLAG_STRUCT, \
JVMCI_EXPERIMENTAL_FLAG_STRUCT, \
JVMCI_NOTPRODUCT_FLAG_STRUCT, \
IGNORE_RANGE, \
@@ -754,6 +765,7 @@
C1_PRODUCT_FLAG_STRUCT, \
C1_PD_PRODUCT_FLAG_STRUCT, \
C1_DIAGNOSTIC_FLAG_STRUCT, \
+ C1_PD_DIAGNOSTIC_FLAG_STRUCT, \
C1_NOTPRODUCT_FLAG_STRUCT, \
IGNORE_RANGE, \
IGNORE_CONSTRAINT, \
@@ -765,6 +777,7 @@
C2_PRODUCT_FLAG_STRUCT, \
C2_PD_PRODUCT_FLAG_STRUCT, \
C2_DIAGNOSTIC_FLAG_STRUCT, \
+ C2_PD_DIAGNOSTIC_FLAG_STRUCT, \
C2_EXPERIMENTAL_FLAG_STRUCT, \
C2_NOTPRODUCT_FLAG_STRUCT, \
IGNORE_RANGE, \
@@ -777,6 +790,7 @@
SHARK_PRODUCT_FLAG_STRUCT, \
SHARK_PD_PRODUCT_FLAG_STRUCT, \
SHARK_DIAGNOSTIC_FLAG_STRUCT, \
+ SHARK_PD_DIAGNOSTIC_FLAG_STRUCT, \
SHARK_NOTPRODUCT_FLAG_STRUCT, \
IGNORE_RANGE, \
IGNORE_CONSTRAINT, \
--- a/hotspot/src/share/vm/runtime/globals.hpp Thu Jun 23 17:07:31 2016 -0700
+++ b/hotspot/src/share/vm/runtime/globals.hpp Wed Jun 29 21:49:41 2016 -0700
@@ -644,6 +644,7 @@
product, \
product_pd, \
diagnostic, \
+ diagnostic_pd, \
experimental, \
notproduct, \
manageable, \
@@ -2529,7 +2530,7 @@
develop(bool, GenerateRangeChecks, true, \
"Generate range checks for array accesses") \
\
- develop_pd(bool, ImplicitNullChecks, \
+ diagnostic_pd(bool, ImplicitNullChecks, \
"Generate code for implicit null checks") \
\
product_pd(bool, TrapBasedNullChecks, \
@@ -3163,7 +3164,7 @@
"Ratio of call site execution to caller method invocation") \
range(0, max_jint) \
\
- develop_pd(intx, InlineFrequencyCount, \
+ diagnostic_pd(intx, InlineFrequencyCount, \
"Count of call site execution necessary to trigger frequent " \
"inlining") \
range(0, max_jint) \
@@ -4144,7 +4145,7 @@
"in the loaded class C. " \
"Check (3) is available only in debug builds.") \
\
- develop_pd(intx, InitArrayShortSize, \
+ diagnostic_pd(intx, InitArrayShortSize, \
"Threshold small size (in bytes) for clearing arrays. " \
"Anything this size or smaller may get converted to discrete " \
"scalar stores.") \
@@ -4168,6 +4169,7 @@
#define DECLARE_PRODUCT_FLAG(type, name, value, doc) extern "C" type name;
#define DECLARE_PD_PRODUCT_FLAG(type, name, doc) extern "C" type name;
#define DECLARE_DIAGNOSTIC_FLAG(type, name, value, doc) extern "C" type name;
+#define DECLARE_PD_DIAGNOSTIC_FLAG(type, name, doc) extern "C" type name;
#define DECLARE_EXPERIMENTAL_FLAG(type, name, value, doc) extern "C" type name;
#define DECLARE_MANAGEABLE_FLAG(type, name, value, doc) extern "C" type name;
#define DECLARE_PRODUCT_RW_FLAG(type, name, value, doc) extern "C" type name;
@@ -4191,6 +4193,7 @@
#define MATERIALIZE_PRODUCT_FLAG(type, name, value, doc) type name = value;
#define MATERIALIZE_PD_PRODUCT_FLAG(type, name, doc) type name = pd_##name;
#define MATERIALIZE_DIAGNOSTIC_FLAG(type, name, value, doc) type name = value;
+#define MATERIALIZE_PD_DIAGNOSTIC_FLAG(type, name, doc) type name = pd_##name;
#define MATERIALIZE_EXPERIMENTAL_FLAG(type, name, value, doc) type name = value;
#define MATERIALIZE_MANAGEABLE_FLAG(type, name, value, doc) type name = value;
#define MATERIALIZE_PRODUCT_RW_FLAG(type, name, value, doc) type name = value;
@@ -4221,6 +4224,7 @@
DECLARE_PRODUCT_FLAG, \
DECLARE_PD_PRODUCT_FLAG, \
DECLARE_DIAGNOSTIC_FLAG, \
+ DECLARE_PD_DIAGNOSTIC_FLAG, \
DECLARE_EXPERIMENTAL_FLAG, \
DECLARE_NOTPRODUCT_FLAG, \
DECLARE_MANAGEABLE_FLAG, \
@@ -4235,6 +4239,7 @@
DECLARE_PRODUCT_FLAG, \
DECLARE_PD_PRODUCT_FLAG, \
DECLARE_DIAGNOSTIC_FLAG, \
+ DECLARE_PD_DIAGNOSTIC_FLAG, \
DECLARE_NOTPRODUCT_FLAG, \
IGNORE_RANGE, \
IGNORE_CONSTRAINT, \
--- a/hotspot/src/share/vm/runtime/globals_extension.hpp Thu Jun 23 17:07:31 2016 -0700
+++ b/hotspot/src/share/vm/runtime/globals_extension.hpp Wed Jun 29 21:49:41 2016 -0700
@@ -49,6 +49,7 @@
#define RUNTIME_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
#define RUNTIME_PD_PRODUCT_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name),
#define RUNTIME_DIAGNOSTIC_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
+#define RUNTIME_PD_DIAGNOSTIC_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name),
#define RUNTIME_EXPERIMENTAL_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
#define RUNTIME_MANAGEABLE_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
#define RUNTIME_PRODUCT_RW_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
@@ -61,6 +62,7 @@
#define JVMCI_DEVELOP_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
#define JVMCI_PD_DEVELOP_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name),
#define JVMCI_DIAGNOSTIC_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
+#define JVMCI_PD_DIAGNOSTIC_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name),
#define JVMCI_EXPERIMENTAL_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
#define JVMCI_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
@@ -73,6 +75,7 @@
#define C1_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
#define C1_PD_PRODUCT_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name),
#define C1_DIAGNOSTIC_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
+#define C1_PD_DIAGNOSTIC_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name),
#define C1_DEVELOP_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
#define C1_PD_DEVELOP_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name),
#define C1_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
@@ -80,6 +83,7 @@
#define C2_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
#define C2_PD_PRODUCT_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name),
#define C2_DIAGNOSTIC_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
+#define C2_PD_DIAGNOSTIC_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name),
#define C2_EXPERIMENTAL_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
#define C2_DEVELOP_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
#define C2_PD_DEVELOP_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name),
@@ -97,6 +101,7 @@
RUNTIME_PRODUCT_FLAG_MEMBER, \
RUNTIME_PD_PRODUCT_FLAG_MEMBER, \
RUNTIME_DIAGNOSTIC_FLAG_MEMBER, \
+ RUNTIME_PD_DIAGNOSTIC_FLAG_MEMBER, \
RUNTIME_EXPERIMENTAL_FLAG_MEMBER, \
RUNTIME_NOTPRODUCT_FLAG_MEMBER, \
RUNTIME_MANAGEABLE_FLAG_MEMBER, \
@@ -110,6 +115,7 @@
RUNTIME_PRODUCT_FLAG_MEMBER, \
RUNTIME_PD_PRODUCT_FLAG_MEMBER, \
RUNTIME_DIAGNOSTIC_FLAG_MEMBER, \
+ RUNTIME_PD_DIAGNOSTIC_FLAG_MEMBER, \
RUNTIME_NOTPRODUCT_FLAG_MEMBER, \
IGNORE_RANGE, \
IGNORE_CONSTRAINT, \
@@ -120,6 +126,7 @@
RUNTIME_PRODUCT_FLAG_MEMBER, \
RUNTIME_PD_PRODUCT_FLAG_MEMBER, \
RUNTIME_DIAGNOSTIC_FLAG_MEMBER, \
+ RUNTIME_PD_DIAGNOSTIC_FLAG_MEMBER, \
RUNTIME_EXPERIMENTAL_FLAG_MEMBER, \
RUNTIME_NOTPRODUCT_FLAG_MEMBER, \
RUNTIME_MANAGEABLE_FLAG_MEMBER, \
@@ -134,6 +141,7 @@
JVMCI_PRODUCT_FLAG_MEMBER, \
JVMCI_PD_PRODUCT_FLAG_MEMBER, \
JVMCI_DIAGNOSTIC_FLAG_MEMBER, \
+ JVMCI_PD_DIAGNOSTIC_FLAG_MEMBER, \
JVMCI_EXPERIMENTAL_FLAG_MEMBER, \
JVMCI_NOTPRODUCT_FLAG_MEMBER, \
IGNORE_RANGE, \
@@ -146,6 +154,7 @@
C1_PRODUCT_FLAG_MEMBER, \
C1_PD_PRODUCT_FLAG_MEMBER, \
C1_DIAGNOSTIC_FLAG_MEMBER, \
+ C1_PD_DIAGNOSTIC_FLAG_MEMBER, \
C1_NOTPRODUCT_FLAG_MEMBER, \
IGNORE_RANGE, \
IGNORE_CONSTRAINT, \
@@ -157,6 +166,7 @@
C2_PRODUCT_FLAG_MEMBER, \
C2_PD_PRODUCT_FLAG_MEMBER, \
C2_DIAGNOSTIC_FLAG_MEMBER, \
+ C2_PD_DIAGNOSTIC_FLAG_MEMBER, \
C2_EXPERIMENTAL_FLAG_MEMBER, \
C2_NOTPRODUCT_FLAG_MEMBER, \
IGNORE_RANGE, \
@@ -182,6 +192,7 @@
#define RUNTIME_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#define RUNTIME_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#define RUNTIME_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
+#define RUNTIME_PD_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#define RUNTIME_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#define RUNTIME_MANAGEABLE_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#define RUNTIME_PRODUCT_RW_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
@@ -194,12 +205,14 @@
#define JVMCI_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#define JVMCI_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#define JVMCI_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
+#define JVMCI_PD_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#define JVMCI_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#define JVMCI_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#define C1_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#define C1_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#define C1_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
+#define C1_PD_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#define C1_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#define C1_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#define C1_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
@@ -213,6 +226,7 @@
#define C2_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#define C2_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#define C2_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
+#define C2_PD_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#define C2_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#define C2_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#define C2_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type),
@@ -230,6 +244,7 @@
RUNTIME_PRODUCT_FLAG_MEMBER_WITH_TYPE,
RUNTIME_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE,
RUNTIME_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
+ RUNTIME_PD_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
RUNTIME_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE,
RUNTIME_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE,
RUNTIME_MANAGEABLE_FLAG_MEMBER_WITH_TYPE,
@@ -243,6 +258,7 @@
RUNTIME_PRODUCT_FLAG_MEMBER_WITH_TYPE,
RUNTIME_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE,
RUNTIME_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
+ RUNTIME_PD_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
RUNTIME_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE,
IGNORE_RANGE,
IGNORE_CONSTRAINT,
@@ -253,6 +269,7 @@
RUNTIME_PRODUCT_FLAG_MEMBER_WITH_TYPE,
RUNTIME_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE,
RUNTIME_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
+ RUNTIME_PD_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
RUNTIME_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE,
RUNTIME_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE,
RUNTIME_MANAGEABLE_FLAG_MEMBER_WITH_TYPE,
@@ -267,6 +284,7 @@
JVMCI_PRODUCT_FLAG_MEMBER_WITH_TYPE,
JVMCI_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE,
JVMCI_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
+ JVMCI_PD_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
JVMCI_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE,
JVMCI_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE,
IGNORE_RANGE,
@@ -279,6 +297,7 @@
C1_PRODUCT_FLAG_MEMBER_WITH_TYPE,
C1_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE,
C1_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
+ C1_PD_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
C1_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE,
IGNORE_RANGE,
IGNORE_CONSTRAINT,
@@ -290,6 +309,7 @@
C2_PRODUCT_FLAG_MEMBER_WITH_TYPE,
C2_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE,
C2_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
+ C2_PD_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
C2_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE,
C2_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE,
IGNORE_RANGE,
--- a/hotspot/src/share/vm/shark/shark_globals.hpp Thu Jun 23 17:07:31 2016 -0700
+++ b/hotspot/src/share/vm/shark/shark_globals.hpp Wed Jun 29 21:49:41 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright 2008, 2009, 2010 Red Hat, Inc.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -31,7 +31,7 @@
# include "shark_globals_zero.hpp"
#endif
-#define SHARK_FLAGS(develop, develop_pd, product, product_pd, diagnostic, notproduct) \
+#define SHARK_FLAGS(develop, develop_pd, product, product_pd, diagnostic, diagnostic_pd, notproduct) \
\
product(intx, MaxNodeLimit, 65000, \
"Maximum number of nodes") \
@@ -69,6 +69,7 @@
"Runs LLVM verify over LLVM IR") \
-SHARK_FLAGS(DECLARE_DEVELOPER_FLAG, DECLARE_PD_DEVELOPER_FLAG, DECLARE_PRODUCT_FLAG, DECLARE_PD_PRODUCT_FLAG, DECLARE_DIAGNOSTIC_FLAG, DECLARE_NOTPRODUCT_FLAG)
+SHARK_FLAGS(DECLARE_DEVELOPER_FLAG, DECLARE_PD_DEVELOPER_FLAG, DECLARE_PRODUCT_FLAG, DECLARE_PD_PRODUCT_FLAG, DECLARE_DIAGNOSTIC_FLAG, DECLARE_PD_DIAGNOSTIC_FLAG,
+ DECLARE_NOTPRODUCT_FLAG)
#endif // SHARE_VM_SHARK_SHARK_GLOBALS_HPP
--- a/jaxp/.hgtags Thu Jun 23 17:07:31 2016 -0700
+++ b/jaxp/.hgtags Wed Jun 29 21:49:41 2016 -0700
@@ -366,3 +366,4 @@
a265b8116058c56179c321c38618570b780329be jdk-9+121
f8899b1884e2c4a000dbcc5b1a80954245fe462e jdk-9+122
3c19ab8742c196ac267b3d87e1d19ec3472c708d jdk-9+123
+e04a15153cc293f05fcd60bc98236f50e16af46a jdk-9+124
--- a/jaxws/.hgtags Thu Jun 23 17:07:31 2016 -0700
+++ b/jaxws/.hgtags Wed Jun 29 21:49:41 2016 -0700
@@ -369,3 +369,4 @@
fb771fa3a986ccfcb00d743b1956b98c380d1dd8 jdk-9+121
342705d785ffd9e999991a3d4baae2eca58ea7c3 jdk-9+122
c42decd28bbfa817347112ed6053b5fbd30517a2 jdk-9+123
+1600da1665cd2cc127014e8c002b328ec33a9147 jdk-9+124
--- a/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/ContextFinder.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/ContextFinder.java Wed Jun 29 21:49:41 2016 -0700
@@ -193,7 +193,7 @@
try {
Method m = spFactory.getMethod("createContext", String.class, ClassLoader.class, Map.class);
// any failure in invoking this method would be considered fatal
- Object obj = instantiateProviderIfNecessary(m);
+ Object obj = instantiateProviderIfNecessary(spFactory);
context = m.invoke(obj, contextPath, classLoader, properties);
} catch (NoSuchMethodException ignored) {
// it's not an error for the provider not to have this method.
@@ -203,7 +203,7 @@
// try the old method that doesn't take properties. compatible with 1.0.
// it is an error for an implementation not to have both forms of the createContext method.
Method m = spFactory.getMethod("createContext", String.class, ClassLoader.class);
- Object obj = instantiateProviderIfNecessary(m);
+ Object obj = instantiateProviderIfNecessary(spFactory);
// any failure in invoking this method would be considered fatal
context = m.invoke(obj, contextPath, classLoader);
}
@@ -228,20 +228,20 @@
}
}
- private static Object instantiateProviderIfNecessary(Method m) throws JAXBException {
- Class<?> declaringClass = m.getDeclaringClass();
+ private static Object instantiateProviderIfNecessary(Class<?> implClass) throws JAXBException {
try {
- if (JAXBContextFactory.class.isAssignableFrom(declaringClass)) {
+ if (JAXBContextFactory.class.isAssignableFrom(implClass)) {
return AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
@Override
public Object run() throws Exception {
- return declaringClass.newInstance();
+ return implClass.newInstance();
}
});
}
return null;
- } catch (PrivilegedActionException e) {
- throw new JAXBException(Messages.format(Messages.COULD_NOT_INSTANTIATE, declaringClass, e), e);
+ } catch (PrivilegedActionException x) {
+ Throwable e = (x.getCause() == null) ? x : x.getCause();
+ throw new JAXBException(Messages.format(Messages.COULD_NOT_INSTANTIATE, implClass, e), e);
}
}
@@ -271,7 +271,7 @@
try {
Method m = spFactory.getMethod("createContext", Class[].class, Map.class);
- Object obj = instantiateProviderIfNecessary(m);
+ Object obj = instantiateProviderIfNecessary(spFactory);
Object context = m.invoke(obj, classes, properties);
if (!(context instanceof JAXBContext)) {
// the cast would fail, so generate an exception with a nice message
@@ -392,7 +392,7 @@
/**
- * first factoryId should be the preffered one,
+ * first factoryId should be the preferred one,
* more of those can be provided to support backwards compatibility
*/
private static String classNameFromPackageProperties(ClassLoader classLoader,
--- a/jdk/make/gensrc/GensrcMisc.gmk Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/make/gensrc/GensrcMisc.gmk Wed Jun 29 21:49:41 2016 -0700
@@ -34,7 +34,11 @@
@@LAUNCHER_NAME@@ => $(LAUNCHER_NAME) ; \
@@RUNTIME_NAME@@ => $(RUNTIME_NAME) ; \
@@VERSION_SHORT@@ => $(VERSION_SHORT) ; \
- @@VERSION_STRING@@ => $(VERSION_STRING), \
+ @@VERSION_STRING@@ => $(VERSION_STRING) ; \
+ @@VERSION_NUMBER@@ => $(VERSION_NUMBER) ; \
+ @@VERSION_PRE@@ => $(VERSION_PRE) ; \
+ @@VERSION_BUILD@@ => $(VERSION_BUILD) ; \
+ @@VERSION_OPT@@ => $(VERSION_OPT), \
))
GENSRC_JAVA_BASE += $(BUILD_VERSION_JAVA)
--- a/jdk/src/java.base/share/classes/java/lang/ApplicationShutdownHooks.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/ApplicationShutdownHooks.java Wed Jun 29 21:49:41 2016 -0700
@@ -102,9 +102,13 @@
hook.start();
}
for (Thread hook : threads) {
- try {
- hook.join();
- } catch (InterruptedException x) { }
+ while (true) {
+ try {
+ hook.join();
+ break;
+ } catch (InterruptedException ignored) {
+ }
+ }
}
}
}
--- a/jdk/src/java.base/share/classes/java/lang/Runtime.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/Runtime.java Wed Jun 29 21:49:41 2016 -0700
@@ -27,8 +27,6 @@
import java.io.*;
import java.math.BigInteger;
-import java.util.AbstractList;
-import java.util.Arrays;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -36,11 +34,9 @@
import java.util.Collections;
import java.util.List;
import java.util.Optional;
-import java.util.RandomAccess;
import java.util.StringTokenizer;
import jdk.internal.reflect.CallerSensitive;
import jdk.internal.reflect.Reflection;
-import sun.security.action.GetPropertyAction;
/**
* Every Java application has a single instance of class
@@ -941,8 +937,9 @@
*/
public static Version version() {
if (version == null) {
- version = Version.parse(
- GetPropertyAction.privilegedGetProperty("java.runtime.version"));
+ version = new Version(VersionProps.versionNumbers(),
+ VersionProps.pre(), VersionProps.build(),
+ VersionProps.optional());
}
return version;
}
@@ -1084,86 +1081,12 @@
private final Optional<Integer> build;
private final Optional<String> optional;
-
- // $VNUM(-$PRE)?(\+($BUILD)?(\-$OPT)?)?
- // RE limits the format of version strings
- // ([1-9][0-9]*(?:(?:\.0)*\.[1-9][0-9]*)*)(?:-([a-zA-Z0-9]+))?(?:(\+)(0|[1-9][0-9]*)?)?(?:-([-a-zA-Z0-9.]+))?
-
- private static final String VNUM
- = "(?<VNUM>[1-9][0-9]*(?:(?:\\.0)*\\.[1-9][0-9]*)*)";
- private static final String VNUM_GROUP = "VNUM";
-
- private static final String PRE = "(?:-(?<PRE>[a-zA-Z0-9]+))?";
- private static final String PRE_GROUP = "PRE";
-
- private static final String BUILD
- = "(?:(?<PLUS>\\+)(?<BUILD>0|[1-9][0-9]*)?)?";
- private static final String PLUS_GROUP = "PLUS";
- private static final String BUILD_GROUP = "BUILD";
-
- private static final String OPT = "(?:-(?<OPT>[-a-zA-Z0-9.]+))?";
- private static final String OPT_GROUP = "OPT";
-
- private static final String VSTR_FORMAT
- = "^" + VNUM + PRE + BUILD + OPT + "$";
- private static final Pattern VSTR_PATTERN = Pattern.compile(VSTR_FORMAT);
-
- /**
- * Constructs a valid <a href="verStr">version string</a> containing
- * a <a href="#verNum">version number</a> followed by pre-release and
- * build information.
- *
- * @param s
- * A string to be interpreted as a version
- *
- * @throws IllegalArgumentException
- * If the given string cannot be interpreted as a valid
- * version
- *
- * @throws NullPointerException
- * If {@code s} is {@code null}
- *
- * @throws NumberFormatException
- * If an element of the version number or the build number
- * cannot be represented as an {@link Integer}
- */
- private Version(String s) {
- if (s == null)
- throw new NullPointerException();
-
- Matcher m = VSTR_PATTERN.matcher(s);
- if (!m.matches())
- throw new IllegalArgumentException("Invalid version string: '"
- + s + "'");
-
- // $VNUM is a dot-separated list of integers of arbitrary length
- List<Integer> list = new ArrayList<>();
- for (String i : m.group(VNUM_GROUP).split("\\."))
- list.add(Integer.parseInt(i));
- version = Collections.unmodifiableList(list);
-
- pre = Optional.ofNullable(m.group(PRE_GROUP));
-
- String b = m.group(BUILD_GROUP);
- // $BUILD is an integer
- build = (b == null)
- ? Optional.<Integer>empty()
- : Optional.ofNullable(Integer.parseInt(b));
-
- optional = Optional.ofNullable(m.group(OPT_GROUP));
-
- // empty '+'
- if ((m.group(PLUS_GROUP) != null) && !build.isPresent()) {
- if (optional.isPresent()) {
- if (pre.isPresent())
- throw new IllegalArgumentException("'+' found with"
- + " pre-release and optional components:'" + s
- + "'");
- } else {
- throw new IllegalArgumentException("'+' found with neither"
- + " build or optional components: '" + s + "'");
- }
- }
+ Version(List<Integer> version, Optional<String> pre,
+ Optional<Integer> build, Optional<String> optional) {
+ this.version = Collections.unmodifiableList(version);
+ this.pre = pre;
+ this.build = build;
+ this.optional = optional;
}
/**
@@ -1189,7 +1112,7 @@
* @return The Version of the given string
*/
public static Version parse(String s) {
- return new Version(s);
+ return VersionBuilder.parse(s);
}
/**
@@ -1518,4 +1441,86 @@
}
}
+ private static class VersionBuilder {
+ // $VNUM(-$PRE)?(\+($BUILD)?(\-$OPT)?)?
+ // RE limits the format of version strings
+ // ([1-9][0-9]*(?:(?:\.0)*\.[1-9][0-9]*)*)(?:-([a-zA-Z0-9]+))?(?:(\+)(0|[1-9][0-9]*)?)?(?:-([-a-zA-Z0-9.]+))?
+
+ private static final String VNUM
+ = "(?<VNUM>[1-9][0-9]*(?:(?:\\.0)*\\.[1-9][0-9]*)*)";
+ private static final String VNUM_GROUP = "VNUM";
+
+ private static final String PRE = "(?:-(?<PRE>[a-zA-Z0-9]+))?";
+ private static final String PRE_GROUP = "PRE";
+
+ private static final String BUILD
+ = "(?:(?<PLUS>\\+)(?<BUILD>0|[1-9][0-9]*)?)?";
+ private static final String PLUS_GROUP = "PLUS";
+ private static final String BUILD_GROUP = "BUILD";
+
+ private static final String OPT = "(?:-(?<OPT>[-a-zA-Z0-9.]+))?";
+ private static final String OPT_GROUP = "OPT";
+
+ private static final String VSTR_FORMAT
+ = "^" + VNUM + PRE + BUILD + OPT + "$";
+ private static final Pattern VSTR_PATTERN = Pattern.compile(VSTR_FORMAT);
+
+ /**
+ * Constructs a valid <a href="verStr">version string</a> containing
+ * a <a href="#verNum">version number</a> followed by pre-release and
+ * build information.
+ *
+ * @param s
+ * A string to be interpreted as a version
+ *
+ * @throws IllegalArgumentException
+ * If the given string cannot be interpreted as a valid
+ * version
+ *
+ * @throws NullPointerException
+ * If {@code s} is {@code null}
+ *
+ * @throws NumberFormatException
+ * If an element of the version number or the build number
+ * cannot be represented as an {@link Integer}
+ */
+ static Version parse(String s) {
+ if (s == null)
+ throw new NullPointerException();
+
+ Matcher m = VSTR_PATTERN.matcher(s);
+ if (!m.matches())
+ throw new IllegalArgumentException("Invalid version string: '"
+ + s + "'");
+
+ // $VNUM is a dot-separated list of integers of arbitrary length
+ List<Integer> version = new ArrayList<>();
+ for (String i : m.group(VNUM_GROUP).split("\\."))
+ version.add(Integer.parseInt(i));
+
+ Optional<String> pre = Optional.ofNullable(m.group(PRE_GROUP));
+
+ String b = m.group(BUILD_GROUP);
+ // $BUILD is an integer
+ Optional<Integer> build = (b == null)
+ ? Optional.empty()
+ : Optional.of(Integer.parseInt(b));
+
+ Optional<String> optional = Optional.ofNullable(m.group(OPT_GROUP));
+
+ // empty '+'
+ if ((m.group(PLUS_GROUP) != null) && !build.isPresent()) {
+ if (optional.isPresent()) {
+ if (pre.isPresent())
+ throw new IllegalArgumentException("'+' found with"
+ + " pre-release and optional components:'" + s
+ + "'");
+ } else {
+ throw new IllegalArgumentException("'+' found with neither"
+ + " build or optional components: '" + s + "'");
+ }
+ }
+ return new Version(version, pre, build, optional);
+ }
+ }
}
--- a/jdk/src/java.base/share/classes/java/lang/StringLatin1.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/StringLatin1.java Wed Jun 29 21:49:41 2016 -0700
@@ -137,8 +137,8 @@
char c1 = (char) CharacterDataLatin1.instance.toUpperCase(getChar(value, k));
char c2 = (char) CharacterDataLatin1.instance.toUpperCase(getChar(other, k));
if (c1 != c2) {
- c1 = (char) CharacterDataLatin1.instance.toLowerCase(c1);
- c2 = (char) CharacterDataLatin1.instance.toLowerCase(c2);
+ c1 = Character.toLowerCase(c1);
+ c2 = Character.toLowerCase(c2);
if (c1 != c2) {
return c1 - c2;
}
--- a/jdk/src/java.base/share/classes/java/lang/StringUTF16.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/StringUTF16.java Wed Jun 29 21:49:41 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 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
@@ -259,17 +259,7 @@
@HotSpotIntrinsicCandidate
public static int compareToLatin1(byte[] value, byte[] other) {
- int len1 = length(value);
- int len2 = StringLatin1.length(other);
- int lim = Math.min(len1, len2);
- for (int k = 0; k < lim; k++) {
- char c1 = getChar(value, k);
- char c2 = StringLatin1.getChar(other, k);
- if (c1 != c2) {
- return c1 - c2;
- }
- }
- return len1 - len2;
+ return -StringLatin1.compareToUTF16(other, value);
}
public static int compareToCI(byte[] value, byte[] other) {
@@ -295,25 +285,7 @@
}
public static int compareToCI_Latin1(byte[] value, byte[] other) {
- int len1 = length(value);
- int len2 = StringLatin1.length(other);
- int lim = Math.min(len1, len2);
- for (int k = 0; k < lim; k++) {
- char c1 = getChar(value, k);
- char c2 = StringLatin1.getChar(other, k);
- if (c1 != c2) {
- c1 = Character.toUpperCase(c1);
- c2 = Character.toUpperCase(c2);
- if (c1 != c2) {
- c1 = Character.toLowerCase(c1);
- c2 = Character.toLowerCase(c2);
- if (c1 != c2) {
- return c1 - c2;
- }
- }
- }
- }
- return len1 - len2;
+ return -StringLatin1.compareToCI_UTF16(other, value);
}
public static int hashCode(byte[] value) {
@@ -566,24 +538,7 @@
public static boolean regionMatchesCI_Latin1(byte[] value, int toffset,
byte[] other, int ooffset,
int len) {
- int last = toffset + len;
- while (toffset < last) {
- char c1 = getChar(value, toffset++);
- char c2 = (char)(other[ooffset++] & 0xff);
- if (c1 == c2) {
- continue;
- }
- char u1 = Character.toUpperCase(c1);
- char u2 = Character.toUpperCase(c2);
- if (u1 == u2) {
- continue;
- }
- if (Character.toLowerCase(u1) == Character.toLowerCase(u2)) {
- continue;
- }
- return false;
- }
- return true;
+ return StringLatin1.regionMatchesCI_UTF16(other, ooffset, value, toffset, len);
}
public static String toLowerCase(String str, byte[] value, Locale locale) {
--- a/jdk/src/java.base/share/classes/java/lang/VersionProps.java.template Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/VersionProps.java.template Wed Jun 29 21:49:41 2016 -0700
@@ -26,6 +26,9 @@
package java.lang;
import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
class VersionProps {
@@ -42,6 +45,18 @@
private static final String java_runtime_version =
"@@VERSION_STRING@@";
+ private static final String VERSION_NUMBER =
+ "@@VERSION_NUMBER@@";
+
+ private static final String VERSION_BUILD =
+ "@@VERSION_BUILD@@";
+
+ private static final String VERSION_PRE =
+ "@@VERSION_PRE@@";
+
+ private static final String VERSION_OPT =
+ "@@VERSION_OPT@@";
+
static {
init();
}
@@ -52,6 +67,44 @@
System.setProperty("java.runtime.name", java_runtime_name);
}
+ static List<Integer> versionNumbers() {
+ List<Integer> versionNumbers = new ArrayList<>(4);
+ int prevIndex = 0;
+ int index = VERSION_NUMBER.indexOf('.');
+ while (index > 0) {
+ versionNumbers.add(
+ Integer.parseInt(VERSION_NUMBER, prevIndex, index, 10));
+ prevIndex = index + 1; // Skip the period
+ index = VERSION_NUMBER.indexOf('.', prevIndex);
+ }
+ versionNumbers.add(Integer.parseInt(VERSION_NUMBER,
+ prevIndex, VERSION_NUMBER.length(), 10));
+ return versionNumbers;
+ }
+
+ static Optional<String> pre() {
+ return optionalOf(VERSION_PRE);
+ }
+
+ static Optional<Integer> build() {
+ return VERSION_BUILD.isEmpty() ?
+ Optional.empty() :
+ Optional.of(Integer.parseInt(VERSION_BUILD));
+ }
+
+ static Optional<String> optional() {
+ return optionalOf(VERSION_OPT);
+ }
+
+ // Treat empty strings as value not being present
+ private static Optional<String> optionalOf(String value) {
+ if (!value.isEmpty()) {
+ return Optional.of(value);
+ } else {
+ return Optional.empty();
+ }
+ }
+
/**
* In case you were wondering this method is called by java -version.
* Sad that it prints to stderr; would be nicer if default printed on
@@ -111,4 +164,4 @@
java_vm_info + ")");
}
-}
\ No newline at end of file
+}
--- a/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java Wed Jun 29 21:49:41 2016 -0700
@@ -1275,8 +1275,6 @@
this.methodName = methodName;
this.at = at;
- // Assert method name is correctly derived from value name
- assert methodName.equals(toMethodName(name()));
// Assert that return type is correct
// Otherwise, when disabled avoid using reflection
assert at.returnType == getReturnType(methodName);
@@ -1311,16 +1309,6 @@
throw new IllegalArgumentException("No AccessMode value for method name " + methodName);
}
- private static String toMethodName(String name) {
- StringBuilder s = new StringBuilder(name.toLowerCase());
- int i;
- while ((i = s.indexOf("_")) != -1) {
- s.deleteCharAt(i);
- s.setCharAt(i, Character.toUpperCase(s.charAt(i)));
- }
- return s.toString();
- }
-
private static Class<?> getReturnType(String name) {
try {
Method m = VarHandle.class.getMethod(name, Object[].class);
--- a/jdk/src/java.base/share/classes/java/util/zip/ZipFile.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/util/zip/ZipFile.java Wed Jun 29 21:49:41 2016 -0700
@@ -295,13 +295,13 @@
* @throws IllegalStateException if the zip file has been closed
*/
public ZipEntry getEntry(String name) {
-
Objects.requireNonNull(name, "name");
synchronized (this) {
ensureOpen();
- int pos = zsrc.getEntryPos(zc.getBytes(name), true);
+ byte[] bname = zc.getBytes(name);
+ int pos = zsrc.getEntryPos(bname, true);
if (pos != -1) {
- return getZipEntry(name, pos);
+ return getZipEntry(name, bname, pos);
}
}
return null;
@@ -492,7 +492,7 @@
throw new NoSuchElementException();
}
// each "entry" has 3 ints in table entries
- return getZipEntry(null, zsrc.getEntryPos(i++ * 3));
+ return getZipEntry(null, null, zsrc.getEntryPos(i++ * 3));
}
}
@@ -527,13 +527,17 @@
}
/* Checks ensureOpen() before invoke this method */
- private ZipEntry getZipEntry(String name, int pos) {
+ private ZipEntry getZipEntry(String name, byte[] bname, int pos) {
byte[] cen = zsrc.cen;
int nlen = CENNAM(cen, pos);
int elen = CENEXT(cen, pos);
int clen = CENCOM(cen, pos);
int flag = CENFLG(cen, pos);
- if (name == null) {
+ if (name == null || bname.length != nlen) {
+ // to use the entry name stored in cen, if the passed in name is
+ // (1) null, invoked from iterator, or
+ // (2) not equal to the name stored, a slash is appended during
+ // getEntryPos() search.
if (!zc.isUTF8() && (flag & EFS) != 0) {
name = zc.toStringUTF8(cen, pos + CENHDR, nlen);
} else {
--- a/jdk/src/java.base/share/classes/jdk/internal/jrtfs/ExplodedImage.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/jrtfs/ExplodedImage.java Wed Jun 29 21:49:41 2016 -0700
@@ -25,6 +25,7 @@
package jdk.internal.jrtfs;
import java.io.IOException;
+import java.io.UncheckedIOException;
import java.nio.file.DirectoryStream;
import java.nio.file.FileSystem;
import java.nio.file.FileSystemException;
@@ -138,6 +139,15 @@
}
return children;
}
+
+ @Override
+ public long size() {
+ try {
+ return isDirectory() ? 0 : Files.size(path);
+ } catch (IOException ex) {
+ throw new UncheckedIOException(ex);
+ }
+ }
}
@Override
--- a/jdk/src/java.base/share/classes/jdk/internal/util/jar/JarIndex.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/util/jar/JarIndex.java Wed Jun 29 21:49:41 2016 -0700
@@ -222,7 +222,8 @@
// Any files in META-INF/ will be indexed explicitly
if (fileName.equals("META-INF/") ||
fileName.equals(INDEX_NAME) ||
- fileName.equals(JarFile.MANIFEST_NAME))
+ fileName.equals(JarFile.MANIFEST_NAME) ||
+ fileName.startsWith("META-INF/versions/"))
continue;
if (!metaInfFilenames || !fileName.startsWith("META-INF/")) {
--- a/jdk/src/java.base/share/classes/sun/launcher/resources/launcher.properties Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/launcher/resources/launcher.properties Wed Jun 29 21:49:41 2016 -0700
@@ -60,6 +60,9 @@
\ limit the universe of observable modules\n\
\ -listmods[:<modulename>[,<modulename>...]]\n\
\ list the observable modules and exit\n\
+\ --dry-run create VM but do not execute main method.\n\
+\ This --dry-run option may be useful for validating the\n\
+\ command-line options such as the module system configuration.\n\
\ -D<name>=<value>\n\
\ set a system property\n\
\ -verbose:[class|gc|jni]\n\
--- a/jdk/src/java.base/share/native/libjli/java.c Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/java.base/share/native/libjli/java.c Wed Jun 29 21:49:41 2016 -0700
@@ -68,6 +68,7 @@
static jboolean showVersion = JNI_FALSE; /* print but continue */
static jboolean printUsage = JNI_FALSE; /* print and exit*/
static jboolean printXUsage = JNI_FALSE; /* print and exit*/
+static jboolean dryRun = JNI_FALSE; /* initialize VM and exit */
static char *showSettings = NULL; /* print but continue */
static char *listModules = NULL;
@@ -489,14 +490,18 @@
mainArgs = CreateApplicationArgs(env, argv, argc);
CHECK_EXCEPTION_NULL_LEAVE(mainArgs);
- /* Invoke main method. */
- (*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);
+ if (dryRun) {
+ ret = 0;
+ } else {
+ /* Invoke main method. */
+ (*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);
- /*
- * The launcher's exit code (in the absence of calls to
- * System.exit) will be non-zero if main threw an exception.
- */
- ret = (*env)->ExceptionOccurred(env) == NULL ? 0 : 1;
+ /*
+ * The launcher's exit code (in the absence of calls to
+ * System.exit) will be non-zero if main threw an exception.
+ */
+ ret = (*env)->ExceptionOccurred(env) == NULL ? 0 : 1;
+ }
LEAVE();
}
@@ -1203,6 +1208,8 @@
return JNI_TRUE;
} else if (JLI_StrCmp(arg, "-showversion") == 0) {
showVersion = JNI_TRUE;
+ } else if (JLI_StrCmp(arg, "--dry-run") == 0) {
+ dryRun = JNI_TRUE;
} else if (JLI_StrCmp(arg, "-X") == 0) {
printXUsage = JNI_TRUE;
return JNI_TRUE;
--- a/jdk/src/java.base/windows/native/libjli/cmdtoargs.c Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/java.base/windows/native/libjli/cmdtoargs.c Wed Jun 29 21:49:41 2016 -0700
@@ -155,6 +155,7 @@
}
}
dest += copyCh(ch, dest);
+ slashes = 0;
break;
default:
--- a/jdk/src/java.httpclient/share/classes/java/net/http/Http2Connection.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/Http2Connection.java Wed Jun 29 21:49:41 2016 -0700
@@ -298,7 +298,7 @@
ByteBuffer[] buffers = frame.getHeaderBlock();
for (int i = 0; i < buffers.length; i++) {
- hpackIn.decode(buffers[i], endOfHeaders, decoder);
+ hpackIn.decode(buffers[i], endOfHeaders && (i == buffers.length - 1), decoder);
}
}
--- a/jdk/src/java.httpclient/share/classes/java/net/http/PlainHttpConnection.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/PlainHttpConnection.java Wed Jun 29 21:49:41 2016 -0700
@@ -128,6 +128,7 @@
this.chan = SocketChannel.open();
int bufsize = client.getReceiveBufferSize();
chan.setOption(StandardSocketOptions.SO_RCVBUF, bufsize);
+ chan.setOption(StandardSocketOptions.TCP_NODELAY, true);
} catch (IOException e) {
throw new InternalError(e);
}
--- a/jdk/src/java.httpclient/share/classes/sun/net/httpclient/hpack/StringReader.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/java.httpclient/share/classes/sun/net/httpclient/hpack/StringReader.java Wed Jun 29 21:49:41 2016 -0700
@@ -78,6 +78,7 @@
if (isLast) {
input.limit(input.position() + remainingLength);
}
+ remainingLength -= Math.min(input.remaining(), remainingLength);
if (huffman) {
huffmanReader.read(input, output, isLast);
} else {
@@ -85,6 +86,7 @@
}
if (isLast) {
input.limit(oldLimit);
+ state = DONE;
}
return isLast;
}
--- a/jdk/src/java.logging/share/classes/java/util/logging/FileHandler.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/java.logging/share/classes/java/util/logging/FileHandler.java Wed Jun 29 21:49:41 2016 -0700
@@ -94,6 +94,9 @@
* <li> <handler-name>.append
* specifies whether the FileHandler should append onto
* any existing files (defaults to false). </li>
+ * <li> <handler-name>.maxLocks
+ * specifies the maximum number of concurrent locks held by
+ * FileHandler (defaults to 100). </li>
* </ul>
* <p>
* For example, the properties for {@code FileHandler} would be:
@@ -157,6 +160,7 @@
private FileChannel lockFileChannel;
private File files[];
private static final int MAX_LOCKS = 100;
+ private int maxLocks = MAX_LOCKS;
private static final Set<String> locks = new HashSet<>();
/**
@@ -235,6 +239,12 @@
setLevel(manager.getLevelProperty(cname + ".level", Level.ALL));
setFilter(manager.getFilterProperty(cname + ".filter", null));
setFormatter(manager.getFormatterProperty(cname + ".formatter", new XMLFormatter()));
+ // Initialize maxLocks from the logging.properties file.
+ // If invalid/no property is provided 100 will be used as a default value.
+ maxLocks = manager.getIntProperty(cname + ".maxLocks", MAX_LOCKS);
+ if(maxLocks <= 0) {
+ maxLocks = MAX_LOCKS;
+ }
try {
setEncoding(manager.getStringProperty(cname +".encoding", null));
} catch (Exception ex) {
@@ -476,7 +486,7 @@
int unique = -1;
for (;;) {
unique++;
- if (unique > MAX_LOCKS) {
+ if (unique > maxLocks) {
throw new IOException("Couldn't get lock for " + pattern);
}
// Generate a lock file name from the "unique" int.
--- a/jdk/src/java.logging/share/conf/logging.properties Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/java.logging/share/conf/logging.properties Wed Jun 29 21:49:41 2016 -0700
@@ -37,6 +37,10 @@
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
+# Default number of locks FileHandler can obtain synchronously.
+# This specifies maximum number of attempts to obtain lock file by FileHandler
+# implemented by incrementing the unique field %u as per FileHandler API documentation.
+java.util.logging.FileHandler.maxLocks = 100
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
# Limit the message that are printed on the console to INFO and above.
--- a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/Main.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/Main.java Wed Jun 29 21:49:41 2016 -0700
@@ -48,6 +48,7 @@
import java.util.function.Supplier;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
+import java.util.stream.Stream;
import java.util.zip.*;
import java.util.jar.*;
import java.util.jar.Pack200.*;
@@ -77,24 +78,82 @@
PrintStream out, err;
String fname, mname, ename;
String zname = "";
- String[] files;
String rootjar = null;
- // An entryName(path)->File map generated during "expand", it helps to
+ private static final int BASE_VERSION = 0;
+
+ class Entry {
+ final String basename;
+ final String entryname;
+ final File file;
+ final boolean isDir;
+
+ Entry(int version, File file) {
+ this.file = file;
+ String path = file.getPath();
+ if (file.isDirectory()) {
+ isDir = true;
+ path = path.endsWith(File.separator) ? path :
+ path + File.separator;
+ } else {
+ isDir = false;
+ }
+ EntryName en = new EntryName(path, version);
+ basename = en.baseName;
+ entryname = en.entryName;
+ }
+ }
+
+ class EntryName {
+ final String baseName;
+ final String entryName;
+
+ EntryName(String name, int version) {
+ name = name.replace(File.separatorChar, '/');
+ String matchPath = "";
+ for (String path : pathsMap.get(version)) {
+ if (name.startsWith(path)
+ && (path.length() > matchPath.length())) {
+ matchPath = path;
+ }
+ }
+ name = safeName(name.substring(matchPath.length()));
+ // the old implementaton doesn't remove
+ // "./" if it was led by "/" (?)
+ if (name.startsWith("./")) {
+ name = name.substring(2);
+ }
+ this.baseName = name;
+ this.entryName = (version > BASE_VERSION)
+ ? VERSIONS_DIR + version + "/" + this.baseName
+ : this.baseName;
+ }
+ }
+
+ // An entryName(path)->Entry map generated during "expand", it helps to
// decide whether or not an existing entry in a jar file needs to be
// replaced, during the "update" operation.
- Map<String, File> entryMap = new HashMap<String, File>();
+ Map<String, Entry> entryMap = new HashMap<>();
- // All files need to be added/updated.
- Set<File> entries = new LinkedHashSet<File>();
+ // All entries need to be added/updated.
+ Map<String, Entry> entries = new LinkedHashMap<>();
+
// All packages.
Set<String> packages = new HashSet<>();
// All actual entries added, or existing, in the jar file ( excl manifest
// and module-info.class ). Populated during create or update.
Set<String> jarEntries = new HashSet<>();
- // Directories specified by "-C" operation.
- Set<String> paths = new HashSet<String>();
+ // A paths Set for each version, where each Set contains directories
+ // specified by the "-C" operation.
+ Map<Integer,Set<String>> pathsMap = new HashMap<>();
+
+ // There's also a files array per version
+ Map<Integer,String[]> filesMap = new HashMap<>();
+
+ // Do we think this is a multi-release jar? Set to true
+ // if --release option found followed by at least file
+ boolean isMultiRelease;
/*
* cflag: create
@@ -241,10 +300,15 @@
if (ename != null) {
addMainClass(manifest, ename);
}
+ if (isMultiRelease) {
+ addMultiRelease(manifest);
+ }
}
Map<String,Path> moduleInfoPaths = new HashMap<>();
- expand(null, files, false, moduleInfoPaths);
-
+ for (int version : filesMap.keySet()) {
+ String[] files = filesMap.get(version);
+ expand(null, files, false, moduleInfoPaths, version);
+ }
Map<String,byte[]> moduleInfos = new LinkedHashMap<>();
if (!moduleInfoPaths.isEmpty()) {
if (!checkModuleInfos(moduleInfoPaths))
@@ -348,7 +412,10 @@
(new FileInputStream(mname)) : null;
Map<String,Path> moduleInfoPaths = new HashMap<>();
- expand(null, files, true, moduleInfoPaths);
+ for (int version : filesMap.keySet()) {
+ String[] files = filesMap.get(version);
+ expand(null, files, true, moduleInfoPaths, version);
+ }
Map<String,byte[]> moduleInfos = new HashMap<>();
for (Map.Entry<String,Path> e : moduleInfoPaths.entrySet())
@@ -381,10 +448,11 @@
tmpFile.delete();
}
} else if (tflag) {
- replaceFSC(files);
+ replaceFSC(filesMap);
// For the "list table contents" action, access using the
// ZipFile class is always most efficient since only a
// "one-finger" scan through the central directory is required.
+ String[] files = filesMapToFiles(filesMap);
if (fname != null) {
list(fname, files);
} else {
@@ -396,7 +464,7 @@
}
}
} else if (xflag) {
- replaceFSC(files);
+ replaceFSC(filesMap);
// For the extract action, when extracting all the entries,
// access using the ZipInputStream class is most efficient,
// since only a single sequential scan through the zip file is
@@ -406,6 +474,8 @@
// "leading garbage", we fall back from the ZipInputStream
// implementation to the ZipFile implementation, since only the
// latter can handle it.
+
+ String[] files = filesMapToFiles(filesMap);
if (fname != null && files != null) {
extract(fname, files);
} else {
@@ -421,6 +491,7 @@
}
}
} else if (iflag) {
+ String[] files = filesMap.get(BASE_VERSION); // base entries only, can be null
genIndex(rootjar, files);
} else if (printModuleDescriptor) {
boolean found;
@@ -449,6 +520,20 @@
return ok;
}
+ private String[] filesMapToFiles(Map<Integer,String[]> filesMap) {
+ if (filesMap.isEmpty()) return null;
+ return filesMap.entrySet()
+ .stream()
+ .flatMap(this::filesToEntryNames)
+ .toArray(String[]::new);
+ }
+
+ Stream<String> filesToEntryNames(Map.Entry<Integer,String[]> fileEntries) {
+ int version = fileEntries.getKey();
+ return Stream.of(fileEntries.getValue())
+ .map(f -> (new EntryName(f, version)).entryName);
+ }
+
/**
* Parses command line arguments.
*/
@@ -579,8 +664,10 @@
/* parse file arguments */
int n = args.length - count;
if (n > 0) {
+ int version = BASE_VERSION;
int k = 0;
String[] nameBuf = new String[n];
+ pathsMap.put(version, new HashSet<>());
try {
for (int i = count; i < args.length; i++) {
if (args[i].equals("-C")) {
@@ -592,8 +679,33 @@
while (dir.indexOf("//") > -1) {
dir = dir.replace("//", "/");
}
- paths.add(dir.replace(File.separatorChar, '/'));
+ pathsMap.get(version).add(dir.replace(File.separatorChar, '/'));
nameBuf[k++] = dir + args[++i];
+ } else if (args[i].startsWith("--release")) {
+ int v = BASE_VERSION;
+ try {
+ v = Integer.valueOf(args[++i]);
+ } catch (NumberFormatException x) {
+ error(formatMsg("error.release.value.notnumber", args[i]));
+ // this will fall into the next error, thus returning false
+ }
+ if (v < 9) {
+ error(formatMsg("error.release.value.toosmall", String.valueOf(v)));
+ usageError();
+ return false;
+ }
+ // associate the files, if any, with the previous version number
+ if (k > 0) {
+ String[] files = new String[k];
+ System.arraycopy(nameBuf, 0, files, 0, k);
+ filesMap.put(version, files);
+ isMultiRelease = version > BASE_VERSION;
+ }
+ // reset the counters and start with the new version number
+ k = 0;
+ nameBuf = new String[n];
+ version = v;
+ pathsMap.put(version, new HashSet<>());
} else {
nameBuf[k++] = args[i];
}
@@ -602,8 +714,13 @@
usageError();
return false;
}
- files = new String[k];
- System.arraycopy(nameBuf, 0, files, 0, k);
+ // associate remaining files, if any, with a version
+ if (k > 0) {
+ String[] files = new String[k];
+ System.arraycopy(nameBuf, 0, files, 0, k);
+ filesMap.put(version, files);
+ isMultiRelease = version > BASE_VERSION;
+ }
} else if (cflag && (mname == null)) {
error(getMsg("error.bad.cflag"));
usageError();
@@ -651,7 +768,8 @@
void expand(File dir,
String[] files,
boolean isUpdate,
- Map<String,Path> moduleInfoPaths)
+ Map<String,Path> moduleInfoPaths,
+ int version)
throws IOException
{
if (files == null)
@@ -664,29 +782,29 @@
else
f = new File(dir, files[i]);
+ Entry entry = new Entry(version, f);
+ String entryName = entry.entryname;
+
if (f.isFile()) {
- String path = f.getPath();
- String entryName = entryName(path);
if (entryName.endsWith(MODULE_INFO)) {
moduleInfoPaths.put(entryName, f.toPath());
if (isUpdate)
- entryMap.put(entryName, f);
- } else if (entries.add(f)) {
+ entryMap.put(entryName, entry);
+ } else if (!entries.containsKey(entryName)) {
+ entries.put(entryName, entry);
jarEntries.add(entryName);
- if (path.endsWith(".class") && !entryName.startsWith(VERSIONS_DIR))
- packages.add(toPackageName(entryName));
+ if (entry.basename.endsWith(".class") && !entryName.startsWith(VERSIONS_DIR))
+ packages.add(toPackageName(entry.basename));
if (isUpdate)
- entryMap.put(entryName, f);
+ entryMap.put(entryName, entry);
}
} else if (f.isDirectory()) {
- if (entries.add(f)) {
+ if (!entries.containsKey(entryName)) {
+ entries.put(entryName, entry);
if (isUpdate) {
- String dirPath = f.getPath();
- dirPath = (dirPath.endsWith(File.separator)) ? dirPath :
- (dirPath + File.separator);
- entryMap.put(entryName(dirPath), f);
+ entryMap.put(entryName, entry);
}
- expand(f, f.list(), isUpdate, moduleInfoPaths);
+ expand(f, f.list(), isUpdate, moduleInfoPaths, version);
}
} else {
error(formatMsg("error.nosuch.fileordir", String.valueOf(f)));
@@ -740,8 +858,9 @@
in.transferTo(zos);
zos.closeEntry();
}
- for (File file: entries) {
- addFile(zos, file);
+ for (String entryname : entries.keySet()) {
+ Entry entry = entries.get(entryname);
+ addFile(zos, entry);
}
zos.close();
}
@@ -823,7 +942,7 @@
|| (Mflag && isManifestEntry)) {
continue;
} else if (isManifestEntry && ((newManifest != null) ||
- (ename != null))) {
+ (ename != null) || isMultiRelease)) {
foundManifest = true;
if (newManifest != null) {
// Don't read from the newManifest InputStream, as we
@@ -862,21 +981,21 @@
zos.putNextEntry(e2);
copy(zis, zos);
} else { // replace with the new files
- File f = entryMap.get(name);
- addFile(zos, f);
+ Entry ent = entryMap.get(name);
+ addFile(zos, ent);
entryMap.remove(name);
- entries.remove(f);
+ entries.remove(name);
}
jarEntries.add(name);
- if (name.endsWith(".class"))
+ if (name.endsWith(".class") && !(name.startsWith(VERSIONS_DIR)))
packages.add(toPackageName(name));
}
}
// add the remaining new files
- for (File f: entries) {
- addFile(zos, f);
+ for (String entryname : entries.keySet()) {
+ addFile(zos, entries.get(entryname));
}
if (!foundManifest) {
if (newManifest != null) {
@@ -961,6 +1080,9 @@
if (ename != null) {
addMainClass(m, ename);
}
+ if (isMultiRelease) {
+ addMultiRelease(m);
+ }
ZipEntry e = new ZipEntry(MANIFEST_NAME);
e.setTime(System.currentTimeMillis());
if (flag0) {
@@ -1016,24 +1138,6 @@
return name;
}
- private String entryName(String name) {
- name = name.replace(File.separatorChar, '/');
- String matchPath = "";
- for (String path : paths) {
- if (name.startsWith(path)
- && (path.length() > matchPath.length())) {
- matchPath = path;
- }
- }
- name = safeName(name.substring(matchPath.length()));
- // the old implementaton doesn't remove
- // "./" if it was led by "/" (?)
- if (name.startsWith("./")) {
- name = name.substring(2);
- }
- return name;
- }
-
private void addVersion(Manifest m) {
Attributes global = m.getMainAttributes();
if (global.getValue(Attributes.Name.MANIFEST_VERSION) == null) {
@@ -1058,6 +1162,11 @@
global.put(Attributes.Name.MAIN_CLASS, mainApp);
}
+ private void addMultiRelease(Manifest m) {
+ Attributes global = m.getMainAttributes();
+ global.put(Attributes.Name.MULTI_RELEASE, "true");
+ }
+
private boolean isAmbiguousMainClass(Manifest m) {
if (ename != null) {
Attributes global = m.getMainAttributes();
@@ -1073,14 +1182,10 @@
/**
* Adds a new file entry to the ZIP output stream.
*/
- void addFile(ZipOutputStream zos, File file) throws IOException {
- String name = file.getPath();
- boolean isDir = file.isDirectory();
- if (isDir) {
- name = name.endsWith(File.separator) ? name :
- (name + File.separator);
- }
- name = entryName(name);
+ void addFile(ZipOutputStream zos, Entry entry) throws IOException {
+ File file = entry.file;
+ String name = entry.entryname;
+ boolean isDir = entry.isDir;
if (name.equals("") || name.equals(".") || name.equals(zname)) {
return;
@@ -1221,12 +1326,15 @@
os.updateEntry(e);
}
- void replaceFSC(String files[]) {
- if (files != null) {
- for (int i = 0; i < files.length; i++) {
- files[i] = files[i].replace(File.separatorChar, '/');
+ void replaceFSC(Map<Integer, String []> filesMap) {
+ filesMap.keySet().forEach(version -> {
+ String[] files = filesMap.get(version);
+ if (files != null) {
+ for (int i = 0; i < files.length; i++) {
+ files[i] = files[i].replace(File.separatorChar, '/');
+ }
}
- }
+ });
}
@SuppressWarnings("serial")
@@ -1566,7 +1674,7 @@
/**
* Print an error message; like something is broken
*/
- protected void error(String s) {
+ void error(String s) {
err.println(s);
}
--- a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties Wed Jun 29 21:49:41 2016 -0700
@@ -63,24 +63,28 @@
error.module.descriptor.not.found=\
Module descriptor not found
error.versioned.info.without.root=\
- module-info.class found in versioned section without module-info.class \
+ module-info.class found in a versioned directory without module-info.class \
in the root
error.versioned.info.name.notequal=\
- module-info.class in versioned section contains incorrect name
+ module-info.class in a versioned directory contains incorrect name
error.versioned.info.requires.public=\
- module-info.class in versioned section contains additional requires public
+ module-info.class in a versioned directory contains additional requires public
error.versioned.info.requires.added=\
- module-info.class in versioned section contains additional requires
+ module-info.class in a versioned directory contains additional requires
error.versioned.info.requires.dropped=\
- module-info.class in versioned section contains missing requires
+ module-info.class in a versioned directory contains missing requires
error.versioned.info.exports.notequal=\
- module-info.class in versioned section contains different exports
+ module-info.class in a versioned directory contains different exports
error.versioned.info.provides.notequal=\
- module-info.class in versioned section contains different provides
+ module-info.class in a versioned directory contains different provides
error.invalid.versioned.module.attribute=\
Invalid module descriptor attribute {0}
error.missing.provider=\
Service provider not found: {0}
+error.release.value.notnumber=\
+ release {0} not valid
+error.release.value.toosmall=\
+ release {0} not valid, must be >= 9
out.added.manifest=\
added manifest
out.added.module-info=\
@@ -109,7 +113,7 @@
usage.compat=\
\Compatibility Interface:\
\n\
-Usage: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...\n\
+Usage: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files] ...\n\
Options:\n\
\ \ -c create new archive\n\
\ \ -t list table of contents for archive\n\
@@ -141,7 +145,7 @@
Try `jar --help' for more information.
main.help.preopt=\
-Usage: jar [OPTION...] [-C dir] files ...\n\
+Usage: jar [OPTION...] [ [--release VERSION] [-C dir] files] ...\n\
jar creates an archive for classes and resources, and can manipulate or\n\
restore individual classes or resources from an archive.\n\
\n\
@@ -156,7 +160,9 @@
\ -C foo/ classes resources\n\
\ # Update an existing non-modular jar to a modular jar:\n\
\ jar --update --file foo.jar --main-class com.foo.Main --module-version 1.0\n\
-\ -C foo/ module-info.class
+\ -C foo/ module-info.class\n\
+\ # Create a multi-release jar, placing some files in the META-INF/versions/9 directory:\n\
+\ jar --create --file mr.jar -C foo classes --release 9 -C foo9 classes
main.help.opt.main=\
\ Main operation mode:\n
main.help.opt.main.create=\
@@ -178,7 +184,9 @@
\ -C DIR Change to the specified directory and include the\n\
\ following file
main.help.opt.any.file=\
-\ -f, --file=FILE The archive file name
+\ -f, --file=FILE The archive file name\n\
+\ --release VERSION Places all following files in a versioned directory\n\
+\ of the jar (i.e. META-INF/versions/VERSION/)
main.help.opt.any.verbose=\
\ -v, --verbose Generate verbose output on standard output
main.help.opt.create.update=\
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jimage/JImageTask.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jimage/JImageTask.java Wed Jun 29 21:49:41 2016 -0700
@@ -54,8 +54,8 @@
}, "--dir"),
new Option<JImageTask>(true, (task, option, arg) -> {
- task.options.filters = arg;
- }, "--filter"),
+ task.options.include = arg;
+ }, "--include"),
new Option<JImageTask>(false, (task, option, arg) -> {
task.options.fullVersion = true;
@@ -81,12 +81,12 @@
private static final FileSystem JRT_FILE_SYSTEM = Utils.jrtFileSystem();
private final OptionsValues options;
- private final List<Predicate<String>> filterPredicates;
+ private final List<Predicate<String>> includePredicates;
private PrintWriter log;
JImageTask() {
this.options = new OptionsValues();
- this.filterPredicates = new ArrayList<>();
+ this.includePredicates = new ArrayList<>();
log = null;
}
@@ -98,7 +98,7 @@
static class OptionsValues {
Task task = Task.LIST;
String directory = ".";
- String filters = "";
+ String include = "";
boolean fullVersion;
boolean help;
boolean verbose;
@@ -200,6 +200,8 @@
log.println(TASK_HELPER.getMessage("main.opt." + name));
}
+
+ log.println(TASK_HELPER.getMessage("main.opt.footer"));
} else {
try {
log.println(TASK_HELPER.getMessage("main.usage." +
@@ -219,7 +221,7 @@
}
}
- processFilter(options.filters);
+ processInclude(options.include);
return run() ? EXIT_OK : EXIT_ERROR;
} catch (BadArgs e) {
@@ -239,15 +241,15 @@
}
}
- private void processFilter(String filters) {
- if (filters.isEmpty()) {
+ private void processInclude(String include) {
+ if (include.isEmpty()) {
return;
}
- for (String filter : filters.split(",")) {
+ for (String filter : include.split(",")) {
final PathMatcher matcher = Utils.getPathMatcher(JRT_FILE_SYSTEM, filter);
Predicate<String> predicate = (path) -> matcher.matches(JRT_FILE_SYSTEM.getPath(path));
- filterPredicates.add(predicate);
+ includePredicates.add(predicate);
}
}
@@ -388,9 +390,9 @@
String oldModule = "";
for (String name : entryNames) {
- boolean match = filterPredicates.isEmpty();
+ boolean match = includePredicates.isEmpty();
- for (Predicate<String> predicate : filterPredicates) {
+ for (Predicate<String> predicate : includePredicates) {
if (predicate.test(name)) {
match = true;
break;
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jimage/resources/jimage.properties Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jimage/resources/jimage.properties Wed Jun 29 21:49:41 2016 -0700
@@ -62,9 +62,19 @@
main.opt.dir=\
\ --dir Target directory for extract directive
-main.opt.filter=\
-\ --filter Filter entries for list or extract\n\
-\ Ex. /java.base/*, */module-info.class
+main.opt.include=\
+\ --include <pattern-list> Pattern list for filtering list or extract entries.
+
+main.opt.footer=\
+\n\
+\For options requiring a <pattern-list>, the value will be a comma\
+\ separated list of elements each using one the following forms:\n\
+\ <glob-pattern>\n\
+\ glob:<glob-pattern>\n\
+\ regex:<regex-pattern>\n\
+\ @<filename> where filename is the name of a file containing patterns to be\
+\ used, one pattern per line\n\
+
main.opt.fullversion=\
\ --fullversion Print full version information
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/AbstractModuleEntry.java Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,95 @@
+/*
+ * 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.tools.jlink.internal;
+
+import java.util.Objects;
+import jdk.tools.jlink.plugin.ModuleEntry;
+
+/**
+ * A LinkModuleEntry is the elementary unit of data inside an image. It is
+ * generally a file. e.g.: a java class file, a resource file, a shared library,
+ * ...
+ * <br>
+ * A LinkModuleEntry is identified by a path of the form:
+ * <ul>
+ * <li>For jimage content: /{module name}/{package1}/.../{packageN}/{file
+ * name}</li>
+ * <li>For other files (shared lib, launchers, config, ...):/{module name}/
+ * {@literal bin|conf|native}/{dir1}>/.../{dirN}/{file name}</li>
+ * </ul>
+ */
+abstract class AbstractModuleEntry implements ModuleEntry {
+ private final String path;
+ private final String module;
+ private final Type type;
+
+ /**
+ * Create a new AbstractModuleEntry.
+ *
+ * @param module The module name.
+ * @param path The data path identifier.
+ * @param type The data type.
+ */
+ AbstractModuleEntry(String module, String path, Type type) {
+ this.module = Objects.requireNonNull(module);
+ this.path = Objects.requireNonNull(path);
+ this.type = Objects.requireNonNull(type);
+ }
+
+ @Override
+ public final String getModule() {
+ return module;
+ }
+
+ @Override
+ public final String getPath() {
+ return path;
+ }
+
+ @Override
+ public final Type getType() {
+ return type;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(this.path);
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (!(other instanceof AbstractModuleEntry)) {
+ return false;
+ }
+ AbstractModuleEntry f = (AbstractModuleEntry) other;
+ return f.path.equals(path);
+ }
+
+ @Override
+ public String toString() {
+ return getPath();
+ }
+}
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/Archive.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/Archive.java Wed Jun 29 21:49:41 2016 -0700
@@ -42,7 +42,6 @@
public abstract class Entry {
public static enum EntryType {
-
MODULE_NAME,
CLASS_OR_RESOURCE,
NATIVE_LIB,
@@ -57,14 +56,10 @@
private final String path;
public Entry(Archive archive, String path, String name, EntryType type) {
- Objects.requireNonNull(archive);
- Objects.requireNonNull(path);
- Objects.requireNonNull(name);
- Objects.requireNonNull(type);
- this.archive = archive;
- this.path = path;
- this.name = name;
- this.type = type;
+ this.archive = Objects.requireNonNull(archive);
+ this.path = Objects.requireNonNull(path);
+ this.name = Objects.requireNonNull(name);
+ this.type = Objects.requireNonNull(type);
}
public Archive archive() {
@@ -79,7 +74,7 @@
return type;
}
- /**
+ /*
* Returns the name of this entry.
*/
public String name() {
@@ -91,7 +86,7 @@
return "type " + type.name() + " path " + path;
}
- /**
+ /*
* Returns the number of uncompressed bytes for this entry.
*/
public abstract long size();
@@ -99,17 +94,17 @@
public abstract InputStream stream() throws IOException;
}
- /**
+ /*
* The module name.
*/
String moduleName();
- /**
+ /*
* Returns the path to this module's content
*/
Path getPath();
- /**
+ /*
* Stream of Entry.
* The stream of entries needs to be closed after use
* since it might cover lazy I/O based resources.
@@ -117,12 +112,12 @@
*/
Stream<Entry> entries();
- /**
+ /*
* Open the archive
*/
void open() throws IOException;
- /**
+ /*
* Close the archive
*/
void close() throws IOException;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ArchiveEntryModuleEntry.java Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,80 @@
+/*
+ * 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.tools.jlink.internal;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UncheckedIOException;
+import java.util.Objects;
+import jdk.tools.jlink.plugin.ModuleEntry;
+
+/**
+ * A ModuleEntry backed by a given Archive Entry.
+ */
+final class ArchiveEntryModuleEntry extends AbstractModuleEntry {
+ private final Archive.Entry entry;
+
+ /**
+ * Create a new ArchiveModuleEntry.
+ *
+ * @param module The module name.
+ * @param path The data path identifier.
+ * @param entry The archive Entry.
+ */
+ ArchiveEntryModuleEntry(String module, String path, Archive.Entry entry) {
+ super(module, path, getImageFileType(Objects.requireNonNull(entry)));
+ this.entry = entry;
+ }
+
+ @Override
+ public InputStream stream() {
+ try {
+ return entry.stream();
+ } catch (IOException ex) {
+ throw new UncheckedIOException(ex);
+ }
+ }
+
+ @Override
+ public long getLength() {
+ return entry.size();
+ }
+
+ private static ModuleEntry.Type getImageFileType(Archive.Entry entry) {
+ switch(entry.type()) {
+ case CLASS_OR_RESOURCE:
+ return ModuleEntry.Type.CLASS_OR_RESOURCE;
+ case CONFIG:
+ return ModuleEntry.Type.CONFIG;
+ case NATIVE_CMD:
+ return ModuleEntry.Type.NATIVE_CMD;
+ case NATIVE_LIB:
+ return ModuleEntry.Type.NATIVE_LIB;
+ default:
+ return ModuleEntry.Type.OTHER;
+ }
+ }
+}
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/BasicImageWriter.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/BasicImageWriter.java Wed Jun 29 21:49:41 2016 -0700
@@ -28,6 +28,7 @@
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
import jdk.internal.jimage.ImageHeader;
import jdk.internal.jimage.ImageStream;
import jdk.internal.jimage.ImageStringsReader;
@@ -54,7 +55,7 @@
}
public BasicImageWriter(ByteOrder byteOrder) {
- this.byteOrder = byteOrder;
+ this.byteOrder = Objects.requireNonNull(byteOrder);
this.input = new ArrayList<>();
this.strings = new ImageStringsWriter();
this.headerStream = new ImageStream(byteOrder);
@@ -96,8 +97,8 @@
private void generatePerfectHash() {
PerfectHashBuilder<ImageLocationWriter> builder =
new PerfectHashBuilder<>(
- PerfectHashBuilder.Entry.class, // PerfectHashBuilder.Entry<ImageLocationWriter>().getClass()
- PerfectHashBuilder.Bucket.class); // PerfectHashBuilder.Bucket<ImageLocationWriter>().getClass()
+ PerfectHashBuilder.Entry.class,
+ PerfectHashBuilder.Bucket.class);
input.forEach((location) -> {
builder.put(location.getFullName(), location);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ByteArrayModuleEntry.java Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,77 @@
+/*
+ * 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.tools.jlink.internal;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.UncheckedIOException;
+import java.util.Objects;
+
+/**
+ * A ModuleEntry backed by a given byte[].
+ */
+class ByteArrayModuleEntry extends AbstractModuleEntry {
+ private final byte[] buffer;
+
+ /**
+ * Create a new ByteArrayModuleEntry.
+ *
+ * @param module The module name.
+ * @param path The data path identifier.
+ * @param type The data type.
+ * @param buf The byte buffer.
+ */
+ ByteArrayModuleEntry(String module, String path, Type type, byte[] buffer) {
+ super(module, path, type);
+ this.buffer = Objects.requireNonNull(buffer);
+ }
+
+ @Override
+ public byte[] getBytes() {
+ return buffer.clone();
+ }
+
+ @Override
+ public InputStream stream() {
+ return new ByteArrayInputStream(buffer);
+ }
+
+ @Override
+ public void write(OutputStream out) {
+ try {
+ out.write(buffer);
+ } catch (IOException ex) {
+ throw new UncheckedIOException(ex);
+ }
+ }
+
+ @Override
+ public long getLength() {
+ return buffer.length;
+ }
+}
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/DirArchive.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/DirArchive.java Wed Jun 29 21:49:41 2016 -0700
@@ -112,13 +112,11 @@
@Override
public Stream<Entry> entries() {
- Stream<Entry> ret = null;
try {
- ret = Files.walk(dirPath).map(this::toEntry).filter(n -> n != null);
+ return Files.walk(dirPath).map(this::toEntry).filter(n -> n != null);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
- return ret;
}
private Archive.Entry toEntry(Path p) {
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImageFileCreator.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImageFileCreator.java Wed Jun 29 21:49:41 2016 -0700
@@ -25,10 +25,8 @@
package jdk.tools.jlink.internal;
import java.io.BufferedOutputStream;
-import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
-import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteOrder;
import java.nio.file.Files;
@@ -47,7 +45,6 @@
import jdk.tools.jlink.internal.ModulePoolImpl.CompressedModuleData;
import jdk.tools.jlink.plugin.ExecutableImage;
import jdk.tools.jlink.plugin.PluginException;
-import jdk.tools.jlink.plugin.ModulePool;
import jdk.tools.jlink.plugin.ModuleEntry;
/**
@@ -73,7 +70,7 @@
private final Map<String, List<Entry>> entriesForModule = new HashMap<>();
private final ImagePluginStack plugins;
private ImageFileCreator(ImagePluginStack plugins) {
- this.plugins = plugins;
+ this.plugins = Objects.requireNonNull(plugins);
}
public static ExecutableImage create(Set<Archive> archives,
@@ -232,10 +229,9 @@
out.write(bytes, 0, bytes.length);
// write module content
- for (ModuleEntry res : content) {
- byte[] buf = res.getBytes();
- out.write(buf, 0, buf.length);
- }
+ content.stream().forEach((res) -> {
+ res.write(out);
+ });
tree.addContent(out);
@@ -244,21 +240,6 @@
return resultResources;
}
- private static ModuleEntry.Type mapImageFileType(EntryType type) {
- switch(type) {
- case CONFIG: {
- return ModuleEntry.Type.CONFIG;
- }
- case NATIVE_CMD: {
- return ModuleEntry.Type.NATIVE_CMD;
- }
- case NATIVE_LIB: {
- return ModuleEntry.Type.NATIVE_LIB;
- }
- }
- return null;
- }
-
private static ModulePoolImpl createPools(Set<Archive> archives,
Map<String, List<Entry>> entriesForModule,
ByteOrder byteOrder,
@@ -278,54 +259,27 @@
for (Archive archive : archives) {
String mn = archive.moduleName();
for (Entry entry : entriesForModule.get(mn)) {
-
+ String path;
if (entry.type() == EntryType.CLASS_OR_RESOURCE) {
// Removal of "classes/" radical.
- String path = entry.name();
- try (InputStream stream = entry.stream()) {
- byte[] bytes = readAllBytes(stream);
- if (path.endsWith("module-info.class")) {
- path = "/" + path;
- } else {
- path = "/" + mn + "/" + path;
- }
- try {
- resources.add(ModuleEntry.create(path, bytes));
- } catch (Exception ex) {
- throw new IOException(ex);
- }
+ path = entry.name();
+ if (path.endsWith("module-info.class")) {
+ path = "/" + path;
+ } else {
+ path = "/" + mn + "/" + path;
}
} else {
- try {
- // Entry.path() contains the kind of file native, conf, bin, ...
- // Keep it to avoid naming conflict (eg: native/jvm.cfg and config/jvm.cfg
- resources.add(ModuleEntry.create(mn,
- "/" + mn + "/" + entry.path(), mapImageFileType(entry.type()),
- entry.stream(), entry.size()));
- } catch (Exception ex) {
- throw new IOException(ex);
- }
+ // Entry.path() contains the kind of file native, conf, bin, ...
+ // Keep it to avoid naming conflict (eg: native/jvm.cfg and config/jvm.cfg
+ path = "/" + mn + "/" + entry.path();
}
+
+ resources.add(new ArchiveEntryModuleEntry(mn, path, entry));
}
}
return resources;
}
- private static final int BUF_SIZE = 8192;
-
- private static byte[] readAllBytes(InputStream is) throws IOException {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- byte[] buf = new byte[BUF_SIZE];
- while (true) {
- int n = is.read(buf);
- if (n < 0) {
- break;
- }
- baos.write(buf, 0, n);
- }
- return baos.toByteArray();
- }
-
/**
* Helper method that splits a Resource path onto 3 items: module, parent
* and resource name.
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginConfiguration.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginConfiguration.java Wed Jun 29 21:49:41 2016 -0700
@@ -47,18 +47,18 @@
*/
public final class ImagePluginConfiguration {
- private static final List<Plugin.Category> CATEGORIES_ORDER = new ArrayList<>();
+ private static final List<Category> CATEGORIES_ORDER = new ArrayList<>();
static {
- CATEGORIES_ORDER.add(Plugin.Category.FILTER);
- CATEGORIES_ORDER.add(Plugin.Category.TRANSFORMER);
- CATEGORIES_ORDER.add(Plugin.Category.MODULEINFO_TRANSFORMER);
- CATEGORIES_ORDER.add(Plugin.Category.SORTER);
- CATEGORIES_ORDER.add(Plugin.Category.COMPRESSOR);
- CATEGORIES_ORDER.add(Plugin.Category.METAINFO_ADDER);
- CATEGORIES_ORDER.add(Plugin.Category.VERIFIER);
- CATEGORIES_ORDER.add(Plugin.Category.PROCESSOR);
- CATEGORIES_ORDER.add(Plugin.Category.PACKAGER);
+ CATEGORIES_ORDER.add(Category.FILTER);
+ CATEGORIES_ORDER.add(Category.TRANSFORMER);
+ CATEGORIES_ORDER.add(Category.MODULEINFO_TRANSFORMER);
+ CATEGORIES_ORDER.add(Category.SORTER);
+ CATEGORIES_ORDER.add(Category.COMPRESSOR);
+ CATEGORIES_ORDER.add(Category.METAINFO_ADDER);
+ CATEGORIES_ORDER.add(Category.VERIFIER);
+ CATEGORIES_ORDER.add(Category.PROCESSOR);
+ CATEGORIES_ORDER.add(Category.PACKAGER);
}
private ImagePluginConfiguration() {
@@ -72,8 +72,8 @@
if (pluginsConfiguration == null) {
return new ImagePluginStack();
}
- Map<Plugin.Category, List<Plugin>> plugins = new LinkedHashMap<>();
- for (Plugin.Category cat : CATEGORIES_ORDER) {
+ Map<Category, List<Plugin>> plugins = new LinkedHashMap<>();
+ for (Category cat : CATEGORIES_ORDER) {
plugins.put(cat, new ArrayList<>());
}
@@ -96,22 +96,22 @@
List<TransformerPlugin> transformerPlugins = new ArrayList<>();
List<PostProcessorPlugin> postProcessingPlugins = new ArrayList<>();
- for (Entry<Plugin.Category, List<Plugin>> entry : plugins.entrySet()) {
+ plugins.entrySet().stream().forEach((entry) -> {
// Sort according to plugin constraints
List<Plugin> orderedPlugins = PluginOrderingGraph.sort(entry.getValue());
Category category = entry.getKey();
- for (Plugin p : orderedPlugins) {
+ orderedPlugins.stream().forEach((p) -> {
if (category.isPostProcessor()) {
@SuppressWarnings("unchecked")
- PostProcessorPlugin pp = (PostProcessorPlugin) p;
+ PostProcessorPlugin pp = (PostProcessorPlugin) p;
postProcessingPlugins.add(pp);
} else {
@SuppressWarnings("unchecked")
- TransformerPlugin trans = (TransformerPlugin) p;
+ TransformerPlugin trans = (TransformerPlugin) p;
transformerPlugins.add(trans);
}
- }
- }
+ });
+ });
Plugin lastSorter = null;
for (Plugin plugin : transformerPlugins) {
if (plugin.getName().equals(pluginsConfiguration.getLastSorterPluginName())) {
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginStack.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginStack.java Wed Jun 29 21:49:41 2016 -0700
@@ -24,7 +24,6 @@
*/
package jdk.tools.jlink.internal;
-import java.io.ByteArrayInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.lang.module.ModuleDescriptor;
@@ -96,7 +95,7 @@
public CheckOrderResourcePool(ByteOrder order, List<ModuleEntry> orderedList, StringTable table) {
super(order, table);
- this.orderedList = orderedList;
+ this.orderedList = Objects.requireNonNull(orderedList);
}
/**
@@ -119,7 +118,6 @@
private int currentid = 0;
private final Map<String, Integer> stringsUsage = new HashMap<>();
-
private final Map<String, Integer> stringsMap = new HashMap<>();
private final Map<Integer, String> reverseMap = new HashMap<>();
@@ -161,12 +159,12 @@
}
}
+ private final ImageBuilder imageBuilder;
private final Plugin lastSorter;
private final List<TransformerPlugin> contentPlugins = new ArrayList<>();
private final List<PostProcessorPlugin> postProcessingPlugins = new ArrayList<>();
private final List<ResourcePrevisitor> resourcePrevisitors = new ArrayList<>();
- private final ImageBuilder imageBuilder;
public ImagePluginStack() {
this(null, Collections.emptyList(), null,
@@ -177,31 +175,32 @@
List<TransformerPlugin> contentPlugins,
Plugin lastSorter,
List<PostProcessorPlugin> postprocessingPlugins) {
- Objects.requireNonNull(contentPlugins);
+ this.imageBuilder = Objects.requireNonNull(imageBuilder);
this.lastSorter = lastSorter;
- for (TransformerPlugin p : contentPlugins) {
+ Objects.requireNonNull(contentPlugins);
+ Objects.requireNonNull(postprocessingPlugins);
+ contentPlugins.stream().forEach((p) -> {
Objects.requireNonNull(p);
if (p instanceof ResourcePrevisitor) {
resourcePrevisitors.add((ResourcePrevisitor) p);
}
this.contentPlugins.add(p);
- }
- for (PostProcessorPlugin p : postprocessingPlugins) {
+ });
+ postprocessingPlugins.stream().forEach((p) -> {
Objects.requireNonNull(p);
this.postProcessingPlugins.add(p);
- }
- this.imageBuilder = imageBuilder;
+ });
}
public void operate(ImageProvider provider) throws Exception {
ExecutableImage img = provider.retrieve(this);
List<String> arguments = new ArrayList<>();
- for (PostProcessorPlugin plugin : postProcessingPlugins) {
- List<String> lst = plugin.process(img);
- if (lst != null) {
- arguments.addAll(lst);
- }
- }
+ postProcessingPlugins.stream()
+ .map((plugin) -> plugin.process(img))
+ .filter((lst) -> (lst != null))
+ .forEach((lst) -> {
+ arguments.addAll(lst);
+ });
img.storeLaunchArgs(arguments);
}
@@ -230,15 +229,15 @@
resources.getStringTable());
}
PreVisitStrings previsit = new PreVisitStrings();
- for (ResourcePrevisitor p : resourcePrevisitors) {
+ resourcePrevisitors.stream().forEach((p) -> {
p.previsit(resources, previsit);
- }
+ });
// Store the strings resulting from the previsit.
List<String> sorted = previsit.getSortedStrings();
- for (String s : sorted) {
+ sorted.stream().forEach((s) -> {
resources.getStringTable().addString(s);
- }
+ });
ModulePoolImpl current = resources;
List<ModuleEntry> frozenOrder = null;
@@ -443,9 +442,7 @@
byte[] bytes = decompressor.decompressResource(getByteOrder(),
(int offset) -> pool.getStringTable().getString(offset),
res.getBytes());
- res = ModuleEntry.create(res.getPath(),
- new ByteArrayInputStream(bytes),
- bytes.length);
+ res = res.create(bytes);
} catch (IOException ex) {
throw new PluginException(ex);
}
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImageResourcesTree.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImageResourcesTree.java Wed Jun 29 21:49:41 2016 -0700
@@ -113,8 +113,7 @@
private final boolean isEmpty;
PackageReference(String name, boolean isEmpty) {
- Objects.requireNonNull(name);
- this.name = name;
+ this.name = Objects.requireNonNull(name);
this.isEmpty = isEmpty;
}
@@ -132,12 +131,8 @@
private void addReference(String name, boolean isEmpty) {
PackageReference ref = references.get(name);
- if (ref == null) {
+ if (ref == null || ref.isEmpty) {
references.put(name, new PackageReference(name, isEmpty));
- } else {
- if (ref.isEmpty) { // replace with new one incase non empty.
- references.put(name, new PackageReference(name, isEmpty));
- }
}
}
@@ -267,8 +262,7 @@
}
// Validate that the packages are well formed.
for (Node n : packages.children.values()) {
- PackageNode pkg = (PackageNode) n;
- pkg.validate();
+ ((PackageNode)n).validate();
}
}
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImageStringsWriter.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImageStringsWriter.java Wed Jun 29 21:49:41 2016 -0700
@@ -44,9 +44,15 @@
// Reserve 0 offset for empty string.
int offset = addString("");
- assert offset == 0 : "Empty string not zero offset";
+ if (offset != 0) {
+ throw new InternalError("Empty string not offset zero");
+ }
+
// Reserve 1 offset for frequently used ".class".
- addString("class");
+ offset = addString("class");
+ if (offset != 1) {
+ throw new InternalError("'class' string not offset one");
+ }
}
private int addString(final String string) {
@@ -76,7 +82,9 @@
public String get(int offset) {
ByteBuffer buffer = stream.getBuffer();
int capacity = buffer.capacity();
- assert 0 <= offset && offset < capacity : "String buffer offset out of range";
+ if (offset < 0 || offset >= capacity) {
+ throw new InternalError("String buffer offset out of range");
+ }
int zero = NOT_FOUND;
for (int i = offset; i < capacity; i++) {
if (buffer.get(i) == '\0') {
@@ -84,7 +92,9 @@
break;
}
}
- assert zero != NOT_FOUND;
+ if (zero == NOT_FOUND) {
+ throw new InternalError("String zero terminator not found");
+ }
int length = zero - offset;
byte[] bytes = new byte[length];
int mark = buffer.position();
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JarArchive.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JarArchive.java Wed Jun 29 21:49:41 2016 -0700
@@ -30,8 +30,6 @@
import java.io.UncheckedIOException;
import java.nio.file.Path;
import java.util.Objects;
-import java.util.function.Consumer;
-import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
@@ -53,8 +51,8 @@
JarEntry(String path, String name, EntryType type, ZipFile file, ZipEntry entry) {
super(JarArchive.this, path, name, type);
- this.entry = entry;
- this.file = file;
+ this.entry = Objects.requireNonNull(entry);
+ this.file = Objects.requireNonNull(file);
size = entry.getSize();
}
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java Wed Jun 29 21:49:41 2016 -0700
@@ -82,7 +82,7 @@
private static final TaskHelper taskHelper
= new TaskHelper(JLINK_BUNDLE);
- static Option<?>[] recognizedOptions = {
+ private static final Option<?>[] recognizedOptions = {
new Option<JlinkTask>(false, (task, opt, arg) -> {
task.options.help = true;
}, "--help"),
@@ -176,7 +176,7 @@
int run(String[] args) {
if (log == null) {
- setLog(new PrintWriter(System.err, true));
+ setLog(new PrintWriter(System.out, true));
}
try {
optionsHelper.handleOptions(this, args);
@@ -325,7 +325,6 @@
Set<String> limitMods,
Set<String> addMods)
{
-
ModuleFinder finder = ModuleFinder.of(paths.toArray(new Path[0]));
// jmods are located at link-time
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JmodArchive.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JmodArchive.java Wed Jun 29 21:49:41 2016 -0700
@@ -25,7 +25,6 @@
package jdk.tools.jlink.internal;
-import jdk.tools.jlink.internal.JarArchive;
import java.nio.file.Path;
import java.util.Objects;
import jdk.tools.jlink.internal.Archive.Entry.EntryType;
@@ -35,7 +34,7 @@
*/
public class JmodArchive extends JarArchive {
- private static final String JMOD_EXT = ".jmod";
+ private static final String JMOD_EXT = ".jmod";
private static final String MODULE_NAME = "module";
private static final String MODULE_INFO = "module-info.class";
private static final String CLASSES = "classes";
@@ -46,8 +45,9 @@
public JmodArchive(String mn, Path jmod) {
super(mn, jmod);
String filename = Objects.requireNonNull(jmod.getFileName()).toString();
- if (!filename.endsWith(JMOD_EXT))
+ if (!filename.endsWith(JMOD_EXT)) {
throw new UnsupportedOperationException("Unsupported format: " + filename);
+ }
}
@Override
@@ -65,7 +65,6 @@
case MODULE_NAME:
return EntryType.MODULE_NAME;
default:
- //throw new InternalError("unexpected entry: " + name + " " + zipfile.toString()); //TODO
throw new InternalError("unexpected entry: " + section);
}
}
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ModularJarArchive.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ModularJarArchive.java Wed Jun 29 21:49:41 2016 -0700
@@ -39,8 +39,9 @@
public ModularJarArchive(String mn, Path jmod) {
super(mn, jmod);
String filename = Objects.requireNonNull(jmod.getFileName()).toString();
- if (!filename.endsWith(JAR_EXT))
+ if (!filename.endsWith(JAR_EXT)) {
throw new UnsupportedOperationException("Unsupported format: " + filename);
+ }
}
@Override
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ModuleEntryFactory.java Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,66 @@
+/*
+ * 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.tools.jlink.internal;
+
+import java.nio.file.Path;
+import java.util.Objects;
+import jdk.tools.jlink.plugin.ModuleEntry;
+
+public final class ModuleEntryFactory {
+ private ModuleEntryFactory() {}
+
+ public static ModuleEntry create(String path,
+ ModuleEntry.Type type, byte[] content) {
+ return new ByteArrayModuleEntry(moduleFrom(path), path, type, content);
+ }
+
+ public static ModuleEntry create(String path,
+ ModuleEntry.Type type, Path file) {
+ return new PathModuleEntry(moduleFrom(path), path, type, file);
+ }
+
+ public static ModuleEntry create(ModuleEntry original, byte[] content) {
+ return new ByteArrayModuleEntry(original.getModule(),
+ original.getPath(), original.getType(), content);
+ }
+
+ public static ModuleEntry create(ModuleEntry original, Path file) {
+ return new PathModuleEntry(original.getModule(),
+ original.getPath(), original.getType(), file);
+ }
+
+ private static String moduleFrom(String path) {
+ Objects.requireNonNull(path);
+ if (path.isEmpty() || path.charAt(0) != '/') {
+ throw new IllegalArgumentException(path + " must start with /");
+ }
+ String noRoot = path.substring(1);
+ int idx = noRoot.indexOf('/');
+ if (idx == -1) {
+ throw new IllegalArgumentException("/ missing after module: " + path);
+ }
+ return noRoot.substring(0, idx);
+ }
+}
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ModuleEntryImpl.java Thu Jun 23 17:07:31 2016 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,164 +0,0 @@
-/*
- * 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.tools.jlink.internal;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UncheckedIOException;
-import java.util.Objects;
-import jdk.tools.jlink.plugin.ModuleEntry;
-
-/**
- * A LinkModuleEntry is the elementary unit of data inside an image. It is
- * generally a file. e.g.: a java class file, a resource file, a shared library,
- * ...
- * <br>
- * A LinkModuleEntry is identified by a path of the form:
- * <ul>
- * <li>For jimage content: /{module name}/{package1}/.../{packageN}/{file
- * name}</li>
- * <li>For other files (shared lib, launchers, config, ...):/{module name}/
- * {@literal bin|conf|native}/{dir1}>/.../{dirN}/{file name}</li>
- * </ul>
- */
-public class ModuleEntryImpl implements ModuleEntry {
-
- private final Type type;
- private final String path;
- private final String module;
- private final long length;
- private final InputStream stream;
- private byte[] buffer;
-
- /**
- * Create a new LinkModuleEntry.
- *
- * @param module The module name.
- * @param path The data path identifier.
- * @param type The data type.
- * @param stream The data content stream.
- * @param length The stream length.
- */
- public ModuleEntryImpl(String module, String path, Type type, InputStream stream, long length) {
- Objects.requireNonNull(module);
- Objects.requireNonNull(path);
- Objects.requireNonNull(type);
- Objects.requireNonNull(stream);
- this.path = path;
- this.type = type;
- this.module = module;
- this.stream = stream;
- this.length = length;
- }
-
- /**
- * The LinkModuleEntry module name.
- *
- * @return The module name.
- */
- @Override
- public final String getModule() {
- return module;
- }
-
- /**
- * The LinkModuleEntry path.
- *
- * @return The module path.
- */
- @Override
- public final String getPath() {
- return path;
- }
-
- /**
- * The LinkModuleEntry's type.
- *
- * @return The data type.
- */
- @Override
- public final Type getType() {
- return type;
- }
-
- /**
- * The LinkModuleEntry content as an array of byte.
- *
- * @return An Array of bytes.
- */
- @Override
- public byte[] getBytes() {
- if (buffer == null) {
- try (InputStream is = stream) {
- buffer = is.readAllBytes();
- } catch (IOException ex) {
- throw new UncheckedIOException(ex);
- }
- }
- return buffer;
- }
-
- /**
- * The LinkModuleEntry content length.
- *
- * @return The length.
- */
- @Override
- public long getLength() {
- return length;
- }
-
- /**
- * The LinkModuleEntry stream.
- *
- * @return The module data stream.
- */
- @Override
- public InputStream stream() {
- return stream;
- }
-
- @Override
- public int hashCode() {
- int hash = 7;
- hash = 89 * hash + Objects.hashCode(this.path);
- return hash;
- }
-
- @Override
- public boolean equals(Object other) {
- if (!(other instanceof ModuleEntryImpl)) {
- return false;
- }
- ModuleEntryImpl f = (ModuleEntryImpl) other;
- return f.path.equals(path);
- }
-
- @Override
- public String toString() {
- return getPath();
- }
-}
\ No newline at end of file
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ModulePoolImpl.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ModulePoolImpl.java Wed Jun 29 21:49:41 2016 -0700
@@ -24,8 +24,6 @@
*/
package jdk.tools.jlink.internal;
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
import java.lang.module.ModuleDescriptor;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
@@ -95,7 +93,7 @@
@Override
public void add(ModuleEntry data) {
if (isReadOnly()) {
- throw new PluginException("LinkConfiguration is readonly");
+ throw new PluginException("ModulePool is readonly");
}
Objects.requireNonNull(data);
if (!data.getModule().equals(name)) {
@@ -168,8 +166,8 @@
}
public ModulePoolImpl(ByteOrder order, StringTable table) {
- this.order = order;
- this.table = table;
+ this.order = Objects.requireNonNull(order);
+ this.table = Objects.requireNonNull(table);
}
/**
@@ -180,7 +178,7 @@
@Override
public void add(ModuleEntry data) {
if (isReadOnly()) {
- throw new PluginException("LinkConfiguration is readonly");
+ throw new PluginException("ModulePool is readonly");
}
Objects.requireNonNull(data);
if (resources.get(data.getPath()) != null) {
@@ -215,7 +213,7 @@
}
/**
- * The stream of modules contained in this LinkConfiguration.
+ * The stream of modules contained in this ModulePool.
*
* @return The stream of modules.
*/
@@ -225,7 +223,7 @@
}
/**
- * Return the number of LinkModule count in this LinkConfiguration.
+ * Return the number of LinkModule count in this ModulePool.
*
* @return the module count.
*/
@@ -235,7 +233,7 @@
}
/**
- * Get all ModuleEntry contained in this LinkConfiguration instance.
+ * Get all ModuleEntry contained in this ModulePool instance.
*
* @return The stream of LinkModuleEntries.
*/
@@ -245,7 +243,7 @@
}
/**
- * Return the number of ModuleEntry count in this LinkConfiguration.
+ * Return the number of ModuleEntry count in this ModulePool.
*
* @return the entry count.
*/
@@ -267,7 +265,7 @@
}
/**
- * Check if the LinkConfiguration contains the given ModuleEntry.
+ * Check if the ModulePool contains the given ModuleEntry.
*
* @param data The module data to check existence for.
* @return The module data or null if not found.
@@ -279,7 +277,7 @@
}
/**
- * Check if the LinkConfiguration contains some content at all.
+ * Check if the ModulePool contains some content at all.
*
* @return True, no content, false otherwise.
*/
@@ -289,16 +287,16 @@
}
/**
- * Visit each ModuleEntry in this LinkConfiguration to transform it and
- * copy the transformed ModuleEntry to the output LinkConfiguration.
+ * Visit each ModuleEntry in this ModulePool to transform it and
+ * copy the transformed ModuleEntry to the output ModulePool.
*
* @param transform The function called for each ModuleEntry found in
- * the LinkConfiguration. The transform function should return a
+ * the ModulePool. The transform function should return a
* ModuleEntry instance which will be added to the output or it should
* return null if the passed ModuleEntry is to be ignored for the
* output.
*
- * @param output The LinkConfiguration to be filled with Visitor returned
+ * @param output The ModulePool to be filled with Visitor returned
* ModuleEntry.
*/
@Override
@@ -351,14 +349,13 @@
/**
* A resource that has been compressed.
*/
- public static final class CompressedModuleData extends ModuleEntryImpl {
+ public static final class CompressedModuleData extends ByteArrayModuleEntry {
final long uncompressed_size;
private CompressedModuleData(String module, String path,
- InputStream stream, long size,
- long uncompressed_size) {
- super(module, path, ModuleEntry.Type.CLASS_OR_RESOURCE, stream, size);
+ byte[] content, long uncompressed_size) {
+ super(module, path, ModuleEntry.Type.CLASS_OR_RESOURCE, content);
this.uncompressed_size = uncompressed_size;
}
@@ -413,8 +410,7 @@
CompressedModuleData compressedResource
= new CompressedModuleData(original.getModule(), original.getPath(),
- new ByteArrayInputStream(contentWithHeader),
- contentWithHeader.length, uncompressed_size);
+ contentWithHeader, uncompressed_size);
return compressedResource;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/PathModuleEntry.java Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,74 @@
+/*
+ * 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 "Classfile" 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.tools.jlink.internal;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UncheckedIOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Objects;
+
+/**
+ * A ModuleEntry backed by a given nio Path.
+ */
+public class PathModuleEntry extends AbstractModuleEntry {
+ private final Path file;
+
+ /**
+ * Create a new PathModuleEntry.
+ *
+ * @param module The module name.
+ * @param path The path for the resource content.
+ * @param type The data type.
+ * @param file The data file identifier.
+ */
+ public PathModuleEntry(String module, String path, Type type, Path file) {
+ super(module, path, type);
+ this.file = Objects.requireNonNull(file);
+ if (!Files.isRegularFile(file)) {
+ throw new IllegalArgumentException(file + " not a file");
+ }
+ }
+
+ @Override
+ public final InputStream stream() {
+ try {
+ return Files.newInputStream(file);
+ } catch (IOException ex) {
+ throw new UncheckedIOException(ex);
+ }
+ }
+
+ @Override
+ public final long getLength() {
+ try {
+ return Files.size(file);
+ } catch (IOException ex) {
+ throw new UncheckedIOException(ex);
+ }
+ }
+}
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ResourcePrevisitor.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ResourcePrevisitor.java Wed Jun 29 21:49:41 2016 -0700
@@ -42,7 +42,6 @@
* @param resources Read only resources.
* @param strings StringTable instance. Add string to the StringTable to track string
* usage.
- * @throws PluginException
*/
public void previsit(ModulePool resources, StringTable strings);
}
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java Wed Jun 29 21:49:41 2016 -0700
@@ -584,6 +584,8 @@
showPlugin(plugin, log, showsImageBuilder);
}
}
+
+ log.println("\n" + bundleHelper.getMessage("main.extended.help.footer"));
}
private void showPlugin(Plugin plugin, PrintWriter log, boolean showsImageBuilder) {
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/Utils.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/Utils.java Wed Jun 29 21:49:41 2016 -0700
@@ -34,7 +34,6 @@
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
-import java.util.Objects;
import java.util.stream.Collectors;
import jdk.tools.jlink.plugin.Plugin;
import jdk.tools.jlink.plugin.Plugin.Category;
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/packager/AppRuntimeImageBuilder.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/packager/AppRuntimeImageBuilder.java Wed Jun 29 21:49:41 2016 -0700
@@ -127,7 +127,7 @@
jlink.build(jlinkConfig, pluginConfig);
}
- /**
+ /*
* Returns a ModuleFinder that limits observability to the given root
* modules, their transitive dependences, plus a set of other modules.
*/
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/DefaultCompressPlugin.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/DefaultCompressPlugin.java Wed Jun 29 21:49:41 2016 -0700
@@ -24,7 +24,6 @@
*/
package jdk.tools.jlink.internal.plugins;
-import java.util.Collections;
import java.util.Map;
import jdk.tools.jlink.internal.ModulePoolImpl;
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeFilesPlugin.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeFilesPlugin.java Wed Jun 29 21:49:41 2016 -0700
@@ -24,14 +24,11 @@
*/
package jdk.tools.jlink.internal.plugins;
-import java.io.UncheckedIOException;
-import java.util.Collections;
import java.util.Map;
import java.util.function.Predicate;
import jdk.tools.jlink.plugin.TransformerPlugin;
import jdk.tools.jlink.plugin.ModulePool;
import jdk.tools.jlink.plugin.ModuleEntry;
-import jdk.tools.jlink.internal.Utils;
/**
*
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludePlugin.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludePlugin.java Wed Jun 29 21:49:41 2016 -0700
@@ -24,7 +24,6 @@
*/
package jdk.tools.jlink.internal.plugins;
-import java.util.Collections;
import java.util.Map;
import java.util.function.Predicate;
import jdk.tools.jlink.plugin.TransformerPlugin;
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeVMPlugin.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeVMPlugin.java Wed Jun 29 21:49:41 2016 -0700
@@ -25,12 +25,10 @@
package jdk.tools.jlink.internal.plugins;
import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UncheckedIOException;
import java.nio.charset.StandardCharsets;
-import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
@@ -244,10 +242,7 @@
byte[] content = builder.toString().getBytes(StandardCharsets.UTF_8);
- return ModuleEntry.create(orig.getModule(),
- orig.getPath(),
- orig.getType(),
- new ByteArrayInputStream(content), content.length);
+ return orig.create(content);
}
private static String jvmlib() {
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/FileCopierPlugin.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/FileCopierPlugin.java Wed Jun 29 21:49:41 2016 -0700
@@ -26,7 +26,6 @@
import java.io.File;
import java.io.IOException;
-import java.io.InputStream;
import java.io.UncheckedIOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
@@ -35,11 +34,10 @@
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
-import jdk.tools.jlink.internal.ModuleEntryImpl;
+import jdk.tools.jlink.internal.PathModuleEntry;
import jdk.tools.jlink.plugin.PluginException;
import jdk.tools.jlink.plugin.ModuleEntry;
import jdk.tools.jlink.plugin.ModulePool;
@@ -66,13 +64,13 @@
/**
* Symbolic link to another path.
*/
- public static abstract class SymImageFile extends ModuleEntryImpl {
+ public static abstract class SymImageFile extends PathModuleEntry {
private final String targetPath;
public SymImageFile(String targetPath, String module, String path,
- ModuleEntry.Type type, InputStream stream, long size) {
- super(module, path, type, stream, size);
+ ModuleEntry.Type type, Path file) {
+ super(module, path, type, file);
this.targetPath = targetPath;
}
@@ -85,23 +83,7 @@
public SymImageFileImpl(String targetPath, Path file, String module,
String path, ModuleEntry.Type type) {
- super(targetPath, module, path, type, newStream(file), length(file));
- }
- }
-
- private static long length(Path file) {
- try {
- return Files.size(file);
- } catch (IOException ex) {
- throw new RuntimeException(ex);
- }
- }
-
- private static InputStream newStream(Path file) {
- try {
- return Files.newInputStream(file);
- } catch (IOException ex) {
- throw new UncheckedIOException(ex);
+ super(targetPath, module, path, type, file);
}
}
@@ -175,9 +157,9 @@
Objects.requireNonNull(pool);
Objects.requireNonNull(file);
Objects.requireNonNull(path);
- ModuleEntry impl = ModuleEntry.create(FAKE_MODULE,
+ ModuleEntry impl = ModuleEntry.create(
"/" + FAKE_MODULE + "/other/" + path,
- ModuleEntry.Type.OTHER, newStream(file), length(file));
+ ModuleEntry.Type.OTHER, file);
try {
pool.add(impl);
} catch (Exception ex) {
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java Wed Jun 29 21:49:41 2016 -0700
@@ -24,10 +24,8 @@
*/
package jdk.tools.jlink.internal.plugins;
-import java.io.ByteArrayInputStream;
import java.lang.reflect.Method;
import java.util.Arrays;
-import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.Map;
@@ -171,10 +169,9 @@
byte[] bytes = result.getValue();
// Add class to pool
- ModuleEntry ndata = ModuleEntry.create(data.getModule(),
+ ModuleEntry ndata = ModuleEntry.create(
"/java.base/" + className + ".class",
- ModuleEntry.Type.CLASS_OR_RESOURCE,
- new ByteArrayInputStream(bytes), bytes.length);
+ bytes);
if (!out.contains(ndata)) {
out.add(ndata);
}
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/IncludeLocalesPlugin.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/IncludeLocalesPlugin.java Wed Jun 29 21:49:41 2016 -0700
@@ -24,10 +24,8 @@
*/
package jdk.tools.jlink.internal.plugins;
-import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
import java.util.IllformedLocaleException;
import java.util.Locale;
import java.util.List;
@@ -123,9 +121,7 @@
if (Arrays.stream(cr.getInterfaces())
.anyMatch(i -> i.contains(METAINFONAME)) &&
stripUnsupportedLocales(bytes, cr)) {
- resource = ModuleEntry.create(MODULENAME, path,
- resource.getType(),
- new ByteArrayInputStream(bytes), bytes.length);
+ resource = resource.create(bytes);
}
}
}
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/OptimizationPlugin.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/OptimizationPlugin.java Wed Jun 29 21:49:41 2016 -0700
@@ -30,7 +30,6 @@
import java.io.UncheckedIOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/OrderResourcesPlugin.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/OrderResourcesPlugin.java Wed Jun 29 21:49:41 2016 -0700
@@ -30,11 +30,9 @@
import java.nio.file.Files;
import java.nio.file.PathMatcher;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.Set;
import java.util.function.ToIntFunction;
import jdk.tools.jlink.plugin.PluginException;
import jdk.tools.jlink.plugin.ModuleEntry;
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ReleaseInfoPlugin.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ReleaseInfoPlugin.java Wed Jun 29 21:49:41 2016 -0700
@@ -26,7 +26,6 @@
import java.io.FileInputStream;
import java.io.IOException;
-import java.util.Collections;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StringSharingPlugin.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StringSharingPlugin.java Wed Jun 29 21:49:41 2016 -0700
@@ -46,7 +46,6 @@
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripDebugPlugin.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripDebugPlugin.java Wed Jun 29 21:49:41 2016 -0700
@@ -24,9 +24,6 @@
*/
package jdk.tools.jlink.internal.plugins;
-import java.io.ByteArrayInputStream;
-import java.util.Arrays;
-import java.util.Collections;
import java.util.function.Predicate;
import jdk.internal.org.objectweb.asm.ClassReader;
import jdk.internal.org.objectweb.asm.ClassWriter;
@@ -75,7 +72,7 @@
ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
reader.accept(writer, ClassReader.SKIP_DEBUG);
byte[] content = writer.toByteArray();
- res = ModuleEntry.create(path, new ByteArrayInputStream(content), content.length);
+ res = resource.create(content);
}
}
} else if (predicate.test(res.getPath())) {
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripNativeCommandsPlugin.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripNativeCommandsPlugin.java Wed Jun 29 21:49:41 2016 -0700
@@ -24,7 +24,6 @@
*/
package jdk.tools.jlink.internal.plugins;
-import java.util.Collections;
import jdk.tools.jlink.plugin.ModuleEntry;
import jdk.tools.jlink.plugin.ModulePool;
import jdk.tools.jlink.plugin.TransformerPlugin;
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModuleDescriptorPlugin.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModuleDescriptorPlugin.java Wed Jun 29 21:49:41 2016 -0700
@@ -139,11 +139,7 @@
ModuleInfoRewriter minfoWriter =
new ModuleInfoRewriter(bain, mbuilder.conceals());
// replace with the overridden version
- data = ModuleEntry.create(data.getModule(),
- data.getPath(),
- data.getType(),
- minfoWriter.stream(),
- minfoWriter.size());
+ data = data.create(minfoWriter.getBytes());
}
out.add(data);
} catch (IOException e) {
@@ -158,12 +154,7 @@
return;
if (builder.isOverriddenClass(data.getPath())) {
byte[] bytes = cwriter.toByteArray();
- ModuleEntry ndata =
- ModuleEntry.create(data.getModule(),
- data.getPath(),
- data.getType(),
- new ByteArrayInputStream(bytes),
- bytes.length);
+ ModuleEntry ndata = data.create(bytes);
out.add(ndata);
} else {
out.add(data);
@@ -183,8 +174,8 @@
this.extender.write(this);
}
- InputStream stream() {
- return new ByteArrayInputStream(buf);
+ byte[] getBytes() {
+ return buf;
}
}
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ZipPlugin.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ZipPlugin.java Wed Jun 29 21:49:41 2016 -0700
@@ -28,7 +28,6 @@
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Arrays;
-import java.util.Collections;
import java.util.Map;
import java.util.function.Predicate;
import java.util.zip.Deflater;
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/asm/AsmPoolImpl.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/asm/AsmPoolImpl.java Wed Jun 29 21:49:41 2016 -0700
@@ -93,8 +93,7 @@
}
byte[] content = writer.toByteArray();
- ModuleEntry res = ModuleEntry.create(path,
- new ByteArrayInputStream(content), content.length);
+ ModuleEntry res = ModuleEntry.create(path, content);
transformedClasses.put(className, res);
}
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/optim/ControlFlow.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/optim/ControlFlow.java Wed Jun 29 21:49:41 2016 -0700
@@ -76,9 +76,7 @@
@Override
public int hashCode() {
- int hash = 3;
- hash = 79 * hash + Objects.hashCode(this.firstInstruction);
- return hash;
+ return Objects.hashCode(this.firstInstruction);
}
@Override
@@ -214,9 +212,7 @@
@Override
public int hashCode() {
- int hash = 3;
- hash = 89 * hash + this.getIndex();
- return hash;
+ return this.getIndex();
}
@Override
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/ModuleEntry.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/ModuleEntry.java Wed Jun 29 21:49:41 2016 -0700
@@ -26,16 +26,18 @@
import java.io.ByteArrayInputStream;
import java.io.InputStream;
-import java.util.Objects;
-import jdk.tools.jlink.internal.ImageFileCreator;
-import jdk.tools.jlink.internal.ModuleEntryImpl;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.UncheckedIOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import jdk.tools.jlink.internal.ModuleEntryFactory;
/**
- * A LinkModuleEntry is the elementary unit of data inside an image. It is
- * generally a file. e.g.: a java class file, a resource file, a shared library,
- * ...
+ * A ModuleEntry is the elementary unit of data inside an image. It is
+ * generally a file. e.g.: a java class file, a resource file, a shared library.
* <br>
- * A LinkModuleEntry is identified by a path of the form:
+ * A ModuleEntry is identified by a path of the form:
* <ul>
* <li>For jimage content: /{module name}/{package1}/.../{packageN}/{file
* name}</li>
@@ -63,93 +65,133 @@
OTHER
}
/**
- * The LinkModuleEntry module name.
+ * The ModuleEntry module name.
*
* @return The module name.
*/
public String getModule();
/**
- * The LinkModuleEntry path.
+ * The ModuleEntry path.
*
* @return The module path.
*/
public String getPath();
/**
- * The LinkModuleEntry's type.
+ * The ModuleEntry's type.
*
* @return The data type.
*/
public Type getType();
/**
- * The LinkModuleEntry content as an array of byte.
+ * The ModuleEntry content as an array of bytes.
*
* @return An Array of bytes.
*/
- public byte[] getBytes();
+ public default byte[] getBytes() {
+ try (InputStream is = stream()) {
+ return is.readAllBytes();
+ } catch (IOException ex) {
+ throw new UncheckedIOException(ex);
+ }
+ }
/**
- * The LinkModuleEntry content length.
+ * The ModuleEntry content length.
*
* @return The length.
*/
public long getLength();
/**
- * The LinkModuleEntry stream.
+ * The ModuleEntry stream.
*
* @return The module data stream.
*/
public InputStream stream();
+ /**
+ * Write the content of this ModuleEntry to stream.
+ *
+ * @param out the output stream
+ */
+ public default void write(OutputStream out) {
+ try {
+ out.write(getBytes());
+ } catch (IOException ex) {
+ throw new UncheckedIOException(ex);
+ }
+ }
/**
- * Create a LinkModuleEntry located inside a jimage file. Such
- * LinkModuleEntry has a Type being equals to CLASS_OR_RESOURCE.
+ * Create a ModuleEntry with new content but other information
+ * copied from this ModuleEntry.
*
- * @param path The complete resource path (contains the module radical).
- * @param content The resource content.
- * @param size The content size.
- * @return A new LinkModuleEntry.
+ * @param content The new resource content.
+ * @return A new ModuleEntry.
*/
- public static ModuleEntry create(String path, InputStream content, long size) {
- Objects.requireNonNull(path);
- Objects.requireNonNull(content);
- String[] split = ImageFileCreator.splitPath(path);
- String module = split[0];
- return new ModuleEntryImpl(module, path, Type.CLASS_OR_RESOURCE, content, size);
+ public default ModuleEntry create(byte[] content) {
+ return ModuleEntryFactory.create(this, content);
}
/**
- * Create a LinkModuleEntry for a file that will be located inside a jimage
- * file.
+ * Create a ModuleEntry with new content but other information
+ * copied from this ModuleEntry.
+ *
+ * @param file The new resource content.
+ * @return A new ModuleEntry.
+ */
+ public default ModuleEntry create(Path file) {
+ return ModuleEntryFactory.create(this, file);
+ }
+
+ /**
+ * Create a ModuleEntry for a resource of the given type.
+ *
+ * @param path The resource path.
+ * @param type The ModuleEntry type.
+ * @param content The resource content.
+ * @return A new ModuleEntry.
+ */
+ public static ModuleEntry create(String path,
+ ModuleEntry.Type type, byte[] content) {
+ return ModuleEntryFactory.create(path, type, content);
+ }
+
+ /**
+ * Create a ModuleEntry for a resource of type {@link Type#CLASS_OR_RESOURCE}.
*
* @param path The resource path.
* @param content The resource content.
- * @return A new LinkModuleEntry.
+ * @return A new ModuleEntry.
*/
public static ModuleEntry create(String path, byte[] content) {
- return create(path, new ByteArrayInputStream(content),
- content.length);
+ return create(path, Type.CLASS_OR_RESOURCE, content);
}
/**
- * Create a LinkModuleEntry for a file that will be located outside a jimage
- * file.
+ * Create a ModuleEntry for a resource of the given type.
*
- * @param module The module in which this files is located.
- * @param path The file path locator (doesn't contain the module name).
- * @param type The LinkModuleEntry type.
- * @param content The file content.
- * @param size The content size.
- * @return A new LinkModuleEntry.
+ * @param path The resource path.
+ * @param type The ModuleEntry type.
+ * @param file The resource file.
+ * @return A new ModuleEntry.
*/
- public static ModuleEntry create(String module, String path, ModuleEntry.Type type,
- InputStream content, long size) {
- Objects.requireNonNull(path);
- Objects.requireNonNull(content);
- return new ModuleEntryImpl(module, path, type, content, size);
+ public static ModuleEntry create(String path,
+ ModuleEntry.Type type, Path file) {
+ return ModuleEntryFactory.create(path, type, file);
+ }
+
+ /**
+ * Create a ModuleEntry for a resource of type {@link Type#CLASS_OR_RESOURCE}.
+ *
+ * @param path The resource path.
+ * @param file The resource file.
+ * @return A new ModuleEntry.
+ */
+ public static ModuleEntry create(String path, Path file) {
+ return create(path, Type.CLASS_OR_RESOURCE, file);
}
}
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/jlink.properties Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/jlink.properties Wed Jun 29 21:49:41 2016 -0700
@@ -29,7 +29,7 @@
main.usage=\
Usage: {0} <options> --modulepath <modulepath> --addmods <mods> --output <path>\n\
-Possible options include:
+\Possible options include:
error.prefix=Error:
warn.prefix=Warning:
@@ -68,7 +68,18 @@
Include your program and the following diagnostic in your report. Thank you.
main.extended.help=\
-List of available plugins:
+\List of available plugins:
+
+main.extended.help.footer=\
+\For options requiring a <pattern-list>, the value will be a comma\
+\ separated list of elements each using one the following forms:\n\
+\ <glob-pattern>\n\
+\ glob:<glob-pattern>\n\
+\ regex:<regex-pattern>\n\
+\ @<filename> where filename is the name of a file containing patterns to be\
+\ used, one pattern per line\n\
+\n\
+
err.unknown.byte.order:unknown byte order {0}
err.output.must.be.specified:--output must be specified
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/plugins.properties Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/plugins.properties Wed Jun 29 21:49:41 2016 -0700
@@ -37,15 +37,16 @@
Class optimization. Warning: This plugin is experimental.\n\
An optional <log file> can be specified to log applied optimizations.
-compress.argument=<0|1|2>[:filter=<pattern>]
+compress.argument=<0|1|2>[:filter=<pattern-list>]
compress.description=\
Compress all resources in the output image.\n\
Level 0: constant string sharing\n\
Level 1: ZIP\n\
Level 2: both.\n\
-An optional filter can be specified to list the pattern of files to be filtered.\n\
-Use ^ for negation. e.g.: *Exception.class,*Error.class,^/java.base/java/lang/*
+An optional <pattern-list> filter can be specified to list the pattern of\n\
+files to be included.
+
compact-cp.argument=<resource paths>
@@ -59,15 +60,15 @@
If files to copy are not absolute path, JDK home dir is used.\n\
e.g.: jrt-fs.jar,LICENSE,/home/me/myfile.txt=somewehere/conf.txt
-exclude-files.argument=<files to exclude | files of excluded files>
+exclude-files.argument=<pattern-list> of files to exclude
exclude-files.description=\
-Specify files to exclude. e.g.: *.diz, /java.base/native/client/*
+Specify files to exclude. e.g.: **.java,glob:/java.base/native/client/**
-exclude-resources.argument=<resources to exclude | file of excluded resources>
+exclude-resources.argument=<pattern-list> resources to exclude
exclude-resources.description=\
-Specify resources to exclude. e.g.: *.jcov, */META-INF/*
+Specify resources to exclude. e.g.: **.jcov,glob:**/META-INF/**
generate-jli-classes.argument=<bmh[:bmh-species=LL,L3,...]>
@@ -78,10 +79,11 @@
onoff.argument=<on|off>
-order-resources.argument=<paths in priority order | file with resource paths>
+order-resources.argument=<pattern-list> of paths in priority order. If a @file\n\
+is specified, then each line should be an exact match for the path to be ordered
order-resources.description=\
-Order resources. e.g.: */module-info.class,/java.base/java/lang/*
+Order resources. e.g.: **/module-info.class,@classlist,/java.base/java/lang/**
strip-debug.description=\
Strip debug information from the output image
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java Wed Jun 29 21:49:41 2016 -0700
@@ -1085,7 +1085,7 @@
@Override public Class<Pattern> valueType() { return Pattern.class; }
- @Override public String valuePattern() { return "pattern"; }
+ @Override public String valuePattern() { return "regex-pattern"; }
}
static class PathMatcherConverter implements ValueConverter<PathMatcher> {
@@ -1100,7 +1100,7 @@
@Override public Class<PathMatcher> valueType() { return PathMatcher.class; }
- @Override public String valuePattern() { return "pattern"; }
+ @Override public String valuePattern() { return "pattern-list"; }
}
/* Support for @<file> in jmod help */
@@ -1145,7 +1145,7 @@
String content = super.format(all);
StringBuilder builder = new StringBuilder();
- builder.append("\n").append(" Main operation modes:\n ");
+ builder.append(getMessage("main.opt.mode")).append("\n ");
builder.append(getMessage("main.opt.mode.create")).append("\n ");
builder.append(getMessage("main.opt.mode.list")).append("\n ");
builder.append(getMessage("main.opt.mode.describe")).append("\n ");
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/resources/jmod.properties Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/resources/jmod.properties Wed Jun 29 21:49:41 2016 -0700
@@ -28,11 +28,13 @@
use --help for a list of possible options
main.usage=\
-Usage: {0} (create|list|describe|hash) <OPTIONS> <jmod-file>
+Usage: {0} (create|list|describe|hash) <OPTIONS> <jmod-file>\n\
error.prefix=Error:
warn.prefix=Warning:
+main.opt.mode=\
+\Main operation modes:
main.opt.mode.create=\
\create - Creates a new jmod archive
main.opt.mode.list=\
@@ -49,7 +51,9 @@
main.opt.cmds=Location of native commands
main.opt.config=Location of user-editable config files
main.opt.dry-run=Dry run of hash mode
-main.opt.exclude=Exclude files, given as a PATTERN
+main.opt.exclude=Exclude files matching the supplied comma separated pattern\
+\ list, each element using one the following forms: <glob-pattern>,\
+\ glob:<glob-pattern> or regex:<regex-pattern>
main.opt.module-version= Module version
main.opt.main-class=Main class
main.opt.main-class.arg=class-name
@@ -61,7 +65,7 @@
main.opt.os-version.arg=os-version
main.opt.modulepath=Module path
main.opt.hash-modules=Compute and record hashes to tie a packaged module\
-\ with modules matching the given pattern and depending upon it directly\
+\ with modules matching the given <regex-pattern> and depending upon it directly\
\ or indirectly. The hashes are recorded in the JMOD file being created, or\
\ a JMOD file or modular JAR on the module path specified the jmod hash command.
--- a/jdk/test/ProblemList.txt Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/test/ProblemList.txt Wed Jun 29 21:49:41 2016 -0700
@@ -164,6 +164,10 @@
java/net/DatagramSocket/SendDatagramToBadAddress.java 7143960 macosx-all
+java/net/httpclient/http2/BasicTest.java 8157408 linux-all
+java/net/httpclient/http2/ErrorTest.java 8158127 solaris-all,windows-all
+java/net/httpclient/http2/TLSConnection.java 8157482 macosx-all
+
############################################################################
# jdk_nio
@@ -336,9 +340,6 @@
# jdk_time
-java/time/test/java/time/TestClock_System.java 8158128 solaris-all
-
-
############################################################################
# jdk_util
--- a/jdk/test/TEST.groups Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/test/TEST.groups Wed Jun 29 21:49:41 2016 -0700
@@ -27,7 +27,6 @@
tier1 = \
:jdk_lang \
- -java/lang/ProcessHandle/TreeTest.java \
:jdk_util \
-java/util/concurrent/ThreadPoolExecutor/ConfigChanges.java \
-java/util/concurrent/forkjoin/FJExceptionTableLeak.java \
@@ -38,7 +37,6 @@
tools/pack200
tier2 = \
- java/lang/ProcessHandle/TreeTest.java \
java/util/concurrent/ThreadPoolExecutor/ConfigChanges.java \
java/util/concurrent/forkjoin/FJExceptionTableLeak.java \
:jdk_io \
--- a/jdk/test/java/lang/ProcessHandle/TreeTest.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/test/java/lang/ProcessHandle/TreeTest.java Wed Jun 29 21:49:41 2016 -0700
@@ -50,7 +50,6 @@
* @build jdk.test.lib.Utils
* @run testng/othervm TreeTest
* @summary Test counting and JavaChild.spawning and counting of Processes.
- * @key intermittent
* @author Roger Riggs
*/
public class TreeTest extends ProcessUtil {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/Runtime/shutdown/ShutdownInterruptedMain.java Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,63 @@
+/*
+ * 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.
+ *
+ * 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.
+ */
+
+/*
+ * @test
+ * @bug 8154017
+ * @library /lib/testlibrary
+ * @build jdk.testlibrary.*
+ * @summary Shutdown hooks are racing against shutdown sequence,
+ if System.exit()-calling thread is interrupted
+ * @run main ShutdownInterruptedMain exec
+ */
+
+import jdk.testlibrary.OutputAnalyzer;
+import static jdk.testlibrary.ProcessTools.createJavaProcessBuilder;
+import static jdk.testlibrary.ProcessTools.executeProcess;
+
+public class ShutdownInterruptedMain {
+
+ public static void main(String[] args) throws Exception {
+ if (args.length > 0) {
+ ProcessBuilder pb = createJavaProcessBuilder(true, "ShutdownInterruptedMain");
+ OutputAnalyzer output = executeProcess(pb);
+ output.shouldContain("Shutdown Hook");
+ output.shouldHaveExitValue(0);
+ return;
+ }
+
+ Runtime.getRuntime().addShutdownHook(new Thread() {
+ @Override
+ public void run() {
+ // Wait for the race to unfold:
+ try {
+ Thread.sleep(5_000);
+ } catch (InterruptedException e) {}
+ System.out.println("Shutdown Hook");
+ System.out.flush();
+ }
+ });
+ Thread.currentThread().interrupt();
+ System.exit(0);
+ }
+}
--- a/jdk/test/java/lang/String/CompareIC.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/test/java/lang/String/CompareIC.java Wed Jun 29 21:49:41 2016 -0700
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4124769
+ * @bug 4124769 8160312
* @summary Test ignore-case comparison
*
*/
@@ -45,6 +45,10 @@
comparer.testTriplet(test1, test2, test3);
test2 = test2.toLowerCase();
comparer.testTriplet(test1, test2, test3);
+
+ // toLowerCase -> non-latin1
+ if ("\u00b5".compareToIgnoreCase("X") < 0)
+ throw new RuntimeException("Comparison failure1");
}
private void testTriplet(String one, String two, String three)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessModeMethodNames.java Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,61 @@
+/*
+ * 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.
+ *
+ * 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.
+ */
+
+/*
+ * @test
+ * @run testng VarHandleTestAccessModeMethodNames
+ */
+
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import java.lang.invoke.VarHandle;
+import java.util.stream.Stream;
+
+import static org.testng.Assert.assertEquals;
+
+public class VarHandleTestAccessModeMethodNames {
+
+ @DataProvider
+ public static Object[][] accessModesProvider() {
+ return Stream.of(VarHandle.AccessMode.values()).
+ map(am -> new Object[]{am}).
+ toArray(Object[][]::new);
+ }
+
+
+ @Test(dataProvider = "accessModesProvider")
+ public void testMethodName(VarHandle.AccessMode am) {
+ assertEquals(am.methodName(), toMethodName(am.name()));
+ }
+
+ private static String toMethodName(String name) {
+ StringBuilder s = new StringBuilder(name.toLowerCase());
+ int i;
+ while ((i = s.indexOf("_")) != -1) {
+ s.deleteCharAt(i);
+ s.setCharAt(i, Character.toUpperCase(s.charAt(i)));
+ }
+ return s.toString();
+ }
+}
--- a/jdk/test/java/net/httpclient/http2/java.httpclient/sun/net/httpclient/hpack/DecoderTest.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/test/java/net/httpclient/http2/java.httpclient/sun/net/httpclient/hpack/DecoderTest.java Wed Jun 29 21:49:41 2016 -0700
@@ -27,14 +27,20 @@
import java.io.UncheckedIOException;
import java.net.ProtocolException;
import java.nio.ByteBuffer;
+import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
+import java.util.function.Supplier;
import java.util.stream.Collectors;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static sun.net.httpclient.hpack.TestHelper.*;
+//
+// Tests whose names start with "testX" are the ones captured from real HPACK
+// use cases
+//
public final class DecoderTest {
//
@@ -138,6 +144,23 @@
// @formatter:on
}
+ @Test
+ public void example5AllSplits() {
+ // @formatter:off
+ testAllSplits(
+ "8286 8441 0f77 7777 2e65 7861 6d70 6c65\n" +
+ "2e63 6f6d",
+
+ "[ 1] (s = 57) :authority: www.example.com\n" +
+ " Table size: 57",
+
+ ":method: GET\n" +
+ ":scheme: http\n" +
+ ":path: /\n" +
+ ":authority: www.example.com");
+ // @formatter:on
+ }
+
//
// http://tools.ietf.org/html/rfc7541#appendix-C.4
//
@@ -334,6 +357,45 @@
// @formatter:on
}
+ @Test
+ public void testX1() {
+ // Supplier of a decoder with a particular state
+ Supplier<Decoder> s = () -> {
+ Decoder d = new Decoder(4096);
+ // @formatter:off
+ test(d, "88 76 92 ca 54 a7 d7 f4 fa ec af ed 6d da 61 d7 bb 1e ad ff" +
+ "df 61 97 c3 61 be 94 13 4a 65 b6 a5 04 00 b8 a0 5a b8 db 77" +
+ "1b 71 4c 5a 37 ff 0f 0d 84 08 00 00 03",
+
+ "[ 1] (s = 65) date: Fri, 24 Jun 2016 14:55:56 GMT\n" +
+ "[ 2] (s = 59) server: Jetty(9.3.z-SNAPSHOT)\n" +
+ " Table size: 124",
+
+ ":status: 200\n" +
+ "server: Jetty(9.3.z-SNAPSHOT)\n" +
+ "date: Fri, 24 Jun 2016 14:55:56 GMT\n" +
+ "content-length: 100000"
+ );
+ // @formatter:on
+ return d;
+ };
+ // For all splits of the following data fed to the supplied decoder we
+ // must get what's expected
+ // @formatter:off
+ testAllSplits(s,
+ "88 bf be 0f 0d 84 08 00 00 03",
+
+ "[ 1] (s = 65) date: Fri, 24 Jun 2016 14:55:56 GMT\n" +
+ "[ 2] (s = 59) server: Jetty(9.3.z-SNAPSHOT)\n" +
+ " Table size: 124",
+
+ ":status: 200\n" +
+ "server: Jetty(9.3.z-SNAPSHOT)\n" +
+ "date: Fri, 24 Jun 2016 14:55:56 GMT\n" +
+ "content-length: 100000");
+ // @formatter:on
+ }
+
//
// This test is missing in the spec
//
@@ -567,6 +629,38 @@
test(new Decoder(4096), hexdump, headerTable, headerList);
}
+ private static void testAllSplits(String hexdump,
+ String expectedHeaderTable,
+ String expectedHeaderList) {
+ testAllSplits(() -> new Decoder(256), hexdump, expectedHeaderTable, expectedHeaderList);
+ }
+
+ private static void testAllSplits(Supplier<Decoder> supplier, String hexdump,
+ String expectedHeaderTable, String expectedHeaderList) {
+ ByteBuffer source = SpecHelper.toBytes(hexdump);
+
+ BuffersTestingKit.forEachSplit(source, iterable -> {
+ List<String> actual = new LinkedList<>();
+ Iterator<? extends ByteBuffer> i = iterable.iterator();
+ if (!i.hasNext()) {
+ return;
+ }
+ Decoder d = supplier.get();
+ do {
+ ByteBuffer n = i.next();
+ d.decode(n, !i.hasNext(), (name, value) -> {
+ if (value == null) {
+ actual.add(name.toString());
+ } else {
+ actual.add(name + ": " + value);
+ }
+ });
+ } while (i.hasNext());
+ assertEquals(d.getTable().getStateString(), expectedHeaderTable);
+ assertEquals(actual.stream().collect(Collectors.joining("\n")), expectedHeaderList);
+ });
+ }
+
//
// Sometimes we need to keep the same decoder along several runs,
// as it models the same connection
--- a/jdk/test/java/net/httpclient/http2/java.httpclient/sun/net/httpclient/hpack/EncoderTest.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/test/java/net/httpclient/http2/java.httpclient/sun/net/httpclient/hpack/EncoderTest.java Wed Jun 29 21:49:41 2016 -0700
@@ -24,17 +24,23 @@
import org.testng.annotations.Test;
+import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedList;
import java.util.List;
+import java.util.function.Consumer;
import java.util.function.Function;
+import static sun.net.httpclient.hpack.BuffersTestingKit.concat;
+import static sun.net.httpclient.hpack.BuffersTestingKit.forEachSplit;
+import static sun.net.httpclient.hpack.SpecHelper.toHexdump;
+import static sun.net.httpclient.hpack.TestHelper.assertVoidThrows;
import static java.util.Arrays.asList;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
-import static sun.net.httpclient.hpack.SpecHelper.toHexdump;
-import static sun.net.httpclient.hpack.TestHelper.assertVoidThrows;
// TODO: map textual representation of commands from the spec to actual
// calls to encoder (actually, this is a good idea for decoder as well)
@@ -198,6 +204,61 @@
// @formatter:on
}
+ @Test
+ public void example5AllSplits() {
+
+ List<Consumer<Encoder>> actions = new LinkedList<>();
+ actions.add(e -> e.indexed(2));
+ actions.add(e -> e.indexed(6));
+ actions.add(e -> e.indexed(4));
+ actions.add(e -> e.literalWithIndexing(1, "www.example.com", false));
+
+ encodeAllSplits(
+ actions,
+
+ "8286 8441 0f77 7777 2e65 7861 6d70 6c65\n" +
+ "2e63 6f6d",
+
+ "[ 1] (s = 57) :authority: www.example.com\n" +
+ " Table size: 57");
+ }
+
+ private static void encodeAllSplits(Iterable<Consumer<Encoder>> consumers,
+ String expectedHexdump,
+ String expectedTableState) {
+ ByteBuffer buffer = SpecHelper.toBytes(expectedHexdump);
+ erase(buffer); // Zeroed buffer of size needed to hold the encoding
+ forEachSplit(buffer, iterable -> {
+ List<ByteBuffer> copy = new LinkedList<>();
+ iterable.forEach(b -> copy.add(ByteBuffer.allocate(b.remaining())));
+ Iterator<ByteBuffer> output = copy.iterator();
+ if (!output.hasNext()) {
+ throw new IllegalStateException("No buffers to encode to");
+ }
+ Encoder e = newCustomEncoder(256); // FIXME: pull up (as a parameter)
+ drainInitialUpdate(e);
+ boolean encoded;
+ ByteBuffer b = output.next();
+ for (Consumer<Encoder> c : consumers) {
+ c.accept(e);
+ do {
+ encoded = e.encode(b);
+ if (!encoded) {
+ if (output.hasNext()) {
+ b = output.next();
+ } else {
+ throw new IllegalStateException("No room for encoding");
+ }
+ }
+ }
+ while (!encoded);
+ }
+ copy.forEach(Buffer::flip);
+ ByteBuffer data = concat(copy);
+ test(e, data, expectedHexdump, expectedTableState);
+ });
+ }
+
//
// http://tools.ietf.org/html/rfc7541#appendix-C.4
//
@@ -620,4 +681,12 @@
b.flip();
} while (!done);
}
+
+ private static void erase(ByteBuffer buffer) {
+ buffer.clear();
+ while (buffer.hasRemaining()) {
+ buffer.put((byte) 0);
+ }
+ buffer.clear();
+ }
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/logging/FileHandlerMaxLocksTest.java Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,114 @@
+/*
+ * 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.
+ *
+ * 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.
+ */
+
+/*
+ * @test
+ * @bug 8153955
+ * @summary test the FileHandler's new property
+ * "java.util.logging.FileHandler.maxLocks" which will be present in
+ * "logging.properties" file with default value of 100. This property can be
+ * overriden by specifying this property in the custom config file.
+ * @library /lib/testlibrary
+ * @build jdk.testlibrary.FileUtils
+ * @author rpatil
+ * @run main/othervm FileHandlerMaxLocksTest
+ */
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.FileHandler;
+import jdk.testlibrary.FileUtils;
+
+public class FileHandlerMaxLocksTest {
+
+ private static final String LOGGER_DIR = "logger-dir";
+ private static final String MAX_LOCK_PROPERTY = "java.util.logging.FileHandler.maxLocks = 200";
+ private static final String CONFIG_FILE_NAME = "logging.properties";
+
+ public static void main(String[] args) throws Exception {
+ File loggerDir = createLoggerDir();
+ String configFilePath = loggerDir.getPath() + File.separator + CONFIG_FILE_NAME;
+ File configFile = new File(configFilePath);
+ createFile(configFile, false);
+ System.setProperty("java.util.logging.config.file", configFilePath);
+ List<FileHandler> fileHandlers = new ArrayList<>();
+ try (FileWriter writer = new FileWriter(configFile)) {
+ writer.write(MAX_LOCK_PROPERTY);
+ writer.flush();
+ // 200 raises the default limit of 100, we try 102 times
+ for (int i = 0; i < 102; i++) {
+ fileHandlers.add(new FileHandler(loggerDir.getPath() + File.separator + "test_%u.log"));
+ }
+ } catch (IOException ie) {
+ throw new RuntimeException("Test Failed: " + ie.getMessage());
+ } finally {
+ for (FileHandler fh : fileHandlers) {
+ fh.close();
+ }
+ FileUtils.deleteFileTreeWithRetry(Paths.get(loggerDir.getPath()));
+ }
+ }
+
+ /**
+ * Create a writable directory in user directory for the test
+ *
+ * @return writable directory created that needs to be deleted when done
+ * @throws RuntimeException
+ */
+ private static File createLoggerDir() throws RuntimeException {
+ String userDir = System.getProperty("user.dir", ".");
+ File loggerDir = new File(userDir, LOGGER_DIR);
+ if (!createFile(loggerDir, true)) {
+ throw new RuntimeException("Test failed: unable to create"
+ + " writable working directory "
+ + loggerDir.getAbsolutePath());
+ }
+ // System.out.println("Created Logger Directory: " + loggerDir.getPath());
+ return loggerDir;
+ }
+
+ /**
+ * @param newFile File to be created
+ * @param makeDirectory is File to be created is directory
+ * @return true if file already exists or creation succeeded
+ */
+ private static boolean createFile(File newFile, boolean makeDirectory) {
+ if (newFile.exists()) {
+ return true;
+ }
+ if (makeDirectory) {
+ return newFile.mkdir();
+ } else {
+ try {
+ return newFile.createNewFile();
+ } catch (IOException ie) {
+ System.err.println("Not able to create file: " + newFile
+ + ", IOException: " + ie.getMessage());
+ return false;
+ }
+ }
+ }
+}
--- a/jdk/test/java/util/zip/ZipFile/ReadZip.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/test/java/util/zip/ZipFile/ReadZip.java Wed Jun 29 21:49:41 2016 -0700
@@ -22,7 +22,7 @@
*/
/* @test
- @bug 4241361 4842702 4985614 6646605 5032358 6923692
+ @bug 4241361 4842702 4985614 6646605 5032358 6923692 6233323 8144977
@summary Make sure we can read a zip file.
@key randomness
*/
@@ -105,6 +105,40 @@
newZip.delete();
}
+ // Read directory entry
+ try {
+ try (FileOutputStream fos = new FileOutputStream(newZip);
+ ZipOutputStream zos = new ZipOutputStream(fos))
+ {
+ ZipEntry ze = new ZipEntry("directory/");
+ zos.putNextEntry(ze);
+ zos.closeEntry();
+ }
+ try (ZipFile zf = new ZipFile(newZip)) {
+ ZipEntry ze = zf.getEntry("directory/");
+ if (ze == null || !ze.isDirectory())
+ throw new RuntimeException("read entry \"directory/\" failed");
+ try (InputStream is = zf.getInputStream(ze)) {
+ is.available();
+ } catch (Exception x) {
+ x.printStackTrace();
+ }
+
+ ze = zf.getEntry("directory");
+ if (ze == null || !ze.isDirectory())
+ throw new RuntimeException("read entry \"directory\" failed");
+ try (InputStream is = zf.getInputStream(ze)) {
+ is.available();
+ } catch (Exception x) {
+ x.printStackTrace();
+ }
+ }
+ } finally {
+ newZip.delete();
+ }
+
+
+
// Throw a FNF exception when read a non-existing zip file
try { unreached (new ZipFile(
new File(System.getProperty("test.src", "."),
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/bind/JAXBContext/JAXBContextWithAbstractFactory.java Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,100 @@
+/*
+ * 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.
+ *
+ * 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.
+ */
+import java.security.Permission;
+import java.security.Policy;
+import java.security.ProtectionDomain;
+import java.util.Map;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBContextFactory;
+import javax.xml.bind.JAXBException;
+
+/**
+ * @test
+ * @bug 8150173
+ * @summary Verifies that a factory which inherit its createContext method
+ * from an abstract subclass of JAXBContextFactory can be instantiated.
+ * @compile -addmods java.xml.bind JAXBContextWithAbstractFactory.java
+ * @run main/othervm -addmods java.xml.bind JAXBContextWithAbstractFactory
+ */
+public class JAXBContextWithAbstractFactory {
+ private static JAXBContext tmp;
+
+ public static abstract class FactoryBase implements JAXBContextFactory {
+ @Override
+ public JAXBContext createContext(Class<?>[] classesToBeBound,
+ Map<String, ?> properties) throws JAXBException {
+ return tmp;
+ }
+
+ @Override
+ public JAXBContext createContext(String contextPath,
+ ClassLoader classLoader, Map<String, ?> properties)
+ throws JAXBException {
+ return tmp;
+ }
+ }
+
+ public static class Factory extends FactoryBase {}
+
+ // test both without and then with a security manager as the code path
+ // can be different when System.getSecurityManager() != null;
+ public static void main(String[] args) throws JAXBException {
+ System.out.println("\nWithout security manager\n");
+ test();
+
+ System.out.println("\nWith security manager\n");
+ Policy.setPolicy(new Policy() {
+ @Override
+ public boolean implies(ProtectionDomain domain, Permission permission) {
+ return true; // allow all
+ }
+ });
+ System.setSecurityManager(new SecurityManager());
+ test();
+ }
+
+ public static void test() throws JAXBException {
+ System.clearProperty(JAXBContext.JAXB_CONTEXT_FACTORY);
+ System.out.println(JAXBContext.JAXB_CONTEXT_FACTORY + " = "
+ + System.getProperty(JAXBContext.JAXB_CONTEXT_FACTORY, ""));
+ System.out.println("Calling "
+ + "JAXBContext.newInstance(JAXBContextWithAbstractFactory.class)");
+ tmp = JAXBContext.newInstance(JAXBContextWithAbstractFactory.class);
+ System.setProperty(JAXBContext.JAXB_CONTEXT_FACTORY,
+ "JAXBContextWithAbstractFactory$Factory");
+ System.out.println(JAXBContext.JAXB_CONTEXT_FACTORY + " = "
+ + System.getProperty(JAXBContext.JAXB_CONTEXT_FACTORY));
+ System.out.println("Calling "
+ + "JAXBContext.newInstance(JAXBContextWithAbstractFactory.class)");
+ JAXBContext ctxt = JAXBContext.newInstance(JAXBContextWithAbstractFactory.class);
+ System.out.println("Successfully loaded JAXBcontext: " +
+ System.identityHashCode(ctxt) + "@" + ctxt.getClass().getName());
+ if (ctxt != tmp) {
+ throw new RuntimeException("Wrong JAXBContext instance"
+ + "\n\texpected: "
+ + System.identityHashCode(tmp) + "@" + tmp.getClass().getName()
+ + "\n\tactual: "
+ + System.identityHashCode(ctxt) + "@" + ctxt.getClass().getName());
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/bind/JAXBContext/JAXBContextWithLegacyFactory.java Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,147 @@
+/*
+ * 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.
+ *
+ * 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.
+ */
+import java.security.Permission;
+import java.security.Policy;
+import java.security.ProtectionDomain;
+import java.util.Map;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.bind.Validator;
+
+/**
+ * @test
+ * @bug 8150173
+ * @summary Verifies that a JAXBContext can be created with a legacy
+ * factory class that has static createContext methods.
+ * @compile -addmods java.xml.bind JAXBContextWithLegacyFactory.java
+ * @run main/othervm -addmods java.xml.bind JAXBContextWithLegacyFactory
+ */
+public class JAXBContextWithLegacyFactory {
+ private static JAXBContext tmp;
+
+ public static class JAXBContextImpl extends JAXBContext {
+ public final Class<?> creator;
+ JAXBContextImpl(Class<?> creator) {
+ this.creator = creator;
+ }
+
+ @Override
+ public Unmarshaller createUnmarshaller() throws JAXBException {
+ return tmp.createUnmarshaller();
+ }
+
+ @Override
+ public Marshaller createMarshaller() throws JAXBException {
+ return tmp.createMarshaller();
+ }
+
+ @Override
+ public Validator createValidator() throws JAXBException {
+ return tmp.createValidator();
+ }
+ }
+
+ public static abstract class FactoryBase {
+ public static JAXBContext createContext(Class<?>[] classesToBeBound,
+ Map<String, ?> properties) throws JAXBException {
+ return new JAXBContextImpl(FactoryBase.class);
+ }
+
+ public static JAXBContext createContext(String contextPath,
+ ClassLoader classLoader, Map<String, ?> properties)
+ throws JAXBException {
+ return new JAXBContextImpl(FactoryBase.class);
+ }
+ }
+
+ public static class Factory1 extends FactoryBase {}
+
+ public static class Factory2 extends FactoryBase {
+ public static JAXBContext createContext(Class<?>[] classesToBeBound,
+ Map<String, ?> properties) throws JAXBException {
+ return new JAXBContextImpl(Factory2.class);
+ }
+
+ public static JAXBContext createContext(String contextPath,
+ ClassLoader classLoader, Map<String, ?> properties)
+ throws JAXBException {
+ return new JAXBContextImpl(Factory2.class);
+ }
+ }
+
+ // test both without and then with a security manager as the code path
+ // can be different when System.getSecurityManager() != null;
+ public static void main(String[] args) throws JAXBException {
+ System.out.println("\nWithout security manager\n");
+ test(FactoryBase.class, FactoryBase.class);
+ test(Factory1.class, FactoryBase.class);
+ test(Factory2.class, Factory2.class);
+
+ System.out.println("\nWith security manager\n");
+ Policy.setPolicy(new Policy() {
+ @Override
+ public boolean implies(ProtectionDomain domain, Permission permission) {
+ return true; // allow all
+ }
+ });
+ System.setSecurityManager(new SecurityManager());
+ test(FactoryBase.class, FactoryBase.class);
+ test(Factory1.class, FactoryBase.class);
+ test(Factory2.class, Factory2.class);
+ }
+
+ public static void test(Class<?> factoryClass, Class<?> creatorClass) throws JAXBException {
+ System.clearProperty(JAXBContext.JAXB_CONTEXT_FACTORY);
+ System.out.println("** Testing with Factory Class: " + factoryClass.getName());
+ System.out.println(JAXBContext.JAXB_CONTEXT_FACTORY + " = "
+ + System.getProperty(JAXBContext.JAXB_CONTEXT_FACTORY, ""));
+ System.out.println("Calling "
+ + "JAXBContext.newInstance(JAXBContextWithLegacyFactory.class)");
+ tmp = JAXBContext.newInstance(JAXBContextWithLegacyFactory.class);
+ System.setProperty(JAXBContext.JAXB_CONTEXT_FACTORY,
+ factoryClass.getName());
+ System.out.println(JAXBContext.JAXB_CONTEXT_FACTORY + " = "
+ + System.getProperty(JAXBContext.JAXB_CONTEXT_FACTORY));
+ System.out.println("Calling "
+ + "JAXBContext.newInstance(JAXBContextWithLegacyFactory.class)");
+ JAXBContext ctxt = JAXBContext.newInstance(JAXBContextWithLegacyFactory.class);
+ System.out.println("Successfully loaded JAXBcontext: " +
+ System.identityHashCode(ctxt) + "@" + ctxt.getClass().getName());
+ if (ctxt.getClass() != JAXBContextImpl.class) {
+ throw new RuntimeException("Wrong JAXBContext class"
+ + "\n\texpected: "
+ + System.identityHashCode(tmp) + "@" + JAXBContextImpl.class.getName()
+ + "\n\tactual: "
+ + System.identityHashCode(ctxt) + "@" + ctxt.getClass().getName());
+ }
+ if (((JAXBContextImpl)ctxt).creator != creatorClass) {
+ throw new RuntimeException("Wrong Factory class"
+ + "\n\texpected: "
+ + System.identityHashCode(tmp) + "@" + creatorClass.getName()
+ + "\n\tactual: "
+ + System.identityHashCode(ctxt) + "@" + ((JAXBContextImpl)ctxt).creator.getName());
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/bind/JAXBContext/JAXBContextWithSubclassedFactory.java Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,153 @@
+/*
+ * 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.
+ *
+ * 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.
+ */
+import java.security.Permission;
+import java.security.Policy;
+import java.security.ProtectionDomain;
+import java.util.Map;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBContextFactory;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.bind.Validator;
+
+/**
+ * @test
+ * @bug 8150173
+ * @summary Verifies that a factory which inherit its createContext method
+ * from a concrete subclass of JAXBContextFactory is be instantiated.
+ * @compile -addmods java.xml.bind JAXBContextWithSubclassedFactory.java
+ * @run main/othervm -addmods java.xml.bind JAXBContextWithSubclassedFactory
+ */
+public class JAXBContextWithSubclassedFactory {
+ static JAXBContext tmp;
+
+ public static class JAXBContextImpl extends JAXBContext {
+ public final Class<?> creator;
+ JAXBContextImpl(Class<?> creator) {
+ this.creator = creator;
+ }
+
+ @Override
+ public Unmarshaller createUnmarshaller() throws JAXBException {
+ return tmp.createUnmarshaller();
+ }
+
+ @Override
+ public Marshaller createMarshaller() throws JAXBException {
+ return tmp.createMarshaller();
+ }
+
+ @Override
+ public Validator createValidator() throws JAXBException {
+ return tmp.createValidator();
+ }
+ }
+
+ public static class FactoryBase implements JAXBContextFactory {
+
+ @Override
+ public JAXBContext createContext(Class<?>[] classesToBeBound,
+ Map<String, ?> properties) throws JAXBException {
+ return new JAXBContextImpl(this.getClass());
+ }
+
+ @Override
+ public JAXBContext createContext(String contextPath,
+ ClassLoader classLoader, Map<String, ?> properties)
+ throws JAXBException {
+ return new JAXBContextImpl(this.getClass());
+ }
+ }
+
+ public static class NonFactoryBase {
+
+ public JAXBContext createContext(Class<?>[] classesToBeBound,
+ Map<String, ?> properties) throws JAXBException {
+ return new JAXBContextImpl(this.getClass());
+ }
+
+ public JAXBContext createContext(String contextPath,
+ ClassLoader classLoader, Map<String, ?> properties)
+ throws JAXBException {
+ return new JAXBContextImpl(this.getClass());
+ }
+ }
+
+ public static class Factory1 extends FactoryBase {}
+ public static class Factory2 extends NonFactoryBase implements JAXBContextFactory {}
+
+ // test both without and then with a security manager as the code path
+ // can be different when System.getSecurityManager() != null;
+ public static void main(String[] args) throws JAXBException {
+ System.out.println("\nWithout security manager\n");
+ test(FactoryBase.class);
+ test(Factory1.class);
+ test(Factory2.class);
+
+ System.out.println("\nWith security manager\n");
+ Policy.setPolicy(new Policy() {
+ @Override
+ public boolean implies(ProtectionDomain domain, Permission permission) {
+ return true; // allow all
+ }
+ });
+ System.setSecurityManager(new SecurityManager());
+ test(FactoryBase.class);
+ test(Factory1.class);
+ test(Factory2.class);
+ }
+
+ public static void test(Class<?> factoryClass) throws JAXBException {
+ System.clearProperty(JAXBContext.JAXB_CONTEXT_FACTORY);
+ System.out.println("** Testing with Factory Class: " + factoryClass.getName());
+ System.out.println(JAXBContext.JAXB_CONTEXT_FACTORY + " = "
+ + System.getProperty(JAXBContext.JAXB_CONTEXT_FACTORY, ""));
+ System.out.println("Calling "
+ + "JAXBContext.newInstance(JAXBContextWithSubclassedFactory.class)");
+ tmp = JAXBContext.newInstance(JAXBContextWithSubclassedFactory.class);
+ System.setProperty(JAXBContext.JAXB_CONTEXT_FACTORY,
+ factoryClass.getName());
+ System.out.println(JAXBContext.JAXB_CONTEXT_FACTORY + " = "
+ + System.getProperty(JAXBContext.JAXB_CONTEXT_FACTORY));
+ System.out.println("Calling "
+ + "JAXBContext.newInstance(JAXBContextWithSubclassedFactory.class)");
+ JAXBContext ctxt = JAXBContext.newInstance(JAXBContextWithSubclassedFactory.class);
+ System.out.println("Successfully loaded JAXBcontext: " +
+ System.identityHashCode(ctxt) + "@" + ctxt.getClass().getName());
+ if (ctxt.getClass() != JAXBContextImpl.class) {
+ throw new RuntimeException("Wrong JAXBContext class"
+ + "\n\texpected: "
+ + System.identityHashCode(tmp) + "@" + JAXBContextImpl.class.getName()
+ + "\n\tactual: "
+ + System.identityHashCode(ctxt) + "@" + ctxt.getClass().getName());
+ }
+ if (((JAXBContextImpl)ctxt).creator != factoryClass) {
+ throw new RuntimeException("Wrong Factory class"
+ + "\n\texpected: "
+ + System.identityHashCode(tmp) + "@" + factoryClass.getName()
+ + "\n\tactual: "
+ + System.identityHashCode(ctxt) + "@" + ((JAXBContextImpl)ctxt).creator.getName());
+ }
+ }
+}
--- a/jdk/test/jdk/internal/jrtfs/Basic.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/test/jdk/internal/jrtfs/Basic.java Wed Jun 29 21:49:41 2016 -0700
@@ -715,5 +715,14 @@
assertTrue(childCount != 0);
assertEquals(dirPrefixOkayCount, childCount);
}
+
+ @Test
+ public void objectClassSizeTest() throws Exception {
+ String path = "/modules/java.base/java/lang/Object.class";
+ FileSystem fs = FileSystems.getFileSystem(URI.create("jrt:/"));
+ Path classFile = fs.getPath(path);
+
+ assertTrue(Files.size(classFile) > 0L);
+ }
}
--- a/jdk/test/sun/security/tools/jarsigner/TimestampCheck.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/test/sun/security/tools/jarsigner/TimestampCheck.java Wed Jun 29 21:49:41 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -39,6 +39,7 @@
import java.util.Calendar;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
+import java.util.Locale;
import sun.security.pkcs.ContentInfo;
import sun.security.pkcs.PKCS7;
@@ -371,7 +372,7 @@
static void jarsigner(String cmd, int path, boolean expected)
throws Exception {
System.err.println("Test " + path);
- Process p = Runtime.getRuntime().exec(String.format(cmd, path, path));
+ Process p = Runtime.getRuntime().exec(String.format(Locale.ROOT,cmd, path, path));
BufferedReader reader = new BufferedReader(
new InputStreamReader(p.getErrorStream()));
while (true) {
--- a/jdk/test/sun/util/locale/provider/Bug8038436.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/test/sun/util/locale/provider/Bug8038436.java Wed Jun 29 21:49:41 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 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
@@ -23,24 +23,25 @@
/*
* @test
- * @bug 8038436
+ * @bug 8038436 8158504
* @summary Test for changes in 8038436
* @modules java.base/sun.util.locale.provider
* java.base/sun.util.spi
* @compile -XDignore.symbol.file Bug8038436.java
- * @run main/othervm Bug8038436 -Djava.ext.dirs=foo security
- * @run main/othervm Bug8038436 -Djava.locale.providers=JRE availlocs
+ * @run main/othervm -limitmods java.base Bug8038436 security
+ * @run main/othervm -Djava.locale.providers=COMPAT Bug8038436 availlocs
*/
import java.security.*;
-import java.text.*;
import java.util.*;
import java.util.stream.*;
import sun.util.locale.provider.*;
public class Bug8038436 {
public static void main(String[] args) {
- switch (args[1]) {
+
+ switch (args[0]) {
+
case "security":
securityTests();
break;
@@ -50,6 +51,7 @@
default:
throw new RuntimeException("no test was specified.");
}
+
}
private static void securityTests() {
@@ -67,12 +69,14 @@
/*
* Check only English/ROOT locales are returned if the jdk.localedata
- * module is not installed (implied by "java.ext.dirs" set to "foo").
+ * module is not loaded (implied by "-limitmods java.base").
*/
- if (Arrays.asList(Locale.getAvailableLocales())
- .stream()
- .anyMatch(l -> l != Locale.ROOT && l.getLanguage() != "en")) {
- throw new RuntimeException("non English locale(s) included in available locales");
+ List<Locale> nonEnglishLocales= (Arrays.stream(Locale.getAvailableLocales())
+ .filter(l -> (l != Locale.ROOT && !(l.getLanguage() == "en" && (l.getCountry() == "US" || l.getCountry() == "" ))))
+ .collect(Collectors.toList()));
+
+ if (!nonEnglishLocales.isEmpty()) {
+ throw new RuntimeException("non English locale(s)" + nonEnglishLocales + " included in available locales");
}
}
--- a/jdk/test/tools/jar/compat/CLICompatibility.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/test/tools/jar/compat/CLICompatibility.java Wed Jun 29 21:49:41 2016 -0700
@@ -415,14 +415,14 @@
jar("-h")
.assertSuccess()
.resultChecker(r ->
- assertTrue(r.output.startsWith("Usage: jar [OPTION...] [-C dir] files"),
+ assertTrue(r.output.startsWith("Usage: jar [OPTION...] [ [--release VERSION] [-C dir] files]"),
"Failed, got [" + r.output + "]")
);
jar("--help")
.assertSuccess()
.resultChecker(r ->
- assertTrue(r.output.startsWith("Usage: jar [OPTION...] [-C dir] files"),
+ assertTrue(r.output.startsWith("Usage: jar [OPTION...] [ [--release VERSION] [-C dir] files]"),
"Failed, got [" + r.output + "]")
);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/jar/multiRelease/Basic.java Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,354 @@
+/*
+ * 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.
+ *
+ * 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.
+ */
+
+/*
+ * @test
+ * @library /test/lib/share/classes
+ * @modules java.base/jdk.internal.misc
+ * @build jdk.test.lib.JDKToolFinder jdk.test.lib.Platform
+ * @run testng Basic
+ */
+
+import static org.testng.Assert.*;
+
+import org.testng.annotations.*;
+
+import java.io.*;
+import java.nio.file.*;
+import java.nio.file.attribute.*;
+import java.util.*;
+import java.util.function.Consumer;
+import java.util.jar.*;
+import java.util.stream.Stream;
+import java.util.zip.*;
+
+import jdk.test.lib.JDKToolFinder;
+
+import static java.lang.String.format;
+import static java.lang.System.out;
+
+public class Basic {
+ private final String src = System.getProperty("test.src", ".");
+ private final String usr = System.getProperty("user.dir", ".");
+
+ @Test
+ // create a regular, non-multi-release jar
+ public void test00() throws IOException {
+ String jarfile = "test.jar";
+
+ compile("test01"); //use same data as test01
+
+ Path classes = Paths.get("classes");
+ jar("cf", jarfile, "-C", classes.resolve("base").toString(), ".")
+ .assertSuccess();
+
+ checkMultiRelease(jarfile, false);
+
+ Map<String,String[]> names = Map.of(
+ "version/Main.class",
+ new String[] {"base", "version", "Main.class"},
+
+ "version/Version.class",
+ new String[] {"base", "version", "Version.class"}
+ );
+
+ compare(jarfile, names);
+
+ delete(jarfile);
+ deleteDir(Paths.get(usr, "classes"));
+ }
+
+ @Test
+ // create a multi-release jar
+ public void test01() throws IOException {
+ String jarfile = "test.jar";
+
+ compile("test01");
+
+ Path classes = Paths.get("classes");
+ jar("cf", jarfile, "-C", classes.resolve("base").toString(), ".",
+ "--release", "9", "-C", classes.resolve("v9").toString(), ".",
+ "--release", "10", "-C", classes.resolve("v10").toString(), ".")
+ .assertSuccess();
+
+ checkMultiRelease(jarfile, true);
+
+ Map<String,String[]> names = Map.of(
+ "version/Main.class",
+ new String[] {"base", "version", "Main.class"},
+
+ "version/Version.class",
+ new String[] {"base", "version", "Version.class"},
+
+ "META-INF/versions/9/version/Version.class",
+ new String[] {"v9", "version", "Version.class"},
+
+ "META-INF/versions/10/version/Version.class",
+ new String[] {"v10", "version", "Version.class"}
+ );
+
+ compare(jarfile, names);
+
+ delete(jarfile);
+ deleteDir(Paths.get(usr, "classes"));
+ }
+
+ @Test
+ // update a regular jar to a multi-release jar
+ public void test02() throws IOException {
+ String jarfile = "test.jar";
+
+ compile("test01"); //use same data as test01
+
+ Path classes = Paths.get("classes");
+ jar("cf", jarfile, "-C", classes.resolve("base").toString(), ".")
+ .assertSuccess();
+
+ checkMultiRelease(jarfile, false);
+
+ jar("uf", jarfile, "--release", "9", "-C", classes.resolve("v9").toString(), ".")
+ .assertSuccess();
+
+ checkMultiRelease(jarfile, true);
+
+ Map<String,String[]> names = Map.of(
+ "version/Main.class",
+ new String[] {"base", "version", "Main.class"},
+
+ "version/Version.class",
+ new String[] {"base", "version", "Version.class"},
+
+ "META-INF/versions/9/version/Version.class",
+ new String[] {"v9", "version", "Version.class"}
+ );
+
+ compare(jarfile, names);
+
+ delete(jarfile);
+ deleteDir(Paths.get(usr, "classes"));
+ }
+
+ @Test
+ // replace a base entry and a versioned entry
+ public void test03() throws IOException {
+ String jarfile = "test.jar";
+
+ compile("test01"); //use same data as test01
+
+ Path classes = Paths.get("classes");
+ jar("cf", jarfile, "-C", classes.resolve("base").toString(), ".",
+ "--release", "9", "-C", classes.resolve("v9").toString(), ".")
+ .assertSuccess();
+
+ checkMultiRelease(jarfile, true);
+
+ Map<String,String[]> names = Map.of(
+ "version/Main.class",
+ new String[] {"base", "version", "Main.class"},
+
+ "version/Version.class",
+ new String[] {"base", "version", "Version.class"},
+
+ "META-INF/versions/9/version/Version.class",
+ new String[] {"v9", "version", "Version.class"}
+ );
+
+ compare(jarfile, names);
+
+ // write the v9 version/Version.class entry in base and the v10
+ // version/Version.class entry in versions/9 section
+ jar("uf", jarfile, "-C", classes.resolve("v9").toString(), "version",
+ "--release", "9", "-C", classes.resolve("v10").toString(), ".")
+ .assertSuccess();
+
+ checkMultiRelease(jarfile, true);
+
+ names = Map.of(
+ "version/Main.class",
+ new String[] {"base", "version", "Main.class"},
+
+ "version/Version.class",
+ new String[] {"v9", "version", "Version.class"},
+
+ "META-INF/versions/9/version/Version.class",
+ new String[] {"v10", "version", "Version.class"}
+ );
+
+ delete(jarfile);
+ deleteDir(Paths.get(usr, "classes"));
+ }
+
+ /*
+ * Test Infrastructure
+ */
+ private void compile(String test) throws IOException {
+ Path classes = Paths.get(usr, "classes", "base");
+ Files.createDirectories(classes);
+ Path source = Paths.get(src, "data", test, "base", "version");
+ javac(classes, source.resolve("Main.java"), source.resolve("Version.java"));
+
+ classes = Paths.get(usr, "classes", "v9");
+ Files.createDirectories(classes);
+ source = Paths.get(src, "data", test, "v9", "version");
+ javac(classes, source.resolve("Version.java"));
+
+ classes = Paths.get(usr, "classes", "v10");
+ Files.createDirectories(classes);
+ source = Paths.get(src, "data", test, "v10", "version");
+ javac(classes, source.resolve("Version.java"));
+ }
+
+ private void checkMultiRelease(String jarFile, boolean expected) throws IOException {
+ try (JarFile jf = new JarFile(new File(jarFile), true, ZipFile.OPEN_READ,
+ JarFile.Release.RUNTIME)) {
+ assertEquals(jf.isMultiRelease(), expected);
+ }
+ }
+
+ // compares the bytes found in the jar entries with the bytes found in the
+ // corresponding data files used to create the entries
+ private void compare(String jarfile, Map<String,String[]> names) throws IOException {
+ try (JarFile jf = new JarFile(jarfile)) {
+ for (String name : names.keySet()) {
+ Path path = Paths.get("classes", names.get(name));
+ byte[] b1 = Files.readAllBytes(path);
+ byte[] b2;
+ JarEntry je = jf.getJarEntry(name);
+ try (InputStream is = jf.getInputStream(je)) {
+ b2 = is.readAllBytes();
+ }
+ assertEquals(b1,b2);
+ }
+ }
+ }
+
+ private void delete(String name) throws IOException {
+ Files.delete(Paths.get(usr, name));
+ }
+
+ private void deleteDir(Path dir) throws IOException {
+ Files.walkFileTree(dir, new SimpleFileVisitor<Path>() {
+ @Override
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+ Files.delete(file);
+ return FileVisitResult.CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+ Files.delete(dir);
+ return FileVisitResult.CONTINUE;
+ }
+ });
+ }
+
+ /*
+ * The following methods were taken from modular jar and other jar tests
+ */
+
+ void javac(Path dest, Path... sourceFiles) throws IOException {
+ String javac = JDKToolFinder.getJDKTool("javac");
+
+ List<String> commands = new ArrayList<>();
+ commands.add(javac);
+ commands.add("-d");
+ commands.add(dest.toString());
+ Stream.of(sourceFiles).map(Object::toString).forEach(x -> commands.add(x));
+
+ quickFail(run(new ProcessBuilder(commands)));
+ }
+
+ Result jarWithStdin(File stdinSource, String... args) {
+ String jar = JDKToolFinder.getJDKTool("jar");
+ List<String> commands = new ArrayList<>();
+ commands.add(jar);
+ Stream.of(args).forEach(x -> commands.add(x));
+ ProcessBuilder p = new ProcessBuilder(commands);
+ if (stdinSource != null)
+ p.redirectInput(stdinSource);
+ return run(p);
+ }
+
+ Result jar(String... args) {
+ return jarWithStdin(null, args);
+ }
+
+ void quickFail(Result r) {
+ if (r.ec != 0)
+ throw new RuntimeException(r.output);
+ }
+
+ Result run(ProcessBuilder pb) {
+ Process p;
+ out.printf("Running: %s%n", pb.command());
+ try {
+ p = pb.start();
+ } catch (IOException e) {
+ throw new RuntimeException(
+ format("Couldn't start process '%s'", pb.command()), e);
+ }
+
+ String output;
+ try {
+ output = toString(p.getInputStream(), p.getErrorStream());
+ } catch (IOException e) {
+ throw new RuntimeException(
+ format("Couldn't read process output '%s'", pb.command()), e);
+ }
+
+ try {
+ p.waitFor();
+ } catch (InterruptedException e) {
+ throw new RuntimeException(
+ format("Process hasn't finished '%s'", pb.command()), e);
+ }
+ return new Result(p.exitValue(), output);
+ }
+
+ String toString(InputStream in1, InputStream in2) throws IOException {
+ try (ByteArrayOutputStream dst = new ByteArrayOutputStream();
+ InputStream concatenated = new SequenceInputStream(in1, in2)) {
+ concatenated.transferTo(dst);
+ return new String(dst.toByteArray(), "UTF-8");
+ }
+ }
+
+ static class Result {
+ final int ec;
+ final String output;
+
+ private Result(int ec, String output) {
+ this.ec = ec;
+ this.output = output;
+ }
+ Result assertSuccess() {
+ assertTrue(ec == 0, format("ec: %d, output: %s", ec, output));
+ return this;
+ }
+ Result assertFailure() {
+ assertTrue(ec != 0, format("ec: %d, output: %s", ec, output));
+ return this;
+ }
+ Result resultChecker(Consumer<Result> r) { r.accept(this); return this; }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/jar/multiRelease/data/test01/base/version/Main.java Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,8 @@
+package version;
+
+public class Main {
+ public static void main(String[] args) {
+ Version v = new Version();
+ System.out.println("I am running on version " + v.getVersion());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/jar/multiRelease/data/test01/base/version/Version.java Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,13 @@
+package version;
+
+public class Version {
+ public int getVersion() {
+ return 8;
+ }
+
+ protected void doNothing() {
+ }
+
+ private void reallyDoNothing() {
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/jar/multiRelease/data/test01/v10/version/Version.java Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,13 @@
+package version;
+
+public class Version {
+ public int getVersion() {
+ return 10;
+ }
+
+ protected void doNothing() {
+ }
+
+ private void someName() {
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/jar/multiRelease/data/test01/v9/version/Version.java Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,13 @@
+package version;
+
+public class Version {
+ public int getVersion() {
+ return 9;
+ }
+
+ protected void doNothing() {
+ }
+
+ private void anyName() {
+ }
+}
--- a/jdk/test/tools/jlink/ImageFilePoolTest.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/test/tools/jlink/ImageFilePoolTest.java Wed Jun 29 21:49:41 2016 -0700
@@ -33,7 +33,7 @@
import java.io.ByteArrayInputStream;
import java.util.Optional;
import java.util.function.Function;
-import jdk.tools.jlink.internal.ModuleEntryImpl;
+import jdk.tools.jlink.internal.ModuleEntryFactory;
import jdk.tools.jlink.internal.ModulePoolImpl;
import jdk.tools.jlink.plugin.ModuleEntry;
import jdk.tools.jlink.plugin.ModulePool;
@@ -54,7 +54,7 @@
ModulePool input = new ModulePoolImpl();
for (int i = 0; i < 1000; ++i) {
String module = "module" + (i / 100);
- input.add(new InMemoryImageFile(module, "/" + module + "/java/class" + i,
+ input.add(newInMemoryImageFile("/" + module + "/java/class" + i,
ModuleEntry.Type.CONFIG, "class" + i));
}
if (input.getEntryCount() != 1000) {
@@ -94,11 +94,11 @@
switch (index) {
case 0:
++amountAfter;
- return new InMemoryImageFile(file.getModule(), file.getPath() + SUFFIX,
+ return newInMemoryImageFile(file.getPath() + SUFFIX,
file.getType(), file.getPath());
case 1:
++amountAfter;
- return new InMemoryImageFile(file.getModule(), file.getPath(),
+ return newInMemoryImageFile(file.getPath(),
file.getType(), file.getPath());
}
return null;
@@ -130,28 +130,27 @@
if (input.findEntry("unknown").isPresent()) {
throw new AssertionError("ImageFileModulePool does not return null for unknown file");
}
- if (input.contains(new InMemoryImageFile("", "unknown", ModuleEntry.Type.CONFIG, "unknown"))) {
- throw new AssertionError("'contain' returns true for unknown file");
+ if (input.contains(newInMemoryImageFile("/unknown/foo", ModuleEntry.Type.CONFIG, "unknown"))) {
+ throw new AssertionError("'contain' returns true for /unknown/foo file");
}
- input.add(new InMemoryImageFile("", "/aaa/bbb", ModuleEntry.Type.CONFIG, ""));
+ input.add(newInMemoryImageFile("/aaa/bbb", ModuleEntry.Type.CONFIG, ""));
try {
- input.add(new InMemoryImageFile("", "/aaa/bbb", ModuleEntry.Type.CONFIG, ""));
+ input.add(newInMemoryImageFile("/aaa/bbb", ModuleEntry.Type.CONFIG, ""));
throw new AssertionError("Exception expected");
} catch (Exception e) {
// expected
}
input.setReadOnly();
try {
- input.add(new InMemoryImageFile("", "/aaa/ccc", ModuleEntry.Type.CONFIG, ""));
+ input.add(newInMemoryImageFile("/aaa/ccc", ModuleEntry.Type.CONFIG, ""));
throw new AssertionError("Exception expected");
} catch (Exception e) {
// expected
}
}
- private static class InMemoryImageFile extends ModuleEntryImpl {
- public InMemoryImageFile(String module, String path, ModuleEntry.Type type, String content) {
- super(module, path, type, new ByteArrayInputStream(content.getBytes()), content.getBytes().length);
- }
+ private static ModuleEntry newInMemoryImageFile(String path,
+ ModuleEntry.Type type, String content) {
+ return ModuleEntryFactory.create(path, type, content.getBytes());
}
}
--- a/jdk/test/tools/jlink/JLinkTest.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/test/tools/jlink/JLinkTest.java Wed Jun 29 21:49:41 2016 -0700
@@ -24,6 +24,7 @@
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
+import java.lang.module.ModuleDescriptor;
import java.lang.reflect.Layer;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -34,6 +35,7 @@
import java.util.stream.Stream;
import jdk.tools.jlink.plugin.Plugin;
+import jdk.tools.jlink.plugin.TransformerPlugin;
import jdk.tools.jlink.internal.PluginRepository;
import tests.Helper;
import tests.JImageGenerator;
@@ -51,9 +53,20 @@
* jdk.jlink/jdk.tools.jimage
* jdk.compiler
* @build tests.*
- * @run main/othervm -verbose:gc -Xmx1g JLinkTest
+ * @run main/othervm -Xmx1g JLinkTest
*/
public class JLinkTest {
+ // number of built-in plugins from jdk.jlink module
+ private static int getNumJlinkPlugins() {
+ ModuleDescriptor desc = Plugin.class.getModule().getDescriptor();
+ return desc.provides().
+ get(TransformerPlugin.class.getName()).
+ providers().size();
+ }
+
+ private static boolean isOfJLinkModule(Plugin p) {
+ return p.getClass().getModule() == Plugin.class.getModule();
+ }
public static void main(String[] args) throws Exception {
@@ -63,18 +76,27 @@
return;
}
helper.generateDefaultModules();
- int numPlugins = 13;
+ // expected num. of plugins from jdk.jlink module
+ int expectedJLinkPlugins = getNumJlinkPlugins();
+ int totalPlugins = 0;
{
// number of built-in plugins
List<Plugin> builtInPlugins = new ArrayList<>();
builtInPlugins.addAll(PluginRepository.getPlugins(Layer.boot()));
+ totalPlugins = builtInPlugins.size();
+ // actual num. of plugins loaded from jdk.jlink module
+ int actualJLinkPlugins = 0;
for (Plugin p : builtInPlugins) {
p.getState();
p.getType();
+ if (isOfJLinkModule(p)) {
+ actualJLinkPlugins++;
+ }
}
- if (builtInPlugins.size() != numPlugins) {
- throw new AssertionError("Found plugins doesn't match expected number : " +
- numPlugins + "\n" + builtInPlugins);
+ if (expectedJLinkPlugins != actualJLinkPlugins) {
+ throw new AssertionError("Actual plugins loaded from jdk.jlink: " +
+ actualJLinkPlugins + " which doesn't match expected number : " +
+ expectedJLinkPlugins);
}
}
@@ -139,9 +161,9 @@
long number = Stream.of(output.split("\\R"))
.filter((s) -> s.matches("Plugin Name:.*"))
.count();
- if (number != numPlugins) {
+ if (number != totalPlugins) {
System.err.println(output);
- throw new AssertionError("Found: " + number + " expected " + numPlugins);
+ throw new AssertionError("Found: " + number + " expected " + totalPlugins);
}
}
--- a/jdk/test/tools/jlink/ResourcePoolTest.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/test/tools/jlink/ResourcePoolTest.java Wed Jun 29 21:49:41 2016 -0700
@@ -66,9 +66,7 @@
String module = "/module" + (i / 10);
String resourcePath = module + "/java/package" + i;
byte[] bytes = resourcePath.getBytes();
- input.add(ModuleEntry.create(module, resourcePath,
- ModuleEntry.Type.CLASS_OR_RESOURCE,
- new ByteArrayInputStream(bytes), bytes.length));
+ input.add(ModuleEntry.create(resourcePath, bytes));
}
ModulePool output = new ModulePoolImpl();
ResourceVisitor visitor = new ResourceVisitor();
@@ -103,12 +101,11 @@
switch (index) {
case 0:
++amountAfter;
- return ModuleEntry.create(resource.getModule(), resource.getPath() + SUFFIX,
- resource.getType(), resource.stream(), resource.getLength());
+ return ModuleEntry.create(resource.getPath() + SUFFIX,
+ resource.getType(), resource.getBytes());
case 1:
++amountAfter;
- return ModuleEntry.create(resource.getModule(), resource.getPath(),
- resource.getType(), resource.stream(), resource.getLength());
+ return resource.create(resource.getBytes());
}
return null;
}
@@ -132,9 +129,7 @@
samples.add("javax/management/ObjectName");
test(samples, (resources, module, path) -> {
try {
- resources.add(ModuleEntry.create(module, path,
- ModuleEntry.Type.CLASS_OR_RESOURCE,
- new ByteArrayInputStream(new byte[0]), 0));
+ resources.add(ModuleEntry.create(path, new byte[0]));
} catch (Exception ex) {
throw new RuntimeException(ex);
}
@@ -142,9 +137,7 @@
test(samples, (resources, module, path) -> {
try {
resources.add(ModulePoolImpl.
- newCompressedResource(ModuleEntry.create(module, path,
- ModuleEntry.Type.CLASS_OR_RESOURCE,
- new ByteArrayInputStream(new byte[0]), 0),
+ newCompressedResource(ModuleEntry.create(path, new byte[0]),
ByteBuffer.allocate(99), "bitcruncher", null,
((ModulePoolImpl)resources).getStringTable(), ByteOrder.nativeOrder()));
} catch (Exception ex) {
@@ -203,20 +196,14 @@
private void checkResourcesAfterCompression() throws Exception {
ModulePoolImpl resources1 = new ModulePoolImpl();
- ModuleEntry res1 = ModuleEntry.create("module1", "/module1/toto1",
- ModuleEntry.Type.CLASS_OR_RESOURCE,
- new ByteArrayInputStream(new byte[0]), 0);
- ModuleEntry res2 = ModuleEntry.create("module2", "/module2/toto1",
- ModuleEntry.Type.CLASS_OR_RESOURCE,
- new ByteArrayInputStream(new byte[0]), 0);
+ ModuleEntry res1 = ModuleEntry.create("/module1/toto1", new byte[0]);
+ ModuleEntry res2 = ModuleEntry.create("/module2/toto1", new byte[0]);
resources1.add(res1);
resources1.add(res2);
checkResources(resources1, res1, res2);
ModulePool resources2 = new ModulePoolImpl();
- ModuleEntry res3 = ModuleEntry.create("module2", "/module2/toto1",
- ModuleEntry.Type.CLASS_OR_RESOURCE,
- new ByteArrayInputStream(new byte[7]), 7);
+ ModuleEntry res3 = ModuleEntry.create("/module2/toto1", new byte[7]);
resources2.add(res3);
resources2.add(ModulePoolImpl.newCompressedResource(res1,
ByteBuffer.allocate(7), "zip", null, resources1.getStringTable(),
@@ -260,8 +247,7 @@
((ModulePoolImpl) resources).setReadOnly();
try {
- resources.add(ModuleEntry.create("module2", "/module2/toto1",
- ModuleEntry.Type.CLASS_OR_RESOURCE, new ByteArrayInputStream(new byte[0]), 0));
+ resources.add(ModuleEntry.create("/module2/toto1", new byte[0]));
throw new AssertionError("ModulePool is read-only, but an exception is not thrown");
} catch (Exception ex) {
// Expected
--- a/jdk/test/tools/jlink/plugins/ExcludeFilesPluginTest.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/test/tools/jlink/plugins/ExcludeFilesPluginTest.java Wed Jun 29 21:49:41 2016 -0700
@@ -74,8 +74,8 @@
fplug.configure(prop);
ModulePoolImpl files = new ModulePoolImpl();
ModulePoolImpl fresult = new ModulePoolImpl();
- ModuleEntry f = ModuleEntry.create(module, "/" + module + "/" + sample,
- ModuleEntry.Type.CONFIG, new ByteArrayInputStream(new byte[0]), 0);
+ ModuleEntry f = ModuleEntry.create("/" + module + "/" + sample,
+ ModuleEntry.Type.CONFIG, new byte[0]);
files.add(f);
fplug.visit(files, fresult);
--- a/jdk/test/tools/jlink/plugins/ExcludePluginTest.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/test/tools/jlink/plugins/ExcludePluginTest.java Wed Jun 29 21:49:41 2016 -0700
@@ -48,16 +48,16 @@
public void test() throws Exception {
check("**.jcov", "/num/toto.jcov", true);
- check("**.jcov", "//toto.jcov", true);
+ check("**.jcov", "/toto.jcov/", true);
check("**.jcov", "/toto.jcov/tutu/tata", false);
check("/java.base/*.jcov", "/java.base/toto.jcov", true);
- check("/java.base/toto.jcov", "t/java.base/iti.jcov", false);
+ check("/java.base/toto.jcov", "/tjava.base/iti.jcov", false);
check("/java.base/*/toto.jcov", "/java.base/toto.jcov", false);
check("/java.base/*/toto.jcov", "/java.base/tutu/toto.jcov", true);
check("**/java.base/*/toto.jcov", "/tutu/java.base/tutu/toto.jcov", true);
check("/META-INF/**", "/META-INF/services/ MyProvider ", true);
check("/META-INF/**", "/META-INF/services/MyProvider", true);
- check("**/META-INF", " /META-INF/services/MyProvider", false);
+ check("**/META-INF", "/ META-INF/services/MyProvider", false);
check("**/META-INF/**", "/java.base//META-INF/services/MyProvider", true);
check("/java.base/*/Toto$Titi.class", "/java.base/tutu/Toto$Titi.class", true);
check("/**$**.class", "/java.base/tutu/Toto$Titi.class", true);
--- a/jdk/test/tools/jlink/plugins/ExcludeVMPluginTest.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/test/tools/jlink/plugins/ExcludeVMPluginTest.java Wed Jun 29 21:49:41 2016 -0700
@@ -165,11 +165,11 @@
// Create a pool with jvm.cfg and the input paths.
byte[] jvmcfgContent = jvmcfg.getBytes();
ModulePool pool = new ModulePoolImpl();
- pool.add(ModuleEntry.create("java.base", "/java.base/native/jvm.cfg",
- ModuleEntry.Type.NATIVE_LIB, new ByteArrayInputStream(jvmcfgContent), jvmcfgContent.length));
+ pool.add(ModuleEntry.create("/java.base/native/jvm.cfg",
+ ModuleEntry.Type.NATIVE_LIB, jvmcfgContent));
for (String in : input) {
- pool.add(ModuleEntry.create("java.base", in,
- ModuleEntry.Type.NATIVE_LIB, new ByteArrayInputStream(new byte[0]), 0));
+ pool.add(ModuleEntry.create(in,
+ ModuleEntry.Type.NATIVE_LIB, new byte[0]));
}
ModulePool out = new ModulePoolImpl();
--- a/jdk/test/tools/jlink/plugins/StringSharingPluginTest.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/test/tools/jlink/plugins/StringSharingPluginTest.java Wed Jun 29 21:49:41 2016 -0700
@@ -106,6 +106,9 @@
byte[] content = Files.readAllBytes(p);
String path = p.toString().replace('\\', '/');
path = path.substring("/modules".length());
+ if (path.charAt(0) != '/') {
+ path = "/" + path;
+ }
ModuleEntry res = ModuleEntry.create(path, content);
resources.add(res);
} catch (Exception ex) {
--- a/jdk/test/tools/launcher/Arrrghs.java Thu Jun 23 17:07:31 2016 -0700
+++ b/jdk/test/tools/launcher/Arrrghs.java Wed Jun 29 21:49:41 2016 -0700
@@ -24,7 +24,7 @@
/**
* @test
* @bug 5030233 6214916 6356475 6571029 6684582 6742159 4459600 6758881 6753938
- * 6894719 6968053 7151434 7146424 8007333 8077822
+ * 6894719 6968053 7151434 7146424 8007333 8077822 8143640
* @summary Argument parsing validation.
* @compile -XDignore.symbol.file Arrrghs.java
* @run main/othervm Arrrghs
@@ -197,6 +197,8 @@
// more treatment of mixed slashes
checkArgumentParsing("f1/ f3\\ f4/", "f1/", "f3\\", "f4/");
checkArgumentParsing("f1/ f2\' ' f3/ f4/", "f1/", "f2\'", "'", "f3/", "f4/");
+
+ checkArgumentParsing("a\\*\\b", "a\\*\\b");
}
private void initEmptyDir(File emptyDir) throws IOException {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/launcher/modules/dryrun/DryRunTest.java Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,199 @@
+/*
+ * 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.
+ *
+ * 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.
+ */
+
+/**
+ * @test
+ * @bug 8159596
+ * @library /lib/testlibrary
+ * @modules jdk.compiler
+ * jdk.jartool/sun.tools.jar
+ * @build DryRunTest CompilerUtils jdk.testlibrary.ProcessTools
+ * @run testng DryRunTest
+ * @summary Test java --dry-run
+ */
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import jdk.testlibrary.ProcessTools;
+
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+import static org.testng.Assert.*;
+
+
+@Test
+public class DryRunTest {
+
+ private static final String TEST_SRC = System.getProperty("test.src");
+
+ private static final Path SRC_DIR = Paths.get(TEST_SRC, "src");
+ private static final Path MODS_DIR = Paths.get("mods");
+ private static final Path LIBS_DIR = Paths.get("libs");
+
+ // the module name of the test module
+ private static final String TEST_MODULE = "test";
+ private static final String M_MODULE = "m";
+
+ // the module main class
+ private static final String MAIN_CLASS = "jdk.test.Main";
+
+
+ @BeforeTest
+ public void compileTestModule() throws Exception {
+
+ // javac -d mods/$TESTMODULE src/$TESTMODULE/**
+ assertTrue(CompilerUtils.compile(SRC_DIR.resolve(M_MODULE),
+ MODS_DIR,
+ "-modulesourcepath", SRC_DIR.toString()));
+
+ assertTrue(CompilerUtils.compile(SRC_DIR.resolve(TEST_MODULE),
+ MODS_DIR,
+ "-modulesourcepath", SRC_DIR.toString()));
+
+ Files.createDirectories(LIBS_DIR);
+
+ // create JAR files with no module-info.class
+ assertTrue(jar(M_MODULE, "p/Lib.class"));
+ assertTrue(jar(TEST_MODULE, "jdk/test/Main.class"));
+ }
+
+ /**
+ * Execute "java" with the given arguments, returning the exit code.
+ */
+ private int exec(String... args) throws Exception {
+ return ProcessTools.executeTestJava(args)
+ .outputTo(System.out)
+ .errorTo(System.out)
+ .getExitValue();
+ }
+
+
+ /**
+ * Launch module main
+ */
+ public void testModule() throws Exception {
+ String dir = MODS_DIR.toString();
+ String mid = TEST_MODULE + "/" + MAIN_CLASS;
+
+ // java -modulepath mods -module $TESTMODULE/$MAINCLASS
+ // no resolution failure
+ int exitValue = exec("--dry-run", "-modulepath", dir, "-m", mid);
+ assertTrue(exitValue == 0);
+ }
+
+ /**
+ * Test non-existence module in -addmods
+ */
+ public void testNonExistAddModules() throws Exception {
+ String dir = MODS_DIR.toString();
+ String mid = TEST_MODULE + "/" + MAIN_CLASS;
+
+ int exitValue = exec("--dry-run", "-modulepath", dir,
+ "-addmods", "non.existence",
+ "-m", mid);
+ assertTrue(exitValue != 0);
+ }
+
+ /**
+ * Launch main class from class path
+ */
+ public void testClassPath() throws Exception {
+ Path testJar = LIBS_DIR.resolve(TEST_MODULE + ".jar");
+ String libs = testJar.toString() + File.pathSeparator +
+ LIBS_DIR.resolve(M_MODULE + ".jar").toString();
+
+ // test pass with m.jar:test.jar
+ int exitValue = exec("-classpath", libs, MAIN_CLASS);
+ assertTrue(exitValue == 0);
+
+ // m.jar is not on classpath and fails with p.Lib not found
+ exitValue = exec("-classpath", testJar.toString(), MAIN_CLASS);
+ assertTrue(exitValue != 0);
+
+ // dry pass passes since main is not executed
+ exitValue = exec("--dry-run", "-classpath", testJar.toString(), MAIN_CLASS);
+ assertTrue(exitValue == 0);
+ }
+
+ /**
+ * Test automatic modules
+ */
+ public void testAutomaticModule() throws Exception {
+ String libs = LIBS_DIR.resolve(M_MODULE + ".jar").toString() +
+ File.pathSeparator +
+ LIBS_DIR.resolve(TEST_MODULE + ".jar").toString();
+ String mid = TEST_MODULE + "/" + MAIN_CLASS;
+
+ // test main method with and without -addmods mm
+ int exitValue = exec("-modulepath", LIBS_DIR.toString(),
+ "-m", mid);
+ assertTrue(exitValue != 0);
+
+ exitValue = exec("-modulepath", LIBS_DIR.toString(),
+ "-addmods", M_MODULE,
+ "-m", mid);
+ assertTrue(exitValue == 0);
+
+ // test dry run with and without -addmods m
+ // no resolution failure
+ exitValue = exec("--dry-run", "-modulepath", LIBS_DIR.toString(),
+ "-m", mid);
+ assertTrue(exitValue == 0);
+
+ exitValue = exec("--dry-run", "-modulepath", LIBS_DIR.toString(),
+ "-addmods", M_MODULE,
+ "-m", mid);
+ assertTrue(exitValue == 0);
+ }
+
+ /**
+ * module m not found
+ */
+ public void testMissingModule() throws Exception {
+ String subdir = MODS_DIR.resolve(TEST_MODULE).toString();
+ String mid = TEST_MODULE + "/" + MAIN_CLASS;
+
+ // resolution failure
+ int exitValue = exec("--dry-run", "-modulepath", subdir, "-m", mid);
+ assertTrue(exitValue != 0);
+ }
+
+ private static boolean jar(String name, String entries) throws IOException {
+ Path jar = LIBS_DIR.resolve(name + ".jar");
+
+ // jar --create ...
+ String classes = MODS_DIR.resolve(name).toString();
+ String[] args = {
+ "--create",
+ "--file=" + jar,
+ "-C", classes, entries
+ };
+ boolean success
+ = new sun.tools.jar.Main(System.out, System.out, "jar").run(args);
+ return success;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/launcher/modules/dryrun/src/m/module-info.java Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,26 @@
+/*
+ * 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.
+ *
+ * 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 m {
+ exports p;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/launcher/modules/dryrun/src/m/p/Lib.java Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,30 @@
+/*
+ * 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.
+ *
+ * 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 p;
+
+public class Lib {
+ public static void sayHi() {
+ System.out.println("Hello world");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/launcher/modules/dryrun/src/test/jdk/test/Main.java Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,30 @@
+/*
+ * 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.
+ *
+ * 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.test;
+
+public class Main {
+ public static void main(String[] args) {
+ p.Lib.sayHi();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/launcher/modules/dryrun/src/test/module-info.java Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,26 @@
+/*
+ * 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.
+ *
+ * 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 test {
+ requires m;
+}
--- a/langtools/.hgtags Thu Jun 23 17:07:31 2016 -0700
+++ b/langtools/.hgtags Wed Jun 29 21:49:41 2016 -0700
@@ -366,3 +366,4 @@
095bd53bdd1ef211a473553a95ee625fcfbc3f59 jdk-9+121
203a9e1b82b6cc7918f96a92e5a7eb28eafcdd18 jdk-9+122
d0c742ddfb01ebe427720798c4c8335023ae20f8 jdk-9+123
+26aa3caa778eab1c931910149c414783ee83bce7 jdk-9+124
--- a/langtools/make/build.xml Thu Jun 23 17:07:31 2016 -0700
+++ b/langtools/make/build.xml Wed Jun 29 21:49:41 2016 -0700
@@ -235,7 +235,10 @@
<target name="idea" depends="-check-langtools.jdk.home">
<mkdir dir=".idea"/>
<copy todir=".idea" >
- <fileset dir="make/intellij" excludes="**/src/**"/>
+ <fileset dir="make/intellij">
+ <exclude name="**/src/**"/>
+ <exclude name="**/utils/**"/>
+ </fileset>
</copy>
<condition property="idea.jtreg.home" value="${jtreg.home}" else = "[jtreg.home]">
<isset property="jtreg.home"/>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/make/diags-examples.xml Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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.
+ -->
+
+<!--
+This is an extension to the langtools make/build.xml file,
+that provides targets to run the examples that generate
+example diagnostics in different locales.
+
+Usage:
+ ant -f langtools/make/run-examples.xml -Dlangtools.jdk.home=<JDK>
+
+By default, the reports will be generated in langtools/build/diags-examples/report/.
+-->
+
+<project name="diags-examples" default="diags-examples" basedir="..">
+ <import file="build.xml"/>
+
+ <!-- specify working directory for the tool -->
+ <property name="diags.examples.dir" location="${build.dir}/diag-examples"/>
+
+ <!-- compiled classes for the tool -->
+ <property name="diags.examples.classes" location="${diags.examples.dir}/classes}"/>
+
+ <!-- directory for generated reports -->
+ <property name="diags.examples.report" location="${diags.examples.dir}/report"/>
+
+ <!-- default target, generates reports for all available locales -->
+ <target name="diags-examples" depends="run-en_US,run-ja,run-zh_CN"/>
+
+ <!-- generate report for US English locale -->
+ <target name="run-en_US" depends="-build-runner,-def-runner">
+ <mkdir dir="${diags.examples.report}"/>
+ <runner lang="en" country="US" outfile="${diags.examples.report}/en_US.html"/>
+ </target>
+
+ <!-- generate report for Japanese locale -->
+ <target name="run-ja" depends="-build-runner,-def-runner">
+ <mkdir dir="${diags.examples.report}"/>
+ <runner lang="ja" outfile="${diags.examples.report}/ja.html"/>
+ </target>
+
+ <!-- generate report for Mandarin Chinese locale -->
+ <target name="run-zh_CN" depends="-build-runner,-def-runner">
+ <mkdir dir="${diags.examples.report}"/>
+ <runner lang="zh" country="CN" outfile="${diags.examples.report}/zh_CN.html"/>
+ </target>
+
+ <!-- compile the tool that runs the examples -->
+ <target name="-build-runner" depends="build">
+ <mkdir dir="${diags.examples.classes}"/>
+ <javac fork="true"
+ executable="${build.bin}/javac"
+ srcdir="test/tools/javac/diags"
+ destdir="${diags.examples.classes}"
+ includes="ArgTypeCompilerFactory.java,Example.java,FileManager.java,HTMLWriter.java,RunExamples.java,DocCommentProcessor.java"
+ sourcepath=""
+ includeAntRuntime="no"
+ debug="${javac.debug}"
+ debuglevel="${javac.debuglevel}">
+ <compilerarg line="-XaddExports:jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED"/>
+ <compilerarg line="-XaddExports:jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED"/>
+ <compilerarg line="-XaddExports:jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED"/>
+ <compilerarg line="-XaddExports:jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED"/>
+ <compilerarg line="-XaddExports:jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED"/>
+ <compilerarg line="-XaddExports:jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED"/>
+ </javac>
+ </target>
+
+ <!-- define a task to run the tool that runs the examples -->
+ <target name="-def-runner">
+ <macrodef name="runner">
+ <attribute name="lang"/>
+ <attribute name="country" default=""/>
+ <attribute name="outfile"/>
+ <sequential>
+ <java fork="true"
+ jvm="${langtools.jdk.home}/bin/java"
+ dir="test/tools/javac/diags"
+ classpath="${diags.examples.classes};${dist.lib.dir}/javac.jar;${dist.lib.dir}/javap.jar"
+ classname="RunExamples">
+ <jvmarg value="-Duser.language=@{lang}"/>
+ <jvmarg value="-Duser.country=@{country}"/>
+ <jvmarg value="-Dtest.classes=${diags.examples.classes}"/>
+ <arg value="-examples"/>
+ <arg value="examples"/>
+ <arg value="-o"/>
+ <arg file="@{outfile}"/>
+ <arg value="-showFiles"/>
+ <arg value="-title"/>
+ <arg value="Examples of javac diagnostics"/>
+ <jvmarg line="-XaddExports:jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED"/>
+ <jvmarg line="-XaddExports:jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED"/>
+ <jvmarg line="-XaddExports:jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED"/>
+ <jvmarg line="-XaddExports:jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED"/>
+ <jvmarg line="-XaddExports:jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED"/>
+ <jvmarg line="-XaddExports:jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED"/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/make/intellij/utils/jtreg-live-templates.xml Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,25 @@
+<!--
+The following live template declarations allow for automatic generation of jtreg test headers.
+Unfortunately, live templates cannot be shared on a per project base, but they can be easily imported
+by cutting and paste the following lines inside IntelliJ LiveTemplate settings (this will need to be done only once).
+-->
+
+<template name="@test" value="@test * @bug $BUG_ID$ * @summary $BUG_SUMMARY$ * $JTREG_ACTION$ $FILE_NAME$" description="jtreg header (positive test)" toReformat="false" toShortenFQNames="true">
+ <variable name="BUG_ID" expression="groovyScript("_1 ==~ /T\\d{7}/ ? _1.substring(1).take(7) : 'NNNNNNN'", fileNameWithoutExtension())" defaultValue="" alwaysStopAt="true" />
+ <variable name="BUG_SUMMARY" expression=""Bug summary"" defaultValue="" alwaysStopAt="true" />
+ <variable name="JTREG_ACTION" expression=""@compile"" defaultValue="" alwaysStopAt="true" />
+ <variable name="FILE_NAME" expression="fileName()" defaultValue="" alwaysStopAt="true" />
+ <context>
+ <option name="JAVA_COMMENT" value="true" />
+ </context>
+</template>
+<template name="@test /nodynamiccopyright/" value="@test * @bug $BUG_ID$ * @summary $BUG_SUMMARY$ * $JTREG_ACTION$/fail/ref=$GOLDEN_NAME$ -XDrawDiagnostics $FILE_NAME$" description="jtreg header (negative test)" toReformat="false" toShortenFQNames="true">
+ <variable name="BUG_ID" expression="groovyScript("_1 ==~ /T\\d{7}/ ? _1.substring(1).take(7) : 'NNNNNNN'", fileNameWithoutExtension())" defaultValue="NNNNNNN" alwaysStopAt="true" />
+ <variable name="BUG_SUMMARY" expression=""Bug summary"" defaultValue="" alwaysStopAt="true" />
+ <variable name="JTREG_ACTION" expression=""@compile"" defaultValue="" alwaysStopAt="true" />
+ <variable name="GOLDEN_NAME" expression="groovyScript("_1 + '.out'", fileNameWithoutExtension())" defaultValue="out.txt" alwaysStopAt="true" />
+ <variable name="FILE_NAME" expression="fileName()" defaultValue="" alwaysStopAt="true" />
+ <context>
+ <option name="JAVA_COMMENT" value="true" />
+ </context>
+</template>
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java Thu Jun 23 17:07:31 2016 -0700
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java Wed Jun 29 21:49:41 2016 -0700
@@ -1039,7 +1039,8 @@
if (start_pc == 0) {
// ensure array large enough
if (register >= parameterNameIndices.length) {
- int newSize = Math.max(register, parameterNameIndices.length + 8);
+ int newSize =
+ Math.max(register + 1, parameterNameIndices.length + 8);
parameterNameIndices =
Arrays.copyOf(parameterNameIndices, newSize);
}
--- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/standard/Standard.java Thu Jun 23 17:07:31 2016 -0700
+++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/standard/Standard.java Wed Jun 29 21:49:41 2016 -0700
@@ -28,6 +28,11 @@
import com.sun.javadoc.*;
import com.sun.tools.doclets.formats.html.*;
+/**
+ * This doclet generates HTML-formatted documentation for the specified packages and types.
+ * @deprecated The doclet has been superseded by its replacement,
+ * {@code jdk.javadoc.doclets.StandardDoclet}.
+ */
@Deprecated
public class Standard {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/doclets/StandardDoclet.java Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2003, 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.
+ */
+
+package jdk.javadoc.doclets;
+
+import java.util.Locale;
+import java.util.Set;
+
+import javax.lang.model.SourceVersion;
+
+import jdk.javadoc.doclet.Doclet;
+import jdk.javadoc.doclet.DocletEnvironment;
+import jdk.javadoc.doclet.Reporter;
+import jdk.javadoc.internal.doclets.formats.html.HtmlDoclet;
+
+/**
+ * This doclet generates HTML-formatted documentation for the specified modules, packages and types.
+ */
+public class StandardDoclet implements Doclet {
+
+ private final HtmlDoclet htmlDoclet;
+
+ public StandardDoclet() {
+ htmlDoclet = new HtmlDoclet();
+ }
+
+ public void init(Locale locale, Reporter reporter) {
+ htmlDoclet.init(locale, reporter);
+ }
+
+ public String getName() {
+ return "Standard";
+ }
+
+ public Set<Doclet.Option> getSupportedOptions() {
+ return htmlDoclet.getSupportedOptions();
+ }
+
+ public SourceVersion getSupportedSourceVersion() {
+ return htmlDoclet.sourceVersion();
+ }
+
+ public boolean run(DocletEnvironment root) {
+ return htmlDoclet.run(root);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/doclets/package-info.java Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,30 @@
+/*
+ * 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.
+ */
+
+/**
+ * This package contains standard, supported doclets.
+ */
+package jdk.javadoc.doclets;
+
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConfigurationImpl.java Thu Jun 23 17:07:31 2016 -0700
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConfigurationImpl.java Wed Jun 29 21:49:41 2016 -0700
@@ -547,7 +547,7 @@
@Override
public Set<Doclet.Option> getSupportedOptions() {
Doclet.Option[] options = {
- new Option(this, "bottom", 1) {
+ new Option(this, "-bottom", 1) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -555,7 +555,7 @@
return true;
}
},
- new Option(this, "charset", 1) {
+ new Option(this, "-charset", 1) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -563,7 +563,7 @@
return true;
}
},
- new Option(this, "doctitle", 1) {
+ new Option(this, "-doctitle", 1) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -571,7 +571,7 @@
return true;
}
},
- new Option(this, "footer", 1) {
+ new Option(this, "-footer", 1) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -579,7 +579,7 @@
return true;
}
},
- new Option(this, "header", 1) {
+ new Option(this, "-header", 1) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -587,7 +587,7 @@
return true;
}
},
- new Option(this, "helpfile", 1) {
+ new Option(this, "-helpfile", 1) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -595,7 +595,7 @@
return true;
}
},
- new Option(this, "html4") {
+ new Option(this, "-html4") {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -603,7 +603,7 @@
return true;
}
},
- new Option(this, "html5") {
+ new Option(this, "-html5") {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -611,7 +611,7 @@
return true;
}
},
- new Option(this, "nohelp") {
+ new Option(this, "-nohelp") {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -619,7 +619,7 @@
return true;
}
},
- new Option(this, "nodeprecatedlist") {
+ new Option(this, "-nodeprecatedlist") {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -627,7 +627,7 @@
return true;
}
},
- new Option(this, "noindex") {
+ new Option(this, "-noindex") {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -635,7 +635,7 @@
return true;
}
},
- new Option(this, "nonavbar") {
+ new Option(this, "-nonavbar") {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -643,7 +643,7 @@
return true;
}
},
- new Hidden(this, "nooverview") {
+ new Hidden(this, "-nooverview") {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -651,7 +651,7 @@
return true;
}
},
- new Option(this, "notree") {
+ new Option(this, "-notree") {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -659,7 +659,7 @@
return true;
}
},
- new Hidden(this, "overview", 1) {
+ new Hidden(this, "-overview", 1) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -667,7 +667,7 @@
return true;
}
},
- new Hidden(this, "packagesheader", 1) {
+ new Hidden(this, "-packagesheader", 1) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -675,7 +675,7 @@
return true;
}
},
- new Option(this, "splitindex") {
+ new Option(this, "-splitindex") {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -683,7 +683,7 @@
return true;
}
},
- new Option(this, "stylesheetfile", 1) {
+ new Option(this, "-stylesheetfile", 1) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -691,7 +691,7 @@
return true;
}
},
- new Option(this, "top", 1) {
+ new Option(this, "-top", 1) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -699,7 +699,7 @@
return true;
}
},
- new Option(this, "use") {
+ new Option(this, "-use") {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -707,7 +707,7 @@
return true;
}
},
- new Option(this, "windowtitle", 1) {
+ new Option(this, "-windowtitle", 1) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -715,7 +715,7 @@
return true;
}
},
- new XOption(this, "xdoclint") {
+ new XOption(this, "-Xdoclint") {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -723,7 +723,7 @@
return true;
}
},
- new XOption(this, "Xdocrootparent", 1) {
+ new XOption(this, "-Xdocrootparent", 1) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -731,11 +731,10 @@
return true;
}
},
- new XOption(this, "doclet.xusage.xdoclint-extended.", "Xdoclint:", 0) {
+ new XOption(this, "doclet.xusage.xdoclint-extended.", "-Xdoclint:", 0) {
@Override
public boolean matches(String option) {
- String opt = option.startsWith("-") ? option.substring(1) : option;
- return opt.toLowerCase().startsWith(getName().toLowerCase());
+ return option.toLowerCase().startsWith(getName().toLowerCase());
}
@Override
@@ -745,11 +744,10 @@
return true;
}
},
- new XOption(this, "doclet.xusage.xdoclint-package.", "Xdoclint/package:", 0) {
+ new XOption(this, "doclet.xusage.xdoclint-package.", "-Xdoclint/package:", 0) {
@Override
public boolean matches(String option) {
- String opt = option.startsWith("-") ? option.substring(1) : option;
- return opt.toLowerCase().startsWith(getName().toLowerCase());
+ return option.toLowerCase().startsWith(getName().toLowerCase());
}
@Override
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties Thu Jun 23 17:07:31 2016 -0700
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties Wed Jun 29 21:49:41 2016 -0700
@@ -185,6 +185,7 @@
doclet.Same_package_name_used=Package name format used twice: {0}
doclet.exception_encountered=Exception encountered while processing {1}\n{0}
+# option specifiers
doclet.usage.d.name=d
doclet.usage.d.parameters=<directory>
doclet.usage.d.description=Destination directory for output files
@@ -240,18 +241,23 @@
doclet.usage.linkoffline.name=linkoffline
doclet.usage.linkoffline.parameters=<url1> <url2>
-doclet.usage.linkoffline.description=Link to docs at <url1> using package list at <url2>
+doclet.usage.linkoffline.description=Link to docs at <url1> using package list\n\
+\ at <url2>
doclet.usage.excludedocfilessubdir.name=excludedocfilessubdir
doclet.usage.excludedocfilessubdir.parameters=<name>:..
-doclet.usage.excludedocfilessubdir.description=Exclude any doc-files subdirectories with given name
+doclet.usage.excludedocfilessubdir.description=\n\
+\ Exclude any doc-files subdirectories with\n\
+\ given name
doclet.usage.group.name=group
doclet.usage.group.parameters=<name> <p1>:<p2>..
-doclet.usage.group.description=Group specified packages together in overview page
+doclet.usage.group.description=Group specified packages together\n\
+\ in overview page
doclet.usage.nocomment.name=nocomment
-doclet.usage.nocomment.description=Suppress description and tags, generate only declarations
+doclet.usage.nocomment.description=Suppress description and tags, generate\n\
+\ only declarations
doclet.usage.nodeprecated.name=nodeprecated
doclet.usage.nodeprecated.description=Do not include @deprecated information
@@ -289,7 +295,8 @@
doclet.usage.tag.name=tag
doclet.usage.tag.parameters=<name>:<locations>:<header>
-doclet.usage.tag.description=Specify single argument custom tags
+doclet.usage.tag.description=\n\
+\ Specify single argument custom tags
doclet.usage.taglet.name=taglet
doclet.usage.taglet.description=The fully qualified name of Taglet to register
@@ -299,7 +306,8 @@
doclet.usage.charset.name=charset
doclet.usage.charset.parameters=<charset>
-doclet.usage.charset.description=Charset for cross-platform viewing of generated documentation
+doclet.usage.charset.description=Charset for cross-platform viewing of\n\
+\ generated documentation
doclet.usage.helpfile.name=helpfile
doclet.usage.helpfile.parameters=<file>
@@ -310,14 +318,17 @@
doclet.usage.sourcetab.name=sourcetab
doclet.usage.sourcetab.parameters=<tab length>
-doclet.usage.sourcetab.description=Specify the number of spaces each tab takes up in the source
+doclet.usage.sourcetab.description=Specify the number of spaces each tab\n\
+\ takes up in the source
doclet.usage.keywords.name=keywords
-doclet.usage.keywords.description=Include HTML meta tags with package, class and member info
+doclet.usage.keywords.description=Include HTML meta tags with package,\n\
+\ class and member info
doclet.usage.stylesheetfile.name=stylesheetfile
doclet.usage.stylesheetfile.parameters=<path>
-doclet.usage.stylesheetfile.description=File to change style of the generated documentation
+doclet.usage.stylesheetfile.description=File to change style of the generated\n\
+\ documentation
doclet.usage.docencoding.name=docencoding
doclet.usage.docencoding.parameters=<name>
@@ -325,23 +336,30 @@
doclet.xusage.xdocrootparent.name=Xdocrootparent
doclet.xusage.xdocrootparent.parameters=<url>
-doclet.xusage.xdocrootparent.description=Replaces all @docRoot followed by /.. in doc comments with <url>
+doclet.xusage.xdocrootparent.description=Replaces all @docRoot followed by /..\n\
+\ in doc comments with <url>
doclet.xusage.xdoclint.name=Xdoclint
-doclet.xusage.xdoclint.description=Enable recommended checks for problems in javadoc comments
+doclet.xusage.xdoclint.description=Enable recommended checks for problems in\n\
+\ javadoc comments
doclet.xusage.xdoclint-extended.name=Xdoclint:
doclet.xusage.xdoclint-extended.parameters=(all|none|[-]<group>)
# L10N: do not localize these words: all none accessibility html missing reference syntax
-doclet.xusage.xdoclint-extended.description=Enable or disable specific checks for problems in javadoc comments,\n\
-\ Enable or disable specific checks for problems in javadoc comments,\n\
-\ where <group> is one of accessibility, html, missing, reference, or syntax.\n
+doclet.xusage.xdoclint-extended.description=Enable or disable specific checks\n\
+\ for problems in javadoc comments, where \n\
+\ <group> is one of accessibility, html,\n\
+\ missing, reference, or syntax.\n
doclet.xusage.xdoclint-package.name=Xdoclint/package:
doclet.xusage.xdoclint-package.parameters=([-]<packages>)
doclet.xusage.xdoclint-package.description=\n\
-\ Enable or disable checks in specific packages. <packages> is a comma separated\n\
-\ list of package specifiers. Package specifier is either a qualified name of a package\n\
-\ or a package name prefix followed by .*, which expands to all sub-packages of\n\
-\ the given package. Prefix the package specifier with - to disable checks for\n\
-\ the specified packages.\n
+\ Enable or disable checks in specific\n\
+\ packages. <packages> is a comma separated\n\
+\ list of package specifiers. Package\n\
+\ specifier is either a qualified name of a\n\
+\ package or a package name prefix followed\n\
+\ by .*, which expands to all sub-packages\n\
+\ of the given package. Prefix the package\n\
+\ specifier with - to disable checks for\n\
+\ the specified packages.\n
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/standard/Standard.java Thu Jun 23 17:07:31 2016 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) 2003, 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.
- */
-
-package jdk.javadoc.internal.doclets.standard;
-
-import java.util.Locale;
-import java.util.Set;
-
-import javax.lang.model.SourceVersion;
-
-import jdk.javadoc.doclet.Doclet;
-import jdk.javadoc.doclet.DocletEnvironment;
-import jdk.javadoc.doclet.Reporter;
-import jdk.javadoc.internal.doclets.formats.html.HtmlDoclet;
-
-public class Standard implements Doclet {
-
- private final HtmlDoclet htmlDoclet;
-
- public Standard() {
- htmlDoclet = new HtmlDoclet();
- }
-
- public void init(Locale locale, Reporter reporter) {
- htmlDoclet.init(locale, reporter);
- }
-
- public String getName() {
- return "Standard";
- }
-
- public Set<Doclet.Option> getSupportedOptions() {
- return htmlDoclet.getSupportedOptions();
- }
-
- public SourceVersion getSupportedSourceVersion() {
- return htmlDoclet.sourceVersion();
- }
-
- public boolean run(DocletEnvironment root) {
- return htmlDoclet.run(root);
- }
-}
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/Configuration.java Thu Jun 23 17:07:31 2016 -0700
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/Configuration.java Wed Jun 29 21:49:41 2016 -0700
@@ -411,7 +411,7 @@
public Set<Doclet.Option> getSupportedOptions() {
Doclet.Option[] options = {
- new Option(this, "author") {
+ new Option(this, "-author") {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -419,7 +419,7 @@
return true;
}
},
- new Option(this, "d", 1) {
+ new Option(this, "-d", 1) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -427,7 +427,7 @@
return true;
}
},
- new Option(this, "docencoding", 1) {
+ new Option(this, "-docencoding", 1) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -435,7 +435,7 @@
return true;
}
},
- new Option(this, "docfilessubdirs") {
+ new Option(this, "-docfilessubdirs") {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -443,7 +443,7 @@
return true;
}
},
- new Hidden(this, "encoding", 1) {
+ new Hidden(this, "-encoding", 1) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -451,7 +451,7 @@
return true;
}
},
- new Option(this, "excludedocfilessubdir", 1) {
+ new Option(this, "-excludedocfilessubdir", 1) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -459,7 +459,7 @@
return true;
}
},
- new Option(this, "group", 2) {
+ new Option(this, "-group", 2) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -467,7 +467,7 @@
return true;
}
},
- new Hidden(this, "javafx") {
+ new Hidden(this, "-javafx") {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -475,7 +475,7 @@
return true;
}
},
- new Option(this, "keywords") {
+ new Option(this, "-keywords") {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -483,7 +483,7 @@
return true;
}
},
- new Option(this, "link", 1) {
+ new Option(this, "-link", 1) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -492,7 +492,7 @@
return true;
}
},
- new Option(this, "linksource") {
+ new Option(this, "-linksource") {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -500,7 +500,7 @@
return true;
}
},
- new Option(this, "linkoffline", 2) {
+ new Option(this, "-linkoffline", 2) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -509,7 +509,7 @@
return true;
}
},
- new Option(this, "nocomment") {
+ new Option(this, "-nocomment") {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -517,7 +517,7 @@
return true;
}
},
- new Option(this, "nodeprecated") {
+ new Option(this, "-nodeprecated") {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -525,7 +525,7 @@
return true;
}
},
- new Option(this, "nosince") {
+ new Option(this, "-nosince") {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -533,7 +533,7 @@
return true;
}
},
- new Option(this, "notimestamp") {
+ new Option(this, "-notimestamp") {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -541,7 +541,7 @@
return true;
}
},
- new Option(this, "noqualifier", 1) {
+ new Option(this, "-noqualifier", 1) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -549,7 +549,7 @@
return true;
}
},
- new Hidden(this, "quiet") {
+ new Hidden(this, "-quiet") {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -557,7 +557,7 @@
return true;
}
},
- new Option(this, "serialwarn") {
+ new Option(this, "-serialwarn") {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -565,7 +565,7 @@
return true;
}
},
- new Option(this, "sourcetab", 1) {
+ new Option(this, "-sourcetab", 1) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -584,7 +584,7 @@
return true;
}
},
- new Option(this, "tag", 1) {
+ new Option(this, "-tag", 1) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -595,7 +595,7 @@
return true;
}
},
- new Option(this, "taglet", 1) {
+ new Option(this, "-taglet", 1) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -606,7 +606,7 @@
return true;
}
},
- new Option(this, "tagletpath", 1) {
+ new Option(this, "-tagletpath", 1) {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -614,7 +614,7 @@
return true;
}
},
- new Option(this, "version") {
+ new Option(this, "-version") {
@Override
public boolean process(String opt, ListIterator<String> args) {
optionsProcessed.add(this);
@@ -1083,14 +1083,13 @@
protected Option(Configuration config, String keyName, String name, int argCount) {
c = config;
+ this.name = name;
String key = keyName + "name";
String oname = getOptionsMessage(key);
if (oname.isEmpty()) {
- this.name = name;
this.parameters = "<MISSING KEY>";
this.description = "<MISSING KEY>";
} else {
- this.name = oname;
this.parameters = getOptionsMessage(keyName + "parameters");
this.description = getOptionsMessage(keyName + "description");
}
@@ -1098,7 +1097,7 @@
}
protected Option(String prefix, Configuration config, String name, int argCount) {
- this(config, prefix + name.toLowerCase() + ".", name, argCount);
+ this(config, prefix + name.toLowerCase().replaceAll("^-*", "") + ".", name, argCount);
}
protected Option(Configuration config, String name, int argCount) {
@@ -1146,7 +1145,7 @@
String opt = name + (name.endsWith(":") ? "" : " ") + parameters;
int optlen = opt.length();
int spaces = 32 - optlen;
- StringBuffer sb = new StringBuffer(" -").append(opt);
+ StringBuffer sb = new StringBuffer(" ").append(opt);
for (int i = 0; i < spaces; i++) {
sb.append(" ");
}
@@ -1161,8 +1160,7 @@
@Override
public boolean matches(String option) {
- String arg = option.startsWith("-") ? option.substring(1) : option;
- return name.toLowerCase().equals(arg.toLowerCase());
+ return name.toLowerCase().equals(option.toLowerCase());
}
@Override
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/Start.java Thu Jun 23 17:07:31 2016 -0700
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/Start.java Wed Jun 29 21:49:41 2016 -0700
@@ -86,7 +86,7 @@
com.sun.tools.doclets.standard.Standard.class;
private static final Class<?> StdDoclet =
- jdk.javadoc.internal.doclets.standard.Standard.class;
+ jdk.javadoc.doclets.StandardDoclet.class;
/** Context for this invocation. */
private final Context context;
--- a/langtools/src/jdk.javadoc/share/classes/module-info.java Thu Jun 23 17:07:31 2016 -0700
+++ b/langtools/src/jdk.javadoc/share/classes/module-info.java Wed Jun 29 21:49:41 2016 -0700
@@ -30,9 +30,12 @@
exports com.sun.javadoc;
exports com.sun.tools.doclets;
+ exports com.sun.tools.doclets.standard;
exports com.sun.tools.javadoc;
+
exports jdk.javadoc.doclet;
exports jdk.javadoc.doclet.taglet;
+ exports jdk.javadoc.doclets;
provides javax.tools.DocumentationTool
with jdk.javadoc.internal.api.JavadocTool;
--- a/langtools/test/jdk/javadoc/tool/EnsureNewOldDoclet.java Thu Jun 23 17:07:31 2016 -0700
+++ b/langtools/test/jdk/javadoc/tool/EnsureNewOldDoclet.java Wed Jun 29 21:49:41 2016 -0700
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8035473 8154482
+ * @bug 8035473 8154482 8154399 8159096
* @summary make sure the javadoc tool responds correctly to Xold,
* old doclets and taglets.
* @library /tools/lib
@@ -87,7 +87,7 @@
CLASS_NAME + "\\$OldTaglet.*");
final static String OLD_STDDOCLET = "com.sun.tools.doclets.standard.Standard";
- final static String NEW_STDDOCLET = "jdk.javadoc.internal.doclets.standard.Standard";
+ final static String NEW_STDDOCLET = "jdk.javadoc.doclets.StandardDoclet";
public EnsureNewOldDoclet() throws Exception {
--- a/langtools/test/jdk/jshell/ComputeFQNsTest.java Thu Jun 23 17:07:31 2016 -0700
+++ b/langtools/test/jdk/jshell/ComputeFQNsTest.java Wed Jun 29 21:49:41 2016 -0700
@@ -76,8 +76,8 @@
assertInferredFQNs("class X { ArrayList", "ArrayList".length(), false, "java.util.ArrayList");
}
- @Test(enabled = false) //JDK-8150860
- public void testSuspendIndexing() throws Exception {
+ @Test
+ public void testSuspendIndexing() throws Throwable {
compiler.compile(outDir, "package test; public class FQNTest { }");
String jarName = "test.jar";
compiler.jar(outDir, jarName, "test/FQNTest.class");
@@ -90,15 +90,35 @@
getState().sourceCodeAnalysis();
+ Throwable[] evalException = new Throwable[1];
+
new Thread() {
@Override public void run() {
- assertEval("{new java.io.FileOutputStream(\"" + runMarkFile.toAbsolutePath().toString() + "\").close();" +
- " while (java.nio.file.Files.exists(java.nio.file.Paths.get(\"" + continueMarkFile.toString() + "\"))) Thread.sleep(100); }");
+ try {
+ assertEval("{new java.io.FileOutputStream(\"" + runMarkFile.toAbsolutePath().toString().replace("\\", "\\\\") + "\").close();" +
+ " while (java.nio.file.Files.exists(java.nio.file.Paths.get(\"" + continueMarkFile.toAbsolutePath().toString().replace("\\", "\\\\") + "\"))) Thread.sleep(100); }");
+ } catch (Throwable t) {
+ evalException[0] = t;
+ }
}
}.start();
- while (!Files.exists(runMarkFile))
- Thread.sleep(100);
+ while (true) {
+ if (Files.exists(runMarkFile))
+ break;
+ try {
+ Thread.sleep(100);
+ } catch (Throwable t) {
+ if (evalException[0] != null) {
+ evalException[0].addSuppressed(t);
+ } else {
+ throw t;
+ }
+ }
+ if (evalException[0] != null) {
+ throw evalException[0];
+ }
+ }
addToClasspath(compiler.getPath(outDir).resolve(jarName));
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/classfiles/attributes/LocalVariableTable/T8136453/T.jcod Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,112 @@
+/*
+ * 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.
+ *
+ * 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.
+ */
+class T {
+ 0xCAFEBABE;
+ 0; // minor version
+ 52; // version
+ [] { // Constant Pool
+ ; // first element is empty
+ Method #3 #15; // #1
+ class #16; // #2
+ class #17; // #3
+ Utf8 "<init>"; // #4
+ Utf8 "()V"; // #5
+ Utf8 "Code"; // #6
+ Utf8 "LocalVariableTable"; // #7
+ Utf8 "this"; // #8
+ Utf8 "LT;"; // #9
+ Utf8 "test"; // #10
+ Utf8 "(I)I"; // #11
+ Utf8 "p"; // #12
+ Utf8 "I"; // #13
+ Utf8 "l1"; // #14
+ NameAndType #4 #5; // #15
+ Utf8 "T"; // #16
+ Utf8 "java/lang/Object"; // #17
+ } // Constant Pool
+
+ 0x0021; // access
+ #2;// this_cpx
+ #3;// super_cpx
+
+ [] { // Interfaces
+ } // Interfaces
+
+ [] { // fields
+ } // fields
+
+ [] { // methods
+ { // Member
+ 0x0001; // access
+ #4; // name_cpx
+ #5; // sig_cpx
+ [] { // Attributes
+ Attr(#6) { // Code
+ 1; // max_stack
+ 1; // max_locals
+ Bytes[]{
+ 0x2AB70001B1;
+ };
+ [] { // Traps
+ } // end Traps
+ [] { // Attributes
+ Attr(#7) { // LocalVariableTable
+ [] { // LocalVariableTable
+ 0 5 8 9 0;
+ }
+ } // end LocalVariableTable
+ } // Attributes
+ } // end Code
+ } // Attributes
+ } // Member
+ ;
+ { // Member
+ 0x0001; // access
+ #10; // name_cpx
+ #11; // sig_cpx
+ [] { // Attributes
+ Attr(#6) { // Code
+ 1; // max_stack
+ 3; // max_locals
+ Bytes[]{
+ 0x033D1CAC;
+ };
+ [] { // Traps
+ } // end Traps
+ [] { // Attributes
+ Attr(#7) { // LocalVariableTable
+ [] { // LocalVariableTable
+ 0 4 8 9 0;
+ 0 4 12 13 1;
+ 0 4 14 13 20;
+ }
+ } // end LocalVariableTable
+ } // Attributes
+ } // end Code
+ } // Attributes
+ } // Member
+ } // methods
+
+ [] { // Attributes
+ } // Attributes
+} // end class T
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/classfiles/attributes/LocalVariableTable/T8136453/T8136453.java Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,64 @@
+/*
+ * 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.
+ *
+ * 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.
+ */
+
+/*
+ * @test
+ * @bug 8136453
+ * @summary Checking that javac's ClassReader expands its parameterNameIndices array properly.
+ * @modules jdk.compiler
+ * @build T T8136453
+ * @run main T8136453
+ */
+
+import java.util.Arrays;
+import java.util.List;
+
+import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.element.Name;
+import javax.lang.model.element.TypeElement;
+import javax.lang.model.element.VariableElement;
+import javax.lang.model.util.ElementFilter;
+import javax.tools.JavaCompiler;
+import javax.tools.ToolProvider;
+
+import com.sun.source.util.JavacTask;
+
+public class T8136453 {
+ public static void main(String... args) {
+ new T8136453().run();
+ }
+
+ void run() {
+ JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
+ List<String> opts = Arrays.asList("-XDsave-parameter-names");
+ JavacTask task = (JavacTask) compiler.getTask(null, null, null, opts, null, null);
+ TypeElement t = task.getElements().getTypeElement("T");
+ ExecutableElement testMethod = ElementFilter.methodsIn(t.getEnclosedElements()).get(0);
+ VariableElement param = testMethod.getParameters().get(0);
+ Name paramName = param.getSimpleName();
+
+ if (!paramName.contentEquals("p")) {
+ throw new AssertionError("Wrong parameter name: " + paramName);
+ }
+ }
+}
--- a/langtools/test/tools/javac/diags/HTMLWriter.java Thu Jun 23 17:07:31 2016 -0700
+++ b/langtools/test/tools/javac/diags/HTMLWriter.java Wed Jun 29 21:49:41 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -40,7 +40,7 @@
* @throws IOException if there is a problem writing to the underlying stream
*/
public HTMLWriter(Writer out) throws IOException {
- this(out, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">");
+ this(out, "<!DOCTYPE html\">");
}
/**
@@ -328,7 +328,7 @@
*/
public void writeLink(File file, String body) throws IOException {
startTag(A);
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
String path = file.getPath().replace(File.separatorChar, '/');
if (file.isAbsolute() && !path.startsWith("/"))
sb.append('/');
@@ -472,13 +472,15 @@
public static final String BORDER = "border";
/** The HTML "br" tag. */
public static final String BR = "br";
+ /** The HTML "charset" attribute. */
+ public static final String CHARSET = "charset";
/** The HTML "class" attribute. */
public static final String CLASS = "class";
/** The HTML "classid" attribute. */
public static final String CLASSID = "classid";
/** The HTML "code" tag. */
public static final String CODE = "code";
- /** The HTML "color" attribte. */
+ /** The HTML "color" attribute. */
public static final String COLOR = "color";
/** The HTML "col" attribute value. */
public static final String COL = "col";
@@ -522,6 +524,8 @@
public static final String LI = "li";
/** The HTML "link" tag. */
public static final String LINK = "link";
+ /** The HTML "meta" attribute. */
+ public static final String META = "meta";
/** The HTML "name" attribute. */
public static final String NAME = "name";
/** The HTML "object" tag. */
--- a/langtools/test/tools/javac/diags/RunExamples.java Thu Jun 23 17:07:31 2016 -0700
+++ b/langtools/test/tools/javac/diags/RunExamples.java Wed Jun 29 21:49:41 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -354,7 +354,10 @@
html.write(title);
html.endTag(HTMLWriter.TITLE);
}
+ html.startTag(HTMLWriter.META);
+ html.writeAttr(HTMLWriter.CHARSET, "UTF-8");
html.startTag(HTMLWriter.STYLE);
+ html.write(null); // revert to body text
html.newLine();
html.writeLine("div.file { background-color:#e0ffe0; margin-left:30px; margin-right:30px;\n"
+ " padding: 3px; border: thin solid silver; }");
--- a/make/Bundles.gmk Thu Jun 23 17:07:31 2016 -0700
+++ b/make/Bundles.gmk Wed Jun 29 21:49:41 2016 -0700
@@ -52,7 +52,7 @@
SetupBundleFile = $(NamedParamsMacroTemplate)
define SetupBundleFileBody
- $1_RELATIVE_FILES := $$(patsubst $$($1_BASE_DIR)/%, ./%, $$($1_FILES))
+ $1_RELATIVE_FILES := $$(patsubst $$($1_BASE_DIR)/%, %, $$($1_FILES))
ifneq ($$(filter %.tar.gz, $$($1_BUNDLE_NAME)), )
$1_TYPE := tar.gz
@@ -71,7 +71,7 @@
$$(call MakeDir, $$(@D))
ifneq ($$($1_SPECIAL_INCLUDES), )
$$(foreach i, $$($1_SPECIAL_INCLUDES), \
- ($(CD) $$($1_BASE_DIR) && $(FIND) ./$$i \
+ ($(CD) $$($1_BASE_DIR) && $(FIND) $$i \
>> $(SUPPORT_OUTPUTDIR)/bundles/_$1_files ) ; )
endif
ifneq ($$($1_SUBDIR), )
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/make/CreateHgtipFiles.gmk Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,55 @@
+#
+# 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.
+#
+
+default: all
+
+include $(SPEC)
+include MakeBase.gmk
+
+define SetupCreateHgtip
+
+ $$(strip $1)/$(HGTIP_FILENAME): FRC
+ $(HG) tip --repository $$(strip $1) --template '{node|short}\n' > $$@.tmp
+ if [ ! -f $$@ ] || [ "`$(CAT) $$@`" != "`$(CAT) $$@.tmp`" ]; then \
+ $(MV) $$@.tmp $$@ ; \
+ else \
+ $(RM) $$@.tmp ; \
+ fi
+
+ TARGETS += $$(strip $1)/$(HGTIP_FILENAME)
+
+endef
+
+# Only try to create the tips if finding an actual hg repository. This will be
+# false if building from a source bundle.
+$(foreach r, $(call FindAllReposAbs), \
+ $(if $(wildcard $r/.hg), $(eval $(call SetupCreateHgtip, $r))) \
+)
+
+all: $(TARGETS)
+
+FRC:
+
+.PHONY: all
--- a/make/GensrcModuleInfo.gmk Thu Jun 23 17:07:31 2016 -0700
+++ b/make/GensrcModuleInfo.gmk Wed Jun 29 21:49:41 2016 -0700
@@ -95,6 +95,7 @@
$(strip $(wildcard $(addsuffix $(subst .,/,/$(strip $1)), \
$(MODULE_CLASSES_DIRS) \
$(addsuffix /$(MODULE), $(IMPORT_MODULES_CLASSES)) \
+ $(JDK_OUTPUTDIR)/modules/$(MODULE) \
)))
# Convert the modification lines into arguments for the modification tool.
--- a/make/Javadoc.gmk Thu Jun 23 17:07:31 2016 -0700
+++ b/make/Javadoc.gmk Wed Jun 29 21:49:41 2016 -0700
@@ -463,7 +463,7 @@
DOCLETAPI_HEADER := <strong>Doclet API</strong>
DOCLETAPI_BOTTOM := $(call CommonTrademarkBottom,$(DOCLETAPI_FIRST_COPYRIGHT_YEAR))
DOCLETAPI_GROUPNAME := Packages
-DOCLETAPI_REGEXP := jdk.javadoc.doclet.*
+DOCLETAPI_REGEXP := jdk.javadoc.doclet*
# DOCLETAPI_PKGS is located in NON_CORE_PKGS.gmk
# The index.html, options, and packages files
--- a/make/Main.gmk Thu Jun 23 17:07:31 2016 -0700
+++ b/make/Main.gmk Wed Jun 29 21:49:41 2016 -0700
@@ -301,13 +301,16 @@
################################################################################
# Images targets
-# Stores the tips for each repository. This file is be used when constructing the jdk image and can be
-# used to track the exact sources used to build that image.
+# Stores the tips for each repository. This file is be used when constructing
+# the jdk image and can be used to track the exact sources used to build that
+# image.
source-tips: $(SUPPORT_OUTPUTDIR)/source_tips
$(SUPPORT_OUTPUTDIR)/source_tips: FRC
$(call MakeDir, $(@D))
- @$(RM) $@
- @$(call GetSourceTips)
+ $(call GetSourceTips)
+
+create-hgtip-files:
+ +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f CreateHgtipFiles.gmk)
BOOTCYCLE_TARGET := product-images
bootcycle-images:
@@ -337,8 +340,8 @@
mac-bundles-jdk:
+($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f MacBundles.gmk)
-ALL_TARGETS += source-tips bootcycle-images zip-security zip-source \
- jrtfs-jar jimages profiles mac-bundles-jdk
+ALL_TARGETS += source-tips create-hgtip-files bootcycle-images zip-security \
+ zip-source jrtfs-jar jimages profiles mac-bundles-jdk
################################################################################
# Docs targets
--- a/make/common/MakeBase.gmk Thu Jun 23 17:07:31 2016 -0700
+++ b/make/common/MakeBase.gmk Wed Jun 29 21:49:41 2016 -0700
@@ -335,25 +335,27 @@
################################################################################
# The source tips can come from the Mercurial repository, or in the files
# $(HGTIP_FILENAME) which contains the tip but is also positioned in the same
-# directory as the original $(HGDIR) directory.
-# These should not be := assignments, only used from the root Makefile.
-HG_VERSION = $(shell $(HG) version 2> /dev/null)
-HG_DIRECTORY=.hg
-HGTIP_FILENAME=.hgtip
-HG_SEARCH = ./REPO ./*/REPO ./*/*/REPO ./*/*/*/REPO
-REPO_LIST = $(patsubst ./%,%,$(patsubst %/,%,$(sort $(dir \
- $(shell $(CD) $(SRC_ROOT) ; \
- $(LS) -d $(HG_SEARCH:%/REPO=%/$(HG_DIRECTORY)) \
- $(HG_SEARCH:%/REPO=%/$(HGTIP_FILENAME)) \
- 2> /dev/null)))))
+# directory as the original .hg directory. The hgtip files are created in
+# CreateHgtipFiles.gmk.
+HGTIP_FILENAME := .hgtip
+FindAllReposAbs = \
+ $(strip $(sort $(dir $(filter-out $(SRC_ROOT)/build/%, $(wildcard \
+ $(addprefix $(SRC_ROOT)/, \
+ .hg */.hg */*/.hg */*/.hg */*/*/.hg \
+ .hgtip */.hgtip */*/.hgtip */*/.hgtip */*/*/.hgtip \
+ ) \
+ )))))
+
+FindAllReposRel = \
+ $(strip $(subst $(SRC_ROOT)/,.,$(patsubst $(SRC_ROOT)/%/, %, $(FindAllReposAbs))))
# Emit the repo:tip pairs to $@, but only if they changed since last time
define GetSourceTips
$(CD) $(SRC_ROOT) ; \
- for i in $(REPO_LIST) IGNORE ; do \
+ for i in $(FindAllReposRel) IGNORE ; do \
if [ "$${i}" = "IGNORE" ] ; then \
continue; \
- elif [ -d $${i}/$(HG_DIRECTORY) -a "$(HG_VERSION)" != "" ] ; then \
+ elif [ -d $${i}/.hg -a "$(HG)" != "" ] ; then \
$(PRINTF) " %s:%s" \
"$${i}" `$(HG) tip --repository $${i} --template '{node|short}\n'` ; \
elif [ -f $${i}/$(HGTIP_FILENAME) ] ; then \
@@ -369,12 +371,6 @@
fi
endef
-# Create the HGTIP_FILENAME file. Called from closed/make/SourceBundles.gmk
-define CreateHgTip
- $(HG) tip --repository $1 --template '{node|short}\n' > $1/$(HGTIP_FILENAME); \
- $(ECHO) $1/$(HGTIP_FILENAME)
-endef
-
################################################################################
define SetupLogging
--- a/make/common/NON_CORE_PKGS.gmk Thu Jun 23 17:07:31 2016 -0700
+++ b/make/common/NON_CORE_PKGS.gmk Wed Jun 29 21:49:41 2016 -0700
@@ -69,7 +69,8 @@
OLD_DOCLETAPI_PKGS = com.sun.javadoc
DOCLETAPI_PKGS = jdk.javadoc.doclet \
- jdk.javadoc.doclet.taglet
+ jdk.javadoc.doclet.taglet \
+ jdk.javadoc.doclets
TAGLETAPI_FILE = com/sun/tools/doclets/Taglet.java
--- a/nashorn/.hgtags Thu Jun 23 17:07:31 2016 -0700
+++ b/nashorn/.hgtags Wed Jun 29 21:49:41 2016 -0700
@@ -357,3 +357,4 @@
5992041b0794fa5f25518673d63e8f35bcc89360 jdk-9+121
b1de131a3fed6845c78bdda358ee127532f16a3f jdk-9+122
9ed859b4faaf9ff7cd35f9e7f51c7e630303067a jdk-9+123
+5d68f5155dded7efec7d5aca5d631caa7ee1042b jdk-9+124
--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ClassGenerator.java Thu Jun 23 17:07:31 2016 -0700
+++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ClassGenerator.java Wed Jun 29 21:49:41 2016 -0700
@@ -280,12 +280,11 @@
addField(cv, name, OBJECT_DESC);
}
- @SuppressWarnings("deprecation")
static void newFunction(final MethodGenerator mi, final String objName, final String className, final MemberInfo memInfo, final List<MemberInfo> specs) {
final boolean arityFound = (memInfo.getArity() != MemberInfo.DEFAULT_ARITY);
loadFunctionName(mi, memInfo.getName());
- mi.visitLdcInsn(new Handle(H_INVOKESTATIC, className, memInfo.getJavaName(), memInfo.getJavaDesc()));
+ mi.visitLdcInsn(new Handle(H_INVOKESTATIC, className, memInfo.getJavaName(), memInfo.getJavaDesc(), false));
assert specs != null;
if (!specs.isEmpty()) {
@@ -306,7 +305,6 @@
mi.invokeVirtual(SCRIPTFUNCTION_TYPE, SCRIPTFUNCTION_SETDOCUMENTATIONKEY, SCRIPTFUNCTION_SETDOCUMENTATIONKEY_DESC);
}
- @SuppressWarnings("deprecation")
static void linkerAddGetterSetter(final MethodGenerator mi, final String className, final MemberInfo memInfo) {
final String propertyName = memInfo.getName();
// stack: Collection
@@ -319,13 +317,13 @@
mi.push(memInfo.getAttributes());
// setup getter method handle
String javaName = GETTER_PREFIX + memInfo.getJavaName();
- mi.visitLdcInsn(new Handle(H_INVOKEVIRTUAL, className, javaName, getterDesc(memInfo)));
+ mi.visitLdcInsn(new Handle(H_INVOKEVIRTUAL, className, javaName, getterDesc(memInfo), false));
// setup setter method handle
if (memInfo.isFinal()) {
mi.pushNull();
} else {
javaName = SETTER_PREFIX + memInfo.getJavaName();
- mi.visitLdcInsn(new Handle(H_INVOKEVIRTUAL, className, javaName, setterDesc(memInfo)));
+ mi.visitLdcInsn(new Handle(H_INVOKEVIRTUAL, className, javaName, setterDesc(memInfo), false));
}
// property = AccessorProperty.create(key, flags, getter, setter);
mi.invokeStatic(ACCESSORPROPERTY_TYPE, ACCESSORPROPERTY_CREATE, ACCESSORPROPERTY_CREATE_DESC);
@@ -336,7 +334,6 @@
// stack: Collection
}
- @SuppressWarnings("deprecation")
static void linkerAddGetterSetter(final MethodGenerator mi, final String className, final MemberInfo getter, final MemberInfo setter) {
final String propertyName = getter.getName();
// stack: Collection
@@ -349,13 +346,13 @@
mi.push(getter.getAttributes());
// setup getter method handle
mi.visitLdcInsn(new Handle(H_INVOKESTATIC, className,
- getter.getJavaName(), getter.getJavaDesc()));
+ getter.getJavaName(), getter.getJavaDesc(), false));
// setup setter method handle
if (setter == null) {
mi.pushNull();
} else {
mi.visitLdcInsn(new Handle(H_INVOKESTATIC, className,
- setter.getJavaName(), setter.getJavaDesc()));
+ setter.getJavaName(), setter.getJavaDesc(), false));
}
// property = AccessorProperty.create(key, flags, getter, setter);
mi.invokeStatic(ACCESSORPROPERTY_TYPE, ACCESSORPROPERTY_CREATE, ACCESSORPROPERTY_CREATE_DESC);
--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ConstructorGenerator.java Thu Jun 23 17:07:31 2016 -0700
+++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ConstructorGenerator.java Wed Jun 29 21:49:41 2016 -0700
@@ -178,7 +178,6 @@
}
}
- @SuppressWarnings("deprecation")
private void callSuper(final MethodGenerator mi) {
String superClass, superDesc;
mi.loadThis();
@@ -192,7 +191,7 @@
superClass = SCRIPTFUNCTION_TYPE;
superDesc = (memberCount > 0) ? SCRIPTFUNCTION_INIT_DESC4 : SCRIPTFUNCTION_INIT_DESC3;
mi.loadLiteral(constructor.getName());
- mi.visitLdcInsn(new Handle(H_INVOKESTATIC, scriptClassInfo.getJavaName(), constructor.getJavaName(), constructor.getJavaDesc()));
+ mi.visitLdcInsn(new Handle(H_INVOKESTATIC, scriptClassInfo.getJavaName(), constructor.getJavaName(), constructor.getJavaDesc(), false));
loadMap(mi);
mi.memberInfoArray(scriptClassInfo.getJavaName(), specs); //pushes null if specs empty
}
--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MethodGenerator.java Thu Jun 23 17:07:31 2016 -0700
+++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MethodGenerator.java Wed Jun 29 21:49:41 2016 -0700
@@ -390,7 +390,6 @@
return EMPTY_LINK_LOGIC_TYPE.equals(type);
}
- @SuppressWarnings("deprecation")
void memberInfoArray(final String className, final List<MemberInfo> mis) {
if (mis.isEmpty()) {
pushNull();
@@ -405,7 +404,7 @@
push(pos++);
visitTypeInsn(NEW, SPECIALIZATION_TYPE);
dup();
- visitLdcInsn(new Handle(H_INVOKESTATIC, className, mi.getJavaName(), mi.getJavaDesc()));
+ visitLdcInsn(new Handle(H_INVOKESTATIC, className, mi.getJavaName(), mi.getJavaDesc(), false));
final Type linkLogicClass = mi.getLinkLogicClass();
final boolean linkLogic = !linkLogicIsEmpty(linkLogicClass);
final String ctor = linkLogic ? SPECIALIZATION_INIT3 : SPECIALIZATION_INIT2;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/checknames.js Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) 2016, 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 Java identifier name pattern checker. You can check
+// class, method and variable names in java sources to confirm
+// to specified patterns. Default check functions just check for
+// 'too short' names. You can customize checkXYZName functions to
+// have arbitrary name pattern checks.
+
+// Usage: jjs checknames.js -- <directory>
+
+if (arguments.length == 0) {
+ print("Usage: jjs checknames.js -- <directory>");
+ exit(1);
+}
+
+// Java types used
+var File = Java.type("java.io.File");
+var Files = Java.type("java.nio.file.Files");
+var StringArray = Java.type("java.lang.String[]");
+var ToolProvider = Java.type("javax.tools.ToolProvider");
+var Tree = Java.type("com.sun.source.tree.Tree");
+var Trees = Java.type("com.sun.source.util.Trees");
+var TreeScanner = Java.type("com.sun.source.util.TreeScanner");
+
+// replace these checkXYZ functions with checks you want!
+function checkClassName(name) {
+ return name.length < 3;
+}
+
+function checkMethodName(name) {
+ return name.length < 3;
+}
+
+function checkVarName(name) {
+ return name.length < 3;
+}
+
+function checkNames() {
+ // get the system compiler tool
+ var compiler = ToolProvider.systemJavaCompiler;
+ // get standard file manager
+ var fileMgr = compiler.getStandardFileManager(null, null, null);
+ // Using Java.to convert script array (arguments) to a Java String[]
+ var compUnits = fileMgr.getJavaFileObjects(Java.to(arguments, StringArray));
+ // create a new compilation task
+ var task = compiler.getTask(null, fileMgr, null, null, null, compUnits);
+ var sourcePositions = Trees.instance(task).sourcePositions;
+ // subclass SimpleTreeVisitor
+ var NameChecker = Java.extend(TreeScanner);
+
+ var visitor = new NameChecker() {
+ report: function(node) {
+ var pos = sourcePositions.getStartPosition(this.compUnit, node);
+ var line = this.lineMap.getLineNumber(pos);
+ var col = this.lineMap.getColumnNumber(pos);
+ print("Too short name: " + node.name + " @ " + this.fileName + ":" + line + ":" + col);
+ },
+
+ // override to capture information on current compilation unit
+ visitCompilationUnit: function(compUnit, p) {
+ this.compUnit = compUnit;
+ this.lineMap = compUnit.lineMap;
+ this.fileName = compUnit.sourceFile.name;
+
+ return Java.super(visitor).visitCompilationUnit(compUnit, p);
+ },
+
+ // override to check class name
+ visitClass: function(node, p) {
+ if (checkClassName(node.simpleName.toString())) {
+ this.report(node);
+ }
+
+ return Java.super(visitor).visitClass(node, p);
+ },
+
+ // override to check method name
+ visitMethod: function(node, p) {
+ if (checkMethodName(node.name.toString())) {
+ this.report(node);
+ }
+
+ return Java.super(visitor).visitMethod(node, p);
+ },
+
+ // override to check variable name
+ visitVariable: function(node, p) {
+ if (checkVarName(node.name.toString())) {
+ this.report(node);
+ }
+
+ return Java.super(visitor).visitVariable(node, p);
+ }
+ }
+
+ for each (var cu in task.parse()) {
+ cu.accept(visitor, null);
+ }
+}
+
+// for each ".java" file in directory (recursively).
+function main(dir) {
+ var totalCount = 0;
+ Files.walk(dir.toPath()).
+ forEach(function(p) {
+ var name = p.toFile().absolutePath;
+ if (name.endsWith(".java")) {
+ checkNames(p);
+ }
+ });
+}
+
+main(new File(arguments[0]));
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/AssertsEnabled.java Thu Jun 23 17:07:31 2016 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/AssertsEnabled.java Wed Jun 29 21:49:41 2016 -0700
@@ -28,7 +28,6 @@
/**
* Class that exposes the current state of asserts.
*/
-@SuppressWarnings("all")
public final class AssertsEnabled {
private static boolean assertsEnabled = false;
static {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/MethodEmitter.java Thu Jun 23 17:07:31 2016 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/MethodEmitter.java Wed Jun 29 21:49:41 2016 -0700
@@ -32,6 +32,7 @@
import static jdk.internal.org.objectweb.asm.Opcodes.GETSTATIC;
import static jdk.internal.org.objectweb.asm.Opcodes.GOTO;
import static jdk.internal.org.objectweb.asm.Opcodes.H_INVOKESTATIC;
+import static jdk.internal.org.objectweb.asm.Opcodes.H_INVOKEINTERFACE;
import static jdk.internal.org.objectweb.asm.Opcodes.IFEQ;
import static jdk.internal.org.objectweb.asm.Opcodes.IFGE;
import static jdk.internal.org.objectweb.asm.Opcodes.IFGT;
@@ -170,12 +171,10 @@
}
/** Bootstrap for normal indy:s */
- @SuppressWarnings("deprecation")
- private static final Handle LINKERBOOTSTRAP = new Handle(H_INVOKESTATIC, Bootstrap.BOOTSTRAP.className(), Bootstrap.BOOTSTRAP.name(), Bootstrap.BOOTSTRAP.descriptor());
+ private static final Handle LINKERBOOTSTRAP = new Handle(H_INVOKESTATIC, Bootstrap.BOOTSTRAP.className(), Bootstrap.BOOTSTRAP.name(), Bootstrap.BOOTSTRAP.descriptor(), false);
/** Bootstrap for array populators */
- @SuppressWarnings("deprecation")
- private static final Handle POPULATE_ARRAY_BOOTSTRAP = new Handle(H_INVOKESTATIC, RewriteException.BOOTSTRAP.className(), RewriteException.BOOTSTRAP.name(), RewriteException.BOOTSTRAP.descriptor());
+ private static final Handle POPULATE_ARRAY_BOOTSTRAP = new Handle(H_INVOKESTATIC, RewriteException.BOOTSTRAP.className(), RewriteException.BOOTSTRAP.name(), RewriteException.BOOTSTRAP.descriptor(), false);
/**
* Constructor - internal use from ClassEmitter only
@@ -1007,10 +1006,10 @@
*
* @return the method emitter
*/
- @SuppressWarnings("deprecation")
MethodEmitter loadHandle(final String className, final String methodName, final String descName, final EnumSet<Flag> flags) {
+ final int flag = Flag.getValue(flags);
debug("load handle ");
- pushType(Type.OBJECT.ldc(method, new Handle(Flag.getValue(flags), className, methodName, descName)));
+ pushType(Type.OBJECT.ldc(method, new Handle(flag, className, methodName, descName, flag == H_INVOKEINTERFACE)));
return this;
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java Thu Jun 23 17:07:31 2016 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java Wed Jun 29 21:49:41 2016 -0700
@@ -2474,14 +2474,14 @@
}
@Override
- protected FindProperty findProperty(final Object key, final boolean deep, final ScriptObject start) {
- if (lexicalScope != null && start != this && start.isScope()) {
+ protected FindProperty findProperty(final Object key, final boolean deep, boolean isScope, final ScriptObject start) {
+ if (lexicalScope != null && isScope) {
final FindProperty find = lexicalScope.findProperty(key, false);
if (find != null) {
return find;
}
}
- return super.findProperty(key, deep, start);
+ return super.findProperty(key, deep, isScope, start);
}
@Override
@@ -2854,8 +2854,7 @@
sb.append("$Constructor");
final Class<?> funcClass = Class.forName(sb.toString());
- @SuppressWarnings("deprecation")
- final T res = clazz.cast(funcClass.newInstance());
+ final T res = clazz.cast(funcClass.getDeclaredConstructor().newInstance());
if (res instanceof ScriptFunction) {
// All global constructor prototypes are not-writable,
@@ -2871,8 +2870,12 @@
res.setIsBuiltin();
return res;
- } catch (final ClassNotFoundException | InstantiationException | IllegalAccessException e) {
- throw new RuntimeException(e);
+ } catch (final Exception e) {
+ if (e instanceof RuntimeException) {
+ throw (RuntimeException)e;
+ } else {
+ throw new RuntimeException(e);
+ }
}
}
@@ -2882,14 +2885,17 @@
final String className = PACKAGE_PREFIX + name + "$Prototype";
final Class<?> funcClass = Class.forName(className);
- @SuppressWarnings("deprecation")
- final ScriptObject res = (ScriptObject) funcClass.newInstance();
+ final ScriptObject res = (ScriptObject) funcClass.getDeclaredConstructor().newInstance();
res.setIsBuiltin();
res.setInitialProto(prototype);
return res;
- } catch (final ClassNotFoundException | InstantiationException | IllegalAccessException e) {
- throw new RuntimeException(e);
+ } catch (final Exception e) {
+ if (e instanceof RuntimeException) {
+ throw (RuntimeException)e;
+ } else {
+ throw new RuntimeException(e);
+ }
}
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Lexer.java Thu Jun 23 17:07:31 2016 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Lexer.java Wed Jun 29 21:49:41 2016 -0700
@@ -609,6 +609,9 @@
if (stream.get(stream.last()) != token) {
return false;
}
+
+ // Record current position in case multiple heredocs start on this line - see JDK-8073653
+ final State state = saveState();
// Rewind to token start position
reset(Token.descPosition(token));
@@ -616,7 +619,7 @@
return scanRegEx();
} else if (ch0 == '<') {
if (ch1 == '<') {
- return scanHereString(lir);
+ return scanHereString(lir, state);
} else if (Character.isJavaIdentifierStart(ch1)) {
return scanXMLLiteral();
}
@@ -1539,7 +1542,7 @@
*
* @return TRUE if is a here string.
*/
- private boolean scanHereString(final LineInfoReceiver lir) {
+ private boolean scanHereString(final LineInfoReceiver lir, final State oldState) {
assert ch0 == '<' && ch1 == '<';
if (scripting) {
// Record beginning of here string.
@@ -1589,6 +1592,11 @@
int lastLinePosition = position;
restState.setLimit(position);
+ if (oldState.position > position) {
+ restoreState(oldState);
+ skipLine(false);
+ }
+
// Record beginning of string.
final State stringState = saveState();
int stringEnd = position;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java Thu Jun 23 17:07:31 2016 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java Wed Jun 29 21:49:41 2016 -0700
@@ -775,7 +775,7 @@
* @return FindPropertyData or null if not found.
*/
public final FindProperty findProperty(final Object key, final boolean deep) {
- return findProperty(key, deep, this);
+ return findProperty(key, deep, false, this);
}
/**
@@ -791,12 +791,12 @@
* @see jdk.nashorn.internal.objects.NativeArray
*
* @param key Property key.
- * @param deep Whether the search should look up proto chain.
+ * @param deep true if the search should look up proto chain
+ * @param isScope true if this is a scope access
* @param start the object on which the lookup was originally initiated
- *
* @return FindPropertyData or null if not found.
*/
- protected FindProperty findProperty(final Object key, final boolean deep, final ScriptObject start) {
+ protected FindProperty findProperty(final Object key, final boolean deep, boolean isScope, final ScriptObject start) {
final PropertyMap selfMap = getMap();
final Property property = selfMap.findProperty(key);
@@ -807,7 +807,7 @@
if (deep) {
final ScriptObject myProto = getProto();
- final FindProperty find = myProto == null ? null : myProto.findProperty(key, true, start);
+ final FindProperty find = myProto == null ? null : myProto.findProperty(key, true, isScope, start);
// checkSharedProtoMap must be invoked after myProto.checkSharedProtoMap to propagate
// shared proto invalidation up the prototype chain. It also must be invoked when prototype is null.
checkSharedProtoMap();
@@ -1977,7 +1977,7 @@
return findMegaMorphicGetMethod(desc, name, operation == StandardOperation.GET_METHOD);
}
- final FindProperty find = findProperty(name, true);
+ final FindProperty find = findProperty(name, true, NashornCallSiteDescriptor.isScope(desc), this);
MethodHandle mh;
if (find == null) {
@@ -2035,7 +2035,7 @@
}
private static GuardedInvocation findMegaMorphicGetMethod(final CallSiteDescriptor desc, final String name, final boolean isMethod) {
- Context.getContextTrusted().getLogger(ObjectClassGenerator.class).warning("Megamorphic getter: " + desc + " " + name + " " +isMethod);
+ Context.getContextTrusted().getLogger(ObjectClassGenerator.class).warning("Megamorphic getter: ", desc, " ", name + " ", isMethod);
final MethodHandle invoker = MH.insertArguments(MEGAMORPHIC_GET, 1, name, isMethod, NashornCallSiteDescriptor.isScope(desc));
final MethodHandle guard = getScriptObjectGuard(desc.getMethodType(), true);
return new GuardedInvocation(invoker, guard);
@@ -2043,7 +2043,7 @@
@SuppressWarnings("unused")
private Object megamorphicGet(final String key, final boolean isMethod, final boolean isScope) {
- final FindProperty find = findProperty(key, true);
+ final FindProperty find = findProperty(key, true, isScope, this);
if (find != null) {
return find.getObjectValue();
}
@@ -2181,7 +2181,7 @@
*
* toString = function() { print("global toString"); } // don't affect Object.prototype.toString
*/
- FindProperty find = findProperty(name, true, this);
+ FindProperty find = findProperty(name, true, NashornCallSiteDescriptor.isScope(desc), this);
// If it's not a scope search, then we don't want any inherited properties except those with user defined accessors.
if (find != null && find.isInherited() && !find.getProperty().isAccessorProperty()) {
@@ -2258,6 +2258,7 @@
}
private GuardedInvocation findMegaMorphicSetMethod(final CallSiteDescriptor desc, final String name) {
+ Context.getContextTrusted().getLogger(ObjectClassGenerator.class).warning("Megamorphic setter: ", desc, " ", name);
final MethodType type = desc.getMethodType().insertParameterTypes(1, Object.class);
//never bother with ClassCastExceptionGuard for megamorphic callsites
final GuardedInvocation inv = findSetIndexMethod(getClass(), desc, false, type);
@@ -2734,7 +2735,7 @@
if (isValidArrayIndex(index)) {
for (ScriptObject object = this; ; ) {
if (object.getMap().containsArrayKeys()) {
- final FindProperty find = object.findProperty(key, false, this);
+ final FindProperty find = object.findProperty(key, false);
if (find != null) {
return getIntValue(find, programPoint);
@@ -2805,7 +2806,7 @@
if (isValidArrayIndex(index)) {
for (ScriptObject object = this; ; ) {
if (object.getMap().containsArrayKeys()) {
- final FindProperty find = object.findProperty(key, false, this);
+ final FindProperty find = object.findProperty(key, false);
if (find != null) {
return getDoubleValue(find, programPoint);
}
@@ -2875,7 +2876,7 @@
if (isValidArrayIndex(index)) {
for (ScriptObject object = this; ; ) {
if (object.getMap().containsArrayKeys()) {
- final FindProperty find = object.findProperty(key, false, this);
+ final FindProperty find = object.findProperty(key, false);
if (find != null) {
return find.getObjectValue();
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptRuntime.java Thu Jun 23 17:07:31 2016 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptRuntime.java Wed Jun 29 21:49:41 2016 -0700
@@ -704,7 +704,17 @@
if (property != null) {
if (obj instanceof ScriptObject) {
- obj = ((ScriptObject)obj).get(property);
+ // this is a scope identifier
+ assert property instanceof String;
+ final ScriptObject sobj = (ScriptObject) obj;
+
+ final FindProperty find = sobj.findProperty(property, true, true, sobj);
+ if (find != null) {
+ obj = find.getObjectValue();
+ } else {
+ obj = sobj.invokeNoSuchProperty(property, false, UnwarrantedOptimismException.INVALID_PROGRAM_POINT);
+ }
+
if(Global.isLocationPropertyPlaceholder(obj)) {
if(CompilerConstants.__LINE__.name().equals(property)) {
obj = 0;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/WithObject.java Thu Jun 23 17:07:31 2016 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/WithObject.java Wed Jun 29 21:49:41 2016 -0700
@@ -193,20 +193,20 @@
*
* @param key Property key.
* @param deep Whether the search should look up proto chain.
+ * @param isScope true if is this a scope access
* @param start the object on which the lookup was originally initiated
- *
* @return FindPropertyData or null if not found.
*/
@Override
- protected FindProperty findProperty(final Object key, final boolean deep, final ScriptObject start) {
+ protected FindProperty findProperty(final Object key, final boolean deep, boolean isScope, final ScriptObject start) {
// We call findProperty on 'expression' with 'expression' itself as start parameter.
// This way in ScriptObject.setObject we can tell the property is from a 'with' expression
// (as opposed from another non-scope object in the proto chain such as Object.prototype).
- final FindProperty exprProperty = expression.findProperty(key, true, expression);
+ final FindProperty exprProperty = expression.findProperty(key, true, false, expression);
if (exprProperty != null) {
return exprProperty;
}
- return super.findProperty(key, deep, start);
+ return super.findProperty(key, deep, isScope, start);
}
@Override
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaAdapterBytecodeGenerator.java Thu Jun 23 17:07:31 2016 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaAdapterBytecodeGenerator.java Wed Jun 29 21:49:41 2016 -0700
@@ -191,18 +191,16 @@
private static final Call RUN = interfaceCallNoLookup(Runnable.class, "run", void.class);
// ASM handle to the bootstrap method
- @SuppressWarnings("deprecation")
private static final Handle BOOTSTRAP_HANDLE = new Handle(H_INVOKESTATIC,
Type.getInternalName(JavaAdapterServices.class), "bootstrap",
MethodType.methodType(CallSite.class, Lookup.class, String.class,
- MethodType.class, int.class).toMethodDescriptorString());
+ MethodType.class, int.class).toMethodDescriptorString(), false);
// ASM handle to the bootstrap method for array populator
- @SuppressWarnings("deprecation")
private static final Handle CREATE_ARRAY_BOOTSTRAP_HANDLE = new Handle(H_INVOKESTATIC,
Type.getInternalName(JavaAdapterServices.class), "createArrayBootstrap",
MethodType.methodType(CallSite.class, Lookup.class, String.class,
- MethodType.class).toMethodDescriptorString());
+ MethodType.class).toMethodDescriptorString(), false);
// Field type names used in the generated bytecode
private static final String SCRIPT_OBJECT_TYPE_DESCRIPTOR = SCRIPT_OBJECT_TYPE.getDescriptor();
@@ -1061,13 +1059,12 @@
endMethod(mv);
}
- @SuppressWarnings("deprecation")
private void generateFinalizerOverride() {
final InstructionAdapter mv = new InstructionAdapter(cw.visitMethod(ACC_PUBLIC, "finalize",
VOID_METHOD_DESCRIPTOR, null, null));
// Overridden finalizer will take a MethodHandle to the finalizer delegating method, ...
mv.aconst(new Handle(Opcodes.H_INVOKESTATIC, generatedClassName, FINALIZER_DELEGATE_NAME,
- FINALIZER_DELEGATE_METHOD_DESCRIPTOR));
+ FINALIZER_DELEGATE_METHOD_DESCRIPTOR, false));
mv.visitVarInsn(ALOAD, 0);
// ...and invoke it through JavaAdapterServices.invokeNoPermissions
INVOKE_NO_PERMISSIONS.invoke(mv);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/RegExpScanner.java Thu Jun 23 17:07:31 2016 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/RegExpScanner.java Wed Jun 29 21:49:41 2016 -0700
@@ -80,8 +80,17 @@
this.negLookaheadLevel = negLookaheadLevel;
}
- boolean isContained(final int group, final int level) {
- return group == this.negLookaheadGroup && level >= this.negLookaheadLevel;
+ /**
+ * Returns true if this Capture can be referenced from the position specified by the
+ * group and level parameters. This is the case if either the group is not within
+ * a negative lookahead, or the position of the referrer is in the same negative lookahead.
+ *
+ * @param group current negative lookahead group
+ * @param level current negative lokahead level
+ * @return true if this capture group can be referenced from the given position
+ */
+ boolean canBeReferencedFrom(final int group, final int level) {
+ return this.negLookaheadLevel == 0 || (group == this.negLookaheadGroup && level >= this.negLookaheadLevel);
}
}
@@ -671,8 +680,9 @@
} else if (decimalValue <= caps.size()) {
// Captures inside a negative lookahead are undefined when referenced from the outside.
- if (!caps.get(decimalValue - 1).isContained(negLookaheadGroup, negLookaheadLevel)) {
- // Reference to capture in negative lookahead, omit from output buffer.
+ final Capture capture = caps.get(decimalValue - 1);
+ if (!capture.canBeReferencedFrom(negLookaheadGroup, negLookaheadLevel)) {
+ // Outside reference to capture in negative lookahead, omit from output buffer.
sb.setLength(sb.length() - 1);
} else {
// Append backreference to output buffer.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8073653.js Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,59 @@
+/*
+ * 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.
+ *
+ * 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-8073653: Secondary heredoc eating wrong lines.
+ *
+ * @test
+ * @run
+ * @option -scripting
+ */
+
+
+print(<<EOD1); print(<<EOD2.toUpperCase()); var a = <<EOD3, b = <<EOD4.toLowerCase(), c = [<<EOD5, <<EOD6];
+This is line 1.
+This is line 2.
+EOD1
+This is line 3.
+This is line 4.
+EOD2
+This is line 5.
+This is line 6.
+EOD3
+This is line 7.
+This is line 8.
+EOD4
+This is line 9.
+This is line 10.
+EOD5
+This is line 11.
+This is line 12.
+EOD6
+
+print(a);
+print(b);
+for (var i in c) {
+ print(c[i]);
+}
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8073653.js.EXPECTED Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,12 @@
+This is line 1.
+This is line 2.
+THIS IS LINE 3.
+THIS IS LINE 4.
+This is line 5.
+This is line 6.
+this is line 7.
+this is line 8.
+This is line 9.
+This is line 10.
+This is line 11.
+This is line 12.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8137240.js Wed Jun 29 21:49:41 2016 -0700
@@ -0,0 +1,44 @@
+/*
+ * 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.
+ *
+ * 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-8137240: Negative lookahead in RegEx breaks backreference
+ *
+ * @test
+ * @run
+ */
+
+
+Assert.assertEquals('aa'.replace(/(a)(?!b)\1/gm, 'c'), 'c');
+
+var result = 'aa'.match(/(a)(?!b)\1/);
+Assert.assertTrue(result.length === 2);
+Assert.assertTrue(result[0] === 'aa');
+Assert.assertTrue(result[1] === 'a');
+
+result = 'aa'.match(/(a)(?!(b))\2(a)/);
+Assert.assertTrue(result.length === 4);
+Assert.assertTrue(result[0] === 'aa');
+Assert.assertTrue(result[1] === 'a');
+Assert.assertTrue(result[2] === undefined);
+Assert.assertTrue(result[3] === 'a');
--- a/nashorn/test/src/jdk/nashorn/internal/runtime/test/LexicalBindingTest.java Thu Jun 23 17:07:31 2016 -0700
+++ b/nashorn/test/src/jdk/nashorn/internal/runtime/test/LexicalBindingTest.java Wed Jun 29 21:49:41 2016 -0700
@@ -46,8 +46,8 @@
public class LexicalBindingTest {
final static String LANGUAGE_ES6 = "--language=es6";
- final static int NUMBER_OF_CONTEXTS = 20;
- final static int MEGAMORPHIC_LOOP_COUNT = 20;
+ final static int NUMBER_OF_CONTEXTS = 40;
+ final static int MEGAMORPHIC_LOOP_COUNT = 40;
/**
* Test access to global var-declared variables for shared script classes with multiple globals.
@@ -57,19 +57,21 @@
final NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
final ScriptEngine e = factory.getScriptEngine();
final ScriptContext[] contexts = new ScriptContext[NUMBER_OF_CONTEXTS];
- final String sharedScript = "foo";
+ final String sharedScript1 = "foo";
+ final String sharedScript2 = "bar = foo; bar";
for (int i = 0; i < NUMBER_OF_CONTEXTS; i++) {
final ScriptContext context = contexts[i] = new SimpleScriptContext();
final Bindings b = e.createBindings();
context.setBindings(b, ScriptContext.ENGINE_SCOPE);
- assertEquals(e.eval("var foo = '" + i + "';", context), null);
+ assertEquals(e.eval("var foo = '" + i + "'; var bar;", context), null);
}
for (int i = 0; i < NUMBER_OF_CONTEXTS; i++) {
final ScriptContext context = contexts[i];
- assertEquals(e.eval(sharedScript, context), String.valueOf(i));
+ assertEquals(e.eval(sharedScript1, context), String.valueOf(i));
+ assertEquals(e.eval(sharedScript2, context), String.valueOf(i));
}
}
@@ -81,19 +83,21 @@
final NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
final ScriptEngine e = factory.getScriptEngine(LANGUAGE_ES6);
final ScriptContext[] contexts = new ScriptContext[NUMBER_OF_CONTEXTS];
- final String sharedScript = "foo";
+ final String sharedScript1 = "foo";
+ final String sharedScript2 = "bar = foo; bar";
for (int i = 0; i < NUMBER_OF_CONTEXTS; i++) {
final ScriptContext context = contexts[i] = new SimpleScriptContext();
final Bindings b = e.createBindings();
context.setBindings(b, ScriptContext.ENGINE_SCOPE);
- assertEquals(e.eval("let foo = '" + i + "';", context), null);
+ assertEquals(e.eval("let foo = '" + i + "'; let bar; ", context), null);
}
for (int i = 0; i < NUMBER_OF_CONTEXTS; i++) {
final ScriptContext context = contexts[i];
- assertEquals(e.eval(sharedScript, context), String.valueOf(i));
+ assertEquals(e.eval(sharedScript1, context), String.valueOf(i));
+ assertEquals(e.eval(sharedScript2, context), String.valueOf(i));
}
}
@@ -182,6 +186,27 @@
assertEquals(e.eval(sharedScript, newCtxt), "newer context");
}
+ /**
+ * Make sure lexically defined variables are accessible in other scripts.
+ */
+ @Test
+ public void lexicalScopeTest() throws ScriptException {
+ final NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
+ final ScriptEngine e = factory.getScriptEngine(LANGUAGE_ES6);
+
+ e.eval("let x; const y = 'world';");
+
+ assertEquals(e.eval("x = 'hello'"), "hello");
+ assertEquals(e.eval("typeof x"), "string");
+ assertEquals(e.eval("typeof y"), "string");
+ assertEquals(e.eval("x"), "hello");
+ assertEquals(e.eval("y"), "world");
+ assertEquals(e.eval("typeof this.x"), "undefined");
+ assertEquals(e.eval("typeof this.y"), "undefined");
+ assertEquals(e.eval("this.x"), null);
+ assertEquals(e.eval("this.y"), null);
+ }
+
private static class ScriptRunner implements Runnable {
final ScriptEngine engine;