diff --git a/.hgtags b/.hgtags index 14aa9215059..a457e5268d8 100644 --- a/.hgtags +++ b/.hgtags @@ -379,3 +379,4 @@ e17429a7e843c4a4ed3651458d0f950970edcbcc jdk-9+133 a71210c0d9800eb6925b61ecd6198abd554f90ee jdk-9+134 e384420383a5b79fa0012ebcb25d8f83cff7f777 jdk-9+135 1b4b5d01aa11edf24b6fadbe3d2f3e411e3b02cd jdk-9+136 +9cb87c88ed851c0575b8ead753ea238ed5b544e9 jdk-9+137 diff --git a/.hgtags-top-repo b/.hgtags-top-repo index e540680549f..a0cde0979fb 100644 --- a/.hgtags-top-repo +++ b/.hgtags-top-repo @@ -379,3 +379,4 @@ be1218f792a450dfb5d4b1f82616b9d95a6a732e jdk-9+133 065724348690eda41fc69112278d8da6dcde548c jdk-9+134 82b94cb5f342319d2cda77f9fa59703ad7fde576 jdk-9+135 3ec350f5f32af249b59620d7e37b54bdcd77b233 jdk-9+136 +d7f519b004254b19e384131d9f0d0e40e31a0fd3 jdk-9+137 diff --git a/Makefile b/Makefile index 2460cd414d8..ebe52d5d7f2 100644 --- a/Makefile +++ b/Makefile @@ -28,8 +28,8 @@ ### It also performs some sanity checks on make. ### -# The shell code below will be executed on /usr/ccs/bin/make on Solaris, but not in GNU Make. -# /usr/ccs/bin/make lacks basically every other flow control mechanism. +# The shell code below will be executed on /usr/bin/make on Solaris, but not in GNU Make. +# /usr/bin/make lacks basically every other flow control mechanism. .TEST_FOR_NON_GNUMAKE:sh=echo You are not using GNU Make/gmake, this is a requirement. Check your path. 1>&2 && exit 1 # The .FEATURES variable is likely to be unique for GNU Make. diff --git a/README-builds.html b/README-builds.html index 42cc0f11b7c..6d7d5b52461 100644 --- a/README-builds.html +++ b/README-builds.html @@ -626,8 +626,7 @@ number of different configurations, e.g. debug, release, 32, 64, etc.
The Common UNIX Printing System (CUPS) Headers are required for building the
OpenJDK on Solaris and Linux. The Solaris header files can be obtained by
- installing the package SFWcups from the Solaris Software Companion
- CD/DVD, these often will be installed into the directory /opt/sfw/cups
.
The CUPS header files can always be downloaded from www.cups.org.
@@ -1111,8 +1110,7 @@ version, see "Building GNU make".PATH
./usr/bin/make
on Solaris. If your Solaris system
has the software from the Solaris Developer Companion CD installed, you
-should try and use gmake
which will be located in either the /usr/bin
,
-/opt/sfw/bin
or /usr/sfw/bin
directory./usr/bin/gmake
or /usr/gnu/bin/make
.
*{@code * // a0: BMH - * // a1: inits, a2: steps, a3: preds, a4: finis - * // a5: box, a6: unbox - * // a7 (and following): arguments - * loop=Lambda(a0:L,a1:L,a2:L,a3:L,a4:L,a5:L,a6:L,a7:L)=>{ - * t8:L=MethodHandle.invokeBasic(a5:L,a7:L); // box the arguments into an Object[] - * t9:L=MethodHandleImpl.loop(bt:L,a1:L,a2:L,a3:L,a4:L,t8:L); // call the loop executor (with supplied types in bt) - * t10:L=MethodHandle.invokeBasic(a6:L,t9:L);t10:L} // unbox the result; return the result + * // a1: LoopClauses (containing an array of arrays: inits, steps, preds, finis) + * // a2: box, a3: unbox + * // a4 (and following): arguments + * loop=Lambda(a0:L,a1:L,a2:L,a3:L,a4:L)=>{ + * t5:L=MethodHandle.invokeBasic(a2:L,a4:L); // box the arguments into an Object[] + * t6:L=MethodHandleImpl.loop(bt:L,a1:L,t5:L); // call the loop executor (with supplied types in bt) + * t7:L=MethodHandle.invokeBasic(a3:L,t6:L);t7:L} // unbox the result; return the result * }
* It is compiled into bytecode equivalent to the code seen in {@link MethodHandleImpl#loop(BasicType[], - * MethodHandle[], MethodHandle[], MethodHandle[], MethodHandle[], Object...)}, with the difference that no arrays + * MethodHandleImpl.LoopClauses, Object...)}, with the difference that no arrays * will be used for local state storage. Instead, the local state will be mapped to actual stack slots. *
* Bytecode generation applies an unrolling scheme to enable better bytecode generation regarding local state type * handling. The generated bytecode will have the following form ({@code void} types are ignored for convenience). * Assume there are {@code C} clauses in the loop. *
*{@code - * INIT: (INIT_SEQ for clause 1) - * ... - * (INIT_SEQ for clause C) - * LOOP: (LOOP_SEQ for clause 1) - * ... - * (LOOP_SEQ for clause C) - * GOTO LOOP - * DONE: ... + * PREINIT: ALOAD_1 + * CHECKCAST LoopClauses + * GETFIELD LoopClauses.clauses + * ASTORE clauseDataIndex // place the clauses 2-dimensional array on the stack + * INIT: (INIT_SEQ for clause 1) + * ... + * (INIT_SEQ for clause C) + * LOOP: (LOOP_SEQ for clause 1) + * ... + * (LOOP_SEQ for clause C) + * GOTO LOOP + * DONE: ... * }
* The {@code INIT_SEQ_x} sequence for clause {@code x} (with {@code x} ranging from {@code 0} to {@code C-1}) has * the following shape. Assume slot {@code vx} is used to hold the state for clause {@code x}. *
{@code - * INIT_SEQ_x: ALOAD inits - * CHECKCAST MethodHandle[] + * INIT_SEQ_x: ALOAD clauseDataIndex + * ICONST_0 + * AALOAD // load the inits array * ICONST x * AALOAD // load the init handle for clause x * load args @@ -1361,24 +1369,27 @@ class InvokerBytecodeGenerator { * The {@code LOOP_SEQ_x} sequence for clause {@code x} (with {@code x} ranging from {@code 0} to {@code C-1}) has * the following shape. Again, assume slot {@code vx} is used to hold the state for clause {@code x}. *{@code - * LOOP_SEQ_x: ALOAD steps - * CHECKCAST MethodHandle[] + * LOOP_SEQ_x: ALOAD clauseDataIndex + * ICONST_1 + * AALOAD // load the steps array * ICONST x * AALOAD // load the step handle for clause x * load locals * load args * INVOKEVIRTUAL MethodHandle.invokeBasic * store vx - * ALOAD preds - * CHECKCAST MethodHandle[] + * ALOAD clauseDataIndex + * ICONST_2 + * AALOAD // load the preds array * ICONST x * AALOAD // load the pred handle for clause x * load locals * load args * INVOKEVIRTUAL MethodHandle.invokeBasic * IFNE LOOP_SEQ_x+1 // predicate returned false -> jump to next clause - * ALOAD finis - * CHECKCAST MethodHandle[] + * ALOAD clauseDataIndex + * ICONST_3 + * AALOAD // load the finis array * ICONST x * AALOAD // load the fini handle for clause x * load locals @@ -1397,8 +1408,12 @@ class InvokerBytecodeGenerator { BasicType[] loopClauseTypes = (BasicType[]) invoker.arguments[0]; Class>[] loopLocalStateTypes = Stream.of(loopClauseTypes). filter(bt -> bt != BasicType.V_TYPE).map(BasicType::basicTypeClass).toArray(Class>[]::new); + Class>[] localTypes = new Class>[loopLocalStateTypes.length + 1]; + localTypes[0] = MethodHandleImpl.LoopClauses.class; + System.arraycopy(loopLocalStateTypes, 0, localTypes, 1, loopLocalStateTypes.length); - final int firstLoopStateIndex = extendLocalsMap(loopLocalStateTypes); + final int clauseDataIndex = extendLocalsMap(localTypes); + final int firstLoopStateIndex = clauseDataIndex + 1; Class> returnType = result.function.resolvedHandle().type().returnType(); MethodType loopType = args.function.resolvedHandle().type() @@ -1420,10 +1435,16 @@ class InvokerBytecodeGenerator { Label lDone = new Label(); Label lNext; + // PREINIT: + emitPushArgument(MethodHandleImpl.LoopClauses.class, invoker.arguments[1]); + mv.visitFieldInsn(Opcodes.GETFIELD, LOOP_CLAUSES, "clauses", MHARY2); + emitAstoreInsn(clauseDataIndex); + // INIT: for (int c = 0, state = 0; c < nClauses; ++c) { MethodType cInitType = loopType.changeReturnType(loopClauseTypes[c].basicTypeClass()); - emitLoopHandleInvoke(invoker, inits, c, args, false, cInitType, loopLocalStateTypes, firstLoopStateIndex); + emitLoopHandleInvoke(invoker, inits, c, args, false, cInitType, loopLocalStateTypes, clauseDataIndex, + firstLoopStateIndex); if (cInitType.returnType() != void.class) { emitStoreInsn(BasicType.basicType(cInitType.returnType()), firstLoopStateIndex + state); ++state; @@ -1440,18 +1461,21 @@ class InvokerBytecodeGenerator { boolean isVoid = stepType.returnType() == void.class; // invoke loop step - emitLoopHandleInvoke(invoker, steps, c, args, true, stepType, loopLocalStateTypes, firstLoopStateIndex); + emitLoopHandleInvoke(invoker, steps, c, args, true, stepType, loopLocalStateTypes, clauseDataIndex, + firstLoopStateIndex); if (!isVoid) { emitStoreInsn(BasicType.basicType(stepType.returnType()), firstLoopStateIndex + state); ++state; } // invoke loop predicate - emitLoopHandleInvoke(invoker, preds, c, args, true, predType, loopLocalStateTypes, firstLoopStateIndex); + emitLoopHandleInvoke(invoker, preds, c, args, true, predType, loopLocalStateTypes, clauseDataIndex, + firstLoopStateIndex); mv.visitJumpInsn(Opcodes.IFNE, lNext); // invoke fini - emitLoopHandleInvoke(invoker, finis, c, args, true, finiType, loopLocalStateTypes, firstLoopStateIndex); + emitLoopHandleInvoke(invoker, finis, c, args, true, finiType, loopLocalStateTypes, clauseDataIndex, + firstLoopStateIndex); mv.visitJumpInsn(Opcodes.GOTO, lDone); // this is the beginning of the next loop clause @@ -1483,9 +1507,10 @@ class InvokerBytecodeGenerator { } private void emitLoopHandleInvoke(Name holder, int handles, int clause, Name args, boolean pushLocalState, - MethodType type, Class>[] loopLocalStateTypes, int firstLoopStateSlot) { + MethodType type, Class>[] loopLocalStateTypes, int clauseDataSlot, + int firstLoopStateSlot) { // load handle for clause - emitPushArgument(holder, handles); + emitPushClauseArray(clauseDataSlot, handles); emitIconstInsn(clause); mv.visitInsn(Opcodes.AALOAD); // load loop state (preceding the other arguments) @@ -1499,6 +1524,12 @@ class InvokerBytecodeGenerator { mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", type.toMethodDescriptorString(), false); } + private void emitPushClauseArray(int clauseDataSlot, int which) { + emitAloadInsn(clauseDataSlot); + emitIconstInsn(which - 1); + mv.visitInsn(Opcodes.AALOAD); + } + private void emitZero(BasicType type) { switch (type) { case I_TYPE: mv.visitInsn(Opcodes.ICONST_0); break; diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java b/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java index 6fdf21e2c91..bcc825bcf15 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java @@ -41,7 +41,6 @@ import java.util.HashMap; import static java.lang.invoke.LambdaForm.BasicType.*; import static java.lang.invoke.MethodHandleNatives.Constants.REF_invokeStatic; import static java.lang.invoke.MethodHandleStatics.*; -import java.util.Objects; /** * The symbolic, non-executable form of a method handle's invocation semantics. @@ -732,9 +731,9 @@ class LambdaForm { boolean isLoop(int pos) { // loop idiom: // t_{n}:L=MethodHandle.invokeBasic(...) - // t_{n+1}:L=MethodHandleImpl.loop(types, *, *, *, *, t_{n}) + // t_{n+1}:L=MethodHandleImpl.loop(types, *, t_{n}) // t_{n+2}:?=MethodHandle.invokeBasic(*, t_{n+1}) - return isMatchingIdiom(pos, "loop", 5); + return isMatchingIdiom(pos, "loop", 2); } /* diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java index 4fe4bb524a7..ca4f050553f 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java @@ -1689,8 +1689,7 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; NF_tryFinally = new NamedFunction(MethodHandleImpl.class .getDeclaredMethod("tryFinally", MethodHandle.class, MethodHandle.class, Object[].class)); NF_loop = new NamedFunction(MethodHandleImpl.class - .getDeclaredMethod("loop", BasicType[].class, MethodHandle[].class, MethodHandle[].class, - MethodHandle[].class, MethodHandle[].class, Object[].class)); + .getDeclaredMethod("loop", BasicType[].class, LoopClauses.class, Object[].class)); NF_throwException = new NamedFunction(MethodHandleImpl.class .getDeclaredMethod("throwException", Throwable.class)); NF_profileBoolean = new NamedFunction(MethodHandleImpl.class @@ -1794,12 +1793,13 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; MethodHandle collectArgs = varargsArray(type.parameterCount()).asType(varargsType); MethodHandle unboxResult = unboxResultHandle(tloop); - BoundMethodHandle.SpeciesData data = BoundMethodHandle.speciesData_LLLLLL(); + LoopClauses clauseData = + new LoopClauses(new MethodHandle[][]{toArray(init), toArray(step), toArray(pred), toArray(fini)}); + BoundMethodHandle.SpeciesData data = BoundMethodHandle.speciesData_LLL(); BoundMethodHandle mh; try { - mh = (BoundMethodHandle) data.constructor().invokeBasic(type, form, (Object) toArray(init), - (Object) toArray(step), (Object) toArray(pred), (Object) toArray(fini), (Object) collectArgs, - (Object) unboxResult); + mh = (BoundMethodHandle) data.constructor().invokeBasic(type, form, (Object) clauseData, + (Object) collectArgs, (Object) unboxResult); } catch (Throwable ex) { throw uncaughtException(ex); } @@ -1818,23 +1818,20 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; * {@code t12}): **{@code * loop=Lambda(a0:L,a1:L)=>{ - * t2:L=BoundMethodHandle$Species_L6.argL0(a0:L); // array of init method handles - * t3:L=BoundMethodHandle$Species_L6.argL1(a0:L); // array of step method handles - * t4:L=BoundMethodHandle$Species_L6.argL2(a0:L); // array of pred method handles - * t5:L=BoundMethodHandle$Species_L6.argL3(a0:L); // array of fini method handles - * t6:L=BoundMethodHandle$Species_L6.argL4(a0:L); // helper handle to box the arguments into an Object[] - * t7:L=BoundMethodHandle$Species_L6.argL5(a0:L); // helper handle to unbox the result - * t8:L=MethodHandle.invokeBasic(t6:L,a1:L); // box the arguments into an Object[] - * t9:L=MethodHandleImpl.loop(null,t2:L,t3:L,t4:L,t5:L,t6:L); // call the loop executor - * t10:L=MethodHandle.invokeBasic(t7:L,t9:L);t10:L} // unbox the result; return the result + * t2:L=BoundMethodHandle$Species_L3.argL0(a0:L); // LoopClauses holding init, step, pred, fini handles + * t3:L=BoundMethodHandle$Species_L3.argL1(a0:L); // helper handle to box the arguments into an Object[] + * t4:L=BoundMethodHandle$Species_L3.argL2(a0:L); // helper handle to unbox the result + * t5:L=MethodHandle.invokeBasic(t3:L,a1:L); // box the arguments into an Object[] + * t6:L=MethodHandleImpl.loop(null,t2:L,t3:L); // call the loop executor + * t7:L=MethodHandle.invokeBasic(t4:L,t6:L);t7:L} // unbox the result; return the result * }- * {@code argL0} through {@code argL3} are the arrays of init, step, pred, and fini method handles. - * {@code argL4} and {@code argL5} are auxiliary method handles: {@code argL2} boxes arguments and wraps them into - * {@code Object[]} ({@code ValueConversions.array()}), and {@code argL3} unboxes the result if necessary + * {@code argL0} is a LoopClauses instance holding, in a 2-dimensional array, the init, step, pred, and fini method + * handles. {@code argL1} and {@code argL2} are auxiliary method handles: {@code argL1} boxes arguments and wraps + * them into {@code Object[]} ({@code ValueConversions.array()}), and {@code argL2} unboxes the result if necessary * ({@code ValueConversions.unbox()}). *
- * Having {@code t6} and {@code t7} passed in via a BMH and not hardcoded in the lambda form allows to share lambda + * Having {@code t3} and {@code t4} passed in via a BMH and not hardcoded in the lambda form allows to share lambda * forms among loop combinators with the same basic type. *
* The above template is instantiated by using the {@link LambdaFormEditor} to replace the {@code null} argument to @@ -1845,15 +1842,12 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; private static LambdaForm makeLoopForm(MethodType basicType, BasicType[] localVarTypes) { MethodType lambdaType = basicType.invokerType(); - final int THIS_MH = 0; // the BMH_LLLLLL + final int THIS_MH = 0; // the BMH_LLL final int ARG_BASE = 1; // start of incoming arguments final int ARG_LIMIT = ARG_BASE + basicType.parameterCount(); int nameCursor = ARG_LIMIT; - final int GET_INITS = nameCursor++; - final int GET_STEPS = nameCursor++; - final int GET_PREDS = nameCursor++; - final int GET_FINIS = nameCursor++; + final int GET_CLAUSE_DATA = nameCursor++; final int GET_COLLECT_ARGS = nameCursor++; final int GET_UNBOX_RESULT = nameCursor++; final int BOXED_ARGS = nameCursor++; @@ -1864,14 +1858,11 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; if (lform == null) { Name[] names = arguments(nameCursor - ARG_LIMIT, lambdaType); - BoundMethodHandle.SpeciesData data = BoundMethodHandle.speciesData_LLLLLL(); + BoundMethodHandle.SpeciesData data = BoundMethodHandle.speciesData_LLL(); names[THIS_MH] = names[THIS_MH].withConstraint(data); - names[GET_INITS] = new Name(data.getterFunction(0), names[THIS_MH]); - names[GET_STEPS] = new Name(data.getterFunction(1), names[THIS_MH]); - names[GET_PREDS] = new Name(data.getterFunction(2), names[THIS_MH]); - names[GET_FINIS] = new Name(data.getterFunction(3), names[THIS_MH]); - names[GET_COLLECT_ARGS] = new Name(data.getterFunction(4), names[THIS_MH]); - names[GET_UNBOX_RESULT] = new Name(data.getterFunction(5), names[THIS_MH]); + names[GET_CLAUSE_DATA] = new Name(data.getterFunction(0), names[THIS_MH]); + names[GET_COLLECT_ARGS] = new Name(data.getterFunction(1), names[THIS_MH]); + names[GET_UNBOX_RESULT] = new Name(data.getterFunction(2), names[THIS_MH]); // t_{i}:L=MethodHandle.invokeBasic(collectArgs:L,a1:L,...); MethodType collectArgsType = basicType.changeReturnType(Object.class); @@ -1881,10 +1872,10 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; System.arraycopy(names, ARG_BASE, args, 1, ARG_LIMIT - ARG_BASE); names[BOXED_ARGS] = new Name(makeIntrinsic(invokeBasic, Intrinsic.LOOP), args); - // t_{i+1}:L=MethodHandleImpl.loop(localTypes:L,inits:L,steps:L,preds:L,finis:L,t_{i}:L); + // t_{i+1}:L=MethodHandleImpl.loop(localTypes:L,clauses:L,t_{i}:L); Object[] lArgs = new Object[]{null, // placeholder for BasicType[] localTypes - will be added by LambdaFormEditor - names[GET_INITS], names[GET_STEPS], names[GET_PREDS], names[GET_FINIS], names[BOXED_ARGS]}; + names[GET_CLAUSE_DATA], names[BOXED_ARGS]}; names[LOOP] = new Name(NF_loop, lArgs); // t_{i+2}:I=MethodHandle.invokeBasic(unbox:L,t_{i+1}:L); @@ -1900,22 +1891,52 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; return lform.editor().noteLoopLocalTypesForm(BOXED_ARGS, localVarTypes); } + static class LoopClauses { + @Stable final MethodHandle[][] clauses; + LoopClauses(MethodHandle[][] clauses) { + assert clauses.length == 4; + this.clauses = clauses; + } + @Override + public String toString() { + StringBuffer sb = new StringBuffer("LoopClauses -- "); + for (int i = 0; i < 4; ++i) { + if (i > 0) { + sb.append(" "); + } + sb.append('<').append(i).append(">: "); + MethodHandle[] hs = clauses[i]; + for (int j = 0; j < hs.length; ++j) { + if (j > 0) { + sb.append(" "); + } + sb.append('*').append(j).append(": ").append(hs[j]).append('\n'); + } + } + sb.append(" --\n"); + return sb.toString(); + } + } /** * Intrinsified during LambdaForm compilation * (see {@link InvokerBytecodeGenerator#emitLoop(int)}). */ @LambdaForm.Hidden - static Object loop(BasicType[] localTypes, MethodHandle[] init, MethodHandle[] step, MethodHandle[] pred, - MethodHandle[] fini, Object... av) throws Throwable { + static Object loop(BasicType[] localTypes, LoopClauses clauseData, Object... av) throws Throwable { + final MethodHandle[] init = clauseData.clauses[0]; + final MethodHandle[] step = clauseData.clauses[1]; + final MethodHandle[] pred = clauseData.clauses[2]; + final MethodHandle[] fini = clauseData.clauses[3]; int varSize = (int) Stream.of(init).filter(h -> h.type().returnType() != void.class).count(); int nArgs = init[0].type().parameterCount(); Object[] varsAndArgs = new Object[varSize + nArgs]; for (int i = 0, v = 0; i < init.length; ++i) { - if (init[i].type().returnType() == void.class) { - init[i].asFixedArity().invokeWithArguments(av); + MethodHandle ih = init[i]; + if (ih.type().returnType() == void.class) { + ih.invokeWithArguments(av); } else { - varsAndArgs[v++] = init[i].asFixedArity().invokeWithArguments(av); + varsAndArgs[v++] = ih.invokeWithArguments(av); } } System.arraycopy(av, 0, varsAndArgs, varSize, nArgs); @@ -1926,12 +1947,12 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; MethodHandle s = step[i]; MethodHandle f = fini[i]; if (s.type().returnType() == void.class) { - s.asFixedArity().invokeWithArguments(varsAndArgs); + s.invokeWithArguments(varsAndArgs); } else { - varsAndArgs[v++] = s.asFixedArity().invokeWithArguments(varsAndArgs); + varsAndArgs[v++] = s.invokeWithArguments(varsAndArgs); } - if (!(boolean) p.asFixedArity().invokeWithArguments(varsAndArgs)) { - return f.asFixedArity().invokeWithArguments(varsAndArgs); + if (!(boolean) p.invokeWithArguments(varsAndArgs)) { + return f.invokeWithArguments(varsAndArgs); } } } @@ -2122,14 +2143,13 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; Throwable t = null; Object r = null; try { - // Use asFixedArity() to avoid unnecessary boxing of last argument for VarargsCollector case. - r = target.asFixedArity().invokeWithArguments(av); + r = target.invokeWithArguments(av); } catch (Throwable thrown) { t = thrown; throw t; } finally { Object[] args = target.type().returnType() == void.class ? prepend(av, t) : prepend(av, t, r); - r = cleanup.asFixedArity().invokeWithArguments(args); + r = cleanup.invokeWithArguments(args); } return r; } diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java index 86685b605de..28364e53ae9 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java @@ -4368,10 +4368,11 @@ assertEquals("boojum", (String) catTrace.invokeExact("boo", "jum")); } // Step 4: fill in missing parameter types. - List
finit = fillParameterTypes(init, commonSuffix); - List fstep = fillParameterTypes(step, commonParameterSequence); - List fpred = fillParameterTypes(pred, commonParameterSequence); - List ffini = fillParameterTypes(fini, commonParameterSequence); + // Also convert all handles to fixed-arity handles. + List finit = fixArities(fillParameterTypes(init, commonSuffix)); + List fstep = fixArities(fillParameterTypes(step, commonParameterSequence)); + List fpred = fixArities(fillParameterTypes(pred, commonParameterSequence)); + List ffini = fixArities(fillParameterTypes(fini, commonParameterSequence)); assert finit.stream().map(MethodHandle::type).map(MethodType::parameterList). allMatch(pl -> pl.equals(commonSuffix)); @@ -4389,6 +4390,10 @@ assertEquals("boojum", (String) catTrace.invokeExact("boo", "jum")); }).collect(Collectors.toList()); } + private static List fixArities(List hs) { + return hs.stream().map(MethodHandle::asFixedArity).collect(Collectors.toList()); + } + /** * Constructs a {@code while} loop from an initializer, a body, and a predicate. This is a convenience wrapper for * the {@linkplain #loop(MethodHandle[][]) generic loop combinator}. @@ -4887,7 +4892,8 @@ assertEquals("boojum", (String) catTrace.invokeExact("boo", "jum")); // target parameter list. cleanup = dropArgumentsToMatch(cleanup, (rtype == void.class ? 1 : 2), targetParamTypes, 0); - return MethodHandleImpl.makeTryFinally(target, cleanup, rtype, targetParamTypes); + // Use asFixedArity() to avoid unnecessary boxing of last argument for VarargsCollector case. + return MethodHandleImpl.makeTryFinally(target.asFixedArity(), cleanup.asFixedArity(), rtype, targetParamTypes); } /** diff --git a/jdk/src/java.base/share/classes/java/lang/module/ModuleInfo.java b/jdk/src/java.base/share/classes/java/lang/module/ModuleInfo.java index db9a3e000b9..1d0e22fec11 100644 --- a/jdk/src/java.base/share/classes/java/lang/module/ModuleInfo.java +++ b/jdk/src/java.base/share/classes/java/lang/module/ModuleInfo.java @@ -664,7 +664,7 @@ final class ModuleInfo { try { bb.get(b, off, len); } catch (BufferUnderflowException e) { - throw new EOFException(); + throw new EOFException(e.getMessage()); } } @@ -681,7 +681,7 @@ final class ModuleInfo { int ch = bb.get(); return (ch != 0); } catch (BufferUnderflowException e) { - throw new EOFException(); + throw new EOFException(e.getMessage()); } } @@ -690,7 +690,7 @@ final class ModuleInfo { try { return bb.get(); } catch (BufferUnderflowException e) { - throw new EOFException(); + throw new EOFException(e.getMessage()); } } @@ -699,7 +699,7 @@ final class ModuleInfo { try { return ((int) bb.get()) & 0xff; } catch (BufferUnderflowException e) { - throw new EOFException(); + throw new EOFException(e.getMessage()); } } @@ -708,7 +708,7 @@ final class ModuleInfo { try { return bb.getShort(); } catch (BufferUnderflowException e) { - throw new EOFException(); + throw new EOFException(e.getMessage()); } } @@ -717,7 +717,7 @@ final class ModuleInfo { try { return ((int) bb.getShort()) & 0xffff; } catch (BufferUnderflowException e) { - throw new EOFException(); + throw new EOFException(e.getMessage()); } } @@ -726,7 +726,7 @@ final class ModuleInfo { try { return bb.getChar(); } catch (BufferUnderflowException e) { - throw new EOFException(); + throw new EOFException(e.getMessage()); } } @@ -735,7 +735,7 @@ final class ModuleInfo { try { return bb.getInt(); } catch (BufferUnderflowException e) { - throw new EOFException(); + throw new EOFException(e.getMessage()); } } @@ -744,7 +744,7 @@ final class ModuleInfo { try { return bb.getLong(); } catch (BufferUnderflowException e) { - throw new EOFException(); + throw new EOFException(e.getMessage()); } } @@ -753,7 +753,7 @@ final class ModuleInfo { try { return bb.getFloat(); } catch (BufferUnderflowException e) { - throw new EOFException(); + throw new EOFException(e.getMessage()); } } @@ -762,7 +762,7 @@ final class ModuleInfo { try { return bb.getDouble(); } catch (BufferUnderflowException e) { - throw new EOFException(); + throw new EOFException(e.getMessage()); } } diff --git a/jdk/src/java.base/share/classes/java/lang/reflect/Proxy.java b/jdk/src/java.base/share/classes/java/lang/reflect/Proxy.java index ba2632b5445..15d41a4101d 100644 --- a/jdk/src/java.base/share/classes/java/lang/reflect/Proxy.java +++ b/jdk/src/java.base/share/classes/java/lang/reflect/Proxy.java @@ -597,10 +597,10 @@ public class Proxy implements java.io.Serializable { private final Module module; ProxyBuilder(ClassLoader loader, List > interfaces) { if (!VM.isModuleSystemInited()) { - throw new InternalError("Proxy is not supported until module system is fully initialzed"); + throw new InternalError("Proxy is not supported until module system is fully initialized"); } if (interfaces.size() > 65535) { - throw new IllegalArgumentException("interface limit exceeded"); + throw new IllegalArgumentException("interface limit exceeded: " + interfaces.size()); } Set > refTypes = referencedTypes(loader, interfaces); diff --git a/jdk/src/java.base/share/classes/java/util/concurrent/CompletableFuture.java b/jdk/src/java.base/share/classes/java/util/concurrent/CompletableFuture.java index 5708af2653c..9946b128591 100644 --- a/jdk/src/java.base/share/classes/java/util/concurrent/CompletableFuture.java +++ b/jdk/src/java.base/share/classes/java/util/concurrent/CompletableFuture.java @@ -2559,6 +2559,13 @@ public class CompletableFuture implements Future , CompletionStage { * exceptionally with a CompletionException with this exception as * cause. * + * Unless overridden by a subclass, a new non-minimal + * CompletableFuture with all methods available can be obtained from + * a minimal CompletionStage via {@link #toCompletableFuture()}. + * For example, completion of a minimal stage can be awaited by + * + *
{@code minimalStage.toCompletableFuture().join(); }+ * * @return the new CompletionStage * @since 9 */ @@ -2853,6 +2860,16 @@ public class CompletableFutureimplements Future , CompletionStage { @Override public CompletableFuture completeOnTimeout (T value, long timeout, TimeUnit unit) { throw new UnsupportedOperationException(); } + @Override public CompletableFuture toCompletableFuture() { + Object r; + if ((r = result) != null) + return new CompletableFuture (encodeRelay(r)); + else { + CompletableFuture d = new CompletableFuture<>(); + unipush(new UniRelay (d, this)); + return d; + } + } } // VarHandle mechanics diff --git a/jdk/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java b/jdk/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java index e8f7ac614df..98524dedc23 100644 --- a/jdk/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java +++ b/jdk/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java @@ -1191,7 +1191,7 @@ public class ForkJoinPool extends AbstractExecutorService { * Default idle timeout value (in milliseconds) for the thread * triggering quiescence to park waiting for new work */ - private static final long DEFAULT_KEEPALIVE = 60000L; + private static final long DEFAULT_KEEPALIVE = 60_000L; /** * Undershoot tolerance for idle timeouts @@ -2303,7 +2303,6 @@ public class ForkJoinPool extends AbstractExecutorService { throw new NullPointerException(); long ms = Math.max(unit.toMillis(keepAliveTime), TIMEOUT_SLOP); - String prefix = "ForkJoinPool-" + nextPoolId() + "-worker-"; int corep = Math.min(Math.max(corePoolSize, parallelism), MAX_CAP); long c = ((((long)(-corep) << TC_SHIFT) & TC_MASK) | (((long)(-parallelism) << RC_SHIFT) & RC_MASK)); @@ -2315,8 +2314,8 @@ public class ForkJoinPool extends AbstractExecutorService { n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; n = (n + 1) << 1; // power of two, including space for submission queues + this.workerNamePrefix = "ForkJoinPool-" + nextPoolId() + "-worker-"; this.workQueues = new WorkQueue[n]; - this.workerNamePrefix = prefix; this.factory = factory; this.ueh = handler; this.saturate = saturate; @@ -2327,11 +2326,19 @@ public class ForkJoinPool extends AbstractExecutorService { checkPermission(); } + private Object newInstanceFromSystemProperty(String property) + throws ReflectiveOperationException { + String className = System.getProperty(property); + return (className == null) + ? null + : ClassLoader.getSystemClassLoader().loadClass(className) + .getConstructor().newInstance(); + } + /** * Constructor for common pool using parameters possibly * overridden by system properties */ - @SuppressWarnings("deprecation") // Class.newInstance private ForkJoinPool(byte forCommonPoolOnly) { int parallelism = -1; ForkJoinWorkerThreadFactory fac = null; @@ -2339,18 +2346,12 @@ public class ForkJoinPool extends AbstractExecutorService { try { // ignore exceptions in accessing/parsing properties String pp = System.getProperty ("java.util.concurrent.ForkJoinPool.common.parallelism"); - String fp = System.getProperty - ("java.util.concurrent.ForkJoinPool.common.threadFactory"); - String hp = System.getProperty - ("java.util.concurrent.ForkJoinPool.common.exceptionHandler"); if (pp != null) parallelism = Integer.parseInt(pp); - if (fp != null) - fac = ((ForkJoinWorkerThreadFactory)ClassLoader. - getSystemClassLoader().loadClass(fp).newInstance()); - if (hp != null) - handler = ((UncaughtExceptionHandler)ClassLoader. - getSystemClassLoader().loadClass(hp).newInstance()); + fac = (ForkJoinWorkerThreadFactory) newInstanceFromSystemProperty( + "java.util.concurrent.ForkJoinPool.common.threadFactory"); + handler = (UncaughtExceptionHandler) newInstanceFromSystemProperty( + "java.util.concurrent.ForkJoinPool.common.exceptionHandler"); } catch (Exception ignore) { } @@ -2373,8 +2374,8 @@ public class ForkJoinPool extends AbstractExecutorService { n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; n = (n + 1) << 1; - this.workQueues = new WorkQueue[n]; this.workerNamePrefix = "ForkJoinPool.commonPool-worker-"; + this.workQueues = new WorkQueue[n]; this.factory = fac; this.ueh = handler; this.saturate = null; diff --git a/jdk/src/java.base/share/classes/java/util/concurrent/atomic/DoubleAccumulator.java b/jdk/src/java.base/share/classes/java/util/concurrent/atomic/DoubleAccumulator.java index f3e3531dbd9..0d0346f02d6 100644 --- a/jdk/src/java.base/share/classes/java/util/concurrent/atomic/DoubleAccumulator.java +++ b/jdk/src/java.base/share/classes/java/util/concurrent/atomic/DoubleAccumulator.java @@ -35,6 +35,9 @@ package java.util.concurrent.atomic; +import static java.lang.Double.doubleToRawLongBits; +import static java.lang.Double.longBitsToDouble; + import java.io.Serializable; import java.util.function.DoubleBinaryOperator; @@ -91,7 +94,7 @@ public class DoubleAccumulator extends Striped64 implements Serializable { public DoubleAccumulator(DoubleBinaryOperator accumulatorFunction, double identity) { this.function = accumulatorFunction; - base = this.identity = Double.doubleToRawLongBits(identity); + base = this.identity = doubleToRawLongBits(identity); } /** @@ -101,18 +104,19 @@ public class DoubleAccumulator extends Striped64 implements Serializable { */ public void accumulate(double x) { Cell[] as; long b, v, r; int m; Cell a; - if ((as = cells) != null || - (r = Double.doubleToRawLongBits - (function.applyAsDouble - (Double.longBitsToDouble(b = base), x))) != b && !casBase(b, r)) { + if ((as = cells) != null + || ((r = doubleToRawLongBits + (function.applyAsDouble(longBitsToDouble(b = base), x))) != b + && !casBase(b, r))) { boolean uncontended = true; - if (as == null || (m = as.length - 1) < 0 || - (a = as[getProbe() & m]) == null || - !(uncontended = - (r = Double.doubleToRawLongBits - (function.applyAsDouble - (Double.longBitsToDouble(v = a.value), x))) == v || - a.cas(v, r))) + if (as == null + || (m = as.length - 1) < 0 + || (a = as[getProbe() & m]) == null + || !(uncontended = + ((r = doubleToRawLongBits + (function.applyAsDouble + (longBitsToDouble(v = a.value), x))) == v) + || a.cas(v, r))) doubleAccumulate(x, function, uncontended); } } @@ -128,12 +132,12 @@ public class DoubleAccumulator extends Striped64 implements Serializable { */ public double get() { Cell[] as = cells; - double result = Double.longBitsToDouble(base); + double result = longBitsToDouble(base); if (as != null) { for (Cell a : as) if (a != null) result = function.applyAsDouble - (result, Double.longBitsToDouble(a.value)); + (result, longBitsToDouble(a.value)); } return result; } @@ -168,12 +172,12 @@ public class DoubleAccumulator extends Striped64 implements Serializable { */ public double getThenReset() { Cell[] as = cells; - double result = Double.longBitsToDouble(base); + double result = longBitsToDouble(base); base = identity; if (as != null) { for (Cell a : as) { if (a != null) { - double v = Double.longBitsToDouble(a.value); + double v = longBitsToDouble(a.value); a.reset(identity); result = function.applyAsDouble(result, v); } @@ -267,9 +271,9 @@ public class DoubleAccumulator extends Striped64 implements Serializable { * held by this proxy */ private Object readResolve() { - double d = Double.longBitsToDouble(identity); + double d = longBitsToDouble(identity); DoubleAccumulator a = new DoubleAccumulator(function, d); - a.base = Double.doubleToRawLongBits(value); + a.base = doubleToRawLongBits(value); return a; } } diff --git a/jdk/src/java.base/share/classes/java/util/concurrent/atomic/LongAccumulator.java b/jdk/src/java.base/share/classes/java/util/concurrent/atomic/LongAccumulator.java index 939a4a2eed9..8c6e332ad79 100644 --- a/jdk/src/java.base/share/classes/java/util/concurrent/atomic/LongAccumulator.java +++ b/jdk/src/java.base/share/classes/java/util/concurrent/atomic/LongAccumulator.java @@ -103,14 +103,16 @@ public class LongAccumulator extends Striped64 implements Serializable { */ public void accumulate(long x) { Cell[] as; long b, v, r; int m; Cell a; - if ((as = cells) != null || - (r = function.applyAsLong(b = base, x)) != b && !casBase(b, r)) { + if ((as = cells) != null + || ((r = function.applyAsLong(b = base, x)) != b + && !casBase(b, r))) { boolean uncontended = true; - if (as == null || (m = as.length - 1) < 0 || - (a = as[getProbe() & m]) == null || - !(uncontended = - (r = function.applyAsLong(v = a.value, x)) == v || - a.cas(v, r))) + if (as == null + || (m = as.length - 1) < 0 + || (a = as[getProbe() & m]) == null + || !(uncontended = + (r = function.applyAsLong(v = a.value, x)) == v + || a.cas(v, r))) longAccumulate(x, function, uncontended); } } diff --git a/jdk/src/java.base/share/classes/jdk/internal/jimage/BasicImageReader.java b/jdk/src/java.base/share/classes/jdk/internal/jimage/BasicImageReader.java index 07038b9ef5e..10506b7029c 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/jimage/BasicImageReader.java +++ b/jdk/src/java.base/share/classes/jdk/internal/jimage/BasicImageReader.java @@ -186,7 +186,9 @@ public class BasicImageReader implements AutoCloseable { if (result.getMajorVersion() != ImageHeader.MAJOR_VERSION || result.getMinorVersion() != ImageHeader.MINOR_VERSION) { - throw new IOException("The image file \"" + name + "\" is not the correct version"); + throw new IOException("The image file \"" + name + "\" is not " + + "the correct version. Major: " + result.getMajorVersion() + + ". Minor: " + result.getMinorVersion()); } return result; @@ -318,11 +320,11 @@ public class BasicImageReader implements AutoCloseable { private ByteBuffer readBuffer(long offset, long size) { if (offset < 0 || Integer.MAX_VALUE <= offset) { - throw new IndexOutOfBoundsException("offset"); + throw new IndexOutOfBoundsException("Bad offset: " + offset); } if (size < 0 || Integer.MAX_VALUE <= size) { - throw new IndexOutOfBoundsException("size"); + throw new IndexOutOfBoundsException("Bad size: " + size); } if (MAP_ALL) { @@ -382,11 +384,13 @@ public class BasicImageReader implements AutoCloseable { long uncompressedSize = loc.getUncompressedSize(); if (compressedSize < 0 || Integer.MAX_VALUE < compressedSize) { - throw new IndexOutOfBoundsException("Compressed size"); + throw new IndexOutOfBoundsException( + "Bad compressed size: " + compressedSize); } if (uncompressedSize < 0 || Integer.MAX_VALUE < uncompressedSize) { - throw new IndexOutOfBoundsException("Uncompressed size"); + throw new IndexOutOfBoundsException( + "Bad uncompressed size: " + uncompressedSize); } if (compressedSize == 0) { diff --git a/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageHeader.java b/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageHeader.java index c4ff85bbfb8..f63665119e2 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageHeader.java +++ b/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageHeader.java @@ -79,7 +79,8 @@ public final class ImageHeader { Objects.requireNonNull(buffer); if (buffer.capacity() != HEADER_SLOTS) { - throw new InternalError("jimage header not the correct size"); + throw new InternalError( + "jimage header not the correct size: " + buffer.capacity()); } int magic = buffer.get(0); diff --git a/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageLocation.java b/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageLocation.java index 16787dad3af..ad0ae42fc3d 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageLocation.java +++ b/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageLocation.java @@ -81,7 +81,8 @@ public class ImageLocation { } if (kind < ATTRIBUTE_END || ATTRIBUTE_COUNT <= kind) { - throw new InternalError("Invalid jimage attribute kind"); + throw new InternalError( + "Invalid jimage attribute kind: " + kind); } int length = attributeLength(data); @@ -91,7 +92,7 @@ public class ImageLocation { value <<= 8; if (!bytes.hasRemaining()) { - throw new InternalError("\"Missing jimage attribute datad"); + throw new InternalError("Missing jimage attribute data"); } value |= bytes.get() & 0xFF; @@ -134,7 +135,8 @@ public class ImageLocation { long getAttribute(int kind) { if (kind < ATTRIBUTE_END || ATTRIBUTE_COUNT <= kind) { - throw new InternalError("Invalid jimage attribute kind"); + throw new InternalError( + "Invalid jimage attribute kind: " + kind); } return attributes[kind]; @@ -142,7 +144,8 @@ public class ImageLocation { String getAttributeString(int kind) { if (kind < ATTRIBUTE_END || ATTRIBUTE_COUNT <= kind) { - throw new InternalError("Invalid jimage attribute kind"); + throw new InternalError( + "Invalid jimage attribute kind: " + kind); } return getStrings().get((int)attributes[kind]); diff --git a/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageStream.java b/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageStream.java index 9802afcc93a..774e0e6e62a 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageStream.java +++ b/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageStream.java @@ -82,7 +82,7 @@ public class ImageStream { public void ensure(int needs) { if (needs < 0) { - throw new IndexOutOfBoundsException("needs"); + throw new IndexOutOfBoundsException("Bad value: " + needs); } if (needs > buffer.remaining()) { @@ -106,7 +106,7 @@ public class ImageStream { public void skip(int n) { if (n < 0) { - throw new IndexOutOfBoundsException("n"); + throw new IndexOutOfBoundsException("skip value = " + n); } buffer.position(buffer.position() + n); diff --git a/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageStringsReader.java b/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageStringsReader.java index 382e6b1696b..e4a11cbdc14 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageStringsReader.java +++ b/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageStringsReader.java @@ -151,7 +151,7 @@ public class ImageStringsReader implements ImageStrings { try { charsFromMUTF8(chars, bytes, offset, count); } catch (UTFDataFormatException ex) { - throw new InternalError("Attempt to convert non modified UTF-8 byte sequence"); + throw new InternalError("Attempt to convert non modified UTF-8 byte sequence", ex); } return new String(chars); @@ -199,7 +199,8 @@ public class ImageStringsReader implements ImageStrings { ch = buffer.get(); if ((ch & 0xC0) != 0x80) { - throw new InternalError("Bad continuation in modified UTF-8 byte sequence"); + throw new InternalError("Bad continuation in " + + "modified UTF-8 byte sequence: " + ch); } uch = ((uch & ~mask) << 6) | (ch & 0x3F); @@ -208,7 +209,8 @@ public class ImageStringsReader implements ImageStrings { } if ((uch & 0xFFFF) != uch) { - throw new InternalError("UTF-32 char in modified UTF-8 byte sequence"); + throw new InternalError("UTF-32 char in modified UTF-8 " + + "byte sequence: " + uch); } chars[j++] = (char)uch; diff --git a/jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtFileSystem.java b/jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtFileSystem.java index cb6c85d11e3..49285b31dfb 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtFileSystem.java +++ b/jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtFileSystem.java @@ -183,7 +183,7 @@ class JrtFileSystem extends FileSystem { public PathMatcher getPathMatcher(String syntaxAndInput) { int pos = syntaxAndInput.indexOf(':'); if (pos <= 0 || pos == syntaxAndInput.length()) { - throw new IllegalArgumentException(); + throw new IllegalArgumentException("pos is " + pos); } String syntax = syntaxAndInput.substring(0, pos); String input = syntaxAndInput.substring(pos + 1); @@ -285,7 +285,8 @@ class JrtFileSystem extends FileSystem { for (OpenOption option : options) { Objects.requireNonNull(option); if (!(option instanceof StandardOpenOption)) { - throw new IllegalArgumentException(); + throw new IllegalArgumentException( + "option class: " + option.getClass()); } } if (options.contains(StandardOpenOption.WRITE) || diff --git a/jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtPath.java b/jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtPath.java index cf3bbd8d2d9..f23887cabad 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtPath.java +++ b/jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtPath.java @@ -122,7 +122,8 @@ final class JrtPath implements Path { public final JrtPath getName(int index) { initOffsets(); if (index < 0 || index >= offsets.length) { - throw new IllegalArgumentException(); + throw new IllegalArgumentException("index: " + + index + ", offsets length: " + offsets.length); } int begin = offsets[index]; int end; @@ -139,7 +140,9 @@ final class JrtPath implements Path { initOffsets(); if (beginIndex < 0 || endIndex > offsets.length || beginIndex >= endIndex) { - throw new IllegalArgumentException(); + throw new IllegalArgumentException( + "beginIndex: " + beginIndex + ", endIndex: " + endIndex + + ", offsets length: " + offsets.length); } // starting/ending offsets int begin = offsets[beginIndex]; @@ -211,7 +214,8 @@ final class JrtPath implements Path { return o; } if (jrtfs != o.jrtfs || isAbsolute() != o.isAbsolute()) { - throw new IllegalArgumentException(); + throw new IllegalArgumentException( + "Incorrect filesystem or path: " + other); } final String tp = this.path; final String op = o.path; @@ -366,7 +370,8 @@ final class JrtPath implements Path { private JrtPath checkPath(Path path) { Objects.requireNonNull(path); if (!(path instanceof JrtPath)) - throw new ProviderMismatchException(); + throw new ProviderMismatchException("path class: " + + path.getClass()); return (JrtPath) path; } @@ -459,7 +464,7 @@ final class JrtPath implements Path { } if (c == '\u0000') { throw new InvalidPathException(path, - "Path: nul character not allowed"); + "Path: NUL character not allowed"); } to.append(c); prevC = c; diff --git a/jdk/src/java.base/share/classes/jdk/internal/misc/VM.java b/jdk/src/java.base/share/classes/jdk/internal/misc/VM.java index 9fe63d56e5e..695795e4338 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/misc/VM.java +++ b/jdk/src/java.base/share/classes/jdk/internal/misc/VM.java @@ -50,7 +50,7 @@ public class VM { public static void initLevel(int value) { synchronized (lock) { if (value <= initLevel || value > SYSTEM_BOOTED) - throw new InternalError(); + throw new InternalError("Bad level: " + value); initLevel = value; lock.notifyAll(); } diff --git a/jdk/src/java.base/share/classes/module-info.java b/jdk/src/java.base/share/classes/module-info.java index f49111be646..11d53463dc8 100644 --- a/jdk/src/java.base/share/classes/module-info.java +++ b/jdk/src/java.base/share/classes/module-info.java @@ -166,6 +166,7 @@ module java.base { jdk.charsets, jdk.compiler, jdk.jartool, + jdk.jdeps, jdk.jlink, jdk.net, jdk.scripting.nashorn, @@ -189,7 +190,8 @@ module java.base { jdk.unsupported, jdk.vm.ci; exports jdk.internal.util.jar to - jdk.jartool; + jdk.jartool, + jdk.jdeps; exports jdk.internal.vm to java.management, jdk.jvmstat; diff --git a/jdk/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java b/jdk/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java index f063e13ac13..7f63ec88264 100644 --- a/jdk/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java +++ b/jdk/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java @@ -328,8 +328,6 @@ class DatagramChannelImpl public SocketAddress receive(ByteBuffer dst) throws IOException { if (dst.isReadOnly()) throw new IllegalArgumentException("Read-only buffer"); - if (dst == null) - throw new NullPointerException(); synchronized (readLock) { ensureOpen(); // Socket was not bound before attempting receive @@ -716,8 +714,6 @@ class DatagramChannelImpl @Override public DatagramChannel connect(SocketAddress sa) throws IOException { - int localPort = 0; - synchronized(readLock) { synchronized(writeLock) { synchronized (stateLock) { diff --git a/jdk/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java b/jdk/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java index 856e0cf2fb6..8e21e522079 100644 --- a/jdk/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java +++ b/jdk/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java @@ -616,8 +616,6 @@ class SocketChannelImpl } public boolean connect(SocketAddress sa) throws IOException { - int localPort = 0; - synchronized (readLock) { synchronized (writeLock) { ensureOpenAndUnconnected(); diff --git a/jdk/src/java.base/share/classes/sun/security/provider/SeedGenerator.java b/jdk/src/java.base/share/classes/sun/security/provider/SeedGenerator.java index e72ae9f406c..ac3a9f86a1a 100644 --- a/jdk/src/java.base/share/classes/sun/security/provider/SeedGenerator.java +++ b/jdk/src/java.base/share/classes/sun/security/provider/SeedGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2015, 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 @@ -344,7 +344,8 @@ abstract class SeedGenerator { try { BogusThread bt = new BogusThread(); Thread t = new Thread - (seedGroup, bt, "SeedGenerator Thread", 0, false); + (seedGroup, bt, "SeedGenerator Thread", 0, + false); t.start(); } catch (Exception e) { throw new InternalError("internal error: " + @@ -357,7 +358,8 @@ abstract class SeedGenerator { long startTime = System.nanoTime(); while (System.nanoTime() - startTime < 250000000) { synchronized(this){}; - latch++; + // Mask the sign bit and keep latch non-negative + latch = (latch + 1) & 0x1FFFFFFF; } // Translate the value using the permutation, and xor @@ -431,7 +433,7 @@ abstract class SeedGenerator { // data and using it to mix the trivial permutation. // It should be evenly distributed. The specific values // are not crucial to the security of this class. - private static byte[] rndTab = { + private static final byte[] rndTab = { 56, 30, -107, -6, -86, 25, -83, 75, -12, -64, 5, -128, 78, 21, 16, 32, 70, -81, 37, -51, -43, -46, -108, 87, 29, 17, -55, 22, -11, -111, diff --git a/jdk/src/java.base/windows/native/libnet/Inet4AddressImpl.c b/jdk/src/java.base/windows/native/libnet/Inet4AddressImpl.c index 30b2a93ffcc..3a9e650a5f8 100644 --- a/jdk/src/java.base/windows/native/libnet/Inet4AddressImpl.c +++ b/jdk/src/java.base/windows/native/libnet/Inet4AddressImpl.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "java_net_InetAddress.h" #include "java_net_Inet4AddressImpl.h" @@ -442,7 +443,15 @@ ping4(JNIEnv *env, DWORD ReplySize = 0; jboolean ret = JNI_FALSE; - ReplySize = sizeof(ICMP_ECHO_REPLY) + sizeof(SendData); + // https://msdn.microsoft.com/en-us/library/windows/desktop/aa366051%28v=vs.85%29.aspx + ReplySize = sizeof(ICMP_ECHO_REPLY) // The buffer should be large enough + // to hold at least one ICMP_ECHO_REPLY + // structure + + sizeof(SendData) // plus RequestSize bytes of data. + + 8; // This buffer should also be large enough + // to also hold 8 more bytes of data + // (the size of an ICMP error message) + ReplyBuffer = (VOID*) malloc(ReplySize); if (ReplyBuffer == NULL) { IcmpCloseHandle(hIcmpFile); @@ -478,10 +487,47 @@ ping4(JNIEnv *env, (timeout < 1000) ? 1000 : timeout); // DWORD Timeout } - if (dwRetVal != 0) { + if (dwRetVal == 0) { // if the call failed + TCHAR *buf; + DWORD err = WSAGetLastError(); + switch (err) { + case ERROR_NO_NETWORK: + case ERROR_NETWORK_UNREACHABLE: + case ERROR_HOST_UNREACHABLE: + case ERROR_PROTOCOL_UNREACHABLE: + case ERROR_PORT_UNREACHABLE: + case ERROR_REQUEST_ABORTED: + case ERROR_INCORRECT_ADDRESS: + case ERROR_HOST_DOWN: + case ERROR_INVALID_COMPUTERNAME: + case ERROR_INVALID_NETNAME: + case WSAEHOSTUNREACH: /* Host Unreachable */ + case WSAENETUNREACH: /* Network Unreachable */ + case WSAENETDOWN: /* Network is down */ + case WSAEPFNOSUPPORT: /* Protocol Family unsupported */ + case IP_REQ_TIMED_OUT: + break; + default: + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR)&buf, 0, NULL); + NET_ThrowNew(env, err, buf); + LocalFree(buf); + break; + } + } else { PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer; - if ((int)pEchoReply->RoundTripTime <= timeout) + + // This is to take into account the undocumented minimum + // timeout mentioned in the IcmpSendEcho call above. + // We perform an extra check to make sure that our + // roundtrip time was less than our desired timeout + // for cases where that timeout is < 1000ms. + if (pEchoReply->Status == IP_SUCCESS + && (int)pEchoReply->RoundTripTime <= timeout) + { ret = JNI_TRUE; + } } free(ReplyBuffer); diff --git a/jdk/src/java.desktop/share/classes/com/sun/beans/finder/ConstructorFinder.java b/jdk/src/java.desktop/share/classes/com/sun/beans/finder/ConstructorFinder.java index 984bf8ad239..d0315ada6bf 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/beans/finder/ConstructorFinder.java +++ b/jdk/src/java.desktop/share/classes/com/sun/beans/finder/ConstructorFinder.java @@ -67,19 +67,22 @@ public final class ConstructorFinder extends AbstractFinder > { */ public static Constructor> findConstructor(Class> type, Class>...args) throws NoSuchMethodException { if (type.isPrimitive()) { - throw new NoSuchMethodException("Primitive wrapper does not contain constructors"); + throw new NoSuchMethodException("Primitive wrapper does not contain constructors: " + + type.getName()); } if (type.isInterface()) { - throw new NoSuchMethodException("Interface does not contain constructors"); + throw new NoSuchMethodException("Interface does not contain constructors: " + + type.getName()); } if (!FinderUtils.isExported(type)) { - throw new NoSuchMethodException("Class is not accessible"); + throw new NoSuchMethodException("Class is not accessible: " + type.getName()); } if (Modifier.isAbstract(type.getModifiers())) { - throw new NoSuchMethodException("Abstract class cannot be instantiated"); + throw new NoSuchMethodException("Abstract class cannot be instantiated: " + + type.getName()); } if (!Modifier.isPublic(type.getModifiers()) || !isPackageAccessible(type)) { - throw new NoSuchMethodException("Class is not accessible"); + throw new NoSuchMethodException("Class is not accessible: " + type.getName()); } PrimitiveWrapperMap.replacePrimitivesWithWrappers(args); Signature signature = new Signature(type, args); diff --git a/jdk/src/java.desktop/share/classes/javax/imageio/ImageReader.java b/jdk/src/java.desktop/share/classes/javax/imageio/ImageReader.java index 5f39ea935fa..e17a5f2e796 100644 --- a/jdk/src/java.desktop/share/classes/javax/imageio/ImageReader.java +++ b/jdk/src/java.desktop/share/classes/javax/imageio/ImageReader.java @@ -2461,16 +2461,16 @@ public abstract class ImageReader { try { bundle = ResourceBundle.getBundle(baseName, locale, this.getClass().getModule()); } catch (MissingResourceException mre) { - throw new IllegalArgumentException("Bundle not found!"); + throw new IllegalArgumentException("Bundle not found!", mre); } String warning = null; try { warning = bundle.getString(keyword); } catch (ClassCastException cce) { - throw new IllegalArgumentException("Resource is not a String!"); + throw new IllegalArgumentException("Resource is not a String!", cce); } catch (MissingResourceException mre) { - throw new IllegalArgumentException("Resource is missing!"); + throw new IllegalArgumentException("Resource is missing!", mre); } listener.warningOccurred(this, warning); diff --git a/jdk/src/java.desktop/share/classes/javax/imageio/ImageWriter.java b/jdk/src/java.desktop/share/classes/javax/imageio/ImageWriter.java index a9a681ce05f..8723c50773e 100644 --- a/jdk/src/java.desktop/share/classes/javax/imageio/ImageWriter.java +++ b/jdk/src/java.desktop/share/classes/javax/imageio/ImageWriter.java @@ -1963,16 +1963,16 @@ public abstract class ImageWriter implements ImageTranscoder { try { bundle = ResourceBundle.getBundle(baseName, locale, this.getClass().getModule()); } catch (MissingResourceException mre) { - throw new IllegalArgumentException("Bundle not found!"); + throw new IllegalArgumentException("Bundle not found!", mre); } String warning = null; try { warning = bundle.getString(keyword); } catch (ClassCastException cce) { - throw new IllegalArgumentException("Resource is not a String!"); + throw new IllegalArgumentException("Resource is not a String!", cce); } catch (MissingResourceException mre) { - throw new IllegalArgumentException("Resource is missing!"); + throw new IllegalArgumentException("Resource is missing!", mre); } listener.warningOccurred(this, imageIndex, warning); diff --git a/jdk/src/java.desktop/unix/native/libjawt/jawt.c b/jdk/src/java.desktop/unix/native/libjawt/jawt.c index 59e9a55cff2..ee61138dd31 100644 --- a/jdk/src/java.desktop/unix/native/libjawt/jawt.c +++ b/jdk/src/java.desktop/unix/native/libjawt/jawt.c @@ -39,6 +39,10 @@ DEF_STATIC_JNI_OnLoad */ JNIEXPORT jboolean JNICALL JAWT_GetAWT(JNIEnv* env, JAWT* awt) { +#if defined(HEADLESS) + /* there are no AWT libs available at all */ + return JNI_FALSE; +#else if (awt == NULL) { return JNI_FALSE; } @@ -64,4 +68,5 @@ JNIEXPORT jboolean JNICALL JAWT_GetAWT(JNIEnv* env, JAWT* awt) } return JNI_TRUE; +#endif } diff --git a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsKeyMaterialGenerator.java b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsKeyMaterialGenerator.java index c054f312c55..83ecaa1701f 100644 --- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsKeyMaterialGenerator.java +++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsKeyMaterialGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -68,8 +68,8 @@ public final class P11TlsKeyMaterialGenerator extends KeyGeneratorSpi { // master secret as a P11Key private P11Key p11Key; - // version, e.g. 0x0301 - private int version; + // whether SSLv3 is supported + private final boolean supportSSLv3; P11TlsKeyMaterialGenerator(Token token, String algorithm, long mechanism) throws PKCS11Exception { @@ -77,6 +77,11 @@ public final class P11TlsKeyMaterialGenerator extends KeyGeneratorSpi { this.token = token; this.algorithm = algorithm; this.mechanism = mechanism; + + // Given the current lookup order specified in SunPKCS11.java, + // if CKM_SSL3_KEY_AND_MAC_DERIVE is not used to construct this object, + // it means that this mech is disabled or unsupported. + this.supportSSLv3 = (mechanism == CKM_SSL3_KEY_AND_MAC_DERIVE); } protected void engineInit(SecureRandom random) { @@ -89,20 +94,26 @@ public final class P11TlsKeyMaterialGenerator extends KeyGeneratorSpi { if (params instanceof TlsKeyMaterialParameterSpec == false) { throw new InvalidAlgorithmParameterException(MSG); } - this.spec = (TlsKeyMaterialParameterSpec)params; + + TlsKeyMaterialParameterSpec spec = (TlsKeyMaterialParameterSpec)params; + int version = (spec.getMajorVersion() << 8) | spec.getMinorVersion(); + + if ((version == 0x0300 && !supportSSLv3) || (version < 0x0300) || + (version > 0x0302)) { + throw new InvalidAlgorithmParameterException + ("Only" + (supportSSLv3? " SSL 3.0,": "") + + " TLS 1.0, and TLS 1.1 are supported (0x" + + Integer.toHexString(version) + ")"); + } try { p11Key = P11SecretKeyFactory.convertKey (token, spec.getMasterSecret(), "TlsMasterSecret"); } catch (InvalidKeyException e) { throw new InvalidAlgorithmParameterException("init() failed", e); } - version = (spec.getMajorVersion() << 8) | spec.getMinorVersion(); - if ((version < 0x0300) && (version > 0x0302)) { - throw new InvalidAlgorithmParameterException - ("Only SSL 3.0, TLS 1.0, and TLS 1.1 are supported"); - } - // we assume the token supports both the CKM_SSL3_* and the CKM_TLS_* - // mechanisms + this.spec = spec; + this.mechanism = (version == 0x0300)? + CKM_SSL3_KEY_AND_MAC_DERIVE : CKM_TLS_KEY_AND_MAC_DERIVE; } protected void engineInit(int keysize, SecureRandom random) { @@ -115,8 +126,6 @@ public final class P11TlsKeyMaterialGenerator extends KeyGeneratorSpi { throw new IllegalStateException ("TlsKeyMaterialGenerator must be initialized"); } - mechanism = (version == 0x0300) ? CKM_SSL3_KEY_AND_MAC_DERIVE - : CKM_TLS_KEY_AND_MAC_DERIVE; int macBits = spec.getMacKeyLength() << 3; int ivBits = spec.getIvLength() << 3; diff --git a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsMasterSecretGenerator.java b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsMasterSecretGenerator.java index 73a2ac2e890..128952e8a49 100644 --- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsMasterSecretGenerator.java +++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsMasterSecretGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -61,7 +61,10 @@ public final class P11TlsMasterSecretGenerator extends KeyGeneratorSpi { private TlsMasterSecretParameterSpec spec; private P11Key p11Key; - int version; + CK_VERSION ckVersion; + + // whether SSLv3 is supported + private final boolean supportSSLv3; P11TlsMasterSecretGenerator(Token token, String algorithm, long mechanism) throws PKCS11Exception { @@ -69,6 +72,11 @@ public final class P11TlsMasterSecretGenerator extends KeyGeneratorSpi { this.token = token; this.algorithm = algorithm; this.mechanism = mechanism; + + // Given the current lookup order specified in SunPKCS11.java, if + // CKM_SSL3_MASTER_KEY_DERIVE is not used to construct this object, + // it means that this mech is disabled or unsupported. + supportSSLv3 = (mechanism == CKM_SSL3_MASTER_KEY_DERIVE); } protected void engineInit(SecureRandom random) { @@ -81,7 +89,17 @@ public final class P11TlsMasterSecretGenerator extends KeyGeneratorSpi { if (params instanceof TlsMasterSecretParameterSpec == false) { throw new InvalidAlgorithmParameterException(MSG); } - this.spec = (TlsMasterSecretParameterSpec)params; + + TlsMasterSecretParameterSpec spec = (TlsMasterSecretParameterSpec)params; + int version = (spec.getMajorVersion() << 8) | spec.getMinorVersion(); + if ((version == 0x0300 && !supportSSLv3) || (version < 0x0300) || + (version > 0x0302)) { + throw new InvalidAlgorithmParameterException + ("Only" + (supportSSLv3? " SSL 3.0,": "") + + " TLS 1.0, and TLS 1.1 are supported (0x" + + Integer.toHexString(version) + ")"); + } + SecretKey key = spec.getPremasterSecret(); // algorithm should be either TlsRsaPremasterSecret or TlsPremasterSecret, // but we omit the check @@ -90,25 +108,7 @@ public final class P11TlsMasterSecretGenerator extends KeyGeneratorSpi { } catch (InvalidKeyException e) { throw new InvalidAlgorithmParameterException("init() failed", e); } - version = (spec.getMajorVersion() << 8) | spec.getMinorVersion(); - if ((version < 0x0300) || (version > 0x0302)) { - throw new InvalidAlgorithmParameterException - ("Only SSL 3.0, TLS 1.0, and TLS 1.1 supported"); - } - // We assume the token supports the required mechanism. If it does not, - // generateKey() will fail and the failover should take care of us. - } - - protected void engineInit(int keysize, SecureRandom random) { - throw new InvalidParameterException(MSG); - } - - protected SecretKey engineGenerateKey() { - if (spec == null) { - throw new IllegalStateException - ("TlsMasterSecretGenerator must be initialized"); - } - CK_VERSION ckVersion; + this.spec = spec; if (p11Key.getAlgorithm().equals("TlsRsaPremasterSecret")) { mechanism = (version == 0x0300) ? CKM_SSL3_MASTER_KEY_DERIVE : CKM_TLS_MASTER_KEY_DERIVE; @@ -124,6 +124,17 @@ public final class P11TlsMasterSecretGenerator extends KeyGeneratorSpi { : CKM_TLS_MASTER_KEY_DERIVE_DH; ckVersion = null; } + } + + protected void engineInit(int keysize, SecureRandom random) { + throw new InvalidParameterException(MSG); + } + + protected SecretKey engineGenerateKey() { + if (spec == null) { + throw new IllegalStateException + ("TlsMasterSecretGenerator must be initialized"); + } byte[] clientRandom = spec.getClientRandom(); byte[] serverRandom = spec.getServerRandom(); CK_SSL3_RANDOM_DATA random = @@ -139,13 +150,12 @@ public final class P11TlsMasterSecretGenerator extends KeyGeneratorSpi { long keyID = token.p11.C_DeriveKey(session.id(), new CK_MECHANISM(mechanism, params), p11Key.keyID, attributes); int major, minor; - ckVersion = params.pVersion; - if (ckVersion == null) { + if (params.pVersion == null) { major = -1; minor = -1; } else { - major = ckVersion.major; - minor = ckVersion.minor; + major = params.pVersion.major; + minor = params.pVersion.minor; } SecretKey key = P11Key.masterSecretKey(session, keyID, "TlsMasterSecret", 48 << 3, attributes, major, minor); @@ -156,5 +166,4 @@ public final class P11TlsMasterSecretGenerator extends KeyGeneratorSpi { token.releaseSession(session); } } - } diff --git a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsRsaPremasterSecretGenerator.java b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsRsaPremasterSecretGenerator.java index 40d3a634ce5..245c067b3d4 100644 --- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsRsaPremasterSecretGenerator.java +++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsRsaPremasterSecretGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -60,12 +60,20 @@ final class P11TlsRsaPremasterSecretGenerator extends KeyGeneratorSpi { @SuppressWarnings("deprecation") private TlsRsaPremasterSecretParameterSpec spec; + // whether SSLv3 is supported + private final boolean supportSSLv3; + P11TlsRsaPremasterSecretGenerator(Token token, String algorithm, long mechanism) throws PKCS11Exception { super(); this.token = token; this.algorithm = algorithm; this.mechanism = mechanism; + + // Given the current lookup order specified in SunPKCS11.java, + // if CKM_SSL3_PRE_MASTER_KEY_GEN is not used to construct this object, + // it means that this mech is disabled or unsupported. + this.supportSSLv3 = (mechanism == CKM_SSL3_PRE_MASTER_KEY_GEN); } protected void engineInit(SecureRandom random) { @@ -78,7 +86,20 @@ final class P11TlsRsaPremasterSecretGenerator extends KeyGeneratorSpi { if (!(params instanceof TlsRsaPremasterSecretParameterSpec)) { throw new InvalidAlgorithmParameterException(MSG); } - this.spec = (TlsRsaPremasterSecretParameterSpec)params; + + TlsRsaPremasterSecretParameterSpec spec = + (TlsRsaPremasterSecretParameterSpec) params; + + int version = (spec.getMajorVersion() << 8) | spec.getMinorVersion(); + + if ((version == 0x0300 && !supportSSLv3) || (version < 0x0300) || + (version > 0x0302)) { + throw new InvalidAlgorithmParameterException + ("Only" + (supportSSLv3? " SSL 3.0,": "") + + " TLS 1.0, and TLS 1.1 are supported (0x" + + Integer.toHexString(version) + ")"); + } + this.spec = spec; } protected void engineInit(int keysize, SecureRandom random) { diff --git a/jdk/test/com/sun/net/httpserver/Test5.java b/jdk/test/com/sun/net/httpserver/Test5.java index b6d39439b7a..f704cf8ef42 100644 --- a/jdk/test/com/sun/net/httpserver/Test5.java +++ b/jdk/test/com/sun/net/httpserver/Test5.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -145,6 +145,7 @@ public class Test5 extends Test { socket.close(); s = new String (b,0,count, "ISO8859_1"); if (!compare (s, result)) { + System.err.println(" Expected [" + result + "]\n actual [" + s + "]"); throw new RuntimeException ("wrong string result"); } } diff --git a/jdk/test/java/io/PrintStream/FormatLocale.java b/jdk/test/java/io/PrintStream/FormatLocale.java index 08d6817d193..ce10a21b388 100644 --- a/jdk/test/java/io/PrintStream/FormatLocale.java +++ b/jdk/test/java/io/PrintStream/FormatLocale.java @@ -21,10 +21,11 @@ * questions. */ -/** +/* * @test * @bug 8146156 * @summary test whether conversion follows Locale.Category.FORMAT locale. + * @modules jdk.localedata * @run main/othervm FormatLocale */ diff --git a/jdk/test/java/lang/invoke/MethodHandlesTest.java b/jdk/test/java/lang/invoke/MethodHandlesTest.java index 0f4e7236c62..2098b5bb2a8 100644 --- a/jdk/test/java/lang/invoke/MethodHandlesTest.java +++ b/jdk/test/java/lang/invoke/MethodHandlesTest.java @@ -632,6 +632,7 @@ public class MethodHandlesTest { } public void testFindVirtualClone0() throws Throwable { + if (CAN_SKIP_WORKING) return; // test some ad hoc system methods testFindVirtual(false, PUBLIC, Object.class, Object.class, "clone"); @@ -2798,11 +2799,17 @@ public class MethodHandlesTest { toClauseMajor(postClauses, inits, steps, usePreds, finis); MethodHandle pre = MethodHandles.loop(preClauses); MethodHandle post = MethodHandles.loop(postClauses); + if (verbosity >= 6) { + System.out.println("pre-handle: " + pre); + } Object[] preResults = (Object[]) pre.invokeWithArguments(args); if (verbosity >= 4) { System.out.println("pre-checked: expected " + Arrays.asList(preCheckedResults[i]) + ", actual " + Arrays.asList(preResults)); } + if (verbosity >= 6) { + System.out.println("post-handle: " + post); + } Object[] postResults = (Object[]) post.invokeWithArguments(args); if (verbosity >= 4) { System.out.println("post-checked: expected " + Arrays.asList(postCheckedResults[i]) + ", actual " + diff --git a/jdk/test/java/net/MulticastSocket/TimeToLive.java b/jdk/test/java/net/MulticastSocket/TimeToLive.java index 6d3158f7396..009ff6d0eb3 100644 --- a/jdk/test/java/net/MulticastSocket/TimeToLive.java +++ b/jdk/test/java/net/MulticastSocket/TimeToLive.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -37,26 +37,27 @@ public class TimeToLive { static int[] bad_ttls = { -1, 256 }; public static void main(String[] args) throws Exception { - MulticastSocket socket = new MulticastSocket(6789); - int ttl = socket.getTimeToLive(); - System.out.println("default ttl: " + ttl); - for (int i = 0; i < new_ttls.length; i++) { - socket.setTimeToLive(new_ttls[i]); - if (!(new_ttls[i] == socket.getTimeToLive())) { - throw new RuntimeException("test failure, set/get differ: " + - new_ttls[i] + " / " + - socket.getTimeToLive()); + try (MulticastSocket socket = new MulticastSocket()) { + int ttl = socket.getTimeToLive(); + System.out.println("default ttl: " + ttl); + for (int i = 0; i < new_ttls.length; i++) { + socket.setTimeToLive(new_ttls[i]); + if (!(new_ttls[i] == socket.getTimeToLive())) { + throw new RuntimeException("test failure, set/get differ: " + + new_ttls[i] + " / " + + socket.getTimeToLive()); + } } - } - for (int j = 0; j < bad_ttls.length; j++) { - boolean exception = false; - try { - socket.setTimeToLive(bad_ttls[j]); - } catch (IllegalArgumentException e) { - exception = true; - } - if (!exception) { - throw new RuntimeException("bad argument accepted: " + bad_ttls[j]); + for (int j = 0; j < bad_ttls.length; j++) { + boolean exception = false; + try { + socket.setTimeToLive(bad_ttls[j]); + } catch (IllegalArgumentException e) { + exception = true; + } + if (!exception) { + throw new RuntimeException("bad argument accepted: " + bad_ttls[j]); + } } } } diff --git a/jdk/test/java/net/ServerSocket/ThreadStop.java b/jdk/test/java/net/ServerSocket/ThreadStop.java index 2ebecbb8db8..adf19379280 100644 --- a/jdk/test/java/net/ServerSocket/ThreadStop.java +++ b/jdk/test/java/net/ServerSocket/ThreadStop.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 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 @@ -68,23 +68,23 @@ public class ThreadStop { thr.start(); // give server time to block in ServerSocket.accept() - Thread.currentThread().sleep(2000); + Thread.sleep(2000); // "stop" the thread thr.stop(); // give thread time to stop - Thread.currentThread().sleep(2000); + Thread.sleep(2000); // it's platform specific if Thread.stop interrupts the // thread - on Linux/Windows most likely that thread is // still in accept() so we connect to server which causes // it to unblock and do JNI-stuff with a pending exception - try { - Socket s = new Socket("localhost", svr.localPort()); - } catch (IOException ioe) { } - + try (Socket s = new Socket("localhost", svr.localPort())) { + } catch (IOException ioe) { + } + thr.join(); } } diff --git a/jdk/test/java/net/Socket/InheritHandle.java b/jdk/test/java/net/Socket/InheritHandle.java index 3fa57caa68e..9a9cddae683 100644 --- a/jdk/test/java/net/Socket/InheritHandle.java +++ b/jdk/test/java/net/Socket/InheritHandle.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 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 @@ -27,6 +27,7 @@ @author Chris Hegarty */ +import java.net.BindException; import java.net.ServerSocket; import java.io.File; import java.io.IOException; @@ -74,6 +75,11 @@ public class InheritHandle } catch (IOException ioe) { System.out.println("Cannot create process"); ioe.printStackTrace(); + try { + ss.close(); + } catch (IOException e) { + e.printStackTrace(); + } return; } @@ -85,9 +91,18 @@ public class InheritHandle System.out.println("Now close the socket and try to create another" + " one listening on the same port"); ss.close(); - ss = new ServerSocket(port); - System.out.println("Second ServerSocket created successfully"); - ss.close(); + int retries = 0; + while (retries < 5) { + try (ServerSocket s = new ServerSocket(port);) { + System.out.println("Second ServerSocket created successfully"); + break; + } catch (BindException e) { + System.out.println("BindException \"" + e.getMessage() + "\", retrying..."); + Thread.sleep(100L); + retries ++; + continue; + } + } } catch (InterruptedException ie) { } catch (IOException ioe) { diff --git a/jdk/test/java/util/Collections/EmptyNavigableMap.java b/jdk/test/java/util/Collections/EmptyNavigableMap.java index 5daf055786a..359d30f4ab6 100644 --- a/jdk/test/java/util/Collections/EmptyNavigableMap.java +++ b/jdk/test/java/util/Collections/EmptyNavigableMap.java @@ -33,7 +33,6 @@ import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; -import java.util.NoSuchElementException; import java.util.NavigableMap; import java.util.SortedMap; import java.util.TreeMap; @@ -41,10 +40,8 @@ import org.testng.annotations.Test; import org.testng.annotations.DataProvider; import static org.testng.Assert.fail; -import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertSame; public class EmptyNavigableMap { diff --git a/jdk/test/java/util/Collections/EmptyNavigableSet.java b/jdk/test/java/util/Collections/EmptyNavigableSet.java index 7541f3d363b..afe216da8d7 100644 --- a/jdk/test/java/util/Collections/EmptyNavigableSet.java +++ b/jdk/test/java/util/Collections/EmptyNavigableSet.java @@ -41,10 +41,9 @@ import org.testng.annotations.Test; import org.testng.annotations.DataProvider; import static org.testng.Assert.fail; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertSame; +import static org.testng.Assert.assertTrue; public class EmptyNavigableSet { diff --git a/jdk/test/java/util/Deque/ChorusLine.java b/jdk/test/java/util/Deque/ChorusLine.java index 2a09c65ef50..9f0d6f89aa5 100644 --- a/jdk/test/java/util/Deque/ChorusLine.java +++ b/jdk/test/java/util/Deque/ChorusLine.java @@ -28,8 +28,14 @@ * @author Martin Buchholz */ -import java.util.*; -import java.util.concurrent.*; +import java.util.ArrayDeque; +import java.util.Collection; +import java.util.Deque; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.NoSuchElementException; +import java.util.concurrent.ConcurrentLinkedDeque; +import java.util.concurrent.LinkedBlockingDeque; public class ChorusLine { private interface Tweaker { diff --git a/jdk/test/java/util/PriorityQueue/ForgetMeNot.java b/jdk/test/java/util/PriorityQueue/ForgetMeNot.java index 7778d1d793d..6f9f65d529e 100644 --- a/jdk/test/java/util/PriorityQueue/ForgetMeNot.java +++ b/jdk/test/java/util/PriorityQueue/ForgetMeNot.java @@ -28,7 +28,11 @@ * @author Martin Buchholz */ -import java.util.*; +import java.util.Arrays; +import java.util.Iterator; +import java.util.NoSuchElementException; +import java.util.PriorityQueue; +import java.util.Queue; public class ForgetMeNot { private static void checkQ(PriorityQueue q, Integer...elts) { diff --git a/jdk/test/java/util/PriorityQueue/PriorityQueueSort.java b/jdk/test/java/util/PriorityQueue/PriorityQueueSort.java index 206d6e815c5..24229639163 100644 --- a/jdk/test/java/util/PriorityQueue/PriorityQueueSort.java +++ b/jdk/test/java/util/PriorityQueue/PriorityQueueSort.java @@ -37,7 +37,13 @@ * @summary Checks that a priority queue returns elements in sorted order across various operations */ -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.Queue; +import java.util.PriorityQueue; public class PriorityQueueSort { diff --git a/jdk/test/java/util/PriorityQueue/RemoveContains.java b/jdk/test/java/util/PriorityQueue/RemoveContains.java index 4b5d5a93bf2..809478221dd 100644 --- a/jdk/test/java/util/PriorityQueue/RemoveContains.java +++ b/jdk/test/java/util/PriorityQueue/RemoveContains.java @@ -28,8 +28,17 @@ * @author Martin Buchholz */ -import java.util.*; -import java.util.concurrent.*; +import java.util.ArrayDeque; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.PriorityQueue; +import java.util.Queue; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.PriorityBlockingQueue; +import java.util.concurrent.LinkedTransferQueue; public class RemoveContains { static volatile int passed = 0, failed = 0; diff --git a/jdk/test/java/util/concurrent/Executors/AutoShutdown.java b/jdk/test/java/util/concurrent/Executors/AutoShutdown.java index 7e34e28bded..95dd38c02cc 100644 --- a/jdk/test/java/util/concurrent/Executors/AutoShutdown.java +++ b/jdk/test/java/util/concurrent/Executors/AutoShutdown.java @@ -31,8 +31,6 @@ */ import static java.util.concurrent.Executors.defaultThreadFactory; -import static java.util.concurrent.Executors.newFixedThreadPool; -import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor; import static java.util.concurrent.Executors.newSingleThreadExecutor; import static java.util.concurrent.TimeUnit.MILLISECONDS; diff --git a/jdk/test/java/util/concurrent/ThreadPoolExecutor/CoreThreadTimeOut.java b/jdk/test/java/util/concurrent/ThreadPoolExecutor/CoreThreadTimeOut.java index 088907cae77..a8bb4c29615 100644 --- a/jdk/test/java/util/concurrent/ThreadPoolExecutor/CoreThreadTimeOut.java +++ b/jdk/test/java/util/concurrent/ThreadPoolExecutor/CoreThreadTimeOut.java @@ -83,15 +83,18 @@ public class CoreThreadTimeOut { tpe.allowCoreThreadTimeOut(true); check(tpe.allowsCoreThreadTimeOut()); equal(countExecutorThreads(), 0); - long t0 = System.nanoTime(); - for (int i = 0; i < threadCount; i++) - tpe.submit(new Runnable() { public void run() {}}); - int count = countExecutorThreads(); - if (millisElapsedSince(t0) < timeoutMillis) - equal(count, threadCount); + long startTime = System.nanoTime(); + for (int i = 0; i < threadCount; i++) { + tpe.submit(() -> {}); + int count = countExecutorThreads(); + if (millisElapsedSince(startTime) < timeoutMillis) + equal(count, i + 1); + } while (countExecutorThreads() > 0 && - millisElapsedSince(t0) < 10 * 1000); + millisElapsedSince(startTime) < LONG_DELAY_MS) + Thread.yield(); equal(countExecutorThreads(), 0); + check(millisElapsedSince(startTime) >= timeoutMillis); tpe.shutdown(); check(tpe.allowsCoreThreadTimeOut()); check(tpe.awaitTermination(LONG_DELAY_MS, MILLISECONDS)); diff --git a/jdk/test/java/util/concurrent/tck/AtomicIntegerArrayTest.java b/jdk/test/java/util/concurrent/tck/AtomicIntegerArrayTest.java index d3d8f14f5c0..e12284063f1 100644 --- a/jdk/test/java/util/concurrent/tck/AtomicIntegerArrayTest.java +++ b/jdk/test/java/util/concurrent/tck/AtomicIntegerArrayTest.java @@ -303,7 +303,7 @@ public class AtomicIntegerArrayTest extends JSR166TestCase { class Counter extends CheckedRunnable { final AtomicIntegerArray aa; - volatile int counts; + int decs; Counter(AtomicIntegerArray a) { aa = a; } public void realRun() { for (;;) { @@ -314,7 +314,7 @@ public class AtomicIntegerArrayTest extends JSR166TestCase { if (v != 0) { done = false; if (aa.compareAndSet(i, v, v - 1)) - ++counts; + decs++; } } if (done) @@ -334,13 +334,11 @@ public class AtomicIntegerArrayTest extends JSR166TestCase { aa.set(i, countdown); Counter c1 = new Counter(aa); Counter c2 = new Counter(aa); - Thread t1 = new Thread(c1); - Thread t2 = new Thread(c2); - t1.start(); - t2.start(); + Thread t1 = newStartedThread(c1); + Thread t2 = newStartedThread(c2); t1.join(); t2.join(); - assertEquals(c1.counts+c2.counts, SIZE * countdown); + assertEquals(c1.decs + c2.decs, SIZE * countdown); } /** diff --git a/jdk/test/java/util/concurrent/tck/AtomicLongArrayTest.java b/jdk/test/java/util/concurrent/tck/AtomicLongArrayTest.java index bd74addbf7f..b312388dd6a 100644 --- a/jdk/test/java/util/concurrent/tck/AtomicLongArrayTest.java +++ b/jdk/test/java/util/concurrent/tck/AtomicLongArrayTest.java @@ -302,7 +302,7 @@ public class AtomicLongArrayTest extends JSR166TestCase { class Counter extends CheckedRunnable { final AtomicLongArray aa; - volatile long counts; + int decs; Counter(AtomicLongArray a) { aa = a; } public void realRun() { for (;;) { @@ -313,7 +313,7 @@ public class AtomicLongArrayTest extends JSR166TestCase { if (v != 0) { done = false; if (aa.compareAndSet(i, v, v - 1)) - ++counts; + decs++; } } if (done) @@ -333,13 +333,11 @@ public class AtomicLongArrayTest extends JSR166TestCase { aa.set(i, countdown); Counter c1 = new Counter(aa); Counter c2 = new Counter(aa); - Thread t1 = new Thread(c1); - Thread t2 = new Thread(c2); - t1.start(); - t2.start(); + Thread t1 = newStartedThread(c1); + Thread t2 = newStartedThread(c2); t1.join(); t2.join(); - assertEquals(c1.counts+c2.counts, SIZE * countdown); + assertEquals(c1.decs + c2.decs, SIZE * countdown); } /** diff --git a/jdk/test/java/util/concurrent/tck/CompletableFutureTest.java b/jdk/test/java/util/concurrent/tck/CompletableFutureTest.java index a29f50e0a24..12f7ee99b53 100644 --- a/jdk/test/java/util/concurrent/tck/CompletableFutureTest.java +++ b/jdk/test/java/util/concurrent/tck/CompletableFutureTest.java @@ -388,7 +388,7 @@ public class CompletableFutureTest extends JSR166TestCase { checkCompletedNormally(f, "test"); } - abstract class CheckedAction { + abstract static class CheckedAction { int invocationCount = 0; final ExecutionMode m; CheckedAction(ExecutionMode m) { this.m = m; } @@ -400,7 +400,7 @@ public class CompletableFutureTest extends JSR166TestCase { void assertInvoked() { assertEquals(1, invocationCount); } } - abstract class CheckedIntegerAction extends CheckedAction { + abstract static class CheckedIntegerAction extends CheckedAction { Integer value; CheckedIntegerAction(ExecutionMode m) { super(m); } void assertValue(Integer expected) { @@ -409,7 +409,7 @@ public class CompletableFutureTest extends JSR166TestCase { } } - class IntegerSupplier extends CheckedAction + static class IntegerSupplier extends CheckedAction implements Supplier { final Integer value; @@ -428,7 +428,7 @@ public class CompletableFutureTest extends JSR166TestCase { return (x == null) ? null : x + 1; } - class NoopConsumer extends CheckedIntegerAction + static class NoopConsumer extends CheckedIntegerAction implements Consumer { NoopConsumer(ExecutionMode m) { super(m); } @@ -438,7 +438,7 @@ public class CompletableFutureTest extends JSR166TestCase { } } - class IncFunction extends CheckedIntegerAction + static class IncFunction extends CheckedIntegerAction implements Function { IncFunction(ExecutionMode m) { super(m); } @@ -456,7 +456,7 @@ public class CompletableFutureTest extends JSR166TestCase { - ((y == null) ? 99 : y.intValue()); } - class SubtractAction extends CheckedIntegerAction + static class SubtractAction extends CheckedIntegerAction implements BiConsumer { SubtractAction(ExecutionMode m) { super(m); } @@ -466,7 +466,7 @@ public class CompletableFutureTest extends JSR166TestCase { } } - class SubtractFunction extends CheckedIntegerAction + static class SubtractFunction extends CheckedIntegerAction implements BiFunction { SubtractFunction(ExecutionMode m) { super(m); } @@ -476,14 +476,14 @@ public class CompletableFutureTest extends JSR166TestCase { } } - class Noop extends CheckedAction implements Runnable { + static class Noop extends CheckedAction implements Runnable { Noop(ExecutionMode m) { super(m); } public void run() { invoked(); } } - class FailingSupplier extends CheckedAction + static class FailingSupplier extends CheckedAction implements Supplier { final CFException ex; @@ -494,7 +494,7 @@ public class CompletableFutureTest extends JSR166TestCase { } } - class FailingConsumer extends CheckedIntegerAction + static class FailingConsumer extends CheckedIntegerAction implements Consumer { final CFException ex; @@ -506,7 +506,7 @@ public class CompletableFutureTest extends JSR166TestCase { } } - class FailingBiConsumer extends CheckedIntegerAction + static class FailingBiConsumer extends CheckedIntegerAction implements BiConsumer { final CFException ex; @@ -518,7 +518,7 @@ public class CompletableFutureTest extends JSR166TestCase { } } - class FailingFunction extends CheckedIntegerAction + static class FailingFunction extends CheckedIntegerAction implements Function { final CFException ex; @@ -530,7 +530,7 @@ public class CompletableFutureTest extends JSR166TestCase { } } - class FailingBiFunction extends CheckedIntegerAction + static class FailingBiFunction extends CheckedIntegerAction implements BiFunction { final CFException ex; @@ -542,7 +542,7 @@ public class CompletableFutureTest extends JSR166TestCase { } } - class FailingRunnable extends CheckedAction implements Runnable { + static class FailingRunnable extends CheckedAction implements Runnable { final CFException ex; FailingRunnable(ExecutionMode m) { super(m); ex = new CFException(); } public void run() { @@ -551,7 +551,7 @@ public class CompletableFutureTest extends JSR166TestCase { } } - class CompletableFutureInc extends CheckedIntegerAction + static class CompletableFutureInc extends CheckedIntegerAction implements Function > { CompletableFutureInc(ExecutionMode m) { super(m); } @@ -564,7 +564,7 @@ public class CompletableFutureTest extends JSR166TestCase { } } - class FailingCompletableFutureFunction extends CheckedIntegerAction + static class FailingCompletableFutureFunction extends CheckedIntegerAction implements Function > { final CFException ex; @@ -3604,29 +3604,53 @@ public class CompletableFutureTest extends JSR166TestCase { * copy returns a CompletableFuture that is completed normally, * with the same value, when source is. */ - public void testCopy() { + public void testCopy_normalCompletion() { + for (boolean createIncomplete : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { CompletableFuture f = new CompletableFuture<>(); + if (!createIncomplete) assertTrue(f.complete(v1)); CompletableFuture g = f.copy(); - checkIncomplete(f); - checkIncomplete(g); - f.complete(1); - checkCompletedNormally(f, 1); - checkCompletedNormally(g, 1); - } + if (createIncomplete) { + checkIncomplete(f); + checkIncomplete(g); + assertTrue(f.complete(v1)); + } + checkCompletedNormally(f, v1); + checkCompletedNormally(g, v1); + }} /** * copy returns a CompletableFuture that is completed exceptionally * when source is. */ - public void testCopy2() { - CompletableFuture f = new CompletableFuture<>(); - CompletableFuture g = f.copy(); - checkIncomplete(f); - checkIncomplete(g); + public void testCopy_exceptionalCompletion() { + for (boolean createIncomplete : new boolean[] { true, false }) + { CFException ex = new CFException(); - f.completeExceptionally(ex); + CompletableFuture f = new CompletableFuture<>(); + if (!createIncomplete) f.completeExceptionally(ex); + CompletableFuture g = f.copy(); + if (createIncomplete) { + checkIncomplete(f); + checkIncomplete(g); + f.completeExceptionally(ex); + } checkCompletedExceptionally(f, ex); checkCompletedWithWrappedException(g, ex); + }} + + /** + * Completion of a copy does not complete its source. + */ + public void testCopy_oneWayPropagation() { + CompletableFuture f = new CompletableFuture<>(); + assertTrue(f.copy().complete(1)); + assertTrue(f.copy().complete(null)); + assertTrue(f.copy().cancel(true)); + assertTrue(f.copy().cancel(false)); + assertTrue(f.copy().completeExceptionally(new CFException())); + checkIncomplete(f); } /** @@ -3991,7 +4015,10 @@ public class CompletableFutureTest extends JSR166TestCase { .collect(Collectors.toList()); List > stages = new ArrayList<>(); - stages.add(new CompletableFuture ().minimalCompletionStage()); + CompletionStage min = + new CompletableFuture ().minimalCompletionStage(); + stages.add(min); + stages.add(min.thenApply(x -> x)); stages.add(CompletableFuture.completedStage(1)); stages.add(CompletableFuture.failedStage(new CFException())); @@ -4027,6 +4054,131 @@ public class CompletableFutureTest extends JSR166TestCase { throw new Error("Methods did not throw UOE: " + bugs); } + /** + * minimalStage.toCompletableFuture() returns a CompletableFuture that + * is completed normally, with the same value, when source is. + */ + public void testMinimalCompletionStage_toCompletableFuture_normalCompletion() { + for (boolean createIncomplete : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { + CompletableFuture f = new CompletableFuture<>(); + CompletionStage minimal = f.minimalCompletionStage(); + if (!createIncomplete) assertTrue(f.complete(v1)); + CompletableFuture g = minimal.toCompletableFuture(); + if (createIncomplete) { + checkIncomplete(f); + checkIncomplete(g); + assertTrue(f.complete(v1)); + } + checkCompletedNormally(f, v1); + checkCompletedNormally(g, v1); + }} + + /** + * minimalStage.toCompletableFuture() returns a CompletableFuture that + * is completed exceptionally when source is. + */ + public void testMinimalCompletionStage_toCompletableFuture_exceptionalCompletion() { + for (boolean createIncomplete : new boolean[] { true, false }) + { + CFException ex = new CFException(); + CompletableFuture f = new CompletableFuture<>(); + CompletionStage minimal = f.minimalCompletionStage(); + if (!createIncomplete) f.completeExceptionally(ex); + CompletableFuture g = minimal.toCompletableFuture(); + if (createIncomplete) { + checkIncomplete(f); + checkIncomplete(g); + f.completeExceptionally(ex); + } + checkCompletedExceptionally(f, ex); + checkCompletedWithWrappedException(g, ex); + }} + + /** + * minimalStage.toCompletableFuture() gives mutable CompletableFuture + */ + public void testMinimalCompletionStage_toCompletableFuture_mutable() { + for (Integer v1 : new Integer[] { 1, null }) + { + CompletableFuture f = new CompletableFuture<>(); + CompletionStage minimal = f.minimalCompletionStage(); + CompletableFuture g = minimal.toCompletableFuture(); + assertTrue(g.complete(v1)); + checkCompletedNormally(g, v1); + checkIncomplete(f); + checkIncomplete(minimal.toCompletableFuture()); + }} + + /** + * minimalStage.toCompletableFuture().join() awaits completion + */ + public void testMinimalCompletionStage_toCompletableFuture_join() throws Exception { + for (boolean createIncomplete : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { + CompletableFuture f = new CompletableFuture<>(); + if (!createIncomplete) assertTrue(f.complete(v1)); + CompletionStage minimal = f.minimalCompletionStage(); + if (createIncomplete) assertTrue(f.complete(v1)); + assertEquals(v1, minimal.toCompletableFuture().join()); + assertEquals(v1, minimal.toCompletableFuture().get()); + checkCompletedNormally(minimal.toCompletableFuture(), v1); + }} + + /** + * Completion of a toCompletableFuture copy of a minimal stage + * does not complete its source. + */ + public void testMinimalCompletionStage_toCompletableFuture_oneWayPropagation() { + CompletableFuture f = new CompletableFuture<>(); + CompletionStage g = f.minimalCompletionStage(); + assertTrue(g.toCompletableFuture().complete(1)); + assertTrue(g.toCompletableFuture().complete(null)); + assertTrue(g.toCompletableFuture().cancel(true)); + assertTrue(g.toCompletableFuture().cancel(false)); + assertTrue(g.toCompletableFuture().completeExceptionally(new CFException())); + checkIncomplete(g.toCompletableFuture()); + f.complete(1); + checkCompletedNormally(g.toCompletableFuture(), 1); + } + + /** Demo utility method for external reliable toCompletableFuture */ + static CompletableFuture toCompletableFuture(CompletionStage stage) { + CompletableFuture f = new CompletableFuture<>(); + stage.handle((T t, Throwable ex) -> { + if (ex != null) f.completeExceptionally(ex); + else f.complete(t); + return null; + }); + return f; + } + + /** Demo utility method to join a CompletionStage */ + static T join(CompletionStage stage) { + return toCompletableFuture(stage).join(); + } + + /** + * Joining a minimal stage "by hand" works + */ + public void testMinimalCompletionStage_join_by_hand() { + for (boolean createIncomplete : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { + CompletableFuture f = new CompletableFuture<>(); + CompletionStage minimal = f.minimalCompletionStage(); + CompletableFuture g = new CompletableFuture<>(); + if (!createIncomplete) assertTrue(f.complete(v1)); + minimal.thenAccept((x) -> g.complete(x)); + if (createIncomplete) assertTrue(f.complete(v1)); + g.join(); + checkCompletedNormally(g, v1); + checkCompletedNormally(f, v1); + assertEquals(v1, join(minimal)); + }} + static class Monad { static class ZeroException extends RuntimeException { public ZeroException() { super("monadic zero"); } @@ -4317,6 +4469,22 @@ public class CompletableFutureTest extends JSR166TestCase { assertTrue(neverCompleted.thenRun(() -> {}).cancel(true)); } + /** + * Checks for garbage retention when MinimalStage.toCompletableFuture() + * is invoked many times. + * 8161600: Garbage retention when source CompletableFutures are never completed + * + * As of 2016-07, fails with OOME: + * ant -Dvmoptions=-Xmx8m -Djsr166.expensiveTests=true -Djsr166.tckTestClass=CompletableFutureTest -Djsr166.methodFilter=testToCompletableFutureGarbageRetention tck + */ + public void testToCompletableFutureGarbageRetention() throws Throwable { + final int n = expensiveTests ? 900_000 : 10; + CompletableFuture neverCompleted = new CompletableFuture<>(); + CompletionStage minimal = neverCompleted.minimalCompletionStage(); + for (int i = 0; i < n; i++) + assertTrue(minimal.toCompletableFuture().cancel(true)); + } + // static U join(CompletionStage stage) { // CompletableFuture f = new CompletableFuture<>(); // stage.whenComplete((v, ex) -> { diff --git a/jdk/test/java/util/concurrent/tck/ConcurrentSkipListMapTest.java b/jdk/test/java/util/concurrent/tck/ConcurrentSkipListMapTest.java index 515303e3e64..0b1faad2824 100644 --- a/jdk/test/java/util/concurrent/tck/ConcurrentSkipListMapTest.java +++ b/jdk/test/java/util/concurrent/tck/ConcurrentSkipListMapTest.java @@ -1024,7 +1024,7 @@ public class ConcurrentSkipListMapTest extends JSR166TestCase { static NavigableMap newMap(Class cl) throws Exception { NavigableMap result = - (NavigableMap ) cl.newInstance(); + (NavigableMap ) cl.getConstructor().newInstance(); assertEquals(0, result.size()); assertFalse(result.keySet().iterator().hasNext()); return result; diff --git a/jdk/test/java/util/concurrent/tck/ConcurrentSkipListSetTest.java b/jdk/test/java/util/concurrent/tck/ConcurrentSkipListSetTest.java index 4ec79c8edd3..28c9f6bd81b 100644 --- a/jdk/test/java/util/concurrent/tck/ConcurrentSkipListSetTest.java +++ b/jdk/test/java/util/concurrent/tck/ConcurrentSkipListSetTest.java @@ -725,7 +725,8 @@ public class ConcurrentSkipListSetTest extends JSR166TestCase { } static NavigableSet newSet(Class cl) throws Exception { - NavigableSet result = (NavigableSet ) cl.newInstance(); + NavigableSet result = + (NavigableSet ) cl.getConstructor().newInstance(); assertEquals(0, result.size()); assertFalse(result.iterator().hasNext()); return result; diff --git a/jdk/test/java/util/concurrent/tck/CyclicBarrierTest.java b/jdk/test/java/util/concurrent/tck/CyclicBarrierTest.java index bfae2ee323b..8db1063dce9 100644 --- a/jdk/test/java/util/concurrent/tck/CyclicBarrierTest.java +++ b/jdk/test/java/util/concurrent/tck/CyclicBarrierTest.java @@ -40,6 +40,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import junit.framework.Test; import junit.framework.TestSuite; @@ -52,11 +53,6 @@ public class CyclicBarrierTest extends JSR166TestCase { return new TestSuite(CyclicBarrierTest.class); } - private volatile int countAction; - private class MyAction implements Runnable { - public void run() { ++countAction; } - } - /** * Spin-waits till the number of waiters == numberOfWaiters. */ @@ -114,14 +110,16 @@ public class CyclicBarrierTest extends JSR166TestCase { * The supplied barrier action is run at barrier */ public void testBarrierAction() throws Exception { - countAction = 0; - CyclicBarrier b = new CyclicBarrier(1, new MyAction()); + final AtomicInteger count = new AtomicInteger(0); + final Runnable incCount = new Runnable() { public void run() { + count.getAndIncrement(); }}; + CyclicBarrier b = new CyclicBarrier(1, incCount); assertEquals(1, b.getParties()); assertEquals(0, b.getNumberWaiting()); b.await(); b.await(); assertEquals(0, b.getNumberWaiting()); - assertEquals(2, countAction); + assertEquals(2, count.get()); } /** diff --git a/jdk/test/java/util/concurrent/tck/DelayQueueTest.java b/jdk/test/java/util/concurrent/tck/DelayQueueTest.java index 4d05c864554..d4a6bdc969c 100644 --- a/jdk/test/java/util/concurrent/tck/DelayQueueTest.java +++ b/jdk/test/java/util/concurrent/tck/DelayQueueTest.java @@ -121,10 +121,8 @@ public class DelayQueueTest extends JSR166TestCase { } public boolean equals(Object other) { - return equals((NanoDelay)other); - } - public boolean equals(NanoDelay other) { - return other.trigger == trigger; + return (other instanceof NanoDelay) && + this.trigger == ((NanoDelay)other).trigger; } // suppress [overrides] javac warning diff --git a/jdk/test/java/util/concurrent/tck/ForkJoinPoolTest.java b/jdk/test/java/util/concurrent/tck/ForkJoinPoolTest.java index 282557d97b7..70004764a78 100644 --- a/jdk/test/java/util/concurrent/tck/ForkJoinPoolTest.java +++ b/jdk/test/java/util/concurrent/tck/ForkJoinPoolTest.java @@ -51,6 +51,7 @@ import java.util.concurrent.Future; import java.util.concurrent.RecursiveTask; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantLock; import junit.framework.AssertionFailedError; @@ -84,13 +85,6 @@ public class ForkJoinPoolTest extends JSR166TestCase { // Some classes to test extension and factory methods - static class MyHandler implements Thread.UncaughtExceptionHandler { - volatile int catches = 0; - public void uncaughtException(Thread t, Throwable e) { - ++catches; - } - } - static class MyError extends Error {} // to test handlers @@ -101,9 +95,9 @@ public class ForkJoinPoolTest extends JSR166TestCase { static class FailingThreadFactory implements ForkJoinPool.ForkJoinWorkerThreadFactory { - volatile int calls = 0; + final AtomicInteger calls = new AtomicInteger(0); public ForkJoinWorkerThread newThread(ForkJoinPool p) { - if (++calls > 1) return null; + if (calls.incrementAndGet() > 1) return null; return new FailingFJWSubclass(p); } } diff --git a/jdk/test/java/util/concurrent/tck/JSR166TestCase.java b/jdk/test/java/util/concurrent/tck/JSR166TestCase.java index aaa97d8abcb..8a0360f9b99 100644 --- a/jdk/test/java/util/concurrent/tck/JSR166TestCase.java +++ b/jdk/test/java/util/concurrent/tck/JSR166TestCase.java @@ -1032,14 +1032,17 @@ public class JSR166TestCase extends TestCase { ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); System.err.println("------ stacktrace dump start ------"); for (ThreadInfo info : threadMXBean.dumpAllThreads(true, true)) { - String name = info.getThreadName(); + final String name = info.getThreadName(); + String lockName; if ("Signal Dispatcher".equals(name)) continue; if ("Reference Handler".equals(name) - && info.getLockName().startsWith("java.lang.ref.Reference$Lock")) + && (lockName = info.getLockName()) != null + && lockName.startsWith("java.lang.ref.Reference$Lock")) continue; if ("Finalizer".equals(name) - && info.getLockName().startsWith("java.lang.ref.ReferenceQueue$Lock")) + && (lockName = info.getLockName()) != null + && lockName.startsWith("java.lang.ref.ReferenceQueue$Lock")) continue; if ("checkForWedgedTest".equals(name)) continue; @@ -1783,7 +1786,7 @@ public class JSR166TestCase extends TestCase { * A CyclicBarrier that uses timed await and fails with * AssertionFailedErrors instead of throwing checked exceptions. */ - public class CheckedBarrier extends CyclicBarrier { + public static class CheckedBarrier extends CyclicBarrier { public CheckedBarrier(int parties) { super(parties); } public int await() { diff --git a/jdk/test/java/util/concurrent/tck/ScheduledExecutorTest.java b/jdk/test/java/util/concurrent/tck/ScheduledExecutorTest.java index 1cb2a472658..0946d006276 100644 --- a/jdk/test/java/util/concurrent/tck/ScheduledExecutorTest.java +++ b/jdk/test/java/util/concurrent/tck/ScheduledExecutorTest.java @@ -537,15 +537,14 @@ public class ScheduledExecutorTest extends JSR166TestCase { * isShutdown is false before shutdown, true after */ public void testIsShutdown() { - final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); - try { - assertFalse(p.isShutdown()); + assertFalse(p.isShutdown()); + try (PoolCleaner cleaner = cleaner(p)) { + try { + p.shutdown(); + assertTrue(p.isShutdown()); + } catch (SecurityException ok) {} } - finally { - try { p.shutdown(); } catch (SecurityException ok) { return; } - } - assertTrue(p.isShutdown()); } /** diff --git a/jdk/test/java/util/concurrent/tck/TreeMapTest.java b/jdk/test/java/util/concurrent/tck/TreeMapTest.java index ebf1dd01b9b..ada561ea119 100644 --- a/jdk/test/java/util/concurrent/tck/TreeMapTest.java +++ b/jdk/test/java/util/concurrent/tck/TreeMapTest.java @@ -829,7 +829,7 @@ public class TreeMapTest extends JSR166TestCase { static NavigableMap newMap(Class cl) throws Exception { NavigableMap result - = (NavigableMap ) cl.newInstance(); + = (NavigableMap ) cl.getConstructor().newInstance(); assertEquals(0, result.size()); assertFalse(result.keySet().iterator().hasNext()); return result; diff --git a/jdk/test/java/util/concurrent/tck/TreeSetTest.java b/jdk/test/java/util/concurrent/tck/TreeSetTest.java index eb7b6efd9d0..dc5b007b0d3 100644 --- a/jdk/test/java/util/concurrent/tck/TreeSetTest.java +++ b/jdk/test/java/util/concurrent/tck/TreeSetTest.java @@ -722,7 +722,8 @@ public class TreeSetTest extends JSR166TestCase { } static NavigableSet newSet(Class cl) throws Exception { - NavigableSet result = (NavigableSet ) cl.newInstance(); + NavigableSet result = + (NavigableSet ) cl.getConstructor().newInstance(); assertEquals(0, result.size()); assertFalse(result.iterator().hasNext()); return result; diff --git a/jdk/test/sun/nio/cs/TestUnmappable.java b/jdk/test/sun/nio/cs/TestUnmappable.java index 6273807cce3..8204fdf4d10 100644 --- a/jdk/test/sun/nio/cs/TestUnmappable.java +++ b/jdk/test/sun/nio/cs/TestUnmappable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 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 @@ -28,11 +28,11 @@ * @bug 8008386 * @summary (cs) Unmappable leading should be decoded to replacement. * Tests for Shift_JIS and MS932 decoding + * @modules jdk.charsets * @run main TestUnmappable */ -import java.nio.*; -import java.nio.charset.*; +import java.nio.charset.Charset; public class TestUnmappable { public static void main(String args[]) throws Exception { diff --git a/jdk/test/sun/security/pkcs11/tls/TestKeyMaterial.java b/jdk/test/sun/security/pkcs11/tls/TestKeyMaterial.java index 27944e92f89..81a8b4571ba 100644 --- a/jdk/test/sun/security/pkcs11/tls/TestKeyMaterial.java +++ b/jdk/test/sun/security/pkcs11/tls/TestKeyMaterial.java @@ -23,7 +23,7 @@ /* * @test - * @bug 6316539 + * @bug 6316539 8136355 * @summary Known-answer-test for TlsKeyMaterial generator * @author Andreas Sterbenz * @library .. @@ -37,6 +37,7 @@ import java.io.BufferedReader; import java.nio.file.Files; import java.nio.file.Paths; import java.security.Provider; +import java.security.InvalidAlgorithmParameterException; import java.util.Arrays; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; @@ -139,21 +140,28 @@ public class TestKeyMaterial extends PKCS11Test { keyLength, expandedKeyLength, ivLength, macLength, null, -1, -1); - kg.init(spec); - TlsKeyMaterialSpec result = - (TlsKeyMaterialSpec)kg.generateKey(); - match(lineNumber, clientCipherBytes, - result.getClientCipherKey(), cipherAlgorithm); - match(lineNumber, serverCipherBytes, - result.getServerCipherKey(), cipherAlgorithm); - match(lineNumber, clientIv, result.getClientIv(), ""); - match(lineNumber, serverIv, result.getServerIv(), ""); - match(lineNumber, clientMacBytes, result.getClientMacKey(), ""); - match(lineNumber, serverMacBytes, result.getServerMacKey(), ""); - - } else { + try { + kg.init(spec); + TlsKeyMaterialSpec result = + (TlsKeyMaterialSpec)kg.generateKey(); + match(lineNumber, clientCipherBytes, + result.getClientCipherKey(), cipherAlgorithm); + match(lineNumber, serverCipherBytes, + result.getServerCipherKey(), cipherAlgorithm); + match(lineNumber, clientIv, result.getClientIv(), ""); + match(lineNumber, serverIv, result.getServerIv(), ""); + match(lineNumber, clientMacBytes, result.getClientMacKey(), ""); + match(lineNumber, serverMacBytes, result.getServerMacKey(), ""); + } catch (InvalidAlgorithmParameterException iape) { + // SSLv3 support is removed in S12 + if (major == 3 && minor == 0) { + System.out.println("Skip testing SSLv3"); + continue; + } + } + } else { throw new Exception("Unknown line: " + line); - } + } } if (n == 0) { throw new Exception("no tests"); diff --git a/jdk/test/sun/security/pkcs11/tls/TestMasterSecret.java b/jdk/test/sun/security/pkcs11/tls/TestMasterSecret.java index 67ee6e708bd..de6863608d5 100644 --- a/jdk/test/sun/security/pkcs11/tls/TestMasterSecret.java +++ b/jdk/test/sun/security/pkcs11/tls/TestMasterSecret.java @@ -23,7 +23,7 @@ /* * @test - * @bug 6316539 + * @bug 6316539 8136355 * @summary Known-answer-test for TlsMasterSecret generator * @author Andreas Sterbenz * @library .. @@ -38,6 +38,7 @@ import java.io.BufferedReader; import java.nio.file.Files; import java.nio.file.Paths; import java.security.Provider; +import java.security.InvalidAlgorithmParameterException; import java.util.Arrays; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; @@ -116,15 +117,24 @@ public class TestMasterSecret extends PKCS11Test { new TlsMasterSecretParameterSpec(premasterKey, protoMajor, protoMinor, clientRandom, serverRandom, null, -1, -1); - kg.init(spec); - TlsMasterSecret key = (TlsMasterSecret)kg.generateKey(); - byte[] enc = key.getEncoded(); - if (Arrays.equals(master, enc) == false) { - throw new Exception("mismatch line: " + lineNumber); - } - if ((preMajor != key.getMajorVersion()) || - (preMinor != key.getMinorVersion())) { - throw new Exception("version mismatch line: " + lineNumber); + + try { + kg.init(spec); + TlsMasterSecret key = (TlsMasterSecret)kg.generateKey(); + byte[] enc = key.getEncoded(); + if (Arrays.equals(master, enc) == false) { + throw new Exception("mismatch line: " + lineNumber); + } + if ((preMajor != key.getMajorVersion()) || + (preMinor != key.getMinorVersion())) { + throw new Exception("version mismatch line: " + lineNumber); + } + } catch (InvalidAlgorithmParameterException iape) { + // SSLv3 support is removed in S12 + if (preMajor == 3 && preMinor == 0) { + System.out.println("Skip testing SSLv3"); + continue; + } } } else { throw new Exception("Unknown line: " + line); diff --git a/jdk/test/sun/security/pkcs11/tls/TestPremaster.java b/jdk/test/sun/security/pkcs11/tls/TestPremaster.java index a179bb81c2a..67191a7df28 100644 --- a/jdk/test/sun/security/pkcs11/tls/TestPremaster.java +++ b/jdk/test/sun/security/pkcs11/tls/TestPremaster.java @@ -23,7 +23,7 @@ /* * @test - * @bug 6316539 + * @bug 6316539 8136355 * @summary Basic tests for TlsRsaPremasterSecret generator * @author Andreas Sterbenz * @library .. @@ -34,6 +34,7 @@ */ import java.security.Provider; +import java.security.InvalidAlgorithmParameterException; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import sun.security.internal.spec.TlsRsaPremasterSecretParameterSpec; @@ -61,7 +62,7 @@ public class TestPremaster extends PKCS11Test { System.out.println("OK: " + e); } - int[] protocolVersions = {0x0300, 0x0301, 0x0302, 0x0400}; + int[] protocolVersions = {0x0300, 0x0301, 0x0302}; for (int clientVersion : protocolVersions) { for (int serverVersion : protocolVersions) { test(kg, clientVersion, serverVersion); @@ -81,8 +82,18 @@ public class TestPremaster extends PKCS11Test { "Testing RSA pre-master secret key generation between " + "client (0x%04X) and server(0x%04X)%n", clientVersion, serverVersion); - kg.init(new TlsRsaPremasterSecretParameterSpec( + try { + kg.init(new TlsRsaPremasterSecretParameterSpec( clientVersion, serverVersion)); + } catch (InvalidAlgorithmParameterException iape) { + // S12 removed support for SSL v3.0 + if (clientVersion == 0x300 || serverVersion == 0x300) { + System.out.println("Skip testing SSLv3 due to no support"); + return; + } + // unexpected, pass it up + throw iape; + } SecretKey key = kg.generateKey(); byte[] encoded = key.getEncoded(); if (encoded != null) { // raw key material may be not extractable diff --git a/langtools/.hgtags b/langtools/.hgtags index c5fe36cee08..959e99614ce 100644 --- a/langtools/.hgtags +++ b/langtools/.hgtags @@ -379,3 +379,4 @@ aebfafc43714d5a27d5064d8a0011eaccde633cf jdk-9+131 f08683786207a48b652266b3b7b908e6c863c3fc jdk-9+134 af5eb8f3ffd21288305a54ea177ffad75021a741 jdk-9+135 c8f02f0ecbd7cd6700f47416e4b7e9d5ec20ad77 jdk-9+136 +dd56c243c199a540c9f1fbff4855f0934b32a9d0 jdk-9+137 diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java index abd811b1ea6..fd3813600c6 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java @@ -383,18 +383,16 @@ public class JavacTrees extends DocTrees { JCTree tree = (JCTree) path.getLeaf(); Symbol sym = TreeInfo.symbolFor(tree); if (sym == null) { - if (TreeInfo.isDeclaration(tree)) { - for (TreePath p = path; p != null; p = p.getParentPath()) { - JCTree t = (JCTree) p.getLeaf(); - if (t.hasTag(JCTree.Tag.CLASSDEF)) { - JCClassDecl ct = (JCClassDecl) t; - if (ct.sym != null) { - if ((ct.sym.flags_field & Flags.UNATTRIBUTED) != 0) { - attr.attribClass(ct.pos(), ct.sym); - sym = TreeInfo.symbolFor(tree); - } - break; + for (TreePath p = path; p != null; p = p.getParentPath()) { + JCTree t = (JCTree) p.getLeaf(); + if (t.hasTag(JCTree.Tag.CLASSDEF)) { + JCClassDecl ct = (JCClassDecl) t; + if (ct.sym != null) { + if ((ct.sym.flags_field & Flags.UNATTRIBUTED) != 0) { + attr.attribClass(ct.pos(), ct.sym); + sym = TreeInfo.symbolFor(tree); } + break; } } } diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Flags.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Flags.java index 5aa826ecacc..88079ff87c9 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Flags.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Flags.java @@ -134,7 +134,7 @@ public class Flags { /** Flag is set for nested classes that do not access instance members * or `this' of an outer class and therefore don't need to be passed * a this$n reference. This value is currently set only for anonymous - * classes in superclass constructor calls and only for pre 1.4 targets. + * classes in superclass constructor calls. * todo: use this value for optimizing away this$n parameters in * other cases. */ diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/TypeAnnotationPosition.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/TypeAnnotationPosition.java index 71d7aac0b05..6e4cd02e0ae 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/TypeAnnotationPosition.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/TypeAnnotationPosition.java @@ -789,7 +789,7 @@ public class TypeAnnotationPosition { classExtends(final List location, final JCLambda onLambda, final int pos) { - return classExtends(location, onLambda, -1, pos); + return classExtends(location, onLambda, 65535, pos); } /** @@ -821,7 +821,7 @@ public class TypeAnnotationPosition { * @param pos The position from the associated tree node. */ public static TypeAnnotationPosition classExtends(final int pos) { - return classExtends(-1, pos); + return classExtends(65535, pos); } /** diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java index 55f123afe76..be396ba3ebc 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java @@ -921,13 +921,11 @@ public class Attr extends JCTree.Visitor { c.complete(); // If this class appears as an anonymous class - // in a superclass constructor call where - // no explicit outer instance is given, + // in a superclass constructor call // disable implicit outer instance from being passed. // (This would be an illegal access to "this before super"). if (env.info.isSelfCall && - env.tree.hasTag(NEWCLASS) && - ((JCNewClass)env.tree).encl == null) { + env.tree.hasTag(NEWCLASS)) { c.flags_field |= NOOUTERTHIS; } attribClass(tree.pos(), c); @@ -1453,7 +1451,7 @@ public class Attr extends JCTree.Visitor { try { close = rs.resolveQualifiedMethod(pos, env, - resource, + types.skipTypeVars(resource, false), names.close, List. nil(), List. nil()); @@ -2329,6 +2327,9 @@ public class Attr extends JCTree.Visitor { /** Make an attributed null check tree. */ public JCExpression makeNullCheck(JCExpression arg) { + // optimization: new Outer() can never be null; skip null check + if (arg.getTag() == NEWCLASS) + return arg; // optimization: X.this is never null; skip null check Name name = TreeInfo.name(arg); if (name == names._this || name == names._super) return arg; diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Flow.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Flow.java index d0e49a2d10c..1fa377635df 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Flow.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Flow.java @@ -1098,7 +1098,7 @@ public class Flow { if (types.asSuper(sup, syms.autoCloseableType.tsym) != null) { Symbol closeMethod = rs.resolveQualifiedMethod(tree, attrEnv, - sup, + types.skipTypeVars(sup, false), names.close, List. nil(), List. nil()); diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/BaseFileManager.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/BaseFileManager.java index 54a419f6096..c4e0780cbf1 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/BaseFileManager.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/BaseFileManager.java @@ -287,6 +287,7 @@ public abstract class BaseFileManager implements JavaFileManager { case MULTIRELEASE: multiReleaseValue = value; + locations.setMultiReleaseValue(value); return true; default: diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/Locations.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/Locations.java index 422f72f13d8..7ae148d895f 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/Locations.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/Locations.java @@ -130,6 +130,7 @@ public class Locations { Map fileSystems = new LinkedHashMap<>(); List closeables = new ArrayList<>(); + private Map fsEnv = Collections.emptyMap(); Locations() { initHandlers(); @@ -207,6 +208,10 @@ public class Locations { return entries; } + public void setMultiReleaseValue(String multiReleaseValue) { + fsEnv = Collections.singletonMap("multi-release", multiReleaseValue); + } + /** * Utility class to help evaluate a path option. Duplicate entries are ignored, jar class paths * can be expanded. @@ -1047,7 +1052,8 @@ public class Locations { } if (p.getFileName().toString().endsWith(".jar") && fsInfo.exists(p)) { - try (FileSystem fs = FileSystems.newFileSystem(p, null)) { + URI uri = URI.create("jar:" + p.toUri()); + try (FileSystem fs = FileSystems.newFileSystem(uri, fsEnv, null)) { Path moduleInfoClass = fs.getPath("module-info.class"); if (Files.exists(moduleInfoClass)) { String moduleName = readModuleName(moduleInfoClass); diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java index ce066f83a39..4e1d4dd42d3 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java @@ -1503,13 +1503,35 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea } } public void visitClassDef(JCClassDecl node) { + super.visitClassDef(node); + // remove generated constructor that may have been added during attribution: + List beforeConstructor = List.nil(); + List defs = node.defs; + while (defs.nonEmpty() && !defs.head.hasTag(Tag.METHODDEF)) { + beforeConstructor = beforeConstructor.prepend(defs.head); + defs = defs.tail; + } + if (defs.nonEmpty() && + (((JCMethodDecl) defs.head).mods.flags & Flags.GENERATEDCONSTR) != 0) { + defs = defs.tail; + while (beforeConstructor.nonEmpty()) { + defs = defs.prepend(beforeConstructor.head); + beforeConstructor = beforeConstructor.tail; + } + node.defs = defs; + } if (node.sym != null) { node.sym.completer = new ImplicitCompleter(topLevel); } node.sym = null; - super.visitClassDef(node); } public void visitMethodDef(JCMethodDecl node) { + // remove super constructor call that may have been added during attribution: + if (TreeInfo.isConstructor(node) && node.sym != null && node.sym.owner.isEnum() && + node.body.stats.nonEmpty() && TreeInfo.isSuperCall(node.body.stats.head) && + node.body.stats.head.pos == node.body.pos) { + node.body.stats = node.body.stats.tail; + } node.sym = null; super.visitMethodDef(node); } diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java index 595d5b45af9..d783fd35f05 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java @@ -424,12 +424,15 @@ public abstract class AbstractMemberWriter { Content tbody = new HtmlTree(HtmlTag.TBODY); boolean altColor = true; for (Element member : deprmembers) { - HtmlTree td = HtmlTree.TD(HtmlStyle.colOne, getDeprecatedLink(member)); + HtmlTree thRow = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, getDeprecatedLink(member)); + HtmlTree tr = HtmlTree.TR(thRow); + HtmlTree td = new HtmlTree(HtmlTag.TD); + td.addStyle(HtmlStyle.colLast); List extends DocTree> deprTrees = utils.getBlockTags(member, DocTree.Kind.DEPRECATED); if (!deprTrees.isEmpty()) { writer.addInlineDeprecatedComment(member, deprTrees.get(0), td); } - HtmlTree tr = HtmlTree.TR(td); + tr.addContent(td); tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor); altColor = !altColor; tbody.addContent(tr); @@ -477,8 +480,9 @@ public abstract class AbstractMemberWriter { tdFirst.addStyle(HtmlStyle.colFirst); writer.addSummaryType(this, element, tdFirst); tr.addContent(tdFirst); - HtmlTree tdLast = new HtmlTree(HtmlTag.TD); - tdLast.addStyle(HtmlStyle.colLast); + HtmlTree thType = new HtmlTree(HtmlTag.TH); + thType.addStyle(HtmlStyle.colSecond); + thType.addAttr(HtmlAttr.SCOPE, "row"); if (te != null && !utils.isConstructor(element) && !utils.isClass(element) @@ -487,14 +491,17 @@ public abstract class AbstractMemberWriter { HtmlTree name = new HtmlTree(HtmlTag.SPAN); name.addStyle(HtmlStyle.typeNameLabel); name.addContent(name(te) + "."); - tdLast.addContent(name); + thType.addContent(name); } addSummaryLink(utils.isClass(element) || utils.isInterface(element) ? LinkInfoImpl.Kind.CLASS_USE : LinkInfoImpl.Kind.MEMBER, - te, element, tdLast); - writer.addSummaryLinkComment(this, element, tdLast); - tr.addContent(tdLast); + te, element, thType); + tr.addContent(thType); + HtmlTree tdDesc = new HtmlTree(HtmlTag.TD); + tdDesc.addStyle(HtmlStyle.colLast); + writer.addSummaryLinkComment(this, element, tdDesc); + tr.addContent(tdDesc); tbody.addContent(tr); } table.addContent(tbody); @@ -557,12 +564,15 @@ public abstract class AbstractMemberWriter { HtmlTree tdSummaryType = new HtmlTree(HtmlTag.TD); tdSummaryType.addStyle(HtmlStyle.colFirst); writer.addSummaryType(this, member, tdSummaryType); - HtmlTree tdSummary = new HtmlTree(HtmlTag.TD); - setSummaryColumnStyle(tdSummary); - addSummaryLink(tElement, member, tdSummary); - writer.addSummaryLinkComment(this, member, firstSentenceTags, tdSummary); HtmlTree tr = HtmlTree.TR(tdSummaryType); - tr.addContent(tdSummary); + HtmlTree thSummaryLink = new HtmlTree(HtmlTag.TH); + setSummaryColumnStyleAndScope(thSummaryLink); + addSummaryLink(tElement, member, thSummaryLink); + tr.addContent(thSummaryLink); + HtmlTree tdDesc = new HtmlTree(HtmlTag.TD); + tdDesc.addStyle(HtmlStyle.colLast); + writer.addSummaryLinkComment(this, member, firstSentenceTags, tdDesc); + tr.addContent(tdDesc); if (utils.isMethod(member) && !utils.isAnnotationType(member)) { int methodType = utils.isStatic(member) ? MethodTypes.STATIC.value() : MethodTypes.INSTANCE.value(); @@ -612,12 +622,13 @@ public abstract class AbstractMemberWriter { } /** - * Set the style for the summary column. + * Set the style and scope attribute for the summary column. * - * @param tdTree the column for which the style will be set + * @param thTree the column for which the style and scope attribute will be set */ - public void setSummaryColumnStyle(HtmlTree tdTree) { - tdTree.addStyle(HtmlStyle.colLast); + public void setSummaryColumnStyleAndScope(HtmlTree thTree) { + thTree.addStyle(HtmlStyle.colSecond); + thTree.addAttr(HtmlAttr.SCOPE, "row"); } /** diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeFieldWriterImpl.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeFieldWriterImpl.java index f0392bcc1db..dd7ed67003c 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeFieldWriterImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeFieldWriterImpl.java @@ -25,8 +25,6 @@ package jdk.javadoc.internal.doclets.formats.html; -import java.io.*; - import java.util.Arrays; import java.util.List; @@ -222,9 +220,7 @@ public class AnnotationTypeFieldWriterImpl extends AbstractMemberWriter */ public List getSummaryTableHeader(Element member) { List header = Arrays.asList(writer.getModifierTypeHeader(), - configuration.getText("doclet.0_and_1", - configuration.getText("doclet.Fields"), - configuration.getText("doclet.Description"))); + resources.getText("doclet.Fields"), resources.getText("doclet.Description")); return header; } diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeOptionalMemberWriterImpl.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeOptionalMemberWriterImpl.java index 2d493090872..237f443a247 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeOptionalMemberWriterImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeOptionalMemberWriterImpl.java @@ -133,9 +133,8 @@ public class AnnotationTypeOptionalMemberWriterImpl extends */ public List getSummaryTableHeader(Element member) { List header = Arrays.asList(writer.getModifierTypeHeader(), - configuration.getText("doclet.0_and_1", - configuration.getText("doclet.Annotation_Type_Optional_Member"), - configuration.getText("doclet.Description"))); + resources.getText("doclet.Annotation_Type_Optional_Member"), + resources.getText("doclet.Description")); return header; } diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java index 3d2d0f8b328..06e4a158a1d 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java @@ -25,7 +25,6 @@ package jdk.javadoc.internal.doclets.formats.html; -import java.io.*; import java.util.Arrays; import java.util.List; @@ -223,9 +222,7 @@ public class AnnotationTypeRequiredMemberWriterImpl extends AbstractMemberWriter */ public List getSummaryTableHeader(Element member) { List header = Arrays.asList(writer.getModifierTypeHeader(), - configuration.getText("doclet.0_and_1", - configuration.getText("doclet.Annotation_Type_Required_Member"), - configuration.getText("doclet.Description"))); + resources.getText("doclet.Annotation_Type_Required_Member"), resources.getText("doclet.Description")); return header; } diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java index 75e1313106a..ac3e677f567 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java @@ -330,8 +330,8 @@ public class ClassUseWriter extends SubWriterHolderWriter { HtmlTree tr = new HtmlTree(HtmlTag.TR); tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor); altColor = !altColor; - Content tdFirst = HtmlTree.TD(HtmlStyle.colFirst, getPackageLink(pkg)); - tr.addContent(tdFirst); + Content thFirst = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, getPackageLink(pkg)); + tr.addContent(thFirst); HtmlTree tdLast = new HtmlTree(HtmlTag.TD); tdLast.addStyle(HtmlStyle.colLast); addSummaryComment(pkg, tdLast); @@ -380,9 +380,9 @@ public class ClassUseWriter extends SubWriterHolderWriter { * @param contentTree the content tree to which the package use information will be added */ protected void addPackageUse(PackageElement pkg, Content contentTree) { - Content tdFirst = HtmlTree.TD(HtmlStyle.colFirst, + Content thFirst = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, getHyperLink(getPackageAnchorName(pkg), new StringContent(utils.getPackageName(pkg)))); - contentTree.addContent(tdFirst); + contentTree.addContent(thFirst); HtmlTree tdLast = new HtmlTree(HtmlTag.TD); tdLast.addStyle(HtmlStyle.colLast); addSummaryComment(pkg, tdLast); diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstantsSummaryWriterImpl.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstantsSummaryWriterImpl.java index 57ee7012236..887d46fe868 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstantsSummaryWriterImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstantsSummaryWriterImpl.java @@ -25,7 +25,6 @@ package jdk.javadoc.internal.doclets.formats.html; -import java.io.*; import java.util.*; import javax.lang.model.element.Modifier; @@ -332,7 +331,7 @@ public class ConstantsSummaryWriterImpl extends HtmlDocletWriter implements Cons Content nameContent = getDocLink(LinkInfoImpl.Kind.CONSTANT_SUMMARY, member, member.getSimpleName(), false); Content code = HtmlTree.CODE(nameContent); - return HtmlTree.TD(code); + return HtmlTree.TH_ROW_SCOPE(HtmlStyle.colSecond, code); } /** diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java index f5bfb4a39bf..be59ef815c9 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java @@ -25,13 +25,13 @@ package jdk.javadoc.internal.doclets.formats.html; -import java.io.*; import java.util.*; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; +import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; @@ -168,11 +168,13 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter * {@inheritDoc} */ @Override - public void setSummaryColumnStyle(HtmlTree tdTree) { - if (foundNonPubConstructor) - tdTree.addStyle(HtmlStyle.colLast); - else - tdTree.addStyle(HtmlStyle.colOne); + public void setSummaryColumnStyleAndScope(HtmlTree thTree) { + if (foundNonPubConstructor) { + thTree.addStyle(HtmlStyle.colSecond); + } else { + thTree.addStyle(HtmlStyle.colFirst); + } + thTree.addAttr(HtmlAttr.SCOPE, "row"); } /** @@ -267,9 +269,8 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter if (foundNonPubConstructor) { header.add(resources.getText("doclet.Modifier")); } - header.add(resources.getText("doclet.0_and_1", - resources.getText("doclet.Constructor"), - resources.getText("doclet.Description"))); + header.add(resources.getText("doclet.Constructor")); + header.add(resources.getText("doclet.Description")); return header; } diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java index 71b7e89e1d4..ef7681cf115 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java @@ -261,14 +261,13 @@ public class DeprecatedListWriter extends SubWriterHolderWriter { for (DeprElementKind kind : DeprElementKind.values()) { if (deprapi.hasDocumentation(kind)) { addAnchor(deprapi, kind, div); - memberTableSummary = - configuration.getText("doclet.Member_Table_Summary", - configuration.getText(getHeadingKey(kind)), - configuration.getText(getSummaryKey(kind))); + memberTableSummary + = resources.getText("doclet.Member_Table_Summary", + resources.getText(getHeadingKey(kind)), + resources.getText(getSummaryKey(kind))); List memberTableHeader = new ArrayList<>(); - memberTableHeader.add(configuration.getText("doclet.0_and_1", - configuration.getText(getHeaderKey(kind)), - configuration.getText("doclet.Description"))); + memberTableHeader.add(resources.getText(getHeaderKey(kind))); + memberTableHeader.add(resources.getText("doclet.Description")); if (kind == DeprElementKind.PACKAGE) addPackageDeprecatedAPI(deprapi.getSet(kind), getHeadingKey(kind), memberTableSummary, memberTableHeader, div); diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriterImpl.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriterImpl.java index b4f6ccedb99..26a2c264499 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriterImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriterImpl.java @@ -25,8 +25,7 @@ package jdk.javadoc.internal.doclets.formats.html; -import java.io.*; - +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -34,6 +33,7 @@ import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; +import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; @@ -214,9 +214,8 @@ public class EnumConstantWriterImpl extends AbstractMemberWriter */ @Override public List getSummaryTableHeader(Element member) { - List header = Arrays.asList(configuration.getText("doclet.0_and_1", - configuration.getText("doclet.Enum_Constant"), - configuration.getText("doclet.Description"))); + List header = Arrays.asList(resources.getText("doclet.Enum_Constant"), + resources.getText("doclet.Description")); return header; } @@ -259,8 +258,9 @@ public class EnumConstantWriterImpl extends AbstractMemberWriter * {@inheritDoc} */ @Override - public void setSummaryColumnStyle(HtmlTree tdTree) { - tdTree.addStyle(HtmlStyle.colOne); + public void setSummaryColumnStyleAndScope(HtmlTree thTree) { + thTree.addStyle(HtmlStyle.colFirst); + thTree.addAttr(HtmlAttr.SCOPE, "row"); } /** diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java index 9afabb7aa7b..9a9c7a9d59a 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java @@ -25,7 +25,6 @@ package jdk.javadoc.internal.doclets.formats.html; -import java.io.*; import java.util.Arrays; import java.util.List; @@ -215,9 +214,7 @@ public class FieldWriterImpl extends AbstractMemberWriter @Override public List getSummaryTableHeader(Element member) { List header = Arrays.asList(writer.getModifierTypeHeader(), - resources.getText("doclet.0_and_1", - resources.getText("doclet.Field"), - resources.getText("doclet.Description"))); + resources.getText("doclet.Field"), resources.getText("doclet.Description")); return header; } diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java index 0703094fd3f..96a5e887ed6 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java @@ -405,7 +405,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { } Content classContent = getLink(new LinkInfoImpl( configuration, LinkInfoImpl.Kind.PACKAGE, te)); - Content tdClass = HtmlTree.TD(HtmlStyle.colFirst, classContent); + Content tdClass = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, classContent); HtmlTree tr = HtmlTree.TR(tdClass); tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor); altColor = !altColor; @@ -942,16 +942,20 @@ public class HtmlDocletWriter extends HtmlDocWriter { Content tr = new HtmlTree(HtmlTag.TR); final int size = header.size(); Content tableHeader; - if (size == 1) { + if (size == 2) { tableHeader = new StringContent(header.get(0)); - tr.addContent(HtmlTree.TH(HtmlStyle.colOne, scope, tableHeader)); + tr.addContent(HtmlTree.TH(HtmlStyle.colFirst, scope, tableHeader)); + tableHeader = new StringContent(header.get(1)); + tr.addContent(HtmlTree.TH(HtmlStyle.colLast, scope, tableHeader)); return tr; } for (int i = 0; i < size; i++) { tableHeader = new StringContent(header.get(i)); - if(i == 0) + if (i == 0) tr.addContent(HtmlTree.TH(HtmlStyle.colFirst, scope, tableHeader)); - else if(i == (size - 1)) + else if (i == 1) + tr.addContent(HtmlTree.TH(HtmlStyle.colSecond, scope, tableHeader)); + else if (i == (size - 1)) tr.addContent(HtmlTree.TH(HtmlStyle.colLast, scope, tableHeader)); else tr.addContent(HtmlTree.TH(scope, tableHeader)); @@ -1062,13 +1066,16 @@ public class HtmlDocletWriter extends HtmlDocWriter { boolean altColor = true; for (Element e : deprPkgs) { PackageElement pkg = (PackageElement) e; - HtmlTree td = HtmlTree.TD(HtmlStyle.colOne, + HtmlTree thRow = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, getPackageLink(pkg, getPackageName(pkg))); + HtmlTree tr = HtmlTree.TR(thRow); + HtmlTree tdDesc = new HtmlTree(HtmlTag.TD); + tdDesc.addStyle(HtmlStyle.colLast); List extends DocTree> tags = utils.getDeprecatedTrees(pkg); if (!tags.isEmpty()) { - addInlineDeprecatedComment(pkg, tags.get(0), td); + addInlineDeprecatedComment(pkg, tags.get(0), tdDesc); } - HtmlTree tr = HtmlTree.TR(td); + tr.addContent(tdDesc); tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor); altColor = !altColor; tbody.addContent(tr); diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriterImpl.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriterImpl.java index 6c94d1eb3a8..89abfce4ecb 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriterImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriterImpl.java @@ -261,9 +261,7 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter @Override public List getSummaryTableHeader(Element member) { List header = Arrays.asList(writer.getModifierTypeHeader(), - resources.getText("doclet.0_and_1", - resources.getText("doclet.Method"), - resources.getText("doclet.Description"))); + resources.getText("doclet.Method"), resources.getText("doclet.Description")); return header; } diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexWriter.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexWriter.java index 866dc2c4382..5ff751d9f0e 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexWriter.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexWriter.java @@ -159,11 +159,11 @@ public class ModuleIndexWriter extends AbstractModuleIndexWriter { for (ModuleElement mdle : modules) { if (!mdle.isUnnamed()) { Content moduleLinkContent = getModuleLink(mdle, new StringContent(mdle.getQualifiedName().toString())); - Content tdModule = HtmlTree.TD(HtmlStyle.colFirst, moduleLinkContent); + Content thModule = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, moduleLinkContent); HtmlTree tdSummary = new HtmlTree(HtmlTag.TD); tdSummary.addStyle(HtmlStyle.colLast); addSummaryComment(mdle, tdSummary); - HtmlTree tr = HtmlTree.TR(tdModule); + HtmlTree tr = HtmlTree.TR(thModule); tr.addContent(tdSummary); tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor); tbody.addContent(tr); diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java index b79ff717281..75ee6180efd 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java @@ -294,11 +294,11 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW public void addRequiresList(ModuleElement.RequiresDirective direct, Content tbody, boolean altColor) { ModuleElement m = direct.getDependency(); Content moduleLinkContent = getModuleLink(m, new StringContent(m.getQualifiedName().toString())); - Content tdPackage = HtmlTree.TD(HtmlStyle.colFirst, moduleLinkContent); + Content thPackage = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, moduleLinkContent); HtmlTree tdSummary = new HtmlTree(HtmlTag.TD); tdSummary.addStyle(HtmlStyle.colLast); addSummaryComment(m, tdSummary); - HtmlTree tr = HtmlTree.TR(tdPackage); + HtmlTree tr = HtmlTree.TR(thPackage); tr.addContent(tdSummary); tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor); tbody.addContent(tr); @@ -347,27 +347,27 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW public void addExportedPackagesList(ModuleElement.ExportsDirective direct, Content tbody, boolean altColor) { PackageElement pkg = direct.getPackage(); Content pkgLinkContent = getPackageLink(pkg, new StringContent(utils.getPackageName(pkg))); - Content tdPackage = HtmlTree.TD(HtmlStyle.colFirst, pkgLinkContent); - HtmlTree tdModules = new HtmlTree(HtmlTag.TD); - tdModules.addStyle(HtmlStyle.colSecond); + Content tdPackage = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, pkgLinkContent); + HtmlTree thModules = new HtmlTree(HtmlTag.TD); + thModules.addStyle(HtmlStyle.colSecond); List extends ModuleElement> targetModules = direct.getTargetModules(); if (targetModules != null) { List extends ModuleElement> mElements = direct.getTargetModules(); for (int i = 0; i < mElements.size(); i++) { if (i > 0) { - tdModules.addContent(new HtmlTree(HtmlTag.BR)); + thModules.addContent(new HtmlTree(HtmlTag.BR)); } ModuleElement m = mElements.get(i); - tdModules.addContent(new StringContent(m.getQualifiedName().toString())); + thModules.addContent(new StringContent(m.getQualifiedName().toString())); } } else { - tdModules.addContent(configuration.getText("doclet.All_Modules")); + thModules.addContent(configuration.getText("doclet.All_Modules")); } HtmlTree tdSummary = new HtmlTree(HtmlTag.TD); tdSummary.addStyle(HtmlStyle.colLast); addSummaryComment(pkg, tdSummary); HtmlTree tr = HtmlTree.TR(tdPackage); - tr.addContent(tdModules); + tr.addContent(thModules); tr.addContent(tdSummary); tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor); tbody.addContent(tr); @@ -428,11 +428,11 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW public void addUsesList(ModuleElement.UsesDirective direct, Content tbody, boolean altColor) { TypeElement type = direct.getService(); Content typeLinkContent = getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.PACKAGE, type)); - Content tdPackage = HtmlTree.TD(HtmlStyle.colFirst, typeLinkContent); + Content thPackage = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, typeLinkContent); HtmlTree tdSummary = new HtmlTree(HtmlTag.TD); tdSummary.addStyle(HtmlStyle.colLast); addSummaryComment(type, tdSummary); - HtmlTree tr = HtmlTree.TR(tdPackage); + HtmlTree tr = HtmlTree.TR(thPackage); tr.addContent(tdSummary); tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor); tbody.addContent(tr); @@ -463,18 +463,18 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW TypeElement srv = direct.getService(); Content implLinkContent = getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.PACKAGE, impl)); Content srvLinkContent = getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.PACKAGE, srv)); - HtmlTree tdType = HtmlTree.TD(HtmlStyle.colFirst, srvLinkContent); - tdType.addContent(new HtmlTree(HtmlTag.BR)); - tdType.addContent("("); + HtmlTree thType = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, srvLinkContent); + thType.addContent(new HtmlTree(HtmlTag.BR)); + thType.addContent("("); HtmlTree implSpan = HtmlTree.SPAN(HtmlStyle.implementationLabel, contents.implementation); - tdType.addContent(implSpan); - tdType.addContent(Contents.SPACE); - tdType.addContent(implLinkContent); - tdType.addContent(")"); + thType.addContent(implSpan); + thType.addContent(Contents.SPACE); + thType.addContent(implLinkContent); + thType.addContent(")"); HtmlTree tdDesc = new HtmlTree(HtmlTag.TD); tdDesc.addStyle(HtmlStyle.colLast); addSummaryComment(srv, tdDesc); - HtmlTree tr = HtmlTree.TR(tdType); + HtmlTree tr = HtmlTree.TR(thType); tr.addContent(tdDesc); tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor); tbody.addContent(tr); diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriterImpl.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriterImpl.java index f43f53eb39a..4c34b2ec9df 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriterImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriterImpl.java @@ -25,8 +25,6 @@ package jdk.javadoc.internal.doclets.formats.html; -import java.io.*; - import java.util.Arrays; import java.util.List; @@ -118,15 +116,11 @@ public class NestedClassWriterImpl extends AbstractMemberWriter public List getSummaryTableHeader(Element member) { if (utils.isInterface(member)) { return Arrays.asList(writer.getModifierTypeHeader(), - configuration.getText("doclet.0_and_1", - configuration.getText("doclet.Interface"), - configuration.getText("doclet.Description"))); + resources.getText("doclet.Interface"), resources.getText("doclet.Description")); } else { return Arrays.asList(writer.getModifierTypeHeader(), - configuration.getText("doclet.0_and_1", - configuration.getText("doclet.Class"), - configuration.getText("doclet.Description"))); + resources.getText("doclet.Class"), resources.getText("doclet.Description")); } } diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageIndexWriter.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageIndexWriter.java index f9c0d3b3613..f6360804701 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageIndexWriter.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageIndexWriter.java @@ -151,11 +151,11 @@ public class PackageIndexWriter extends AbstractPackageIndexWriter { if (!pkg.isUnnamed()) { if (!(configuration.nodeprecated && utils.isDeprecated(pkg))) { Content packageLinkContent = getPackageLink(pkg, getPackageName(pkg)); - Content tdPackage = HtmlTree.TD(HtmlStyle.colFirst, packageLinkContent); + Content thPackage = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, packageLinkContent); HtmlTree tdSummary = new HtmlTree(HtmlTag.TD); tdSummary.addStyle(HtmlStyle.colLast); addSummaryComment(pkg, tdSummary); - HtmlTree tr = HtmlTree.TR(tdPackage); + HtmlTree tr = HtmlTree.TR(thPackage); tr.addContent(tdSummary); tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor); tbody.addContent(tr); diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageUseWriter.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageUseWriter.java index 05b966ec318..726c64ff927 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageUseWriter.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageUseWriter.java @@ -187,9 +187,7 @@ public class PackageUseWriter extends SubWriterHolderWriter { */ protected void addClassList(Content contentTree) { List classTableHeader = Arrays.asList( - configuration.getText("doclet.0_and_1", - configuration.getText("doclet.Class"), - configuration.getText("doclet.Description"))); + resources.getText("doclet.Class"), resources.getText("doclet.Description")); for (String packageName : usingPackageToUsedClasses.keySet()) { PackageElement usingPackage = utils.elementUtils.getPackageElement(packageName); HtmlTree li = new HtmlTree(HtmlTag.LI); @@ -234,10 +232,13 @@ public class PackageUseWriter extends SubWriterHolderWriter { DocPath dp = pathString(usedClass, DocPaths.CLASS_USE.resolve(DocPath.forName(utils, usedClass))); StringContent stringContent = new StringContent(utils.getSimpleName(usedClass)); - Content td = HtmlTree.TD(HtmlStyle.colOne, + Content thType = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, getHyperLink(dp.fragment(getPackageAnchorName(pkg)), stringContent)); - addIndexComment(usedClass, td); - contentTree.addContent(td); + contentTree.addContent(thType); + HtmlTree tdDesc = new HtmlTree(HtmlTag.TD); + tdDesc.addStyle(HtmlStyle.colLast); + addIndexComment(usedClass, tdDesc); + contentTree.addContent(tdDesc); } /** @@ -247,10 +248,10 @@ public class PackageUseWriter extends SubWriterHolderWriter { * @param contentTree the content tree to which the information will be added */ protected void addPackageUse(PackageElement pkg, Content contentTree) { - Content tdFirst = HtmlTree.TD(HtmlStyle.colFirst, + Content thFirst = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, getHyperLink(utils.getPackageName(pkg), new StringContent(utils.getPackageName(pkg)))); - contentTree.addContent(tdFirst); + contentTree.addContent(thFirst); HtmlTree tdLast = new HtmlTree(HtmlTag.TD); tdLast.addStyle(HtmlStyle.colLast); if (pkg != null && !pkg.isUnnamed()) { diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java index f6c2eaba492..e787014a798 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java @@ -229,8 +229,8 @@ public class PackageWriterImpl extends HtmlDocletWriter } Content classContent = getLink(new LinkInfoImpl( configuration, LinkInfoImpl.Kind.PACKAGE, klass)); - Content tdClass = HtmlTree.TD(HtmlStyle.colFirst, classContent); - HtmlTree tr = HtmlTree.TR(tdClass); + Content thClass = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, classContent); + HtmlTree tr = HtmlTree.TR(thClass); tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor); HtmlTree tdClassDescription = new HtmlTree(HtmlTag.TD); diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java index 24c9f96776c..7538fd6c57a 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java @@ -25,8 +25,6 @@ package jdk.javadoc.internal.doclets.formats.html; -import java.io.*; - import java.util.Arrays; import java.util.List; @@ -235,10 +233,8 @@ public class PropertyWriterImpl extends AbstractMemberWriter */ @Override public List getSummaryTableHeader(Element member) { - List header = Arrays.asList(configuration.getText("doclet.Type"), - configuration.getText("doclet.0_and_1", - configuration.getText("doclet.Property"), - configuration.getText("doclet.Description"))); + List header = Arrays.asList(resources.getText("doclet.Type"), + resources.getText("doclet.Property"), resources.getText("doclet.Description")); return header; } diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java index 3b5de9f4cd4..e6c262d7cfc 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java @@ -48,7 +48,6 @@ public enum HtmlStyle { classUseContainer, colFirst, colLast, - colOne, colSecond, constantsSummary, constantValuesContainer, diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlTree.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlTree.java index 2b4e0def4b6..062dccc8e12 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlTree.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlTree.java @@ -807,6 +807,17 @@ public class HtmlTree extends Content { return TH(null, scope, body); } + /** + * Generates a TH tag with style class, scope attribute and some content. + * + * @param styleClass style for the tag + * @param body content for the tag + * @return an HtmlTree object for the TH tag + */ + public static HtmlTree TH_ROW_SCOPE(HtmlStyle styleClass, Content body) { + return TH(styleClass, "row", body); + } + /** * Generates a TITLE tag with some content. * diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css index a74bf144c27..99ce43cb68d 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css @@ -528,20 +528,23 @@ Table styles float:left; } +.rowColor th, .altColor th { + font-weight:normal; +} .overviewSummary td, .memberSummary td, .typeSummary td, .useSummary td, .constantsSummary td, .deprecatedSummary td, .requiresSummary td, .packagesSummary td, .providesSummary td, .usesSummary td { text-align:left; padding:0px 0px 12px 10px; } -th.colOne, th.colFirst, th.colSecond, th.colLast, .useSummary th, .constantsSummary th, .packagesSummary th, -td.colOne, td.colFirst, td.colSecond, td.colLast, .useSummary td, .constantsSummary td { +th.colFirst, th.colSecond, th.colLast, .useSummary th, .constantsSummary th, .packagesSummary th, +td.colFirst, td.colSecond, td.colLast, .useSummary td, .constantsSummary td { vertical-align:top; padding-right:0px; padding-top:8px; padding-bottom:3px; } -th.colFirst, th.colSecond, th.colLast, th.colOne, .constantsSummary th, .packagesSummary th { +th.colFirst, th.colSecond, th.colLast, .constantsSummary th, .packagesSummary th { background:#dee3e9; text-align:left; padding:8px 3px 3px 7px; @@ -550,10 +553,10 @@ td.colFirst, th.colFirst { white-space:nowrap; font-size:13px; } -td.colLast, th.colLast { +td.colSecond, th.colSecond, td.colLast, th.colLast { font-size:13px; } -td.colOne, th.colOne, .constantsSummary th, .packagesSummary th { +.constantsSummary th, .packagesSummary th { font-size:13px; } .providesSummary th.colFirst, .providesSummary th.colLast, .providesSummary td.colFirst, @@ -567,23 +570,22 @@ td.colOne, th.colOne, .constantsSummary th, .packagesSummary th { .packagesSummary td.colFirst, .packagesSummary td.colSecond, .packagesSummary th.colFirst, .packagesSummary th, .usesSummary td.colFirst, .usesSummary th.colFirst, .useSummary td.colFirst, .useSummary th.colFirst, -.overviewSummary td.colOne, .overviewSummary th.colOne, .memberSummary td.colFirst, .memberSummary th.colFirst, -.memberSummary td.colOne, .memberSummary th.colOne, +.memberSummary td.colSecond, .memberSummary th.colSecond, .typeSummary td.colFirst{ width:25%; vertical-align:top; } -td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colSecond a:link, td.colSecond a:active, td.colSecond a:visited, td.colSecond a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { +td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colSecond a:link, td.colSecond a:active, td.colSecond a:visited, td.colSecond a:hover, th.colFirst a:link, th.colFirst a:active, th.colFirst a:visited, th.colFirst a:hover, th.colSecond a:link, th.colSecond a:active, th.colSecond a:visited, th.colSecond a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { font-weight:bold; } .tableSubHeadingColor { background-color:#EEEEFF; } -.altColor { +.altColor, .altColor th { background-color:#FFFFFF; } -.rowColor { +.rowColor, .rowColor th { background-color:#EEEEEF; } /* @@ -774,4 +776,4 @@ ul.ui-autocomplete li { .searchTagHolderResult { font-style:italic; font-size:12px; -} +} \ No newline at end of file diff --git a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/classfile/TypeAnnotation.java b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/classfile/TypeAnnotation.java index 21473f4aeb5..5d591705d52 100644 --- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/classfile/TypeAnnotation.java +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/classfile/TypeAnnotation.java @@ -130,10 +130,7 @@ public class TypeAnnotation { break; // class extends or implements clause case CLASS_EXTENDS: - int in = cr.readUnsignedShort(); - if (in == 0xFFFF) - in = -1; - position.type_index = in; + position.type_index = cr.readUnsignedShort();; break; // throws case THROWS: diff --git a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/Analyzer.java b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/Analyzer.java index aeb712bbc90..d60eea8d35f 100644 --- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/Analyzer.java +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/Analyzer.java @@ -256,7 +256,7 @@ public class Analyzer { // return classname or package name depending on the level private String getLocationName(Location o) { if (level == Type.CLASS || level == Type.VERBOSE) { - return o.getClassName(); + return VersionHelper.get(o.getClassName()); } else { String pkg = o.getPackageName(); return pkg.isEmpty() ? " " : pkg; diff --git a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/Archive.java b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/Archive.java index fd5b9a2ed90..3233d61baef 100644 --- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/Archive.java +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/Archive.java @@ -45,9 +45,9 @@ import java.util.stream.Stream; * Represents the source of the class files. */ public class Archive implements Closeable { - public static Archive getInstance(Path p) { + public static Archive getInstance(Path p, Runtime.Version version) { try { - return new Archive(p, ClassFileReader.newInstance(p)); + return new Archive(p, ClassFileReader.newInstance(p, version)); } catch (IOException e) { throw new UncheckedIOException(e); } diff --git a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ClassFileReader.java b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ClassFileReader.java index c1b4311a7f1..a72a5152d3c 100644 --- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ClassFileReader.java +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ClassFileReader.java @@ -29,6 +29,8 @@ import com.sun.tools.classfile.ClassFile; import com.sun.tools.classfile.ConstantPoolException; import com.sun.tools.classfile.Dependencies.ClassFileError; +import jdk.internal.util.jar.VersionedStream; + import java.io.Closeable; import java.io.File; import java.io.FileNotFoundException; @@ -50,6 +52,7 @@ import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.stream.Collectors; import java.util.stream.Stream; +import java.util.zip.ZipFile; /** * ClassFileReader reads ClassFile(s) of a given path that can be @@ -60,6 +63,13 @@ public class ClassFileReader implements Closeable { * Returns a ClassFileReader instance of a given path. */ public static ClassFileReader newInstance(Path path) throws IOException { + return newInstance(path, JarFile.baseVersion()); + } + + /** + * Returns a ClassFileReader instance of a given path. + */ + public static ClassFileReader newInstance(Path path, Runtime.Version version) throws IOException { if (Files.notExists(path)) { throw new FileNotFoundException(path.toString()); } @@ -67,19 +77,12 @@ public class ClassFileReader implements Closeable { if (Files.isDirectory(path)) { return new DirectoryReader(path); } else if (path.getFileName().toString().endsWith(".jar")) { - return new JarFileReader(path); + return new JarFileReader(path, version); } else { return new ClassFileReader(path); } } - /** - * Returns a ClassFileReader instance of a given JarFile. - */ - public static ClassFileReader newInstance(Path path, JarFile jf) throws IOException { - return new JarFileReader(path, jf); - } - /** * Returns a ClassFileReader instance of a given FileSystem and path. * @@ -302,13 +305,16 @@ public class ClassFileReader implements Closeable { static class JarFileReader extends ClassFileReader { private final JarFile jarfile; - JarFileReader(Path path) throws IOException { - this(path, new JarFile(path.toFile(), false)); + private final Runtime.Version version; + + JarFileReader(Path path, Runtime.Version version) throws IOException { + this(path, openJarFile(path.toFile(), version), version); } - JarFileReader(Path path, JarFile jf) throws IOException { + JarFileReader(Path path, JarFile jf, Runtime.Version version) throws IOException { super(path); this.jarfile = jf; + this.version = version; } @Override @@ -316,9 +322,26 @@ public class ClassFileReader implements Closeable { jarfile.close(); } + private static JarFile openJarFile(File f, Runtime.Version version) + throws IOException { + JarFile jf; + if (version == null) { + jf = new JarFile(f, false); + if (jf.isMultiRelease()) { + throw new MultiReleaseException("err.multirelease.option.notfound", f.getName()); + } + } else { + jf = new JarFile(f, false, ZipFile.OPEN_READ, version); + if (!jf.isMultiRelease()) { + throw new MultiReleaseException("err.multirelease.option.exists", f.getName()); + } + } + return jf; + } + protected Set scan() { - try (JarFile jf = new JarFile(path.toFile())) { - return jf.stream().map(JarEntry::getName) + try (JarFile jf = openJarFile(path.toFile(), version)) { + return VersionedStream.stream(jf).map(JarEntry::getName) .filter(n -> n.endsWith(".class")) .collect(Collectors.toSet()); } catch (IOException e) { @@ -348,15 +371,14 @@ public class ClassFileReader implements Closeable { } protected ClassFile readClassFile(JarFile jarfile, JarEntry e) throws IOException { - InputStream is = null; - try { - is = jarfile.getInputStream(e); - return ClassFile.read(is); + try (InputStream is = jarfile.getInputStream(e)) { + ClassFile cf = ClassFile.read(is); + if (jarfile.isMultiRelease()) { + VersionHelper.add(jarfile, e, cf); + } + return cf; } catch (ConstantPoolException ex) { throw new ClassFileError(ex); - } finally { - if (is != null) - is.close(); } } @@ -370,6 +392,21 @@ public class ClassFileReader implements Closeable { } } + Enumeration versionedEntries(JarFile jf) { + Iterator it = VersionedStream.stream(jf).iterator(); + return new Enumeration<>() { + @Override + public boolean hasMoreElements() { + return it.hasNext(); + } + + @Override + public JarEntry nextElement() { + return it.next(); + } + }; + } + class JarFileIterator implements Iterator { protected final JarFileReader reader; protected Enumeration entries; @@ -388,7 +425,7 @@ public class ClassFileReader implements Closeable { if (jarfile == null) return; this.jf = jarfile; - this.entries = jf.entries(); + this.entries = versionedEntries(jf); this.nextEntry = nextEntry(); } diff --git a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsConfiguration.java b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsConfiguration.java index 3c4632a8078..b6640b1a4ba 100644 --- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsConfiguration.java +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsConfiguration.java @@ -81,19 +81,22 @@ public class JdepsConfiguration implements AutoCloseable { private final List initialArchives = new ArrayList<>(); private final Set rootModules = new HashSet<>(); private final Configuration configuration; + private final Runtime.Version version; private JdepsConfiguration(SystemModuleFinder systemModulePath, ModuleFinder finder, Set roots, List classpaths, List initialArchives, - boolean allDefaultModules) + boolean allDefaultModules, + Runtime.Version version) throws IOException { trace("root: %s%n", roots); this.system = systemModulePath; this.finder = finder; + this.version = version; // build root set for resolution Set mods = new HashSet<>(roots); @@ -121,7 +124,7 @@ public class JdepsConfiguration implements AutoCloseable { // classpath archives for (Path p : classpaths) { if (Files.exists(p)) { - Archive archive = Archive.getInstance(p); + Archive archive = Archive.getInstance(p, version); addPackagesInUnnamedModule(archive); classpathArchives.add(archive); } @@ -292,7 +295,7 @@ public class JdepsConfiguration implements AutoCloseable { if (location.getScheme().equals("jrt")) { reader = system.getClassReader(mn); } else { - reader = ClassFileReader.newInstance(Paths.get(location)); + reader = ClassFileReader.newInstance(Paths.get(location), version); } builder.classes(reader); @@ -304,6 +307,10 @@ public class JdepsConfiguration implements AutoCloseable { } } + public Runtime.Version getVersion() { + return version; + } + /* * Close all archives e.g. JarFile */ @@ -476,6 +483,7 @@ public class JdepsConfiguration implements AutoCloseable { ModuleFinder appModulePath; boolean addAllApplicationModules; boolean addAllDefaultModules; + Runtime.Version version; public Builder() { this.systemModulePath = new SystemModuleFinder(); @@ -526,8 +534,13 @@ public class JdepsConfiguration implements AutoCloseable { return this; } + public Builder multiRelease(Runtime.Version version) { + this.version = version; + return this; + } + public Builder addRoot(Path path) { - Archive archive = Archive.getInstance(path); + Archive archive = Archive.getInstance(path, version); if (archive.contains(MODULE_INFO)) { paths.add(path); } else { @@ -569,7 +582,8 @@ public class JdepsConfiguration implements AutoCloseable { rootModules, classPaths, initialArchives, - addAllDefaultModules); + addAllDefaultModules, + version); } private static ModuleFinder createModulePathFinder(String mpaths) { diff --git a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsTask.java b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsTask.java index 38e1d08c6ef..862c5261859 100644 --- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsTask.java +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsTask.java @@ -36,6 +36,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.text.MessageFormat; import java.util.*; +import java.util.jar.JarFile; import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -389,6 +390,23 @@ class JdepsTask { } } }, + new Option(true, "--multi-release") { + void process(JdepsTask task, String opt, String arg) throws BadArgs { + if (arg.equalsIgnoreCase("base")) { + task.options.multiRelease = JarFile.baseVersion(); + } else { + try { + int v = Integer.parseInt(arg); + if (v < 9) { + throw new BadArgs("err.invalid.arg.for.option", arg); + } + } catch (NumberFormatException x) { + throw new BadArgs("err.invalid.arg.for.option", arg); + } + task.options.multiRelease = Runtime.Version.parse(arg); + } + } + }, }; private static final String PROGNAME = "jdeps"; @@ -481,6 +499,9 @@ class JdepsTask { } catch (IOException e) { e.printStackTrace(); return EXIT_CMDERR; + } catch (MultiReleaseException e) { + reportError(e.getKey(), (Object)e.getMsg()); + return EXIT_CMDERR; // could be EXIT_ABNORMAL sometimes } finally { log.flush(); } @@ -541,11 +562,16 @@ class JdepsTask { if (options.classpath != null) builder.addClassPath(options.classpath); + if (options.multiRelease != null) + builder.multiRelease(options.multiRelease); + // build the root set of archives to be analyzed for (String s : inputArgs) { Path p = Paths.get(s); if (Files.exists(p)) { builder.addRoot(p); + } else { + warning("warn.invalid.arg", s); } } @@ -839,6 +865,7 @@ class JdepsTask { String modulePath; String rootModule; Set addmods = new HashSet<>(); + Runtime.Version multiRelease; boolean hasFilter() { return numFilters() > 0; diff --git a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/MultiReleaseException.java b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/MultiReleaseException.java new file mode 100644 index 00000000000..feb35989334 --- /dev/null +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/MultiReleaseException.java @@ -0,0 +1,69 @@ +/* + * 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 com.sun.tools.jdeps; + +/** + * Signals that an exception of some sort has occurred while processing + * a multi-release jar file. + * + * @since 9 + */ +class MultiReleaseException extends RuntimeException { + private static final long serialVersionUID = 4474870142461654108L; + private final String key; + private final String[] msg; + + /** + * Constructs an {@code MultiReleaseException} with the specified detail + * error message array. + * + * @param key + * The key that identifies the message in the jdeps.properties file + * @param msg + * The detail message array + */ + public MultiReleaseException(String key, String... msg) { + super(); + this.key = key; + this.msg = msg; + } + + /** + * Returns the resource message key + */ + public String getKey() { + return key; + } + + /** + * Returns the detailed error message array. + * + * @return the detailed error message array + */ + public String[] getMsg() { + return msg; + } +} diff --git a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/VersionHelper.java b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/VersionHelper.java new file mode 100644 index 00000000000..b94d87c1397 --- /dev/null +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/VersionHelper.java @@ -0,0 +1,75 @@ +/* + * 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 com.sun.tools.jdeps; + +import com.sun.tools.classfile.ClassFile; +import com.sun.tools.classfile.ConstantPoolException; +import jdk.internal.misc.SharedSecrets; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +public class VersionHelper { + private static final String META_INF_VERSIONS = "META-INF/versions/"; + private static final Map nameToVersion = new ConcurrentHashMap<>(); + + public static String get(String classname) { + if (nameToVersion.containsKey(classname)) { + return nameToVersion.get(classname) + "/" + classname; + } + return classname; + } + + public static void add(JarFile jarfile, JarEntry e, ClassFile cf) + throws ConstantPoolException + { + String realName = SharedSecrets.javaUtilJarAccess().getRealName(jarfile, e); + if (realName.startsWith(META_INF_VERSIONS)) { + int len = META_INF_VERSIONS.length(); + int n = realName.indexOf('/', len); + if (n > 0) { + String version = realName.substring(len, n); + assert (Integer.parseInt(version) > 8); + String name = cf.getName().replace('/', '.'); + if (nameToVersion.containsKey(name)) { + if (!version.equals(nameToVersion.get(name))) { + throw new MultiReleaseException( + "err.multirelease.version.associated", + name, nameToVersion.get(name), version + ); + } + } else { + nameToVersion.put(name, version); + } + } else { + throw new MultiReleaseException("err.multirelease.jar.malformed", + jarfile.getName(), realName); + } + } + } +} diff --git a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/resources/jdeps.properties b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/resources/jdeps.properties index 571126c7383..821c99d54e9 100644 --- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/resources/jdeps.properties +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/resources/jdeps.properties @@ -150,6 +150,11 @@ main.opt.q=\ \ -q -quiet Do not show missing dependencies from \n\ \ -genmoduleinfo output. +main.opt.multi-release=\ +\ --multi-release Specifies the version when processing\n\ +\ multi-release jar files. should\n\ +\ be integer >= 9 or base. + err.unknown.option=unknown option: {0} err.missing.arg=no value given for {0} err.invalid.arg.for.option=invalid argument for option: {0} @@ -164,7 +169,11 @@ err.module.not.found=module not found: {0} err.root.module.not.set=root module set empty err.invalid.inverse.option={0} cannot be used with -inverse option err.inverse.filter.not.set={0} cannot be used with -inverse option -warn.invalid.arg=Path not exist: {0} +err.multirelease.option.exists={0} is not a multi-release jar file, but the --multi-release option is set +err.multirelease.option.notfound={0} is a multi-release jar file, but the --multi-release option is not set +err.multirelease.version.associated=class {0} already associated with version {1}, trying to add version {2} +err.multirelease.jar.malformed=malformed multi-release jar, {0}, bad entry: {1} +warn.invalid.arg=Path does not exist: {0} warn.split.package=package {0} defined in {1} {2} warn.replace.useJDKInternals=\ JDK internal APIs are unsupported and private to JDK implementation that are\n\ diff --git a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties index 7f7f12c0433..5434e949328 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties +++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties @@ -543,7 +543,6 @@ Set the max length a displayed value.\n\ \n\ Where is the name of a previously defined feedback mode -- see '/help /set mode'.\n\ Where is an unsigned integer representing a maximum length.\n\ -Where is a quoted string which will be the value of the field if one of\n\ Where is only needed if you wish to fine-tune value truncation length\n\ by context, is the context in which the truncation is applied.\n\ The structure of selector is a hyphen separated list of selector kind lists.\n\ diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DemultiplexInput.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DemultiplexInput.java index 09912801f7b..5842ca9ca85 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DemultiplexInput.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DemultiplexInput.java @@ -45,6 +45,7 @@ class DemultiplexInput extends Thread { DemultiplexInput(InputStream input, Map io, Iterable closeList) { super("output reader"); + setDaemon(true); this.delegate = new DataInputStream(input); this.io = io; this.closeList = closeList; diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DirectExecutionControl.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DirectExecutionControl.java index ec54b1c8fa2..56e987ea6c8 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DirectExecutionControl.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DirectExecutionControl.java @@ -24,6 +24,7 @@ */ package jdk.jshell.execution; +import java.lang.reflect.Array; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -200,6 +201,21 @@ public class DirectExecutionControl implements ExecutionControl { return "\"" + (String) value + "\""; } else if (value instanceof Character) { return "'" + value + "'"; + } else if (value.getClass().isArray()) { + String tn = value.getClass().getTypeName(); + int len = Array.getLength(value); + StringBuilder sb = new StringBuilder(); + sb.append(tn.substring(tn.lastIndexOf('.') + 1, tn.length() - 1)); + sb.append(len); + sb.append("] { "); + for (int i = 0; i < len; ++i) { + sb.append(valueString(Array.get(value, i))); + if (i < len - 1) { + sb.append(", "); + } + } + sb.append(" }"); + return sb.toString(); } else { return value.toString(); } diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/JDIEventHandler.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/JDIEventHandler.java index e6bd57583ed..180216e5ffc 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/JDIEventHandler.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/JDIEventHandler.java @@ -53,6 +53,7 @@ class JDIEventHandler implements Runnable { this.vm = vm; this.reportVMExit = reportVMExit; this.thread = new Thread(this, "event-handler"); + this.thread.setDaemon(true); } /** diff --git a/langtools/test/jdk/javadoc/doclet/constantValues/TestConstantValuesDriver.java b/langtools/test/jdk/javadoc/doclet/constantValues/TestConstantValuesDriver.java index 882e8769281..f94cbc47194 100644 --- a/langtools/test/jdk/javadoc/doclet/constantValues/TestConstantValuesDriver.java +++ b/langtools/test/jdk/javadoc/doclet/constantValues/TestConstantValuesDriver.java @@ -23,7 +23,7 @@ /* * @test - * @bug 4504730 4526070 5077317 + * @bug 4504730 4526070 5077317 8162363 * @summary Test the generation of constant-values.html. * @author jamieh * @library ../lib @@ -53,29 +53,29 @@ public class TestConstantValuesDriver extends JavadocTester { "TEST4PASSES", " \"<Hello World>\"
", "public static final byte
\n" + - "\n" + + " " + - "BYTE_MAX_VALUE
\n" + " " + + "BYTE_MAX_VALUE
", " 127
public static final byte
\n" + - "\n" + + " " + - "BYTE_MIN_VALUE
\n" + " " + + "BYTE_MIN_VALUE
", " -127
public static final char
\n" + - "\n" + + " " + - "CHAR_MAX_VALUE
\n" + " " + + "CHAR_MAX_VALUE
", " 65535
public static final double
", - "\n" + + " " + - "DOUBLE_MAX_VALUE
\n" + " " + + "DOUBLE_MAX_VALUE
", " 1.7976931348623157E308
public static final double
\n" + - "", + " " + - "DOUBLE_MIN_VALUE
", " " + + "DOUBLE_MIN_VALUE
public static final boolean
\n" + - "", + " " + - "GOODBYE
", " " + + "GOODBYE
public static final boolean
\n" + - "\n" + + " HELLO
\n" + " HELLO
" ); } diff --git a/langtools/test/jdk/javadoc/doclet/testAnnotationTypes/TestAnnotationTypes.java b/langtools/test/jdk/javadoc/doclet/testAnnotationTypes/TestAnnotationTypes.java index ac867105ded..0cfe4b0f0e0 100644 --- a/langtools/test/jdk/javadoc/doclet/testAnnotationTypes/TestAnnotationTypes.java +++ b/langtools/test/jdk/javadoc/doclet/testAnnotationTypes/TestAnnotationTypes.java @@ -23,7 +23,7 @@ /* * @test - * @bug 4973609 8015249 8025633 8026567 6469561 8071982 + * @bug 4973609 8015249 8025633 8026567 6469561 8071982 8162363 * @summary Make sure that annotation types with 0 members does not have * extra HR tags. * @author jamieh @@ -56,9 +56,9 @@ public class TestAnnotationTypes extends JavadocTester { + "field.detail\">Field | ", "", " true
Field Summary
", - "", + + "", "", "
DEFAULT_NAME" - + "
DEFAULT_NAME
\n" + "static final java." diff --git a/langtools/test/jdk/javadoc/doclet/testHeadings/TestHeadings.java b/langtools/test/jdk/javadoc/doclet/testHeadings/TestHeadings.java index e93becd44ae..c7811ce5843 100644 --- a/langtools/test/jdk/javadoc/doclet/testHeadings/TestHeadings.java +++ b/langtools/test/jdk/javadoc/doclet/testHeadings/TestHeadings.java @@ -23,7 +23,7 @@ /* * @test - * @bug 4905786 6259611 + * @bug 4905786 6259611 8162363 * @summary Make sure that headings use the TH tag instead of the TD tag. * @author jamieh * @library ../lib @@ -76,7 +76,8 @@ public class TestHeadings extends JavadocTester { // Class documentation checkOutput("pkg1/C1.html", true, "Modifier and Type \n" - + "Field and Description ", + + "Field \n" + + "Description ", "Methods inherited from class java.lang.Object
"); // Class use documentation @@ -84,17 +85,19 @@ public class TestHeadings extends JavadocTester { "Package \n" + "Description ", "Modifier and Type \n" - + "Field and Description "); + + "Field \n" + + "Description "); // Deprecated checkOutput("deprecated-list.html", true, - "Method and Description "); + "Method \n" + + "Description "); // Constant values checkOutput("constant-values.html", true, "" + "Modifier and Type \n" - + "Constant Field \n" + + "Constant Field \n" + "Value "); // Serialized Form diff --git a/langtools/test/jdk/javadoc/doclet/testHtmlTableTags/TestHtmlTableTags.java b/langtools/test/jdk/javadoc/doclet/testHtmlTableTags/TestHtmlTableTags.java index e11de5b4e4a..87102f2d1f9 100644 --- a/langtools/test/jdk/javadoc/doclet/testHtmlTableTags/TestHtmlTableTags.java +++ b/langtools/test/jdk/javadoc/doclet/testHtmlTableTags/TestHtmlTableTags.java @@ -23,7 +23,7 @@ /* * @test - * @bug 6786688 8008164 + * @bug 6786688 8008164 8162363 * @summary HTML tables should have table summary, caption and table headers. * @author Bhavesh Patel * @library ../lib @@ -282,25 +282,32 @@ public class TestHtmlTableTags extends JavadocTester { // Class documentation checkOutput("pkg1/C1.html", true, "Modifier and Type \n" - + "Field and Description ", + + "Field \n" + + "Description ", "Modifier and Type \n" - + "Method and Description "); + + "Method \n" + + "Description "); checkOutput("pkg2/C2.html", true, "Modifier and Type \n" - + "Class and Description ", - "Constructor and Description "); + + "Class \n" + + "Description ", + "Constructor \n" + + "Description "); checkOutput("pkg2/C2.ModalExclusionType.html", true, - "Enum Constant and Description "); + "Enum Constant \n" + + "Description "); checkOutput("pkg2/C3.html", true, "Modifier and Type \n" - + "Required Element and Description "); + + "Required Element \n" + + "Description "); checkOutput("pkg2/C4.html", true, "Modifier and Type \n" - + "Optional Element and Description "); + + "Optional Element \n" + + "Description "); // Class use documentation checkOutput("pkg1/class-use/I1.html", true, @@ -309,43 +316,52 @@ public class TestHtmlTableTags extends JavadocTester { checkOutput("pkg1/class-use/C1.html", true, "Modifier and Type \n" - + "Field and Description ", + + "Field \n" + + "Description ", "Modifier and Type \n" - + "Method and Description "); + + "Method \n" + + "Description "); checkOutput("pkg2/class-use/C2.html", true, "Modifier and Type \n" - + "Field and Description ", + + "Field \n" + + "Description ", "Modifier and Type \n" - + "Method and Description "); + + "Method \n" + + "Description "); checkOutput("pkg2/class-use/C2.ModalExclusionType.html", true, "Package \n" + "Description ", "Modifier and Type \n" - + "Method and Description "); + + "Method \n" + + "Description "); // Package use documentation checkOutput("pkg1/package-use.html", true, "Package \n" + "Description ", - "Class and Description "); + "Class \n" + + "Description "); checkOutput("pkg2/package-use.html", true, "Package \n" + "Description ", - "Class and Description "); + "Class \n" + + "Description "); // Deprecated checkOutput("deprecated-list.html", true, - "Field and Description ", - "Method and Description "); + "Field \n" + + "Description ", + "Method \n" + + "Description "); // Constant values checkOutput("constant-values.html", true, "" + "Modifier and Type \n" - + "Constant Field \n" + "Value "); diff --git a/langtools/test/jdk/javadoc/doclet/testJavaFX/TestJavaFX.java b/langtools/test/jdk/javadoc/doclet/testJavaFX/TestJavaFX.java index b7543b5a6d3..e738b85d0f9 100644 --- a/langtools/test/jdk/javadoc/doclet/testJavaFX/TestJavaFX.java +++ b/langtools/test/jdk/javadoc/doclet/testJavaFX/TestJavaFX.java @@ -23,7 +23,7 @@ /* * @test - * @bug 7112427 8012295 8025633 8026567 8061305 8081854 8150130 + * @bug 7112427 8012295 8025633 8026567 8061305 8081854 8150130 8162363 * @summary Test of the JavaFX doclet features. * @author jvalenta * @library ../lib @@ -61,19 +61,17 @@ public class TestJavaFX extends JavadocTester { + "Gets the value of the property rate.\n" + "\n" + "
- Property description:
", - "" - + "rate
\n" - + "Defines the direction/speed at which the " - + "Timeline
is expected to", + "" + + "rate
", "Default value:", "Since:\n" + "- JavaFX 8.0
", "Sets the value of the property
Property
", "Gets the value of the property
Property
", "Property description:", - "", + + "setTestMethodProperty()", " " + "
" + "" - + "setTestMethodProperty()
isPaused
\n" + "public final double isPaused()\n" + "Gets the value of the property paused."); @@ -152,34 +150,34 @@ public class TestJavaFX extends JavadocTester { checkOutput("pkg2/Test.html", false, "Property Summary
"); checkOutput("pkg2/Test.html", true, "Modifier and Type \n" - + "Method and Description \n" + + "Method \n" + + "Description \n" + "\n" + "\n" + " \n" + "\n" - + " <T> java.lang.Object
\n" + + " " - + "" - + "alphaProperty(java.util.List<T> foo)
\n" + + " " + + "alphaProperty" + + "(java.util.List<T> foo)
\n" + " \n" + " \n" + "\n" - + " java.lang.Object
\n" + + " " - + "betaProperty()
" - + "\n" + + " " + + "betaProperty()
\n" + " \n" - + " \n" + "" - + "java.util.List<java.util.Set<? super java.lang.Object>>" + + "
\n" - + " java.util.List<java.util.Set<? super java.lang.Object>>" + "
\n" + + " " - + "" - + "deltaProperty()
\n" + + " " + + "deltaProperty()
\n" + " \n" - + " \n" - + " java.util.List<java.lang.String>" - + "
" + + " " - + "gammaProperty" - + "()
\n" + + " java.util.List<java.lang.String>
\n" + + " " + + "gammaProperty()
" ); } diff --git a/langtools/test/jdk/javadoc/doclet/testMemberInheritence/TestMemberInheritence.java b/langtools/test/jdk/javadoc/doclet/testMemberInheritence/TestMemberInheritence.java index 9b1b4257ea8..3ad67a283eb 100644 --- a/langtools/test/jdk/javadoc/doclet/testMemberInheritence/TestMemberInheritence.java +++ b/langtools/test/jdk/javadoc/doclet/testMemberInheritence/TestMemberInheritence.java @@ -23,7 +23,7 @@ /* * @test - * @bug 4638588 4635809 6256068 6270645 8025633 8026567 + * @bug 4638588 4635809 6256068 6270645 8025633 8026567 8162363 * @summary Test to make sure that members are inherited properly in the Javadoc. * Verify that inheritence labels are correct. * @author jamieh @@ -90,10 +90,10 @@ public class TestMemberInheritence extends JavadocTester { checkOutput("pkg1/Implementer.html", true, // ensure the method makes it " \n" - + " static java.time.Period
", + + " java.time.LocalDate endDateExclusive)", // check the inherited from interfaces " " + + "
" + "" + "between(java.time.LocalDate startDateInclusive,\n" - + " java.time.LocalDate endDateExclusive)
Methods inherited from interface pkg1.Interface
\n" diff --git a/langtools/test/jdk/javadoc/doclet/testMemberSummary/TestMemberSummary.java b/langtools/test/jdk/javadoc/doclet/testMemberSummary/TestMemberSummary.java index 4dc5ce53587..560c9f1e138 100644 --- a/langtools/test/jdk/javadoc/doclet/testMemberSummary/TestMemberSummary.java +++ b/langtools/test/jdk/javadoc/doclet/testMemberSummary/TestMemberSummary.java @@ -23,7 +23,7 @@ /* * @test - * @bug 4951228 6290760 8025633 8026567 8081854 + * @bug 4951228 6290760 8025633 8026567 8081854 8162363 * @summary Test the case where the overriden method returns a different * type than the method in the child class. Make sure the * documentation is inherited but the return type isn't. @@ -51,7 +51,7 @@ public class TestMemberSummary extends JavadocTester { checkOutput("pkg/PublicChild.html", true, // Check return type in member summary. "PublicChild
\n" - + "", + + "(T t)", " " + + "
", " " + "returnTypeTest()
", // Check return type in member detail. "public " diff --git a/langtools/test/jdk/javadoc/doclet/testModules/TestModules.java b/langtools/test/jdk/javadoc/doclet/testModules/TestModules.java index 79e166c9b8f..12703fa145a 100644 --- a/langtools/test/jdk/javadoc/doclet/testModules/TestModules.java +++ b/langtools/test/jdk/javadoc/doclet/testModules/TestModules.java @@ -23,7 +23,7 @@ /* * @test - * @bug 8154119 8154262 8156077 8157987 8154261 8154817 8135291 8155995 + * @bug 8154119 8154262 8156077 8157987 8154261 8154817 8135291 8155995 8162363 * @summary Test modules support in javadoc. * @author bpatel * @library ../lib @@ -397,7 +397,7 @@ public class TestModules extends JavadocTester { + ""); checkOutput("module1-summary.html", true, "\n" - + " "); @@ -408,7 +408,7 @@ public class TestModules extends JavadocTester { + ""); checkOutput("module1-summary.html", true, "testpkgmdl1 \n" + + "testpkgmdl1 \n" + "All Modules \n" + "\n" + " \n" - + " module2 \n" + + "module2 \n" + "\n" + " \n" @@ -424,8 +424,8 @@ public class TestModules extends JavadocTester { + ""); checkOutput("module2-summary.html", true, "This is a test description for the module2 module.\n" + "\n" - + " "); @@ -436,7 +436,7 @@ public class TestModules extends JavadocTester { + ""); checkOutput("module2-summary.html", true, "" - + "testpkg2mdl2 \n" + + "" + + "testpkg2mdl2 \n" + "module1 \n" + "\n" + " \n" - + " "); checkOutput("module2-summary.html", true, @@ -446,24 +446,24 @@ public class TestModules extends JavadocTester { + ""); checkOutput("module2-summary.html", true, "java.base \n" + + "java.base \n" + "\n" + " \n" - + " "); checkOutput("module2-summary.html", true, "TestClassInModule2 \n" + + "TestClassInModule2 \n" + "\n" + " \n" - + " Exported Packages \n" + "TestInterfaceInModule2 \n" + + "TestClassInModule2)\n" + "
" + "(Implementation: " + "" - + "TestClassInModule2)\n" + " \n" + " "); checkOutput("module2-summary.html", true, diff --git a/langtools/test/jdk/javadoc/doclet/testNewLanguageFeatures/TestNewLanguageFeatures.java b/langtools/test/jdk/javadoc/doclet/testNewLanguageFeatures/TestNewLanguageFeatures.java index 312fcf47839..048c310b0ea 100644 --- a/langtools/test/jdk/javadoc/doclet/testNewLanguageFeatures/TestNewLanguageFeatures.java +++ b/langtools/test/jdk/javadoc/doclet/testNewLanguageFeatures/TestNewLanguageFeatures.java @@ -23,7 +23,7 @@ /* * @test - * @bug 4789689 4905985 4927164 4827184 4993906 5004549 7025314 7010344 8025633 8026567 + * @bug 4789689 4905985 4927164 4827184 4993906 5004549 7025314 7010344 8025633 8026567 8162363 * @summary Run Javadoc on a set of source files that demonstrate new * language features. Check the output to ensure that the new * language features are properly documented. @@ -134,7 +134,7 @@ public class TestNewLanguageFeatures extends JavadocTester { // Method that returns TypeParameters "Package \n" - + "Module \n" + + "Module \n" + "Description \n" + "\n" - + " E[]
" + + "
" + "" + "methodThatReturnsTypeParameterA(E[] e)
", @@ -144,15 +144,15 @@ public class TestNewLanguageFeatures extends JavadocTester { + "title=\"type parameter in TypeParameters\">E[] e)\n", "\n" - + " <T extends java.lang.Object & java.lang.Comparable<? super T>>" + "
T" + + "
" + "" - + "methodtThatReturnsTypeParametersB(java.util.Collection<? extends T> coll)
\n" - + "Returns TypeParameters\n", + + "methodtThatReturnsTypeParametersB(java.util.Collection<? extends T> coll)", + "Returns TypeParameters\n", // Method takes a TypeVariable "\n" - + " <X extends java.lang.Throwable>
" + "E" + "" + + "
" + "" + "orElseThrow(java.util.function.Supplier<? extends X> exceptionSupplier)
" ); @@ -219,19 +219,19 @@ public class TestNewLanguageFeatures extends JavadocTester { + "package-summary.html\">pkg2 with type parameters of " + "type " + "Foo ", - "", + + "Foo2>
ClassUseTest1<T extends " + "Foo" + " & " - + "Foo2>
Methods in pkg2 with type parameters of " + "type Foo ", - "ClassUseTest1." + " ClassUseTest1." + " method" - + "(T t)
Fields in pkg2 with type parameters of " + "type " @@ -259,20 +259,20 @@ public class TestNewLanguageFeatures extends JavadocTester { + "type Foo2 " + " ", - "", + + "Foo2>", "
ClassUseTest1<T extends " + "Foo" + " & " - + "Foo2>
Methods in pkg2 with type parameters of " + "type Foo2 " + " ", - "" + " " + "ClassUseTest1. " ); // ClassUseTest2:method" - + "(T t)
" + + "(T t)> @@ -282,20 +282,20 @@ public class TestNewLanguageFeatures extends JavadocTester { + "type ParamTest" + " ", - " ", + + "Foo3>>", "
ClassUseTest2<T extends " + "" + "ParamTest<" - + "Foo3>>
Methods in pkg2 with type parameters of " + "type ParamTest" + " ", - "ClassUseTest2." + " ClassUseTest2." + " ", "method" - + "(T t)
", + + "(T t)Fields in pkg2 declared as ParamTest" @@ -323,20 +323,20 @@ public class TestNewLanguageFeatures extends JavadocTester { + "package-summary.html\">pkg2 with type parameters of " + "type " + "Foo3 ", - "", + + "Foo3>>", "
ClassUseTest2<T extends " + "" + "ParamTest<" - + "Foo3>>
Methods in pkg2 with type parameters of " + "type Foo3 " + " ", - "ClassUseTest2." + " ClassUseTest2." + " ", "method" - + "(T t)
", + + "(T t)Methods in pkg2 that return types with " + "arguments of type ParamTest2" + " ", - "", + + "Foo4>>>", "
ClassUseTest3<T extends " + "" + "ParamTest2<java.util.List<? extends " + "" - + "Foo4>>>
Methods in pkg2 with type parameters of " + "type ParamTest2" + " ", - "ClassUseTest3" + " ClassUseTest3" + ". ", "method(T t)
", + + "html#method-T-\">method(T t)<T extends " + "ParamTest2<java.util.List<? extends Foo4 " + "", - "
", "", + + "Foo4>>>
ClassUseTest3<T extends " + "" + "ParamTest2<java.util.List<? extends " + "" - + "Foo4>>>
Methods in pkg2 with type parameters of " + "type Foo4 ", - "ClassUseTest3." + " ClassUseTest3." + " ", "method(T t)
" - + " ", + + "Methods in pkg2 that return types with " + "arguments of type \n" + "\n" + " \n" + "\n" + "Modifier and Type \n" - + "Method and Description \n" + + "Method \n" + + "Description \n" + "\n" + " \n" - + "", + + "class in pkg2\">Foo4> p)", "\n" - + " void
ClassUseTest3." + + " ClassUseTest3." + " method(java." + "util.Set<Foo4> p)
\n" - + "Constructor parameters in pkg2 with type arguments " + "of type <Unnamed>"); + " <Unnamed> "); checkFiles(false, "pkg1/package-summary.html", diff --git a/langtools/test/jdk/javadoc/doclet/testStylesheet/TestStylesheet.java b/langtools/test/jdk/javadoc/doclet/testStylesheet/TestStylesheet.java index fc37f6ed400..025bf8a6c95 100644 --- a/langtools/test/jdk/javadoc/doclet/testStylesheet/TestStylesheet.java +++ b/langtools/test/jdk/javadoc/doclet/testStylesheet/TestStylesheet.java @@ -23,7 +23,7 @@ /* * @test - * @bug 4494033 7028815 7052425 8007338 8023608 8008164 8016549 8072461 8154261 + * @bug 4494033 7028815 7052425 8007338 8023608 8008164 8016549 8072461 8154261 8162363 * @summary Run tests on doclet stylesheet. * @author jamieh * @library ../lib @@ -139,9 +139,8 @@ public class TestStylesheet extends JavadocTester { + ".packagesSummary td.colFirst, .packagesSummary td.colSecond, .packagesSummary th.colFirst, .packagesSummary th,\n" + ".usesSummary td.colFirst, .usesSummary th.colFirst,\n" + ".useSummary td.colFirst, .useSummary th.colFirst,\n" - + ".overviewSummary td.colOne, .overviewSummary th.colOne,\n" + ".memberSummary td.colFirst, .memberSummary th.colFirst,\n" - + ".memberSummary td.colOne, .memberSummary th.colOne,\n" + + ".memberSummary td.colSecond, .memberSummary th.colSecond,\n" + ".typeSummary td.colFirst{\n" + " width:25%;\n" + " vertical-align:top;\n" diff --git a/langtools/test/jdk/javadoc/doclet/testTypeAnnotations/TestTypeAnnotations.java b/langtools/test/jdk/javadoc/doclet/testTypeAnnotations/TestTypeAnnotations.java index 088777b7bad..04f0fd659c0 100644 --- a/langtools/test/jdk/javadoc/doclet/testTypeAnnotations/TestTypeAnnotations.java +++ b/langtools/test/jdk/javadoc/doclet/testTypeAnnotations/TestTypeAnnotations.java @@ -23,7 +23,7 @@ /* * @test - * @bug 8005091 8009686 8025633 8026567 6469562 8071982 8071984 + * @bug 8005091 8009686 8025633 8026567 6469562 8071982 8071984 8162363 * @summary Make sure that type annotations are displayed correctly * @author Bhavesh Patel * @library ../lib @@ -473,7 +473,7 @@ public class TestTypeAnnotations extends JavadocTester { + "\" title=\"annotation in typeannos\">@RepTypeUseB ... vararg)"); checkOutput("typeannos/RepeatingOnField.html", true, - "(package private) java.lang.Integer
\n" + " \n(package private) java.lang.Integer
" + " i1
", @@ -483,7 +483,7 @@ public class TestTypeAnnotations extends JavadocTester { + "@RepTypeUseA @RepTypeUseB @RepTypeUseB java.lang.Integer\n" - + "\n
i2
", "(package private) " + "@RepTypeUseB @RepTypeUseB java.lang.Integer
" - + "\n " + + "
" + "i3
", "(package private) " + "@RepAllContextsB @RepAllContextsB java.lang.Integer
" - + "\n\n " + + "
" + "i4
", "(package private) java.lang.String @RepTypeUseA @RepTypeUseB " - + "@RepTypeUseB []
\n\n []
sa
", @@ -572,8 +572,8 @@ public class TestTypeAnnotations extends JavadocTester { + "@RepTypeUseB [] sa"); checkOutput("typeannos/RepeatingOnMethod.html", true, - "(package private) java.lang.String
\n\n (package private) java.lang.String
" + + " test1()
", "(package private) @RepTypeUseB @RepTypeUseB java.lang.String
" - + "\n\n " + + "
" + "test2" + "()
", @@ -592,7 +592,7 @@ public class TestTypeAnnotations extends JavadocTester { + "@RepTypeUseA @RepTypeUseB @RepTypeUseB java.lang.String" - + "\n\n " + + "
" + "test3" + "()
", @@ -602,7 +602,7 @@ public class TestTypeAnnotations extends JavadocTester { + "@RepAllContextsA @RepAllContextsB " - + "@RepAllContextsB java.lang.String\n" + + "@RepAllContextsB java.lang.String \n" + " test4()
", @@ -682,12 +682,12 @@ public class TestTypeAnnotations extends JavadocTester { checkOutput("typeannos/RepeatingOnTypeParametersBoundsTypeArgumentsOnMethod.html", true, "(package private) <T> java.lang.String
\n" - + "\n" - + "
genericMethod(T t)
", "(package private) <T> java.lang.String
\n
genericMethod2(@RepTypeUseA @RepTypeUseB @RepTypeUseB T t)
", - "(package private) java.lang.String
\n " + "
(package private) java.lang.String
" + "test()
", diff --git a/langtools/test/jdk/javadoc/doclet/testUseOption/TestUseOption.java b/langtools/test/jdk/javadoc/doclet/testUseOption/TestUseOption.java index 9f79964a3d8..409969beeb5 100644 --- a/langtools/test/jdk/javadoc/doclet/testUseOption/TestUseOption.java +++ b/langtools/test/jdk/javadoc/doclet/testUseOption/TestUseOption.java @@ -23,7 +23,7 @@ /* * @test - * @bug 4496290 4985072 7006178 7068595 8016328 8050031 8048351 8081854 8071982 + * @bug 4496290 4985072 7006178 7068595 8016328 8050031 8048351 8081854 8071982 8162363 * @summary A simple test to ensure class-use files are correct. * @author jamieh * @library ../lib @@ -124,17 +124,17 @@ public class TestUseOption extends JavadocTester { checkOutput("pkg1/class-use/UsedInterface.html", true, "Subinterfaces of " + "UsedInterface in pkg1", - "\n interface
" + " \n interface
" + " " ); checkOutput("pkg1/class-use/UsedThrowable.html", true, "Methods in pkg1 that throw " + "UsedThrowable", - "SubInterface<T>
" + + "title=\"interface in pkg1\">SubInterface<T>\n void
\n void
C1. " ); } @@ -154,9 +154,9 @@ public class TestUseOption extends JavadocTester { "" + "methodInC1ThrowsThrowable" - + "()
" + + "()- " ); checkOutput("package-use.html", true, - "
" - + "UsedInC ", - "<Unnamed> \n" + "" + + "UsedInC ", + "<Unnamed> \n" + "" ); } diff --git a/langtools/test/jdk/javadoc/tool/modules/ModuleTestBase.java b/langtools/test/jdk/javadoc/tool/modules/ModuleTestBase.java index 5b3647ad0d7..a63350522a0 100644 --- a/langtools/test/jdk/javadoc/tool/modules/ModuleTestBase.java +++ b/langtools/test/jdk/javadoc/tool/modules/ModuleTestBase.java @@ -252,10 +252,14 @@ public class ModuleTestBase extends TestRunner { } void assertAbsent(String regex) throws Exception { - List foundList = tb.grep(regex, currentTask.getOutputLines(STDOUT)); + assertAbsent(regex, STDOUT); + } + + void assertAbsent(String regex, Task.OutputKind kind) throws Exception { + List foundList = tb.grep(regex, currentTask.getOutputLines(kind)); if (!foundList.isEmpty()) { dumpDocletDiagnostics(); - throw new Exception(regex + " found in: " + STDOUT); + throw new Exception(regex + " found in: " + kind); } } diff --git a/langtools/test/jdk/javadoc/tool/modules/Modules.java b/langtools/test/jdk/javadoc/tool/modules/Modules.java index 496a8e2c3cb..80fd88b69b2 100644 --- a/langtools/test/jdk/javadoc/tool/modules/Modules.java +++ b/langtools/test/jdk/javadoc/tool/modules/Modules.java @@ -21,9 +21,9 @@ * questions. */ -/** +/* * @test - * @bug 8159305 + * @bug 8159305 8166127 * @summary Tests primarily the module graph computations. * @modules * jdk.javadoc/jdk.javadoc.internal.api @@ -40,6 +40,8 @@ import java.nio.file.Files; import java.nio.file.Path; import toolbox.*; +import toolbox.Task.Expect; +import toolbox.Task.OutputKind; public class Modules extends ModuleTestBase { @@ -54,8 +56,8 @@ public class Modules extends ModuleTestBase { ModuleBuilder mb = new ModuleBuilder(tb, "m1"); mb.comment("The first module.") .exports("pub") - .classes("package pub; /** Klass A */ public class A {}") - .classes("package pro; /** Klass B */ public class B {}") + .classes("package pub; /** Class A */ public class A {}") + .classes("package pro; /** Class B */ public class B {}") .write(src); execTask("--module-source-path", src.toString(), "--module", "m1"); @@ -72,15 +74,15 @@ public class Modules extends ModuleTestBase { mb1.comment("The first module.") .exports("m1pub") .requires("m2") - .classes("package m1pub; /** Klass A */ public class A {}") - .classes("package m1pro; /** Klass B */ public class B {}") + .classes("package m1pub; /** Class A */ public class A {}") + .classes("package m1pro; /** Class B */ public class B {}") .write(src); ModuleBuilder mb2 = new ModuleBuilder(tb, "m2"); mb2.comment("The second module.") .exports("m2pub") - .classes("package m2pub; /** Klass A */ public class A {}") - .classes("package m2pro; /** Klass B */ public class B {}") + .classes("package m2pub; /** Class A */ public class A {}") + .classes("package m2pro; /** Class B */ public class B {}") .write(src); execTask("--module-source-path", src.toString(), "--module", "m1,m2"); @@ -98,15 +100,15 @@ public class Modules extends ModuleTestBase { mb1.comment("The first module.") .exports("m1pub") .requires("m2") - .classes("package m1pub; /** Klass A */ public class A {}") - .classes("package m1pro; /** Klass B */ public class B {}") + .classes("package m1pub; /** Class A */ public class A {}") + .classes("package m1pro; /** Class B */ public class B {}") .write(src); ModuleBuilder mb2 = new ModuleBuilder(tb, "m2"); mb2.comment("The second module.") .exports("m2pub") - .classes("package m2pub; /** Klass A */ public class A {}") - .classes("package m2pro; /** Klass B */ public class B {}") + .classes("package m2pub; /** Class A */ public class A {}") + .classes("package m2pro; /** Class B */ public class B {}") .write(src); execTask("--module-source-path", src.toString(), "--module", "m1", @@ -117,7 +119,268 @@ public class Modules extends ModuleTestBase { } - /** + @Test + public void testModulePathOption(Path base) throws Exception { + Path src = base.resolve("src"); + Path modulePath = base.resolve("modules"); + + ModuleBuilder mb1 = new ModuleBuilder(tb, "m1"); + mb1.comment("Module on module path.") + .exports("pkg1") + .classes("package pkg1; /** Class A */ public class A { }") + .build(modulePath); + + ModuleBuilder mb2 = new ModuleBuilder(tb, "m2"); + mb2.comment("The second module.") + .exports("pkg2") + .requires("m1") + .classes("package pkg2; /** Class B */ public class B { /** Field f */ public pkg1.A f; }") + .write(src); + execTask("--module-source-path", src.toString(), + "--module-path", modulePath.toString(), + "--module", "m2"); + checkModulesSpecified("m2"); + checkPackagesIncluded("pkg2"); + checkMembersSelected("pkg2.B.f"); + + // module path option "-p" + execTask("--module-source-path", src.toString(), + "-p", modulePath.toString(), + "--module", "m2"); + // no module path + execNegativeTask("--module-source-path", src.toString(), + "--module", "m2"); + assertErrorPresent("error: module not found: m1"); + } + + @Test + public void testUpgradeModulePathOption(Path base) throws Exception { + Path src = base.resolve("src"); + Path modulePath = base.resolve("modules"); + Path upgradePath = base.resolve("upgrades"); + + ModuleBuilder mb1 = new ModuleBuilder(tb, "m1"); + mb1.comment("Module on module path.") + .exports("pkg1") + .classes("package pkg1; /** Class A */ public class A { }") + .build(modulePath); + + ModuleBuilder mbUpgrade = new ModuleBuilder(tb, "m1"); + mbUpgrade.comment("Module on upgrade module path.") + .exports("pkg1") + .classes("package pkg1; /** Class C */ public class C { }") + .build(upgradePath); + + ModuleBuilder mb2 = new ModuleBuilder(tb, "m2"); + mb2.comment("The second module.") + .exports("pkg2") + .requires("m1") + .classes("package pkg2; /** Class B */ public class B { /** Field f */ public pkg1.C f; }") + .write(src); + execTask("--module-source-path", src.toString(), + "--module-path", modulePath.toString(), + "--upgrade-module-path", upgradePath.toString(), + "--module", "m2"); + checkModulesSpecified("m2"); + checkPackagesIncluded("pkg2"); + checkMembersSelected("pkg2.B.f"); + + // no upgrade module path + execNegativeTask("--module-source-path", src.toString(), + "--module-path", modulePath.toString(), + "--module", "m2"); + assertErrorPresent("error: cannot find symbol"); + + // dependency from module path + ModuleBuilder mb3 = new ModuleBuilder(tb, "m3"); + mb3.comment("The third module.") + .exports("pkg3") + .requires("m1") + .classes("package pkg3; /** Class Z */ public class Z { /** Field f */ public pkg1.A f; }") + .write(src); + execNegativeTask("--module-source-path", src.toString(), + "--module-path", modulePath.toString(), + "--upgrade-module-path", upgradePath.toString(), + "--module", "m3"); + assertErrorPresent("Z.java:1: error: cannot find symbol"); + } + + @Test + public void testAddModulesOption(Path base) throws Exception { + Path src = base.resolve("src"); + Path modulePath = base.resolve("modules"); + + ModuleBuilder mb1 = new ModuleBuilder(tb, "m1"); + mb1.comment("Module on module path.") + .exports("pkg1") + .classes("package pkg1; /** Class A */ public class A { }") + .build(modulePath); + + ModuleBuilder mb2 = new ModuleBuilder(tb, "m2"); + mb2.comment("The second module.") + .exports("pkg2") + .classes("package pkg2; /** @see pkg1.A */ public class B { }") + .write(src); + + String log = new JavadocTask(tb) + .options("--module-source-path", src.toString(), + "--module-path", modulePath.toString(), + "--module", "m2") + .run(Expect.FAIL) + .writeAll() + .getOutput(OutputKind.DIRECT); + if (!log.contains("B.java:1: error: reference not found")) { + throw new Exception("Error not found"); + } + + new JavadocTask(tb) + .options("--module-source-path", src.toString(), + "--module-path", modulePath.toString(), + "--add-modules", "m1", + "--module", "m2") + .run() + .writeAll(); + } + + @Test + public void testLimitModulesOption(Path base) throws Exception { + Path src = base.resolve("src"); + Path modulePath = base.resolve("modules"); + + ModuleBuilder mb1 = new ModuleBuilder(tb, "m1"); + mb1.comment("Module on module path.") + .build(modulePath); + + ModuleBuilder mb2 = new ModuleBuilder(tb, "m2"); + mb2.comment("The second module.") + .exports("pkg2") + .requires("m1") + .classes("package pkg2; /** Class B */ public class B { }") + .write(src); + + execNegativeTask("--module-source-path", src.toString(), + "--module-path", modulePath.toString(), + "--limit-modules", "java.base", + "--module", "m2"); + assertErrorPresent("error: module not found: m1"); + } + + @Test + public void testAddExportsOption(Path base) throws Exception { + Path src = base.resolve("src"); + Path modulePath = base.resolve("modules"); + + ModuleBuilder mb1 = new ModuleBuilder(tb, "m1"); + mb1.comment("Module on module path.") + .classes("package pkg1; /** Class A */ public class A { }") + .build(modulePath); + + ModuleBuilder mb2 = new ModuleBuilder(tb, "m2"); + mb2.comment("The second module.") + .exports("pkg2") + .requires("m1") + .classes("package pkg2; /** Class B */ public class B { /** Field f */ public pkg1.A f; }") + .write(src); + execTask("--module-source-path", src.toString(), + "--module-path", modulePath.toString(), + "--add-exports", "m1/pkg1=m2", + "--module", "m2"); + checkModulesSpecified("m2"); + checkPackagesIncluded("pkg2"); + checkMembersSelected("pkg2.B.f"); + } + +// @Test @ignore JDK-8166379 + public void testPatchModuleOption(Path base) throws Exception { + Path src = base.resolve("src"); + Path modulePath = base.resolve("modules"); + Path patchPath = base.resolve("patch"); + + ModuleBuilder mb1 = new ModuleBuilder(tb, "m1"); + mb1.comment("Module on module path.") + .exports("pkg1") + .classes("package pkg1; /** Class A */ public class A { }") + .build(modulePath); + + tb.writeJavaFiles(patchPath, "package pkg1; /** Class A */ public class A { public static int k; }"); + new JavacTask(tb) + .files(patchPath.resolve("pkg1/A.java")) + .run(); + + ModuleBuilder mb2 = new ModuleBuilder(tb, "m2"); + mb2.comment("The second module.") + .exports("pkg2") + .requires("m1") + .classes("package pkg2; /** Class B */ public class B { /** Field f */ public int f = pkg1.A.k; }") + .write(src); + execTask("--module-source-path", src.toString(), + "--patch-module", "m1=" + patchPath.toString(), + "--module-path", modulePath.toString(), + "--module", "m2"); + checkModulesSpecified("m2"); + checkPackagesIncluded("pkg2"); + checkMembersSelected("pkg2.B.f"); + } + + @Test + public void testAddReadsOption(Path base) throws Exception { + Path src = base.resolve("src"); + Path modulePath = base.resolve("modules"); + + ModuleBuilder mb1 = new ModuleBuilder(tb, "m1"); + mb1.comment("Module on module path.") + .exports("pkg1") + .classes("package pkg1; /** Class A */ public class A {}") + .build(modulePath); + + ModuleBuilder mb2 = new ModuleBuilder(tb, "m2"); + mb2.comment("The second module.") + .exports("pkg2") + .classes("package pkg2; /** Class B */ public class B { /** Field f */ public pkg1.A f;}") + .write(src); + execTask("--module-source-path", src.toString(), + "--module-path", modulePath.toString(), + "--add-modules", "m1", + "--add-reads", "m2=m1", + "--module", "m2"); + checkModulesSpecified("m2"); + checkPackagesIncluded("pkg2"); + checkMembersSelected("pkg2.B.f"); + } + + @Test + public void testModuleOptionsWithLegacy(Path base) throws Exception { + Files.createDirectory(base); + Path src = base.resolve("src"); + Path classpath = base.resolve("classpath"); + Path modulePath = base.resolve("modules"); + + tb.writeJavaFiles(classpath, "package pkg1; /** Class C */ public class C { }"); + new JavacTask(tb) + .files(classpath.resolve("pkg1/C.java")) + .run(); + + ModuleBuilder mb = new ModuleBuilder(tb, "m1"); + mb.comment("The first module.") + .exports("pub") + .classes("package pub; /** Class M */ public class M { }") + .build(modulePath); + + tb.writeJavaFiles(src, "package pkg; /** Class L */ public class L { public pkg1.C f1; public pub.M f2; }"); + + execTask("--source-path", src.toString(), + "--class-path", classpath.toString(), + "--module-path", modulePath.toString(), + "--add-modules", "m1", + "pkg"); + checkPackagesIncluded("pkg"); + checkTypesIncluded("pkg.L"); + checkMembersSelected("pkg.L.f1"); + checkMembersSelected("pkg.L.f2"); + assertAbsent("error", OutputKind.DIRECT); + } + + /** * Tests diamond graph, inspired by javac diamond tests. * * @@ -262,48 +525,48 @@ public class Modules extends ModuleTestBase { new ModuleBuilder(tb, "J") .comment("The J module.") .exports("openJ") - .classes("package openJ; /** Klass J open. */ public class J { }") - .classes("package closedJ; /** Klass J closed. */ public class J { }") + .classes("package openJ; /** Class J open. */ public class J { }") + .classes("package closedJ; /** Class J closed. */ public class J { }") .write(src); new ModuleBuilder(tb, "L") .comment("The L module.") .exports("openL") .requiresPublic("P") - .classes("package openL; /** Klass L open */ public class L { }") - .classes("package closedL; /** Klass L closed */ public class L { }") + .classes("package openL; /** Class L open */ public class L { }") + .classes("package closedL; /** Class L closed */ public class L { }") .write(src); new ModuleBuilder(tb, "N") .comment("The N module.") .exports("openN") .requiresPublic("O") - .classes("package openN; /** Klass N open */ public class N { }") - .classes("package closedN; /** Klass N closed */ public class N { }") + .classes("package openN; /** Class N open */ public class N { }") + .classes("package closedN; /** Class N closed */ public class N { }") .write(src); new ModuleBuilder(tb, "O") .comment("The O module.") .exports("openO") .requires("J") - .classes("package openO; /** Klass O open. */ public class O { openJ.J j; }") - .classes("package closedO; /** Klass O closed. */ public class O { }") + .classes("package openO; /** Class O open. */ public class O { openJ.J j; }") + .classes("package closedO; /** Class O closed. */ public class O { }") .write(src); new ModuleBuilder(tb, "P") .comment("The O module.") .exports("openP") .requires("J") - .classes("package openP; /** Klass O open. */ public class O { openJ.J j; }") - .classes("package closedP; /** Klass O closed. */ public class O { }") + .classes("package openP; /** Class O open. */ public class O { openJ.J j; }") + .classes("package closedP; /** Class O closed. */ public class O { }") .write(src); new ModuleBuilder(tb, "Q") .comment("The Q module.") .exports("openQ") .requires("J") - .classes("package openQ; /** Klass Q open. */ public class Q { openJ.J j; }") - .classes("package closedQ; /** Klass Q closed. */ public class Q { }") + .classes("package openQ; /** Class Q open. */ public class Q { openJ.J j; }") + .classes("package closedQ; /** Class Q closed. */ public class Q { }") .write(src); } diff --git a/langtools/test/jdk/jshell/SimpleRegressionTest.java b/langtools/test/jdk/jshell/SimpleRegressionTest.java index 70de72c9bbb..063a2335f4b 100644 --- a/langtools/test/jdk/jshell/SimpleRegressionTest.java +++ b/langtools/test/jdk/jshell/SimpleRegressionTest.java @@ -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 @@ -22,7 +22,7 @@ */ /* - * @test 8130450 8158906 8154374 + * @test 8130450 8158906 8154374 8166400 * @summary simple regression test * @build KullaTesting TestingInputStream * @run testng SimpleRegressionTest @@ -149,4 +149,21 @@ public class SimpleRegressionTest extends KullaTesting { assertEval("class C {}"); assertEval("C.class.getClassLoader() == Thread.currentThread().getContextClassLoader()", "true"); } + + public void testArayRepresentation() { + assertEval("new int[4]", "int[4] { 0, 0, 0, 0 }"); + assertEval("new int[0]", "int[0] { }"); + assertEval("new byte[2]", "byte[2] { 0, 0 }"); + assertEval("new short[] { 1234, 4321 }", "short[2] { 1234, 4321 }"); + assertEval("new long[] { 123456789 }", "long[1] { 123456789 }"); + assertEval("new float[] { -23.5645f, 1.0101f }", "float[2] { -23.5645, 1.0101 }"); + assertEval("new double[] { 1/8, Math.PI }", "double[2] { 0.0, 3.141592653589793 }"); + assertEval("new String[] { \"hi\", \"low\", null }", "String[3] { \"hi\", \"low\", null }"); + assertEval("new char[] { 'a', 34, 77 }", "char[3] { 'a', '\"', 'M' }"); + assertEval("new boolean[] { false, true }", "boolean[2] { false, true }"); + assertEval("new int[][] { new int[] {44, 55}, new int[] {88,99}}", + "int[][2] { int[2] { 44, 55 }, int[2] { 88, 99 } }"); + assertEval("new Object[] { \"howdy\", new int[] { 33, 44, 55 }, new String[] { \"up\", \"down\" }}", + "Object[3] { \"howdy\", int[3] { 33, 44, 55 }, String[2] { \"up\", \"down\" } }"); + } } diff --git a/langtools/test/tools/javac/AnonymousClass/AnonymousInSuperCallNegTest.java b/langtools/test/tools/javac/AnonymousClass/AnonymousInSuperCallNegTest.java new file mode 100644 index 00000000000..b7d0a73d576 --- /dev/null +++ b/langtools/test/tools/javac/AnonymousClass/AnonymousInSuperCallNegTest.java @@ -0,0 +1,31 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8166108 + * @summary Verify that a program cannot access instance state before construction + * @compile/fail/ref=AnonymousInSuperCallNegTest.out -XDrawDiagnostics AnonymousInSuperCallNegTest.java + */ + +public class AnonymousInSuperCallNegTest { + + static class Base { + Base(Object o) {} + } + + static class Outer { + class Inner {} + } + + public static class JavacBug extends Base { + int x; + JavacBug() { + super(new Outer().new Inner() { + void foo() { + System.out.println("x = " + x); + } + }); } + } + + public static void main(String[] args) { + new JavacBug(); + } +} \ No newline at end of file diff --git a/langtools/test/tools/javac/AnonymousClass/AnonymousInSuperCallNegTest.out b/langtools/test/tools/javac/AnonymousClass/AnonymousInSuperCallNegTest.out new file mode 100644 index 00000000000..c04b45bce1e --- /dev/null +++ b/langtools/test/tools/javac/AnonymousClass/AnonymousInSuperCallNegTest.out @@ -0,0 +1,2 @@ +AnonymousInSuperCallNegTest.java:23:49: compiler.err.cant.ref.before.ctor.called: x +1 error diff --git a/langtools/test/tools/javac/AnonymousClass/AnonymousInSuperCallTest.java b/langtools/test/tools/javac/AnonymousClass/AnonymousInSuperCallTest.java new file mode 100644 index 00000000000..bcd4dd435ac --- /dev/null +++ b/langtools/test/tools/javac/AnonymousClass/AnonymousInSuperCallTest.java @@ -0,0 +1,48 @@ +/* + * 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 8166108 + * @summary Verify that javac skips outer this to anonymous inner classes in super type constructor calls + * + */ + +public class AnonymousInSuperCallTest { + + static class Base { + Base(Object o) {} + } + + static class Outer { + class Inner {} + } + + public static class JavacBug extends Base { + JavacBug() { super(new Outer().new Inner() {}); } + } + + public static void main(String[] args) { + new JavacBug(); + } +} \ No newline at end of file diff --git a/test/lib/jdk/test/lib/unsafe/UnsafeHelper.java b/langtools/test/tools/javac/TryWithResources/TwrAndTypeVariables2Test.java similarity index 59% rename from test/lib/jdk/test/lib/unsafe/UnsafeHelper.java rename to langtools/test/tools/javac/TryWithResources/TwrAndTypeVariables2Test.java index 4a6c92644a6..8f35a5b2417 100644 --- a/test/lib/jdk/test/lib/unsafe/UnsafeHelper.java +++ b/langtools/test/tools/javac/TryWithResources/TwrAndTypeVariables2Test.java @@ -21,32 +21,27 @@ * questions. */ -package jdk.test.lib.unsafe; - -import jdk.internal.misc.Unsafe; -import java.lang.reflect.Field; - - -/** - * Helper class for accessing the jdk.internal.misc.Unsafe functionality +/* + * @test + * @bug 8163027 + * @summary AssertionError while compiling program that uses try with resources + * @compile TwrAndTypeVariables2Test.java */ -public final class UnsafeHelper { - private static Unsafe unsafe = null; - /** - * @return Unsafe instance. - */ - public static synchronized Unsafe getUnsafe() { - if (unsafe == null) { - try { - Field f = Unsafe.class.getDeclaredField("theUnsafe"); - f.setAccessible(true); - unsafe = (Unsafe) f.get(null); - } catch (NoSuchFieldException | IllegalAccessException e) { - throw new RuntimeException("Unable to get Unsafe instance.", e); - } - } - return unsafe; +abstract class TwrAndTypeVariables2Test_01 implements AutoCloseable { + @Override + public void close() { + } + public boolean close(long timeout) { + return true; } } +public abstract class TwrAndTypeVariables2Test { + abstract C newCloseable(); + + void m() throws Exception{ + try(C p= newCloseable()){ + } + } +} diff --git a/langtools/test/tools/javac/annotations/typeAnnotations/classfile/AnnotatedExtendsTest.java b/langtools/test/tools/javac/annotations/typeAnnotations/classfile/AnnotatedExtendsTest.java new file mode 100644 index 00000000000..456225f643b --- /dev/null +++ b/langtools/test/tools/javac/annotations/typeAnnotations/classfile/AnnotatedExtendsTest.java @@ -0,0 +1,65 @@ +/* + * 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 8164519 + * @summary Verify that javac emits proper super type index (65535) for an annotated extends + * @library /tools/lib + * @modules jdk.compiler/com.sun.tools.javac.api + * jdk.compiler/com.sun.tools.javac.main + * jdk.jdeps/com.sun.tools.javap + * @build toolbox.ToolBox toolbox.JavapTask + * @run compile -g AnnotatedExtendsTest.java + * @run main AnnotatedExtendsTest + */ + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +import toolbox.JavapTask; +import toolbox.Task; +import toolbox.ToolBox; + +public class AnnotatedExtendsTest { + + @Target(ElementType.TYPE_USE) + public @interface TA { + }; + + public class Inner extends @TA Object {} + + public static strictfp void main(String args[]) throws Exception { + ToolBox tb = new ToolBox(); + Path classPath = Paths.get(ToolBox.testClasses, "AnnotatedExtendsTest$Inner.class"); + String javapOut = new JavapTask(tb) + .options("-v", "-p") + .classes(classPath.toString()) + .run() + .getOutput(Task.OutputKind.DIRECT); + if (!javapOut.contains("0: #21(): CLASS_EXTENDS, type_index=65535")) + throw new AssertionError("Expected output missing: " + javapOut); + } +} \ No newline at end of file diff --git a/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/ClassExtends.java b/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/ClassExtends.java index 7922b499bfd..091d45c9196 100644 --- a/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/ClassExtends.java +++ b/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/ClassExtends.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -25,7 +25,7 @@ import static com.sun.tools.classfile.TypeAnnotation.TargetType.*; /* * @test - * @bug 8042451 + * @bug 8042451 8164519 * @summary Test population of reference info for class extends clauses * @modules jdk.jdeps/com.sun.tools.classfile * @compile -g Driver.java ReferenceInfoUtil.java ClassExtends.java @@ -33,21 +33,21 @@ import static com.sun.tools.classfile.TypeAnnotation.TargetType.*; */ public class ClassExtends { - @TADescription(annotation = "TA", type = CLASS_EXTENDS, typeIndex = -1) + @TADescription(annotation = "TA", type = CLASS_EXTENDS, typeIndex = 65535) @TADescription(annotation = "TB", type = CLASS_EXTENDS, typeIndex = 1) public String regularClass() { return "class %TEST_CLASS_NAME% extends @TA Object implements Cloneable, @TB Runnable {" + " public void run() { } }"; } - @TADescription(annotation = "RTAs", type = CLASS_EXTENDS, typeIndex = -1) + @TADescription(annotation = "RTAs", type = CLASS_EXTENDS, typeIndex = 65535) @TADescription(annotation = "RTBs", type = CLASS_EXTENDS, typeIndex = 1) public String regularClassRepeatableAnnotation() { return "class %TEST_CLASS_NAME% extends @RTA @RTA Object implements Cloneable, @RTB @RTB Runnable {" + " public void run() { } }"; } - @TADescription(annotation = "TA", type = CLASS_EXTENDS, typeIndex = -1, + @TADescription(annotation = "TA", type = CLASS_EXTENDS, typeIndex = 65535, genericLocation = { 3, 0 }) @TADescription(annotation = "TB", type = CLASS_EXTENDS, typeIndex = 1, genericLocation = { 3, 1 }) @@ -55,7 +55,7 @@ public class ClassExtends { return "class %TEST_CLASS_NAME% extends HashMap<@TA String, String> implements Cloneable, Map { } "; } - @TADescription(annotation = "RTAs", type = CLASS_EXTENDS, typeIndex = -1, + @TADescription(annotation = "RTAs", type = CLASS_EXTENDS, typeIndex = 65535, genericLocation = { 3, 0 }) @TADescription(annotation = "RTBs", type = CLASS_EXTENDS, typeIndex = 1, genericLocation = { 3, 1 }) @@ -63,21 +63,21 @@ public class ClassExtends { return "class %TEST_CLASS_NAME% extends HashMap<@RTA @RTA String, String> implements Cloneable, Map { } "; } - @TADescription(annotation = "TA", type = CLASS_EXTENDS, typeIndex = -1) + @TADescription(annotation = "TA", type = CLASS_EXTENDS, typeIndex = 65535) @TADescription(annotation = "TB", type = CLASS_EXTENDS, typeIndex = 1) public String abstractClass() { return "abstract class %TEST_CLASS_NAME% extends @TA Date implements Cloneable, @TB Runnable {" + " public void run() { } }"; } - @TADescription(annotation = "RTAs", type = CLASS_EXTENDS, typeIndex = -1) + @TADescription(annotation = "RTAs", type = CLASS_EXTENDS, typeIndex = 65535) @TADescription(annotation = "RTBs", type = CLASS_EXTENDS, typeIndex = 1) public String abstractClassRepeatableAnnotation() { return "abstract class %TEST_CLASS_NAME% extends @RTA @RTA Date implements Cloneable, @RTB @RTB Runnable {" + " public void run() { } }"; } - @TADescription(annotation = "RTAs", type = CLASS_EXTENDS, typeIndex = -1, + @TADescription(annotation = "RTAs", type = CLASS_EXTENDS, typeIndex = 65535, genericLocation = { 3, 0 }) @TADescription(annotation = "RTBs", type = CLASS_EXTENDS, typeIndex = 1, genericLocation = { 3, 1 }) diff --git a/langtools/test/tools/javac/file/MultiReleaseJar/MutliReleaseModuleInfoTest.java b/langtools/test/tools/javac/file/MultiReleaseJar/MutliReleaseModuleInfoTest.java new file mode 100644 index 00000000000..8d4cde4e669 --- /dev/null +++ b/langtools/test/tools/javac/file/MultiReleaseJar/MutliReleaseModuleInfoTest.java @@ -0,0 +1,148 @@ +/* + * 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 8156568 + * @summary Update javac to support compiling against a modular multi-release JAR + * @library /tools/lib + * @modules jdk.compiler/com.sun.tools.javac.api + * jdk.compiler/com.sun.tools.javac.main + * @build toolbox.ToolBox toolbox.JarTask toolbox.JavacTask + * @run main MutliReleaseModuleInfoTest + */ + +import java.nio.file.Paths; +import java.util.Set; +import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedAnnotationTypes; +import javax.lang.model.SourceVersion; +import javax.lang.model.element.ModuleElement; +import javax.lang.model.element.ModuleElement.RequiresDirective; +import javax.lang.model.element.TypeElement; +import javax.lang.model.util.ElementFilter; + +import toolbox.JarTask; +import toolbox.JavacTask; +import toolbox.Task; +import toolbox.ToolBox; + + +public class MutliReleaseModuleInfoTest { + + private final String service_mi = + "module service {\n" + + "}\n"; + + private final String service = + "package service;\n" + + "public class Service {\n" + + "}\n"; + + private final String service_mi9 = + "module service {\n" + + " requires java.desktop;\n" + + "}\n"; + + private final String service9 = + "package service;\n" + + "public class Service {\n" + + "}\n"; + + private final String client_mi = + "module client {\n" + + " requires service;\n" + + "}\n"; + + private final String manifest = + "Manifest-Version: 1.0\n" + + "Multi-Release: true\n"; + + private final ToolBox tb = new ToolBox(); + + public static void main(String [] args) throws Exception { + new MutliReleaseModuleInfoTest().runTest(); + } + + private void runTest() throws Exception { + tb.createDirectories("classes", "classes/META-INF/versions/9"); + new JavacTask(tb) + .outdir("classes") + .sources(service_mi, service) + .run(); + new JavacTask(tb) + .outdir("classes/META-INF/versions/9") + .sources(service_mi9, service9) + .run(); + new JarTask(tb, "multi-release.jar") + .manifest(manifest) + .baseDir("classes") + .files("module-info.class", "service/Service.class", + "META-INF/versions/9/module-info.class", + "META-INF/versions/9/service/Service.class") + .run(); + tb.cleanDirectory(Paths.get("classes")); + + tb.writeFile("module-info.java", client_mi); + Task.Result result = new JavacTask(tb) + .outdir("classes") + .options("-processor", VerifyRequires.class.getName(), + "--module-path", "multi-release.jar") + .files("module-info.java") + .run(); + result.writeAll(); + tb.deleteFiles("module-info.java"); + + tb.deleteFiles( + "multi-release.jar", + "classes/module-info.class", + "classes" + ); + } + + @SupportedAnnotationTypes("*") + public static final class VerifyRequires extends AbstractProcessor { + + @Override + public boolean process(Set extends TypeElement> u, RoundEnvironment r) { + ModuleElement sm = processingEnv.getElementUtils().getModuleElement("service"); + if (sm == null) { + throw new AssertionError("Cannot find the service module!"); + } + boolean foundjd = false; + for (RequiresDirective rd : ElementFilter.requiresIn(sm.getDirectives())) { + foundjd |= rd.getDependency().getSimpleName().contentEquals("java.desktop"); + } + if (!foundjd) { + throw new AssertionError("Missing dependency on java desktop module!"); + } + return false; + } + + @Override + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.latest(); + } + } +} diff --git a/langtools/test/tools/javac/processing/model/trees/BrokenEnumConstructor.java b/langtools/test/tools/javac/processing/model/trees/BrokenEnumConstructor.java new file mode 100644 index 00000000000..ed39a82d6a9 --- /dev/null +++ b/langtools/test/tools/javac/processing/model/trees/BrokenEnumConstructor.java @@ -0,0 +1,40 @@ +/* + * 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 8047347 + * @summary Verify that an explicit (incorrect) super constructor invocation in enums is not cleared + * by JavacProcessingEnvironment + * @library /tools/javac/lib + * @modules jdk.compiler + * @build JavacTestingAbstractProcessor OnDemandAttribution + * @compile/process/fail/ref=BrokenEnumConstructor.out -XDrawDiagnostics -processor OnDemandAttribution BrokenEnumConstructor.java + */ + +public enum BrokenEnumConstructor { + + A; + + BrokenEnumConstructor() {super(); /*illegal*/} +} diff --git a/langtools/test/tools/javac/processing/model/trees/BrokenEnumConstructor.out b/langtools/test/tools/javac/processing/model/trees/BrokenEnumConstructor.out new file mode 100644 index 00000000000..9b514e7223c --- /dev/null +++ b/langtools/test/tools/javac/processing/model/trees/BrokenEnumConstructor.out @@ -0,0 +1,2 @@ +BrokenEnumConstructor.java:39:30: compiler.err.call.to.super.not.allowed.in.enum.ctor: BrokenEnumConstructor +1 error diff --git a/langtools/test/tools/javac/processing/model/trees/OnDemandAttribution.java b/langtools/test/tools/javac/processing/model/trees/OnDemandAttribution.java index ce7c3e655c1..6c7d477bf3c 100644 --- a/langtools/test/tools/javac/processing/model/trees/OnDemandAttribution.java +++ b/langtools/test/tools/javac/processing/model/trees/OnDemandAttribution.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, 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,56 +23,88 @@ /* * @test - * @bug 8038455 + * @bug 8038455 8047347 * @summary Verify that in-method ClassSymbols from one round do not affect ClassSymbols in * following rounds. * @library /tools/javac/lib * @modules jdk.compiler * @build JavacTestingAbstractProcessor OnDemandAttribution - * @compile/process -processor OnDemandAttribution OnDemandAttribution.java + * @clean Gen + * @compile/process -processor OnDemandAttribution OnDemandAttributionData.java */ +import java.io.IOException; +import java.io.Writer; import java.util.*; import javax.annotation.processing.*; import javax.lang.model.element.*; -import static javax.lang.model.util.ElementFilter.*; +import static javax.lang.model.util.ElementFilter.constructorsIn; import com.sun.source.tree.*; import com.sun.source.util.*; public class OnDemandAttribution extends JavacTestingAbstractProcessor { public OnDemandAttribution() { - class Local { } - new Object() { }; } - public boolean process(Set extends TypeElement> annos,RoundEnvironment rEnv) { - TypeElement currentClass = elements.getTypeElement("OnDemandAttribution"); - ExecutableElement constr = constructorsIn(currentClass.getEnclosedElements()).get(0); - Trees trees = Trees.instance(processingEnv); - TreePath path = trees.getPath(constr); + int round; + Set roots = new HashSet<>(); - new TreePathScanner () { - @Override public Void visitClass(ClassTree node, Void p) { - if (node.getSimpleName().contentEquals("Local")) { - //will also attribute the body on demand: + public boolean process(Set extends TypeElement> annos,RoundEnvironment rEnv) { + for (Element root : rEnv.getRootElements()) { + while (root.getEnclosingElement().getKind() != ElementKind.PACKAGE) { + root = root.getEnclosingElement(); + } + roots.add(((TypeElement) root).getQualifiedName().toString()); + } + for (String root : roots) { + TypeElement currentClass = elements.getTypeElement(root); + ExecutableElement constr = constructorsIn(currentClass.getEnclosedElements()).get(0); + Trees trees = Trees.instance(processingEnv); + TreePath path = trees.getPath(constr); + + new TreePathScanner () { + @Override public Void visitClass(ClassTree node, Void p) { + if (node.getSimpleName().contentEquals("Local")) { + //will also attribute the body on demand: + Element el = trees.getElement(getCurrentPath()); + Name binaryName = elements.getBinaryName((TypeElement) el); + if (!binaryName.contentEquals("OnDemandAttributionData$1Local")) { + throw new IllegalStateException("Incorrect binary name=" + binaryName); + } + } + return super.visitClass(node, p); + } + @Override public Void visitNewClass(NewClassTree node, Void p) { Element el = trees.getElement(getCurrentPath()); - Name binaryName = elements.getBinaryName((TypeElement) el); - if (!binaryName.contentEquals("OnDemandAttribution$1Local")) { + Name binaryName = elements.getBinaryName((TypeElement) el.getEnclosingElement()); + if (!binaryName.contentEquals("OnDemandAttributionData$1")) { throw new IllegalStateException("Incorrect binary name=" + binaryName); } + return super.visitNewClass(node, p); } - return super.visitClass(node, p); - } - @Override public Void visitNewClass(NewClassTree node, Void p) { - Element el = trees.getElement(getCurrentPath()); - Name binaryName = elements.getBinaryName((TypeElement) el.getEnclosingElement()); - if (!binaryName.contentEquals("OnDemandAttribution$1")) { - throw new IllegalStateException("Incorrect binary name=" + binaryName); + @Override + public Void visitMethodInvocation(MethodInvocationTree node, Void p) { + if (trees.getElement(getCurrentPath()) == null) + throw new IllegalStateException("No element for: " + node); + return super.visitMethodInvocation(node, p); } - return super.visitNewClass(node, p); + @Override + public Void visitIdentifier(IdentifierTree node, Void p) { + if (trees.getElement(getCurrentPath()) == null) + throw new IllegalStateException("No element for: " + node); + return super.visitIdentifier(node, p); + } + }.scan(path, null); + } + + if (round++ == 0) { + try (Writer out = filer.createSourceFile("Gen").openWriter()) { + out.write("class Gen { public static long C = 1; }"); + } catch (IOException ex) { + throw new IllegalStateException(ex); } - }.scan(path, null); + } return true; } diff --git a/langtools/test/tools/javac/processing/model/trees/OnDemandAttributionData.java b/langtools/test/tools/javac/processing/model/trees/OnDemandAttributionData.java new file mode 100644 index 00000000000..3b986e30c35 --- /dev/null +++ b/langtools/test/tools/javac/processing/model/trees/OnDemandAttributionData.java @@ -0,0 +1,59 @@ +/* + * 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 + * 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. + */ + +public class OnDemandAttributionData { + + public OnDemandAttributionData(int i) { + class Local { } + new Aux(Gen.C) { }; + } + + class Aux { + Aux(String str) {} + Aux(int i) {} + Aux(long l) {} + } + + private void methodAttributionTest() { + System.err.println(""); + } + + enum E { + A; + + final int i; + + E() { + i = Integer.parseInt("1"); + } + + } + + enum E2 { + A; + + { + int i = Integer.parseInt("1"); + } + } +} diff --git a/langtools/test/tools/jdeps/MultiReleaseJar.java b/langtools/test/tools/jdeps/MultiReleaseJar.java new file mode 100644 index 00000000000..0f4fd7cc405 --- /dev/null +++ b/langtools/test/tools/jdeps/MultiReleaseJar.java @@ -0,0 +1,274 @@ +/* + * 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 8153654 + * @summary Tests for jdeps tool with multi-release jar files + * @modules jdk.jdeps/com.sun.tools.jdeps + * @library mrjar mrjar/base mrjar/9 mrjar/10 mrjar/v9 mrjar/v10 + * @build test.* p.* q.* + * @run testng MultiReleaseJar + */ + +import org.testng.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.concurrent.TimeUnit; + +public class MultiReleaseJar { + Path mrjar; + String testJdk; + String fileSep; + Path cmdPath; + + @BeforeClass + public void initialize() throws Exception { + mrjar = Paths.get(System.getProperty("test.classes", "."), "mrjar"); + testJdk = System.getProperty("test.jdk"); + fileSep = System.getProperty("file.separator"); + cmdPath = Paths.get(testJdk, "bin"); + } + + @Test + public void basic() throws Exception { + // build the jar file + Result r = run("jar -cf Version.jar -C base test --release 9 -C 9 test --release 10 -C 10 test"); + checkResult(r); + + // try out a bunch of things + r = run("jdeps --multi-release 9 -v missing.jar"); + checkResult(r, false, "Warning: Path does not exist: missing.jar"); + + r = run("jdeps -v Version.jar"); + checkResult(r, false, "the --multi-release option is not set"); + + r = run("jdeps --multi-release base -v Version.jar"); + checkResult(r, true, + "Version.jar ->", + "test.Version", + "test.Version" + ); + + r = run("jdeps --multi-release 9 -v Version.jar"); + checkResult(r, true, + "Version.jar ->", + "9/test.NonPublic", + "9/test.NonPublic", + "9/test.Version", + "9/test.Version", + "9/test.Version", + "9/test.Version" + ); + + r = run("jdeps --multi-release 10 -v Version.jar"); + checkResult(r, true, + "Version.jar ->", + "10/test.Version", + "10/test.Version", + "10/test.Version", + "10/test.Version", + "9/test.NonPublic", + "9/test.NonPublic" + ); + + r = run("jdeps --multi-release 8 -v Version.jar"); + checkResult(r, false, "Error: invalid argument for option: 8"); + + r = run("jdeps --multi-release 9.1 -v Version.jar"); + checkResult(r, false, "Error: invalid argument for option: 9.1"); + + r = run("jdeps -v -R -cp Version.jar test/Main.class"); + checkResult(r, false, "the --multi-release option is not set"); + + r = run("jdeps -v -R -cp Version.jar -multi-release 9 test/Main.class"); + checkResult(r, false, + "Error: unknown option: -multi-release", + "Usage: jdeps ", + "Main.class ->", + "test.Main", + "test.Main", + "test.Main", + "Version.jar ->", + "9/test.NonPublic", + "9/test.NonPublic", + "9/test.Version", + "9/test.Version", + "9/test.Version", + "9/test.Version" + ); + + r = run("jdeps -v -R -cp Version.jar --multi-release 10 test/Main.class"); + checkResult(r, true, + "Main.class ->", + "Main.class ->", + "test.Main", + "test.Main", + "test.Main", + "Version.jar ->", + "10/test.Version", + "10/test.Version", + "10/test.Version", + "10/test.Version", + "9/test.NonPublic", + "9/test.NonPublic" + ); + + r = run("jdeps -v -R -cp Version.jar --multi-release base test/Main.class"); + checkResult(r, true, + "Main.class ->", + "Main.class ->", + "test.Main", + "test.Main", + "test.Main", + "Version.jar ->", + "test.Version", + "test.Version" + ); + + r = run("jdeps -v -R -cp Version.jar --multi-release 9.1 test/Main.class"); + checkResult(r, false, "Error: invalid argument for option: 9.1"); + + // Rebuild jar without version 10 + r = run("jar -cf Version.jar -C base test --release 9 -C 9 test"); + checkResult(r); + + // but ask for version 10 + r = run("jdeps -v -R -cp Version.jar --multi-release 10 test/Main.class"); + checkResult(r, true, + "Main.class ->", + "Main.class ->", + "test.Main", + "test.Main", + "test.Main", + "Version.jar ->", + "9/test.NonPublic", + "9/test.NonPublic", + "9/test.Version", + "9/test.Version", + "9/test.Version", + "9/test.Version" + ); + } + + @Test + public void ps_and_qs() throws Exception { + // build the jar file + Result r = run("jar -cf PQ.jar -C base p --release 9 -C v9 p -C v9 q --release 10 -C v10 q"); + checkResult(r); + + r = run("jdeps -v -R -cp PQ.jar --multi-release base PQ.jar"); + checkResult(r, true, + "PQ.jar -> java.base", + "p.Foo" + ); + + r = run("jdeps -v -R -cp PQ.jar --multi-release 9 PQ.jar"); + checkResult(r, true, + "PQ.jar -> java.base", + "9/p.Foo", + "9/p.Foo", + "9/q.Bar" + ); + + + r = run("jdeps -v -R -cp PQ.jar --multi-release 10 PQ.jar"); + checkResult(r, true, + "PQ.jar -> java.base", + "10/q.Bar", + "10/q.Bar", + "10/q.Gee", + "9/p.Foo", + "9/p.Foo" + ); + } + + static class Result { + final String cmd; + final int rc; + final String out; + final String err; + Result(String cmd, int rc, String out, String err) { + this.cmd = cmd; + this.rc = rc; + this.out = out; + this.err = err; + } + } + + Result run(String cmd) throws Exception { + String[] cmds = cmd.split(" +"); + cmds[0] = cmdPath.resolve(cmds[0]).toString(); + ProcessBuilder pb = new ProcessBuilder(cmds); + pb.directory(mrjar.toFile()); + Process p = pb.start(); + p.waitFor(10, TimeUnit.SECONDS); + String out; + try (InputStream is = p.getInputStream()) { + out = new String(is.readAllBytes()); + } + String err; + try (InputStream is = p.getErrorStream()) { + err = new String(is.readAllBytes()); + } + return new Result(cmd, p.exitValue(), out, err); + } + + void checkResult(Result r) throws Exception { + System.out.println(r.cmd); + System.out.println(r.out); + if (r.rc != 0) { + System.out.println(r.err); + throw new Exception("rc=" + r.rc); + } + System.out.println(); + } + + void checkResult(Result r, boolean checkrc, String... lines) throws Exception { + System.out.println(r.cmd); + System.out.println(r.out); + if (checkrc && r.rc != 0) { + System.out.println(r.err); + throw new Exception("rc=" + r.rc); + } + String[] out = r.out.split("\r?\n"); + Assert.assertEquals(out.length, lines.length); + int n = 0; + for (String line : lines) { + Assert.assertTrue(out[n++].contains(line), "\"" + line + "\""); + } + System.out.println(); + } +} diff --git a/langtools/test/tools/jdeps/mrjar/10/test/Version.java b/langtools/test/tools/jdeps/mrjar/10/test/Version.java new file mode 100644 index 00000000000..4d27269283b --- /dev/null +++ b/langtools/test/tools/jdeps/mrjar/10/test/Version.java @@ -0,0 +1,40 @@ +/* + * 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 test; + +public class Version { + public int getVersion() { + NonPublic np = new NonPublic(); + String ignore = np.toString(); + return 10; + } + + private String getStringVersion() { + return "10"; + } + + private void foo() { + if (getStringVersion() == null) throw new NullPointerException(); + } +} diff --git a/langtools/test/tools/jdeps/mrjar/9/test/NonPublic.java b/langtools/test/tools/jdeps/mrjar/9/test/NonPublic.java new file mode 100644 index 00000000000..112a97044a0 --- /dev/null +++ b/langtools/test/tools/jdeps/mrjar/9/test/NonPublic.java @@ -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 test; + +class NonPublic { + public String toString() { + return "NonPublic"; + } +} diff --git a/langtools/test/tools/jdeps/mrjar/9/test/Version.java b/langtools/test/tools/jdeps/mrjar/9/test/Version.java new file mode 100644 index 00000000000..c4f310e35c4 --- /dev/null +++ b/langtools/test/tools/jdeps/mrjar/9/test/Version.java @@ -0,0 +1,36 @@ +/* + * 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 test; + +public class Version { + public int getVersion() { + NonPublic np = new NonPublic(); + String ignore = np.toString(); + return 9; + } + + private void foo() { + if (getVersion() != 9) throw new RuntimeException(); + } +} diff --git a/langtools/test/tools/jdeps/mrjar/base/p/Foo.java b/langtools/test/tools/jdeps/mrjar/base/p/Foo.java new file mode 100644 index 00000000000..6169cb05de0 --- /dev/null +++ b/langtools/test/tools/jdeps/mrjar/base/p/Foo.java @@ -0,0 +1,28 @@ +/* + * 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; + +// dependencies: Object +public class Foo { +} diff --git a/langtools/test/tools/jdeps/mrjar/base/test/Version.java b/langtools/test/tools/jdeps/mrjar/base/test/Version.java new file mode 100644 index 00000000000..b3c6bc9f9e0 --- /dev/null +++ b/langtools/test/tools/jdeps/mrjar/base/test/Version.java @@ -0,0 +1,34 @@ +/* + * 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 test; + +public class Version { + public int getVersion() { + return 8; + } + + private void foo() { + if (getVersion() != 8) throw new IllegalStateException(); + } +} diff --git a/langtools/test/tools/jdeps/mrjar/test/Main.java b/langtools/test/tools/jdeps/mrjar/test/Main.java new file mode 100644 index 00000000000..994ecbf7699 --- /dev/null +++ b/langtools/test/tools/jdeps/mrjar/test/Main.java @@ -0,0 +1,35 @@ +/* + * 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 test; + +public class Main { + public void run() { + Version v = new Version(); + v.getVersion(); + } + + public static void main(String[] args) { + (new Main()).run(); + } +} diff --git a/langtools/test/tools/jdeps/mrjar/v10/q/Bar.java b/langtools/test/tools/jdeps/mrjar/v10/q/Bar.java new file mode 100644 index 00000000000..e1b39c5b605 --- /dev/null +++ b/langtools/test/tools/jdeps/mrjar/v10/q/Bar.java @@ -0,0 +1,29 @@ +/* + * 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 q; + +// dependencies: Object, q.Gee +class Bar { + Gee gee = new Gee(); +} diff --git a/langtools/test/tools/jdeps/mrjar/v10/q/Gee.java b/langtools/test/tools/jdeps/mrjar/v10/q/Gee.java new file mode 100644 index 00000000000..c5bd2a7fa69 --- /dev/null +++ b/langtools/test/tools/jdeps/mrjar/v10/q/Gee.java @@ -0,0 +1,28 @@ +/* + * 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 q; + +// dependencies: Object +class Gee { +} diff --git a/langtools/test/tools/jdeps/mrjar/v9/p/Foo.java b/langtools/test/tools/jdeps/mrjar/v9/p/Foo.java new file mode 100644 index 00000000000..e3b6dbd8f0d --- /dev/null +++ b/langtools/test/tools/jdeps/mrjar/v9/p/Foo.java @@ -0,0 +1,31 @@ +/* + * 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; + +// dependencies: Object, q.Bar +public class Foo { + void crash() { + throw new RuntimeException(); + } +} diff --git a/langtools/test/tools/jdeps/mrjar/v9/q/Bar.java b/langtools/test/tools/jdeps/mrjar/v9/q/Bar.java new file mode 100644 index 00000000000..501e29bbfb7 --- /dev/null +++ b/langtools/test/tools/jdeps/mrjar/v9/q/Bar.java @@ -0,0 +1,28 @@ +/* + * 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 q; + +// dependecies: Object +class Bar { +} diff --git a/make/MainSupport.gmk b/make/MainSupport.gmk index 7683cfeb2af..57fd68deaa5 100644 --- a/make/MainSupport.gmk +++ b/make/MainSupport.gmk @@ -31,11 +31,13 @@ ifndef _MAINSUPPORT_GMK _MAINSUPPORT_GMK := 1 # Run the tests specified by $1, with PRODUCT_HOME specified by $2 +# JT_JAVA is picked up by the jtreg launcher and used to run Jtreg itself. define RunTests ($(CD) $(SRC_ROOT)/test && $(MAKE) $(MAKE_ARGS) -j1 -k MAKEFLAGS= \ JT_HOME=$(JT_HOME) PRODUCT_HOME=$(strip $2) \ TEST_IMAGE_DIR=$(TEST_IMAGE_DIR) \ ALT_OUTPUTDIR=$(OUTPUT_ROOT) TEST_JOBS=$(TEST_JOBS) \ + JT_JAVA=$(BOOT_JDK) \ JOBS=$(JOBS) $1) || true endef diff --git a/nashorn/.hgtags b/nashorn/.hgtags index 26b80a32770..41633a26b9a 100644 --- a/nashorn/.hgtags +++ b/nashorn/.hgtags @@ -370,3 +370,4 @@ ee77c6b3713ab293e027ac3ea1cc16f86dac535f jdk-9+131 e05400ba935753c77697af936db24657eb811022 jdk-9+134 cb00d5ef023a18a66fcb4311ed4474d4145c66e9 jdk-9+135 f11b8f5c4ccbf9c87d283815abac6c0117fba3c0 jdk-9+136 +17ed43add2f9e3528686cd786ae2ed49c8ed36e9 jdk-9+137 diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java index f784b74ca5f..c9fa06880f9 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java @@ -2512,7 +2512,8 @@ final class CodeGenerator extends NodeOperatorVisitor elements = objectNode.getElements(); final List > tuples = new ArrayList<>(); - final List gettersSetters = new ArrayList<>(); + // List below will contain getter/setter properties and properties with computed keys (ES6) + final List specialProperties = new ArrayList<>(); final int ccp = getCurrentContinuationEntryPoint(); final List ranges = objectNode.getSplitRanges(); @@ -2522,11 +2523,14 @@ final class CodeGenerator extends NodeOperatorVisitor valueType = (!useDualFields() || value == null || value.getType().isBoolean()) ? Object.class : value.getType().getTypeClass(); + final Class> valueType = (!useDualFields() || isComputedOrAccessor || value.getType().isBoolean()) ? Object.class : value.getType().getTypeClass(); tuples.add(new MapTuple (key, symbol, Type.typeFor(valueType), value) { @Override public Class> getValueType() { @@ -2590,26 +2594,41 @@ final class CodeGenerator extends NodeOperatorVisitor map = new HashMap<>(); rp.save(map); compileJdk = (String) map.get("regtest.compilejdk"); diff --git a/test/failure_handler/src/share/classes/jdk/test/failurehandler/jtreg/GatherProcessInfoTimeoutHandler.java b/test/failure_handler/src/share/classes/jdk/test/failurehandler/jtreg/GatherProcessInfoTimeoutHandler.java index c08418073fe..10c0580dc50 100644 --- a/test/failure_handler/src/share/classes/jdk/test/failurehandler/jtreg/GatherProcessInfoTimeoutHandler.java +++ b/test/failure_handler/src/share/classes/jdk/test/failurehandler/jtreg/GatherProcessInfoTimeoutHandler.java @@ -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 @@ -23,7 +23,6 @@ package jdk.test.failurehandler.jtreg; -import com.sun.javatest.regtest.OS; import com.sun.javatest.regtest.TimeoutHandler; import jdk.test.failurehandler.*; diff --git a/test/failure_handler/src/share/classes/jdk/test/failurehandler/jtreg/OS.java b/test/failure_handler/src/share/classes/jdk/test/failurehandler/jtreg/OS.java new file mode 100644 index 00000000000..ccc1861f9e7 --- /dev/null +++ b/test/failure_handler/src/share/classes/jdk/test/failurehandler/jtreg/OS.java @@ -0,0 +1,56 @@ +/* + * 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.failurehandler.jtreg; + +// Stripped down version of jtreg internal class com.sun.javatest.regtest.config.OS +class OS { + public final String family; + + private static OS current; + + public static OS current() { + if (current == null) { + String name = System.getProperty("os.name"); + current = new OS(name); + } + return current; + } + + private OS(String name) { + if (name.startsWith("Linux")) { + family = "linux"; + } else if (name.startsWith("Mac") || name.startsWith("Darwin")) { + family = "mac"; + } else if (name.startsWith("SunOS") || name.startsWith("Solaris")) { + family = "solaris"; + } else if (name.startsWith("Windows")) { + family = "windows"; + } else { + // use first word of name + family = name.replaceFirst("^([^ ]+).*", "$1"); + } + } +} + + diff --git a/test/lib/jdk/test/lib/Platform.java b/test/lib/jdk/test/lib/Platform.java index ec4fa8b63ba..1c5e60021c2 100644 --- a/test/lib/jdk/test/lib/Platform.java +++ b/test/lib/jdk/test/lib/Platform.java @@ -116,6 +116,14 @@ public class Platform { return (jdkDebug.toLowerCase().contains("debug")); } + public static boolean isSlowDebugBuild() { + return (jdkDebug.toLowerCase().equals("slowdebug")); + } + + public static boolean isFastDebugBuild() { + return (jdkDebug.toLowerCase().equals("fastdebug")); + } + public static String getVMVersion() { return vmVersion; }