--- a/.hgtags Tue Jul 14 20:36:12 2015 +0300
+++ b/.hgtags Tue Jul 14 15:26:34 2015 -0700
@@ -314,3 +314,4 @@
d69c968463f0ae5d0b45de3fc14fe65171b23948 jdk9-b69
43d0179ee9de3bfffae3417f09e07eb6d8efc963 jdk9-b70
f66c185284727f6e6ffd27e9c45ed2dd9da0a691 jdk9-b71
+61d2d0629b6dbf4c091dc86151ade1b3ef34fffe jdk9-b72
--- a/.hgtags-top-repo Tue Jul 14 20:36:12 2015 +0300
+++ b/.hgtags-top-repo Tue Jul 14 15:26:34 2015 -0700
@@ -314,3 +314,4 @@
1bcfd6b8726582cff5a42dbfc75903e36f9dd4fe jdk9-b69
eed77fcd77711fcdba05f18fc22f37d86efb243c jdk9-b70
c706ef5ea5da00078dc5e4334660315f7d99c15b jdk9-b71
+8582c35016fb6211b373810b6b172feccf9c483b jdk9-b72
--- a/corba/.hgtags Tue Jul 14 20:36:12 2015 +0300
+++ b/corba/.hgtags Tue Jul 14 15:26:34 2015 -0700
@@ -314,3 +314,4 @@
de8acedcb5b5870f1dc54cba575aaa5d33897ea2 jdk9-b69
e7cf01990ed366bd493080663259281e91ce223b jdk9-b70
cd39ed501fb0504554a7f58ac6cf3dd2b64afec0 jdk9-b71
+f9f3706bd24c42c07cb260fe05730a749b8e52f4 jdk9-b72
--- a/hotspot/.hgtags Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/.hgtags Tue Jul 14 15:26:34 2015 -0700
@@ -474,3 +474,4 @@
ff0929a59ced0e144201aa05819ae2e47d6f2c61 jdk9-b69
8672e9264db30c21504063932dbc374eabc287a1 jdk9-b70
07c6b035d68b0c41b1dcd442157b50b41a2551e9 jdk9-b71
+c1b2825ef47e75cb34dd18450d1c4280b7c5853c jdk9-b72
--- a/hotspot/src/cpu/aarch64/vm/aarch64.ad Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/cpu/aarch64/vm/aarch64.ad Tue Jul 14 15:26:34 2015 -0700
@@ -865,6 +865,42 @@
V31, V31_H
);
+// Class for all 64bit vector registers
+reg_class vectord_reg(
+ V0, V0_H,
+ V1, V1_H,
+ V2, V2_H,
+ V3, V3_H,
+ V4, V4_H,
+ V5, V5_H,
+ V6, V6_H,
+ V7, V7_H,
+ V8, V8_H,
+ V9, V9_H,
+ V10, V10_H,
+ V11, V11_H,
+ V12, V12_H,
+ V13, V13_H,
+ V14, V14_H,
+ V15, V15_H,
+ V16, V16_H,
+ V17, V17_H,
+ V18, V18_H,
+ V19, V19_H,
+ V20, V20_H,
+ V21, V21_H,
+ V22, V22_H,
+ V23, V23_H,
+ V24, V24_H,
+ V25, V25_H,
+ V26, V26_H,
+ V27, V27_H,
+ V28, V28_H,
+ V29, V29_H,
+ V30, V30_H,
+ V31, V31_H
+);
+
// Class for all 128bit vector registers
reg_class vectorx_reg(
V0, V0_H, V0_J, V0_K,
@@ -2133,40 +2169,48 @@
if (bottom_type()->isa_vect() != NULL) {
uint len = 4;
+ uint ireg = ideal_reg();
+ assert(ireg == Op_VecD || ireg == Op_VecX, "must be 64 bit or 128 bit vector");
if (cbuf) {
MacroAssembler _masm(cbuf);
- uint ireg = ideal_reg();
assert((src_lo_rc != rc_int && dst_lo_rc != rc_int), "sanity");
- assert(ireg == Op_VecX, "sanity");
if (src_lo_rc == rc_stack && dst_lo_rc == rc_stack) {
// stack->stack
int src_offset = ra_->reg2offset(src_lo);
int dst_offset = ra_->reg2offset(dst_lo);
assert((src_offset & 7) && (dst_offset & 7), "unaligned stack offset");
len = 8;
- if (src_offset < 512) {
- __ ldp(rscratch1, rscratch2, Address(sp, src_offset));
- } else {
+ if (ireg == Op_VecD) {
__ ldr(rscratch1, Address(sp, src_offset));
- __ ldr(rscratch2, Address(sp, src_offset+4));
- len += 4;
- }
- if (dst_offset < 512) {
- __ stp(rscratch1, rscratch2, Address(sp, dst_offset));
+ __ str(rscratch1, Address(sp, dst_offset));
} else {
- __ str(rscratch1, Address(sp, dst_offset));
- __ str(rscratch2, Address(sp, dst_offset+4));
- len += 4;
+ if (src_offset < 512) {
+ __ ldp(rscratch1, rscratch2, Address(sp, src_offset));
+ } else {
+ __ ldr(rscratch1, Address(sp, src_offset));
+ __ ldr(rscratch2, Address(sp, src_offset+4));
+ len += 4;
+ }
+ if (dst_offset < 512) {
+ __ stp(rscratch1, rscratch2, Address(sp, dst_offset));
+ } else {
+ __ str(rscratch1, Address(sp, dst_offset));
+ __ str(rscratch2, Address(sp, dst_offset+4));
+ len += 4;
+ }
}
} else if (src_lo_rc == rc_float && dst_lo_rc == rc_float) {
- __ orr(as_FloatRegister(Matcher::_regEncode[dst_lo]), __ T16B,
+ __ orr(as_FloatRegister(Matcher::_regEncode[dst_lo]),
+ ireg == Op_VecD ? __ T8B : __ T16B,
as_FloatRegister(Matcher::_regEncode[src_lo]),
as_FloatRegister(Matcher::_regEncode[src_lo]));
} else if (src_lo_rc == rc_float && dst_lo_rc == rc_stack) {
- __ str(as_FloatRegister(Matcher::_regEncode[src_lo]), __ Q,
+ __ str(as_FloatRegister(Matcher::_regEncode[src_lo]),
+ ireg == Op_VecD ? __ D : __ Q,
Address(sp, ra_->reg2offset(dst_lo)));
} else if (src_lo_rc == rc_stack && dst_lo_rc == rc_float) {
- __ ldr(as_FloatRegister(Matcher::_regEncode[dst_lo]), __ Q,
+ __ ldr(as_FloatRegister(Matcher::_regEncode[dst_lo]),
+ ireg == Op_VecD ? __ D : __ Q,
Address(sp, ra_->reg2offset(src_lo)));
} else {
ShouldNotReachHere();
@@ -2176,17 +2220,22 @@
// stack->stack
int src_offset = ra_->reg2offset(src_lo);
int dst_offset = ra_->reg2offset(dst_lo);
- if (src_offset < 512) {
- st->print("ldp rscratch1, rscratch2, [sp, #%d]", src_offset);
- } else {
+ if (ireg == Op_VecD) {
st->print("ldr rscratch1, [sp, #%d]", src_offset);
- st->print("\nldr rscratch2, [sp, #%d]", src_offset+4);
- }
- if (dst_offset < 512) {
- st->print("\nstp rscratch1, rscratch2, [sp, #%d]", dst_offset);
+ st->print("str rscratch1, [sp, #%d]", dst_offset);
} else {
- st->print("\nstr rscratch1, [sp, #%d]", dst_offset);
- st->print("\nstr rscratch2, [sp, #%d]", dst_offset+4);
+ if (src_offset < 512) {
+ st->print("ldp rscratch1, rscratch2, [sp, #%d]", src_offset);
+ } else {
+ st->print("ldr rscratch1, [sp, #%d]", src_offset);
+ st->print("\nldr rscratch2, [sp, #%d]", src_offset+4);
+ }
+ if (dst_offset < 512) {
+ st->print("\nstp rscratch1, rscratch2, [sp, #%d]", dst_offset);
+ } else {
+ st->print("\nstr rscratch1, [sp, #%d]", dst_offset);
+ st->print("\nstr rscratch2, [sp, #%d]", dst_offset+4);
+ }
}
st->print("\t# vector spill, stack to stack");
} else if (src_lo_rc == rc_float && dst_lo_rc == rc_float) {
@@ -2638,17 +2687,22 @@
return vector_width_in_bytes(bt)/type2aelembytes(bt);
}
const int Matcher::min_vector_size(const BasicType bt) {
- //return (type2aelembytes(bt) == 1) ? 4 : 2;
- // For the moment, only support 1 vector size, 128 bits
- return max_vector_size(bt);
+// For the moment limit the vector size to 8 bytes
+ int size = 8 / type2aelembytes(bt);
+ if (size < 2) size = 2;
+ return size;
}
// Vector ideal reg.
const int Matcher::vector_ideal_reg(int len) {
- return Op_VecX;
+ switch(len) {
+ case 8: return Op_VecD;
+ case 16: return Op_VecX;
+ }
+ ShouldNotReachHere();
+ return 0;
}
-// Only lowest bits of xmm reg are used for vector shift count.
const int Matcher::vector_shift_count_ideal_reg(int size) {
return Op_VecX;
}
@@ -2660,9 +2714,7 @@
// x86 supports misaligned vectors store/load.
const bool Matcher::misaligned_vectors_ok() {
- // TODO fixme
- // return !AlignVector; // can be changed by flag
- return false;
+ return !AlignVector; // can be changed by flag
}
// false => size gets scaled to BytesPerLong, ok.
@@ -3073,13 +3125,13 @@
as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
%}
- enc_class aarch64_enc_ldrvS(vecX dst, memory mem) %{
+ enc_class aarch64_enc_ldrvS(vecD dst, memory mem) %{
FloatRegister dst_reg = as_FloatRegister($dst$$reg);
loadStore(MacroAssembler(&cbuf), &MacroAssembler::ldr, dst_reg, MacroAssembler::S,
$mem->opcode(), as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
%}
- enc_class aarch64_enc_ldrvD(vecX dst, memory mem) %{
+ enc_class aarch64_enc_ldrvD(vecD dst, memory mem) %{
FloatRegister dst_reg = as_FloatRegister($dst$$reg);
loadStore(MacroAssembler(&cbuf), &MacroAssembler::ldr, dst_reg, MacroAssembler::D,
$mem->opcode(), as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
@@ -3159,13 +3211,13 @@
as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
%}
- enc_class aarch64_enc_strvS(vecX src, memory mem) %{
+ enc_class aarch64_enc_strvS(vecD src, memory mem) %{
FloatRegister src_reg = as_FloatRegister($src$$reg);
loadStore(MacroAssembler(&cbuf), &MacroAssembler::str, src_reg, MacroAssembler::S,
$mem->opcode(), as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
%}
- enc_class aarch64_enc_strvD(vecX src, memory mem) %{
+ enc_class aarch64_enc_strvD(vecD src, memory mem) %{
FloatRegister src_reg = as_FloatRegister($src$$reg);
loadStore(MacroAssembler(&cbuf), &MacroAssembler::str, src_reg, MacroAssembler::D,
$mem->opcode(), as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
@@ -5187,6 +5239,16 @@
interface(REG_INTER);
%}
+operand vecD()
+%{
+ constraint(ALLOC_IN_RC(vectord_reg));
+ match(VecD);
+
+ op_cost(0);
+ format %{ %}
+ interface(REG_INTER);
+%}
+
operand vecX()
%{
constraint(ALLOC_IN_RC(vectorx_reg));
@@ -7402,6 +7464,96 @@
ins_pipe(ialu_reg);
%}
+//---------- Population Count Instructions -------------------------------------
+//
+
+instruct popCountI(iRegINoSp dst, iRegIorL2I src, vRegF tmp) %{
+ predicate(UsePopCountInstruction);
+ match(Set dst (PopCountI src));
+ effect(TEMP tmp);
+ ins_cost(INSN_COST * 13);
+
+ format %{ "movw $src, $src\n\t"
+ "mov $tmp, $src\t# vector (1D)\n\t"
+ "cnt $tmp, $tmp\t# vector (8B)\n\t"
+ "addv $tmp, $tmp\t# vector (8B)\n\t"
+ "mov $dst, $tmp\t# vector (1D)" %}
+ ins_encode %{
+ __ movw($src$$Register, $src$$Register); // ensure top 32 bits 0
+ __ mov($tmp$$FloatRegister, __ T1D, 0, $src$$Register);
+ __ cnt($tmp$$FloatRegister, __ T8B, $tmp$$FloatRegister);
+ __ addv($tmp$$FloatRegister, __ T8B, $tmp$$FloatRegister);
+ __ mov($dst$$Register, $tmp$$FloatRegister, __ T1D, 0);
+ %}
+
+ ins_pipe(pipe_class_default);
+%}
+
+instruct popCountI_mem(iRegINoSp dst, memory mem, vRegF tmp) %{
+ predicate(UsePopCountInstruction);
+ match(Set dst (PopCountI (LoadI mem)));
+ effect(TEMP tmp);
+ ins_cost(INSN_COST * 13);
+
+ format %{ "ldrs $tmp, $mem\n\t"
+ "cnt $tmp, $tmp\t# vector (8B)\n\t"
+ "addv $tmp, $tmp\t# vector (8B)\n\t"
+ "mov $dst, $tmp\t# vector (1D)" %}
+ ins_encode %{
+ FloatRegister tmp_reg = as_FloatRegister($tmp$$reg);
+ loadStore(MacroAssembler(&cbuf), &MacroAssembler::ldrs, tmp_reg, $mem->opcode(),
+ as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
+ __ cnt($tmp$$FloatRegister, __ T8B, $tmp$$FloatRegister);
+ __ addv($tmp$$FloatRegister, __ T8B, $tmp$$FloatRegister);
+ __ mov($dst$$Register, $tmp$$FloatRegister, __ T1D, 0);
+ %}
+
+ ins_pipe(pipe_class_default);
+%}
+
+// Note: Long.bitCount(long) returns an int.
+instruct popCountL(iRegINoSp dst, iRegL src, vRegD tmp) %{
+ predicate(UsePopCountInstruction);
+ match(Set dst (PopCountL src));
+ effect(TEMP tmp);
+ ins_cost(INSN_COST * 13);
+
+ format %{ "mov $tmp, $src\t# vector (1D)\n\t"
+ "cnt $tmp, $tmp\t# vector (8B)\n\t"
+ "addv $tmp, $tmp\t# vector (8B)\n\t"
+ "mov $dst, $tmp\t# vector (1D)" %}
+ ins_encode %{
+ __ mov($tmp$$FloatRegister, __ T1D, 0, $src$$Register);
+ __ cnt($tmp$$FloatRegister, __ T8B, $tmp$$FloatRegister);
+ __ addv($tmp$$FloatRegister, __ T8B, $tmp$$FloatRegister);
+ __ mov($dst$$Register, $tmp$$FloatRegister, __ T1D, 0);
+ %}
+
+ ins_pipe(pipe_class_default);
+%}
+
+instruct popCountL_mem(iRegINoSp dst, memory mem, vRegD tmp) %{
+ predicate(UsePopCountInstruction);
+ match(Set dst (PopCountL (LoadL mem)));
+ effect(TEMP tmp);
+ ins_cost(INSN_COST * 13);
+
+ format %{ "ldrd $tmp, $mem\n\t"
+ "cnt $tmp, $tmp\t# vector (8B)\n\t"
+ "addv $tmp, $tmp\t# vector (8B)\n\t"
+ "mov $dst, $tmp\t# vector (1D)" %}
+ ins_encode %{
+ FloatRegister tmp_reg = as_FloatRegister($tmp$$reg);
+ loadStore(MacroAssembler(&cbuf), &MacroAssembler::ldrd, tmp_reg, $mem->opcode(),
+ as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
+ __ cnt($tmp$$FloatRegister, __ T8B, $tmp$$FloatRegister);
+ __ addv($tmp$$FloatRegister, __ T8B, $tmp$$FloatRegister);
+ __ mov($dst$$Register, $tmp$$FloatRegister, __ T1D, 0);
+ %}
+
+ ins_pipe(pipe_class_default);
+%}
+
// ============================================================================
// MemBar Instruction
@@ -13194,7 +13346,7 @@
// ====================VECTOR INSTRUCTIONS=====================================
// Load vector (32 bits)
-instruct loadV4(vecX dst, vmem mem)
+instruct loadV4(vecD dst, vmem mem)
%{
predicate(n->as_LoadVector()->memory_size() == 4);
match(Set dst (LoadVector mem));
@@ -13205,7 +13357,7 @@
%}
// Load vector (64 bits)
-instruct loadV8(vecX dst, vmem mem)
+instruct loadV8(vecD dst, vmem mem)
%{
predicate(n->as_LoadVector()->memory_size() == 8);
match(Set dst (LoadVector mem));
@@ -13227,7 +13379,7 @@
%}
// Store Vector (32 bits)
-instruct storeV4(vecX src, vmem mem)
+instruct storeV4(vecD src, vmem mem)
%{
predicate(n->as_StoreVector()->memory_size() == 4);
match(Set mem (StoreVector mem src));
@@ -13238,7 +13390,7 @@
%}
// Store Vector (64 bits)
-instruct storeV8(vecX src, vmem mem)
+instruct storeV8(vecD src, vmem mem)
%{
predicate(n->as_StoreVector()->memory_size() == 8);
match(Set mem (StoreVector mem src));
@@ -13259,8 +13411,22 @@
ins_pipe(pipe_class_memory);
%}
+instruct replicate8B(vecD dst, iRegIorL2I src)
+%{
+ predicate(n->as_Vector()->length() == 4 ||
+ n->as_Vector()->length() == 8);
+ match(Set dst (ReplicateB src));
+ ins_cost(INSN_COST);
+ format %{ "dup $dst, $src\t# vector (8B)" %}
+ ins_encode %{
+ __ dup(as_FloatRegister($dst$$reg), __ T8B, as_Register($src$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct replicate16B(vecX dst, iRegIorL2I src)
%{
+ predicate(n->as_Vector()->length() == 16);
match(Set dst (ReplicateB src));
ins_cost(INSN_COST);
format %{ "dup $dst, $src\t# vector (16B)" %}
@@ -13270,8 +13436,22 @@
ins_pipe(pipe_class_default);
%}
+instruct replicate8B_imm(vecD dst, immI con)
+%{
+ predicate(n->as_Vector()->length() == 4 ||
+ n->as_Vector()->length() == 8);
+ match(Set dst (ReplicateB con));
+ ins_cost(INSN_COST);
+ format %{ "movi $dst, $con\t# vector(8B)" %}
+ ins_encode %{
+ __ mov(as_FloatRegister($dst$$reg), __ T8B, $con$$constant & 0xff);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct replicate16B_imm(vecX dst, immI con)
%{
+ predicate(n->as_Vector()->length() == 16);
match(Set dst (ReplicateB con));
ins_cost(INSN_COST);
format %{ "movi $dst, $con\t# vector(16B)" %}
@@ -13281,8 +13461,22 @@
ins_pipe(pipe_class_default);
%}
+instruct replicate4S(vecD dst, iRegIorL2I src)
+%{
+ predicate(n->as_Vector()->length() == 2 ||
+ n->as_Vector()->length() == 4);
+ match(Set dst (ReplicateS src));
+ ins_cost(INSN_COST);
+ format %{ "dup $dst, $src\t# vector (4S)" %}
+ ins_encode %{
+ __ dup(as_FloatRegister($dst$$reg), __ T4H, as_Register($src$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct replicate8S(vecX dst, iRegIorL2I src)
%{
+ predicate(n->as_Vector()->length() == 8);
match(Set dst (ReplicateS src));
ins_cost(INSN_COST);
format %{ "dup $dst, $src\t# vector (8S)" %}
@@ -13292,8 +13486,22 @@
ins_pipe(pipe_class_default);
%}
+instruct replicate4S_imm(vecD dst, immI con)
+%{
+ predicate(n->as_Vector()->length() == 2 ||
+ n->as_Vector()->length() == 4);
+ match(Set dst (ReplicateS con));
+ ins_cost(INSN_COST);
+ format %{ "movi $dst, $con\t# vector(4H)" %}
+ ins_encode %{
+ __ mov(as_FloatRegister($dst$$reg), __ T4H, $con$$constant & 0xffff);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct replicate8S_imm(vecX dst, immI con)
%{
+ predicate(n->as_Vector()->length() == 8);
match(Set dst (ReplicateS con));
ins_cost(INSN_COST);
format %{ "movi $dst, $con\t# vector(8H)" %}
@@ -13303,8 +13511,21 @@
ins_pipe(pipe_class_default);
%}
+instruct replicate2I(vecD dst, iRegIorL2I src)
+%{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (ReplicateI src));
+ ins_cost(INSN_COST);
+ format %{ "dup $dst, $src\t# vector (2I)" %}
+ ins_encode %{
+ __ dup(as_FloatRegister($dst$$reg), __ T2S, as_Register($src$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct replicate4I(vecX dst, iRegIorL2I src)
%{
+ predicate(n->as_Vector()->length() == 4);
match(Set dst (ReplicateI src));
ins_cost(INSN_COST);
format %{ "dup $dst, $src\t# vector (4I)" %}
@@ -13314,8 +13535,21 @@
ins_pipe(pipe_class_default);
%}
+instruct replicate2I_imm(vecD dst, immI con)
+%{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (ReplicateI con));
+ ins_cost(INSN_COST);
+ format %{ "movi $dst, $con\t# vector(2I)" %}
+ ins_encode %{
+ __ mov(as_FloatRegister($dst$$reg), __ T2S, $con$$constant);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct replicate4I_imm(vecX dst, immI con)
%{
+ predicate(n->as_Vector()->length() == 4);
match(Set dst (ReplicateI con));
ins_cost(INSN_COST);
format %{ "movi $dst, $con\t# vector(4I)" %}
@@ -13327,6 +13561,7 @@
instruct replicate2L(vecX dst, iRegL src)
%{
+ predicate(n->as_Vector()->length() == 2);
match(Set dst (ReplicateL src));
ins_cost(INSN_COST);
format %{ "dup $dst, $src\t# vector (2L)" %}
@@ -13338,6 +13573,7 @@
instruct replicate2L_zero(vecX dst, immI0 zero)
%{
+ predicate(n->as_Vector()->length() == 2);
match(Set dst (ReplicateI zero));
ins_cost(INSN_COST);
format %{ "movi $dst, $zero\t# vector(4I)" %}
@@ -13349,8 +13585,22 @@
ins_pipe(pipe_class_default);
%}
+instruct replicate2F(vecD dst, vRegF src)
+%{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (ReplicateF src));
+ ins_cost(INSN_COST);
+ format %{ "dup $dst, $src\t# vector (2F)" %}
+ ins_encode %{
+ __ dup(as_FloatRegister($dst$$reg), __ T2S,
+ as_FloatRegister($src$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct replicate4F(vecX dst, vRegF src)
%{
+ predicate(n->as_Vector()->length() == 4);
match(Set dst (ReplicateF src));
ins_cost(INSN_COST);
format %{ "dup $dst, $src\t# vector (4F)" %}
@@ -13363,6 +13613,7 @@
instruct replicate2D(vecX dst, vRegD src)
%{
+ predicate(n->as_Vector()->length() == 2);
match(Set dst (ReplicateD src));
ins_cost(INSN_COST);
format %{ "dup $dst, $src\t# vector (2D)" %}
@@ -13375,6 +13626,25 @@
// ====================REDUCTION ARITHMETIC====================================
+instruct reduce_add2I(iRegINoSp dst, iRegIorL2I src1, vecD src2, iRegI tmp, iRegI tmp2)
+%{
+ match(Set dst (AddReductionVI src1 src2));
+ ins_cost(INSN_COST);
+ effect(TEMP tmp, TEMP tmp2);
+ format %{ "umov $tmp, $src2, S, 0\n\t"
+ "umov $tmp2, $src2, S, 1\n\t"
+ "addw $dst, $src1, $tmp\n\t"
+ "addw $dst, $dst, $tmp2\t add reduction2i"
+ %}
+ ins_encode %{
+ __ umov($tmp$$Register, as_FloatRegister($src2$$reg), __ S, 0);
+ __ umov($tmp2$$Register, as_FloatRegister($src2$$reg), __ S, 1);
+ __ addw($dst$$Register, $src1$$Register, $tmp$$Register);
+ __ addw($dst$$Register, $dst$$Register, $tmp2$$Register);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct reduce_add4I(iRegINoSp dst, iRegIorL2I src1, vecX src2, vecX tmp, iRegI tmp2)
%{
match(Set dst (AddReductionVI src1 src2));
@@ -13393,6 +13663,25 @@
ins_pipe(pipe_class_default);
%}
+instruct reduce_mul2I(iRegINoSp dst, iRegIorL2I src1, vecD src2, iRegI tmp)
+%{
+ match(Set dst (MulReductionVI src1 src2));
+ ins_cost(INSN_COST);
+ effect(TEMP tmp, TEMP dst);
+ format %{ "umov $tmp, $src2, S, 0\n\t"
+ "mul $dst, $tmp, $src1\n\t"
+ "umov $tmp, $src2, S, 1\n\t"
+ "mul $dst, $tmp, $dst\t mul reduction2i\n\t"
+ %}
+ ins_encode %{
+ __ umov($tmp$$Register, as_FloatRegister($src2$$reg), __ S, 0);
+ __ mul($dst$$Register, $tmp$$Register, $src1$$Register);
+ __ umov($tmp$$Register, as_FloatRegister($src2$$reg), __ S, 1);
+ __ mul($dst$$Register, $tmp$$Register, $dst$$Register);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct reduce_mul4I(iRegINoSp dst, iRegIorL2I src1, vecX src2, vecX tmp, iRegI tmp2)
%{
match(Set dst (MulReductionVI src1 src2));
@@ -13418,6 +13707,26 @@
ins_pipe(pipe_class_default);
%}
+instruct reduce_add2F(vRegF dst, vRegF src1, vecD src2, vecD tmp)
+%{
+ match(Set dst (AddReductionVF src1 src2));
+ ins_cost(INSN_COST);
+ effect(TEMP tmp, TEMP dst);
+ format %{ "fadds $dst, $src1, $src2\n\t"
+ "ins $tmp, S, $src2, 0, 1\n\t"
+ "fadds $dst, $dst, $tmp\t add reduction2f"
+ %}
+ ins_encode %{
+ __ fadds(as_FloatRegister($dst$$reg),
+ as_FloatRegister($src1$$reg), as_FloatRegister($src2$$reg));
+ __ ins(as_FloatRegister($tmp$$reg), __ S,
+ as_FloatRegister($src2$$reg), 0, 1);
+ __ fadds(as_FloatRegister($dst$$reg),
+ as_FloatRegister($dst$$reg), as_FloatRegister($tmp$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct reduce_add4F(vRegF dst, vRegF src1, vecX src2, vecX tmp)
%{
match(Set dst (AddReductionVF src1 src2));
@@ -13450,6 +13759,26 @@
ins_pipe(pipe_class_default);
%}
+instruct reduce_mul2F(vRegF dst, vRegF src1, vecD src2, vecD tmp)
+%{
+ match(Set dst (MulReductionVF src1 src2));
+ ins_cost(INSN_COST);
+ effect(TEMP tmp, TEMP dst);
+ format %{ "fmuls $dst, $src1, $src2\n\t"
+ "ins $tmp, S, $src2, 0, 1\n\t"
+ "fmuls $dst, $dst, $tmp\t add reduction4f"
+ %}
+ ins_encode %{
+ __ fmuls(as_FloatRegister($dst$$reg),
+ as_FloatRegister($src1$$reg), as_FloatRegister($src2$$reg));
+ __ ins(as_FloatRegister($tmp$$reg), __ S,
+ as_FloatRegister($src2$$reg), 0, 1);
+ __ fmuls(as_FloatRegister($dst$$reg),
+ as_FloatRegister($dst$$reg), as_FloatRegister($tmp$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct reduce_mul4F(vRegF dst, vRegF src1, vecX src2, vecX tmp)
%{
match(Set dst (MulReductionVF src1 src2));
@@ -13526,8 +13855,24 @@
// --------------------------------- ADD --------------------------------------
+instruct vadd8B(vecD dst, vecD src1, vecD src2)
+%{
+ predicate(n->as_Vector()->length() == 4 ||
+ n->as_Vector()->length() == 8);
+ match(Set dst (AddVB src1 src2));
+ ins_cost(INSN_COST);
+ format %{ "addv $dst,$src1,$src2\t# vector (8B)" %}
+ ins_encode %{
+ __ addv(as_FloatRegister($dst$$reg), __ T8B,
+ as_FloatRegister($src1$$reg),
+ as_FloatRegister($src2$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vadd16B(vecX dst, vecX src1, vecX src2)
%{
+ predicate(n->as_Vector()->length() == 16);
match(Set dst (AddVB src1 src2));
ins_cost(INSN_COST);
format %{ "addv $dst,$src1,$src2\t# vector (16B)" %}
@@ -13539,8 +13884,24 @@
ins_pipe(pipe_class_default);
%}
+instruct vadd4S(vecD dst, vecD src1, vecD src2)
+%{
+ predicate(n->as_Vector()->length() == 2 ||
+ n->as_Vector()->length() == 4);
+ match(Set dst (AddVS src1 src2));
+ ins_cost(INSN_COST);
+ format %{ "addv $dst,$src1,$src2\t# vector (4H)" %}
+ ins_encode %{
+ __ addv(as_FloatRegister($dst$$reg), __ T4H,
+ as_FloatRegister($src1$$reg),
+ as_FloatRegister($src2$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vadd8S(vecX dst, vecX src1, vecX src2)
%{
+ predicate(n->as_Vector()->length() == 8);
match(Set dst (AddVS src1 src2));
ins_cost(INSN_COST);
format %{ "addv $dst,$src1,$src2\t# vector (8H)" %}
@@ -13552,8 +13913,23 @@
ins_pipe(pipe_class_default);
%}
+instruct vadd2I(vecD dst, vecD src1, vecD src2)
+%{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (AddVI src1 src2));
+ ins_cost(INSN_COST);
+ format %{ "addv $dst,$src1,$src2\t# vector (2S)" %}
+ ins_encode %{
+ __ addv(as_FloatRegister($dst$$reg), __ T2S,
+ as_FloatRegister($src1$$reg),
+ as_FloatRegister($src2$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vadd4I(vecX dst, vecX src1, vecX src2)
%{
+ predicate(n->as_Vector()->length() == 4);
match(Set dst (AddVI src1 src2));
ins_cost(INSN_COST);
format %{ "addv $dst,$src1,$src2\t# vector (4S)" %}
@@ -13567,6 +13943,7 @@
instruct vadd2L(vecX dst, vecX src1, vecX src2)
%{
+ predicate(n->as_Vector()->length() == 2);
match(Set dst (AddVL src1 src2));
ins_cost(INSN_COST);
format %{ "addv $dst,$src1,$src2\t# vector (2L)" %}
@@ -13578,8 +13955,23 @@
ins_pipe(pipe_class_default);
%}
+instruct vadd2F(vecD dst, vecD src1, vecD src2)
+%{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (AddVF src1 src2));
+ ins_cost(INSN_COST);
+ format %{ "fadd $dst,$src1,$src2\t# vector (2S)" %}
+ ins_encode %{
+ __ fadd(as_FloatRegister($dst$$reg), __ T2S,
+ as_FloatRegister($src1$$reg),
+ as_FloatRegister($src2$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vadd4F(vecX dst, vecX src1, vecX src2)
%{
+ predicate(n->as_Vector()->length() == 4);
match(Set dst (AddVF src1 src2));
ins_cost(INSN_COST);
format %{ "fadd $dst,$src1,$src2\t# vector (4S)" %}
@@ -13606,8 +13998,24 @@
// --------------------------------- SUB --------------------------------------
+instruct vsub8B(vecD dst, vecD src1, vecD src2)
+%{
+ predicate(n->as_Vector()->length() == 4 ||
+ n->as_Vector()->length() == 8);
+ match(Set dst (SubVB src1 src2));
+ ins_cost(INSN_COST);
+ format %{ "subv $dst,$src1,$src2\t# vector (8B)" %}
+ ins_encode %{
+ __ subv(as_FloatRegister($dst$$reg), __ T8B,
+ as_FloatRegister($src1$$reg),
+ as_FloatRegister($src2$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vsub16B(vecX dst, vecX src1, vecX src2)
%{
+ predicate(n->as_Vector()->length() == 16);
match(Set dst (SubVB src1 src2));
ins_cost(INSN_COST);
format %{ "subv $dst,$src1,$src2\t# vector (16B)" %}
@@ -13619,8 +14027,24 @@
ins_pipe(pipe_class_default);
%}
+instruct vsub4S(vecD dst, vecD src1, vecD src2)
+%{
+ predicate(n->as_Vector()->length() == 2 ||
+ n->as_Vector()->length() == 4);
+ match(Set dst (SubVS src1 src2));
+ ins_cost(INSN_COST);
+ format %{ "subv $dst,$src1,$src2\t# vector (4H)" %}
+ ins_encode %{
+ __ subv(as_FloatRegister($dst$$reg), __ T4H,
+ as_FloatRegister($src1$$reg),
+ as_FloatRegister($src2$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vsub8S(vecX dst, vecX src1, vecX src2)
%{
+ predicate(n->as_Vector()->length() == 8);
match(Set dst (SubVS src1 src2));
ins_cost(INSN_COST);
format %{ "subv $dst,$src1,$src2\t# vector (8H)" %}
@@ -13632,8 +14056,23 @@
ins_pipe(pipe_class_default);
%}
+instruct vsub2I(vecD dst, vecD src1, vecD src2)
+%{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (SubVI src1 src2));
+ ins_cost(INSN_COST);
+ format %{ "subv $dst,$src1,$src2\t# vector (2S)" %}
+ ins_encode %{
+ __ subv(as_FloatRegister($dst$$reg), __ T2S,
+ as_FloatRegister($src1$$reg),
+ as_FloatRegister($src2$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vsub4I(vecX dst, vecX src1, vecX src2)
%{
+ predicate(n->as_Vector()->length() == 4);
match(Set dst (SubVI src1 src2));
ins_cost(INSN_COST);
format %{ "subv $dst,$src1,$src2\t# vector (4S)" %}
@@ -13647,6 +14086,7 @@
instruct vsub2L(vecX dst, vecX src1, vecX src2)
%{
+ predicate(n->as_Vector()->length() == 2);
match(Set dst (SubVL src1 src2));
ins_cost(INSN_COST);
format %{ "subv $dst,$src1,$src2\t# vector (2L)" %}
@@ -13658,8 +14098,23 @@
ins_pipe(pipe_class_default);
%}
+instruct vsub2F(vecD dst, vecD src1, vecD src2)
+%{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (AddVF src1 src2));
+ ins_cost(INSN_COST);
+ format %{ "fsub $dst,$src1,$src2\t# vector (2S)" %}
+ ins_encode %{
+ __ fsub(as_FloatRegister($dst$$reg), __ T2S,
+ as_FloatRegister($src1$$reg),
+ as_FloatRegister($src2$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vsub4F(vecX dst, vecX src1, vecX src2)
%{
+ predicate(n->as_Vector()->length() == 4);
match(Set dst (SubVF src1 src2));
ins_cost(INSN_COST);
format %{ "fsub $dst,$src1,$src2\t# vector (4S)" %}
@@ -13673,6 +14128,7 @@
instruct vsub2D(vecX dst, vecX src1, vecX src2)
%{
+ predicate(n->as_Vector()->length() == 2);
match(Set dst (SubVD src1 src2));
ins_cost(INSN_COST);
format %{ "fsub $dst,$src1,$src2\t# vector (2D)" %}
@@ -13686,8 +14142,24 @@
// --------------------------------- MUL --------------------------------------
+instruct vmul4S(vecD dst, vecD src1, vecD src2)
+%{
+ predicate(n->as_Vector()->length() == 2 ||
+ n->as_Vector()->length() == 4);
+ match(Set dst (MulVS src1 src2));
+ ins_cost(INSN_COST);
+ format %{ "mulv $dst,$src1,$src2\t# vector (4H)" %}
+ ins_encode %{
+ __ mulv(as_FloatRegister($dst$$reg), __ T4H,
+ as_FloatRegister($src1$$reg),
+ as_FloatRegister($src2$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vmul8S(vecX dst, vecX src1, vecX src2)
%{
+ predicate(n->as_Vector()->length() == 8);
match(Set dst (MulVS src1 src2));
ins_cost(INSN_COST);
format %{ "mulv $dst,$src1,$src2\t# vector (8H)" %}
@@ -13699,8 +14171,23 @@
ins_pipe(pipe_class_default);
%}
+instruct vmul2I(vecD dst, vecD src1, vecD src2)
+%{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (MulVI src1 src2));
+ ins_cost(INSN_COST);
+ format %{ "mulv $dst,$src1,$src2\t# vector (2S)" %}
+ ins_encode %{
+ __ mulv(as_FloatRegister($dst$$reg), __ T2S,
+ as_FloatRegister($src1$$reg),
+ as_FloatRegister($src2$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vmul4I(vecX dst, vecX src1, vecX src2)
%{
+ predicate(n->as_Vector()->length() == 4);
match(Set dst (MulVI src1 src2));
ins_cost(INSN_COST);
format %{ "mulv $dst,$src1,$src2\t# vector (4S)" %}
@@ -13712,8 +14199,23 @@
ins_pipe(pipe_class_default);
%}
+instruct vmul2F(vecD dst, vecD src1, vecD src2)
+%{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (MulVF src1 src2));
+ ins_cost(INSN_COST);
+ format %{ "fmul $dst,$src1,$src2\t# vector (2S)" %}
+ ins_encode %{
+ __ fmul(as_FloatRegister($dst$$reg), __ T2S,
+ as_FloatRegister($src1$$reg),
+ as_FloatRegister($src2$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vmul4F(vecX dst, vecX src1, vecX src2)
%{
+ predicate(n->as_Vector()->length() == 4);
match(Set dst (MulVF src1 src2));
ins_cost(INSN_COST);
format %{ "fmul $dst,$src1,$src2\t# vector (4S)" %}
@@ -13727,6 +14229,7 @@
instruct vmul2D(vecX dst, vecX src1, vecX src2)
%{
+ predicate(n->as_Vector()->length() == 2);
match(Set dst (MulVD src1 src2));
ins_cost(INSN_COST);
format %{ "fmul $dst,$src1,$src2\t# vector (2D)" %}
@@ -13740,8 +14243,23 @@
// --------------------------------- DIV --------------------------------------
+instruct vdiv2F(vecD dst, vecD src1, vecD src2)
+%{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (DivVF src1 src2));
+ ins_cost(INSN_COST);
+ format %{ "fdiv $dst,$src1,$src2\t# vector (2S)" %}
+ ins_encode %{
+ __ fdiv(as_FloatRegister($dst$$reg), __ T2S,
+ as_FloatRegister($src1$$reg),
+ as_FloatRegister($src2$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vdiv4F(vecX dst, vecX src1, vecX src2)
%{
+ predicate(n->as_Vector()->length() == 4);
match(Set dst (DivVF src1 src2));
ins_cost(INSN_COST);
format %{ "fdiv $dst,$src1,$src2\t# vector (4S)" %}
@@ -13755,6 +14273,7 @@
instruct vdiv2D(vecX dst, vecX src1, vecX src2)
%{
+ predicate(n->as_Vector()->length() == 2);
match(Set dst (DivVD src1 src2));
ins_cost(INSN_COST);
format %{ "fdiv $dst,$src1,$src2\t# vector (2D)" %}
@@ -13768,8 +14287,24 @@
// --------------------------------- AND --------------------------------------
+instruct vand8B(vecD dst, vecD src1, vecD src2)
+%{
+ predicate(n->as_Vector()->length_in_bytes() == 4 ||
+ n->as_Vector()->length_in_bytes() == 8);
+ match(Set dst (AndV src1 src2));
+ ins_cost(INSN_COST);
+ format %{ "and $dst,$src1,$src2\t# vector (8B)" %}
+ ins_encode %{
+ __ andr(as_FloatRegister($dst$$reg), __ T8B,
+ as_FloatRegister($src1$$reg),
+ as_FloatRegister($src2$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vand16B(vecX dst, vecX src1, vecX src2)
%{
+ predicate(n->as_Vector()->length_in_bytes() == 16);
match(Set dst (AndV src1 src2));
ins_cost(INSN_COST);
format %{ "and $dst,$src1,$src2\t# vector (16B)" %}
@@ -13783,8 +14318,24 @@
// --------------------------------- OR ---------------------------------------
+instruct vor8B(vecD dst, vecD src1, vecD src2)
+%{
+ predicate(n->as_Vector()->length_in_bytes() == 4 ||
+ n->as_Vector()->length_in_bytes() == 8);
+ match(Set dst (OrV src1 src2));
+ ins_cost(INSN_COST);
+ format %{ "and $dst,$src1,$src2\t# vector (8B)" %}
+ ins_encode %{
+ __ orr(as_FloatRegister($dst$$reg), __ T8B,
+ as_FloatRegister($src1$$reg),
+ as_FloatRegister($src2$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vor16B(vecX dst, vecX src1, vecX src2)
%{
+ predicate(n->as_Vector()->length_in_bytes() == 16);
match(Set dst (OrV src1 src2));
ins_cost(INSN_COST);
format %{ "orr $dst,$src1,$src2\t# vector (16B)" %}
@@ -13798,8 +14349,24 @@
// --------------------------------- XOR --------------------------------------
+instruct vxor8B(vecD dst, vecD src1, vecD src2)
+%{
+ predicate(n->as_Vector()->length_in_bytes() == 4 ||
+ n->as_Vector()->length_in_bytes() == 8);
+ match(Set dst (XorV src1 src2));
+ ins_cost(INSN_COST);
+ format %{ "xor $dst,$src1,$src2\t# vector (8B)" %}
+ ins_encode %{
+ __ eor(as_FloatRegister($dst$$reg), __ T8B,
+ as_FloatRegister($src1$$reg),
+ as_FloatRegister($src2$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vxor16B(vecX dst, vecX src1, vecX src2)
%{
+ predicate(n->as_Vector()->length_in_bytes() == 16);
match(Set dst (XorV src1 src2));
ins_cost(INSN_COST);
format %{ "xor $dst,$src1,$src2\t# vector (16B)" %}
@@ -13833,7 +14400,23 @@
ins_pipe(pipe_class_default);
%}
+instruct vsll8B(vecD dst, vecD src, vecX shift) %{
+ predicate(n->as_Vector()->length() == 4 ||
+ n->as_Vector()->length() == 8);
+ match(Set dst (LShiftVB src shift));
+ match(Set dst (RShiftVB src shift));
+ ins_cost(INSN_COST);
+ format %{ "sshl $dst,$src,$shift\t# vector (8B)" %}
+ ins_encode %{
+ __ sshl(as_FloatRegister($dst$$reg), __ T8B,
+ as_FloatRegister($src$$reg),
+ as_FloatRegister($shift$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vsll16B(vecX dst, vecX src, vecX shift) %{
+ predicate(n->as_Vector()->length() == 16);
match(Set dst (LShiftVB src shift));
match(Set dst (RShiftVB src shift));
ins_cost(INSN_COST);
@@ -13846,7 +14429,22 @@
ins_pipe(pipe_class_default);
%}
+instruct vsrl8B(vecD dst, vecD src, vecX shift) %{
+ predicate(n->as_Vector()->length() == 4 ||
+ n->as_Vector()->length() == 8);
+ match(Set dst (URShiftVB src shift));
+ ins_cost(INSN_COST);
+ format %{ "ushl $dst,$src,$shift\t# vector (8B)" %}
+ ins_encode %{
+ __ ushl(as_FloatRegister($dst$$reg), __ T8B,
+ as_FloatRegister($src$$reg),
+ as_FloatRegister($shift$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vsrl16B(vecX dst, vecX src, vecX shift) %{
+ predicate(n->as_Vector()->length() == 16);
match(Set dst (URShiftVB src shift));
ins_cost(INSN_COST);
format %{ "ushl $dst,$src,$shift\t# vector (16B)" %}
@@ -13858,7 +14456,28 @@
ins_pipe(pipe_class_default);
%}
+instruct vsll8B_imm(vecD dst, vecD src, immI shift) %{
+ predicate(n->as_Vector()->length() == 4 ||
+ n->as_Vector()->length() == 8);
+ match(Set dst (LShiftVB src shift));
+ ins_cost(INSN_COST);
+ format %{ "shl $dst, $src, $shift\t# vector (8B)" %}
+ ins_encode %{
+ int sh = (int)$shift$$constant & 31;
+ if (sh >= 8) {
+ __ eor(as_FloatRegister($dst$$reg), __ T8B,
+ as_FloatRegister($src$$reg),
+ as_FloatRegister($src$$reg));
+ } else {
+ __ shl(as_FloatRegister($dst$$reg), __ T8B,
+ as_FloatRegister($src$$reg), sh);
+ }
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vsll16B_imm(vecX dst, vecX src, immI shift) %{
+ predicate(n->as_Vector()->length() == 16);
match(Set dst (LShiftVB src shift));
ins_cost(INSN_COST);
format %{ "shl $dst, $src, $shift\t# vector (16B)" %}
@@ -13876,7 +14495,24 @@
ins_pipe(pipe_class_default);
%}
+instruct vsra8B_imm(vecD dst, vecD src, immI shift) %{
+ predicate(n->as_Vector()->length() == 4 ||
+ n->as_Vector()->length() == 8);
+ match(Set dst (RShiftVB src shift));
+ ins_cost(INSN_COST);
+ format %{ "sshr $dst, $src, $shift\t# vector (8B)" %}
+ ins_encode %{
+ int sh = (int)$shift$$constant & 31;
+ if (sh >= 8) sh = 7;
+ sh = -sh & 7;
+ __ sshr(as_FloatRegister($dst$$reg), __ T8B,
+ as_FloatRegister($src$$reg), sh);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vsra16B_imm(vecX dst, vecX src, immI shift) %{
+ predicate(n->as_Vector()->length() == 16);
match(Set dst (RShiftVB src shift));
ins_cost(INSN_COST);
format %{ "sshr $dst, $src, $shift\t# vector (16B)" %}
@@ -13890,7 +14526,28 @@
ins_pipe(pipe_class_default);
%}
+instruct vsrl8B_imm(vecD dst, vecD src, immI shift) %{
+ predicate(n->as_Vector()->length() == 4 ||
+ n->as_Vector()->length() == 8);
+ match(Set dst (URShiftVB src shift));
+ ins_cost(INSN_COST);
+ format %{ "ushr $dst, $src, $shift\t# vector (8B)" %}
+ ins_encode %{
+ int sh = (int)$shift$$constant & 31;
+ if (sh >= 8) {
+ __ eor(as_FloatRegister($dst$$reg), __ T8B,
+ as_FloatRegister($src$$reg),
+ as_FloatRegister($src$$reg));
+ } else {
+ __ ushr(as_FloatRegister($dst$$reg), __ T8B,
+ as_FloatRegister($src$$reg), -sh & 7);
+ }
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vsrl16B_imm(vecX dst, vecX src, immI shift) %{
+ predicate(n->as_Vector()->length() == 16);
match(Set dst (URShiftVB src shift));
ins_cost(INSN_COST);
format %{ "ushr $dst, $src, $shift\t# vector (16B)" %}
@@ -13908,7 +14565,23 @@
ins_pipe(pipe_class_default);
%}
+instruct vsll4S(vecD dst, vecD src, vecX shift) %{
+ predicate(n->as_Vector()->length() == 2 ||
+ n->as_Vector()->length() == 4);
+ match(Set dst (LShiftVS src shift));
+ match(Set dst (RShiftVS src shift));
+ ins_cost(INSN_COST);
+ format %{ "sshl $dst,$src,$shift\t# vector (4H)" %}
+ ins_encode %{
+ __ sshl(as_FloatRegister($dst$$reg), __ T4H,
+ as_FloatRegister($src$$reg),
+ as_FloatRegister($shift$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vsll8S(vecX dst, vecX src, vecX shift) %{
+ predicate(n->as_Vector()->length() == 8);
match(Set dst (LShiftVS src shift));
match(Set dst (RShiftVS src shift));
ins_cost(INSN_COST);
@@ -13921,7 +14594,22 @@
ins_pipe(pipe_class_default);
%}
+instruct vsrl4S(vecD dst, vecD src, vecX shift) %{
+ predicate(n->as_Vector()->length() == 2 ||
+ n->as_Vector()->length() == 4);
+ match(Set dst (URShiftVS src shift));
+ ins_cost(INSN_COST);
+ format %{ "ushl $dst,$src,$shift\t# vector (4H)" %}
+ ins_encode %{
+ __ ushl(as_FloatRegister($dst$$reg), __ T4H,
+ as_FloatRegister($src$$reg),
+ as_FloatRegister($shift$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vsrl8S(vecX dst, vecX src, vecX shift) %{
+ predicate(n->as_Vector()->length() == 8);
match(Set dst (URShiftVS src shift));
ins_cost(INSN_COST);
format %{ "ushl $dst,$src,$shift\t# vector (8H)" %}
@@ -13933,7 +14621,28 @@
ins_pipe(pipe_class_default);
%}
+instruct vsll4S_imm(vecD dst, vecD src, immI shift) %{
+ predicate(n->as_Vector()->length() == 2 ||
+ n->as_Vector()->length() == 4);
+ match(Set dst (LShiftVS src shift));
+ ins_cost(INSN_COST);
+ format %{ "shl $dst, $src, $shift\t# vector (4H)" %}
+ ins_encode %{
+ int sh = (int)$shift$$constant & 31;
+ if (sh >= 16) {
+ __ eor(as_FloatRegister($dst$$reg), __ T8B,
+ as_FloatRegister($src$$reg),
+ as_FloatRegister($src$$reg));
+ } else {
+ __ shl(as_FloatRegister($dst$$reg), __ T4H,
+ as_FloatRegister($src$$reg), sh);
+ }
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vsll8S_imm(vecX dst, vecX src, immI shift) %{
+ predicate(n->as_Vector()->length() == 8);
match(Set dst (LShiftVS src shift));
ins_cost(INSN_COST);
format %{ "shl $dst, $src, $shift\t# vector (8H)" %}
@@ -13951,7 +14660,24 @@
ins_pipe(pipe_class_default);
%}
+instruct vsra4S_imm(vecD dst, vecD src, immI shift) %{
+ predicate(n->as_Vector()->length() == 2 ||
+ n->as_Vector()->length() == 4);
+ match(Set dst (RShiftVS src shift));
+ ins_cost(INSN_COST);
+ format %{ "sshr $dst, $src, $shift\t# vector (4H)" %}
+ ins_encode %{
+ int sh = (int)$shift$$constant & 31;
+ if (sh >= 16) sh = 15;
+ sh = -sh & 15;
+ __ sshr(as_FloatRegister($dst$$reg), __ T4H,
+ as_FloatRegister($src$$reg), sh);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vsra8S_imm(vecX dst, vecX src, immI shift) %{
+ predicate(n->as_Vector()->length() == 8);
match(Set dst (RShiftVS src shift));
ins_cost(INSN_COST);
format %{ "sshr $dst, $src, $shift\t# vector (8H)" %}
@@ -13965,7 +14691,28 @@
ins_pipe(pipe_class_default);
%}
+instruct vsrl4S_imm(vecD dst, vecD src, immI shift) %{
+ predicate(n->as_Vector()->length() == 2 ||
+ n->as_Vector()->length() == 4);
+ match(Set dst (URShiftVS src shift));
+ ins_cost(INSN_COST);
+ format %{ "ushr $dst, $src, $shift\t# vector (4H)" %}
+ ins_encode %{
+ int sh = (int)$shift$$constant & 31;
+ if (sh >= 16) {
+ __ eor(as_FloatRegister($dst$$reg), __ T8B,
+ as_FloatRegister($src$$reg),
+ as_FloatRegister($src$$reg));
+ } else {
+ __ ushr(as_FloatRegister($dst$$reg), __ T4H,
+ as_FloatRegister($src$$reg), -sh & 15);
+ }
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vsrl8S_imm(vecX dst, vecX src, immI shift) %{
+ predicate(n->as_Vector()->length() == 8);
match(Set dst (URShiftVS src shift));
ins_cost(INSN_COST);
format %{ "ushr $dst, $src, $shift\t# vector (8H)" %}
@@ -13983,7 +14730,22 @@
ins_pipe(pipe_class_default);
%}
+instruct vsll2I(vecD dst, vecD src, vecX shift) %{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (LShiftVI src shift));
+ match(Set dst (RShiftVI src shift));
+ ins_cost(INSN_COST);
+ format %{ "sshl $dst,$src,$shift\t# vector (2S)" %}
+ ins_encode %{
+ __ sshl(as_FloatRegister($dst$$reg), __ T2S,
+ as_FloatRegister($src$$reg),
+ as_FloatRegister($shift$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vsll4I(vecX dst, vecX src, vecX shift) %{
+ predicate(n->as_Vector()->length() == 4);
match(Set dst (LShiftVI src shift));
match(Set dst (RShiftVI src shift));
ins_cost(INSN_COST);
@@ -13996,7 +14758,21 @@
ins_pipe(pipe_class_default);
%}
+instruct vsrl2I(vecD dst, vecD src, vecX shift) %{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (URShiftVI src shift));
+ ins_cost(INSN_COST);
+ format %{ "ushl $dst,$src,$shift\t# vector (2S)" %}
+ ins_encode %{
+ __ ushl(as_FloatRegister($dst$$reg), __ T2S,
+ as_FloatRegister($src$$reg),
+ as_FloatRegister($shift$$reg));
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vsrl4I(vecX dst, vecX src, vecX shift) %{
+ predicate(n->as_Vector()->length() == 4);
match(Set dst (URShiftVI src shift));
ins_cost(INSN_COST);
format %{ "ushl $dst,$src,$shift\t# vector (4S)" %}
@@ -14008,7 +14784,21 @@
ins_pipe(pipe_class_default);
%}
+instruct vsll2I_imm(vecD dst, vecD src, immI shift) %{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (LShiftVI src shift));
+ ins_cost(INSN_COST);
+ format %{ "shl $dst, $src, $shift\t# vector (2S)" %}
+ ins_encode %{
+ __ shl(as_FloatRegister($dst$$reg), __ T2S,
+ as_FloatRegister($src$$reg),
+ (int)$shift$$constant & 31);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vsll4I_imm(vecX dst, vecX src, immI shift) %{
+ predicate(n->as_Vector()->length() == 4);
match(Set dst (LShiftVI src shift));
ins_cost(INSN_COST);
format %{ "shl $dst, $src, $shift\t# vector (4S)" %}
@@ -14020,7 +14810,21 @@
ins_pipe(pipe_class_default);
%}
+instruct vsra2I_imm(vecD dst, vecD src, immI shift) %{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (RShiftVI src shift));
+ ins_cost(INSN_COST);
+ format %{ "sshr $dst, $src, $shift\t# vector (2S)" %}
+ ins_encode %{
+ __ sshr(as_FloatRegister($dst$$reg), __ T2S,
+ as_FloatRegister($src$$reg),
+ -(int)$shift$$constant & 31);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vsra4I_imm(vecX dst, vecX src, immI shift) %{
+ predicate(n->as_Vector()->length() == 4);
match(Set dst (RShiftVI src shift));
ins_cost(INSN_COST);
format %{ "sshr $dst, $src, $shift\t# vector (4S)" %}
@@ -14032,7 +14836,21 @@
ins_pipe(pipe_class_default);
%}
+instruct vsrl2I_imm(vecD dst, vecD src, immI shift) %{
+ predicate(n->as_Vector()->length() == 2);
+ match(Set dst (URShiftVI src shift));
+ ins_cost(INSN_COST);
+ format %{ "ushr $dst, $src, $shift\t# vector (2S)" %}
+ ins_encode %{
+ __ ushr(as_FloatRegister($dst$$reg), __ T2S,
+ as_FloatRegister($src$$reg),
+ -(int)$shift$$constant & 31);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
instruct vsrl4I_imm(vecX dst, vecX src, immI shift) %{
+ predicate(n->as_Vector()->length() == 4);
match(Set dst (URShiftVI src shift));
ins_cost(INSN_COST);
format %{ "ushr $dst, $src, $shift\t# vector (4S)" %}
@@ -14045,6 +14863,7 @@
%}
instruct vsll2L(vecX dst, vecX src, vecX shift) %{
+ predicate(n->as_Vector()->length() == 2);
match(Set dst (LShiftVL src shift));
match(Set dst (RShiftVL src shift));
ins_cost(INSN_COST);
@@ -14058,6 +14877,7 @@
%}
instruct vsrl2L(vecX dst, vecX src, vecX shift) %{
+ predicate(n->as_Vector()->length() == 2);
match(Set dst (URShiftVL src shift));
ins_cost(INSN_COST);
format %{ "ushl $dst,$src,$shift\t# vector (2D)" %}
@@ -14070,6 +14890,7 @@
%}
instruct vsll2L_imm(vecX dst, vecX src, immI shift) %{
+ predicate(n->as_Vector()->length() == 2);
match(Set dst (LShiftVL src shift));
ins_cost(INSN_COST);
format %{ "shl $dst, $src, $shift\t# vector (2D)" %}
@@ -14082,6 +14903,7 @@
%}
instruct vsra2L_imm(vecX dst, vecX src, immI shift) %{
+ predicate(n->as_Vector()->length() == 2);
match(Set dst (RShiftVL src shift));
ins_cost(INSN_COST);
format %{ "sshr $dst, $src, $shift\t# vector (2D)" %}
@@ -14094,6 +14916,7 @@
%}
instruct vsrl2L_imm(vecX dst, vecX src, immI shift) %{
+ predicate(n->as_Vector()->length() == 2);
match(Set dst (URShiftVL src shift));
ins_cost(INSN_COST);
format %{ "ushr $dst, $src, $shift\t# vector (2D)" %}
--- a/hotspot/src/cpu/aarch64/vm/assembler_aarch64.hpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/cpu/aarch64/vm/assembler_aarch64.hpp Tue Jul 14 15:26:34 2015 -0700
@@ -2055,6 +2055,9 @@
INSN(negr, 1, 0b100000101110);
INSN(notr, 1, 0b100000010110);
INSN(addv, 0, 0b110001101110);
+ INSN(cls, 0, 0b100000010010);
+ INSN(clz, 1, 0b100000010010);
+ INSN(cnt, 0, 0b100000010110);
#undef INSN
--- a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp Tue Jul 14 15:26:34 2015 -0700
@@ -36,6 +36,7 @@
class MacroAssembler: public Assembler {
friend class LIR_Assembler;
+ public:
using Assembler::mov;
using Assembler::movi;
--- a/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.cpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.cpp Tue Jul 14 15:26:34 2015 -0700
@@ -199,6 +199,12 @@
UseCRC32Intrinsics = true;
}
+ if (UseCRC32CIntrinsics) {
+ if (!FLAG_IS_DEFAULT(UseCRC32CIntrinsics))
+ warning("CRC32C intrinsics are not available on this CPU");
+ FLAG_SET_DEFAULT(UseCRC32CIntrinsics, false);
+ }
+
if (auxv & (HWCAP_SHA1 | HWCAP_SHA2)) {
if (FLAG_IS_DEFAULT(UseSHA)) {
FLAG_SET_DEFAULT(UseSHA, true);
@@ -251,6 +257,10 @@
UseBarriersForVolatile = (_cpuFeatures & CPU_DMB_ATOMICS) != 0;
}
+ if (FLAG_IS_DEFAULT(UsePopCountInstruction)) {
+ UsePopCountInstruction = true;
+ }
+
#ifdef COMPILER2
if (FLAG_IS_DEFAULT(OptoScheduling)) {
OptoScheduling = true;
--- a/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp Tue Jul 14 15:26:34 2015 -0700
@@ -191,6 +191,13 @@
FLAG_SET_DEFAULT(UseSHA256Intrinsics, false);
FLAG_SET_DEFAULT(UseSHA512Intrinsics, false);
}
+
+ if (UseCRC32CIntrinsics) {
+ if (!FLAG_IS_DEFAULT(UseCRC32CIntrinsics))
+ warning("CRC32C intrinsics are not available on this CPU");
+ FLAG_SET_DEFAULT(UseCRC32CIntrinsics, false);
+ }
+
// Adjust RTM (Restricted Transactional Memory) flags.
if (!has_tcheck() && UseRTMLocking) {
// Can't continue because UseRTMLocking affects UseBiasedLocking flag
--- a/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp Tue Jul 14 15:26:34 2015 -0700
@@ -128,8 +128,11 @@
faligndata_op3 = 0x36,
flog3_op3 = 0x36,
edge_op3 = 0x36,
+ fzero_op3 = 0x36,
fsrc_op3 = 0x36,
+ fnot_op3 = 0x36,
xmulx_op3 = 0x36,
+ crc32c_op3 = 0x36,
impdep2_op3 = 0x37,
stpartialf_op3 = 0x37,
jmpl_op3 = 0x38,
@@ -231,7 +234,9 @@
sha1_opf = 0x141,
sha256_opf = 0x142,
- sha512_opf = 0x143
+ sha512_opf = 0x143,
+
+ crc32c_opf = 0x147
};
enum op5s {
@@ -600,6 +605,11 @@
return x & ((1 << 10) - 1);
}
+ // create a low12 __value__ (not a field) for a given a 32-bit constant
+ static int low12( int x ) {
+ return x & ((1 << 12) - 1);
+ }
+
// AES crypto instructions supported only on certain processors
static void aes_only() { assert( VM_Version::has_aes(), "This instruction only works on SPARC with AES instructions support"); }
@@ -608,6 +618,9 @@
static void sha256_only() { assert( VM_Version::has_sha256(), "This instruction only works on SPARC with SHA256"); }
static void sha512_only() { assert( VM_Version::has_sha512(), "This instruction only works on SPARC with SHA512"); }
+ // CRC32C instruction supported only on certain processors
+ static void crc32c_only() { assert( VM_Version::has_crc32c(), "This instruction only works on SPARC with CRC32C"); }
+
// instruction only in VIS1
static void vis1_only() { assert( VM_Version::has_vis1(), "This instruction only works on SPARC with VIS1"); }
@@ -1022,6 +1035,7 @@
void nop() { emit_int32( op(branch_op) | op2(sethi_op2) ); }
+ void sw_count() { emit_int32( op(branch_op) | op2(sethi_op2) | 0x3f0 ); }
// pp 202
@@ -1198,8 +1212,14 @@
void faligndata( FloatRegister s1, FloatRegister s2, FloatRegister d ) { vis1_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(faligndata_op3) | fs1(s1, FloatRegisterImpl::D) | opf(faligndata_opf) | fs2(s2, FloatRegisterImpl::D)); }
+ void fzero( FloatRegisterImpl::Width w, FloatRegister d ) { vis1_only(); emit_int32( op(arith_op) | fd(d, w) | op3(fzero_op3) | opf(0x62 - w)); }
+
void fsrc2( FloatRegisterImpl::Width w, FloatRegister s2, FloatRegister d ) { vis1_only(); emit_int32( op(arith_op) | fd(d, w) | op3(fsrc_op3) | opf(0x7A - w) | fs2(s2, w)); }
+ void fnot1( FloatRegisterImpl::Width w, FloatRegister s1, FloatRegister d ) { vis1_only(); emit_int32( op(arith_op) | fd(d, w) | op3(fnot_op3) | fs1(s1, w) | opf(0x6C - w)); }
+
+ void fpmerge( FloatRegister s1, FloatRegister s2, FloatRegister d ) { vis1_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(0x36) | fs1(s1, FloatRegisterImpl::S) | opf(0x4b) | fs2(s2, FloatRegisterImpl::S)); }
+
void stpartialf( Register s1, Register s2, FloatRegister d, int ia = -1 ) { vis1_only(); emit_int32( op(ldst_op) | fd(d, FloatRegisterImpl::D) | op3(stpartialf_op3) | rs1(s1) | imm_asi(ia) | rs2(s2)); }
// VIS2 instructions
@@ -1224,6 +1244,10 @@
void sha256() { sha256_only(); emit_int32( op(arith_op) | op3(sha_op3) | opf(sha256_opf)); }
void sha512() { sha512_only(); emit_int32( op(arith_op) | op3(sha_op3) | opf(sha512_opf)); }
+ // CRC32C instruction
+
+ void crc32c( FloatRegister s1, FloatRegister s2, FloatRegister d ) { crc32c_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(crc32c_op3) | fs1(s1, FloatRegisterImpl::D) | opf(crc32c_opf) | fs2(s2, FloatRegisterImpl::D)); }
+
// Creation
Assembler(CodeBuffer* code) : AbstractAssembler(code) {
#ifdef CHECK_DELAY
--- a/hotspot/src/cpu/sparc/vm/macroAssembler_sparc.cpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/cpu/sparc/vm/macroAssembler_sparc.cpp Tue Jul 14 15:26:34 2015 -0700
@@ -956,6 +956,7 @@
int hi = (int)(value >> 32);
int lo = (int)(value & ~0);
+ int bits_33to2 = (int)((value >> 2) & ~0);
// (Matcher::isSimpleConstant64 knows about the following optimizations.)
if (Assembler::is_simm13(lo) && value == lo) {
or3(G0, lo, d);
@@ -964,6 +965,12 @@
if (low10(lo) != 0)
or3(d, low10(lo), d);
}
+ else if ((hi >> 2) == 0) {
+ Assembler::sethi(bits_33to2, d); // hardware version zero-extends to upper 32
+ sllx(d, 2, d);
+ if (low12(lo) != 0)
+ or3(d, low12(lo), d);
+ }
else if (hi == -1) {
Assembler::sethi(~lo, d); // hardware version zero-extends to upper 32
xor3(d, low10(lo) ^ ~low10(~0), d);
@@ -4351,3 +4358,52 @@
cmp_and_brx_short(to, end, Assembler::lessUnsigned, Assembler::pt, small_loop);
nop(); // Separate short branches
}
+
+/**
+ * Update CRC-32[C] with a byte value according to constants in table
+ *
+ * @param [in,out]crc Register containing the crc.
+ * @param [in]val Register containing the byte to fold into the CRC.
+ * @param [in]table Register containing the table of crc constants.
+ *
+ * uint32_t crc;
+ * val = crc_table[(val ^ crc) & 0xFF];
+ * crc = val ^ (crc >> 8);
+ */
+void MacroAssembler::update_byte_crc32(Register crc, Register val, Register table) {
+ xor3(val, crc, val);
+ and3(val, 0xFF, val);
+ sllx(val, 2, val);
+ lduw(table, val, val);
+ srlx(crc, 8, crc);
+ xor3(val, crc, crc);
+}
+
+// Reverse byte order of lower 32 bits, assuming upper 32 bits all zeros
+void MacroAssembler::reverse_bytes_32(Register src, Register dst, Register tmp) {
+ srlx(src, 24, dst);
+
+ sllx(src, 32+8, tmp);
+ srlx(tmp, 32+24, tmp);
+ sllx(tmp, 8, tmp);
+ or3(dst, tmp, dst);
+
+ sllx(src, 32+16, tmp);
+ srlx(tmp, 32+24, tmp);
+ sllx(tmp, 16, tmp);
+ or3(dst, tmp, dst);
+
+ sllx(src, 32+24, tmp);
+ srlx(tmp, 32, tmp);
+ or3(dst, tmp, dst);
+}
+
+void MacroAssembler::movitof_revbytes(Register src, FloatRegister dst, Register tmp1, Register tmp2) {
+ reverse_bytes_32(src, tmp1, tmp2);
+ movxtod(tmp1, dst);
+}
+
+void MacroAssembler::movftoi_revbytes(FloatRegister src, Register dst, Register tmp1, Register tmp2) {
+ movdtox(src, tmp1);
+ reverse_bytes_32(tmp1, dst, tmp2);
+}
--- a/hotspot/src/cpu/sparc/vm/macroAssembler_sparc.hpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/cpu/sparc/vm/macroAssembler_sparc.hpp Tue Jul 14 15:26:34 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -903,6 +903,10 @@
inline void ldf(FloatRegisterImpl::Width w, Register s1, RegisterOrConstant s2, FloatRegister d);
inline void ldf(FloatRegisterImpl::Width w, const Address& a, FloatRegister d, int offset = 0);
+ // little-endian
+ inline void ldxl(Register s1, Register s2, Register d) { ldxa(s1, s2, ASI_PRIMARY_LITTLE, d); }
+ inline void ldfl(FloatRegisterImpl::Width w, Register s1, Register s2, FloatRegister d) { ldfa(w, s1, s2, ASI_PRIMARY_LITTLE, d); }
+
// membar psuedo instruction. takes into account target memory model.
inline void membar( Assembler::Membar_mask_bits const7a );
@@ -1436,6 +1440,14 @@
// Use BIS for zeroing
void bis_zeroing(Register to, Register count, Register temp, Label& Ldone);
+ // Update CRC-32[C] with a byte value according to constants in table
+ void update_byte_crc32(Register crc, Register val, Register table);
+
+ // Reverse byte order of lower 32 bits, assuming upper 32 bits all zeros
+ void reverse_bytes_32(Register src, Register dst, Register tmp);
+ void movitof_revbytes(Register src, FloatRegister dst, Register tmp1, Register tmp2);
+ void movftoi_revbytes(FloatRegister src, Register dst, Register tmp1, Register tmp2);
+
#undef VIRTUAL
};
--- a/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp Tue Jul 14 15:26:34 2015 -0700
@@ -4910,6 +4910,206 @@
return start;
}
+#define CHUNK_LEN 128 /* 128 x 8B = 1KB */
+#define CHUNK_K1 0x1307a0206 /* reverseBits(pow(x, CHUNK_LEN*8*8*3 - 32) mod P(x)) << 1 */
+#define CHUNK_K2 0x1a0f717c4 /* reverseBits(pow(x, CHUNK_LEN*8*8*2 - 32) mod P(x)) << 1 */
+#define CHUNK_K3 0x0170076fa /* reverseBits(pow(x, CHUNK_LEN*8*8*1 - 32) mod P(x)) << 1 */
+
+ /**
+ * Arguments:
+ *
+ * Inputs:
+ * O0 - int crc
+ * O1 - byte* buf
+ * O2 - int len
+ * O3 - int* table
+ *
+ * Output:
+ * O0 - int crc result
+ */
+ address generate_updateBytesCRC32C() {
+ assert(UseCRC32CIntrinsics, "need CRC32C instruction");
+
+ __ align(CodeEntryAlignment);
+ StubCodeMark mark(this, "StubRoutines", "updateBytesCRC32C");
+ address start = __ pc();
+
+ const Register crc = O0; // crc
+ const Register buf = O1; // source java byte array address
+ const Register len = O2; // number of bytes
+ const Register table = O3; // byteTable
+
+ Label L_crc32c_head, L_crc32c_aligned;
+ Label L_crc32c_parallel, L_crc32c_parallel_loop;
+ Label L_crc32c_serial, L_crc32c_x32_loop, L_crc32c_x8, L_crc32c_x8_loop;
+ Label L_crc32c_done, L_crc32c_tail, L_crc32c_return;
+
+ __ cmp_and_br_short(len, 0, Assembler::lessEqual, Assembler::pn, L_crc32c_return);
+
+ // clear upper 32 bits of crc
+ __ clruwu(crc);
+
+ __ and3(buf, 7, G4);
+ __ cmp_and_brx_short(G4, 0, Assembler::equal, Assembler::pt, L_crc32c_aligned);
+
+ __ mov(8, G1);
+ __ sub(G1, G4, G4);
+
+ // ------ process the misaligned head (7 bytes or less) ------
+ __ BIND(L_crc32c_head);
+
+ // crc = (crc >>> 8) ^ byteTable[(crc ^ b) & 0xFF];
+ __ ldub(buf, 0, G1);
+ __ update_byte_crc32(crc, G1, table);
+
+ __ inc(buf);
+ __ dec(len);
+ __ cmp_and_br_short(len, 0, Assembler::equal, Assembler::pn, L_crc32c_return);
+ __ dec(G4);
+ __ cmp_and_br_short(G4, 0, Assembler::greater, Assembler::pt, L_crc32c_head);
+
+ // ------ process the 8-byte-aligned body ------
+ __ BIND(L_crc32c_aligned);
+ __ nop();
+ __ cmp_and_br_short(len, 8, Assembler::less, Assembler::pn, L_crc32c_tail);
+
+ // reverse the byte order of lower 32 bits to big endian, and move to FP side
+ __ movitof_revbytes(crc, F0, G1, G3);
+
+ __ set(CHUNK_LEN*8*4, G4);
+ __ cmp_and_br_short(len, G4, Assembler::less, Assembler::pt, L_crc32c_serial);
+
+ // ------ process four 1KB chunks in parallel ------
+ __ BIND(L_crc32c_parallel);
+
+ __ fzero(FloatRegisterImpl::D, F2);
+ __ fzero(FloatRegisterImpl::D, F4);
+ __ fzero(FloatRegisterImpl::D, F6);
+
+ __ mov(CHUNK_LEN - 1, G4);
+ __ BIND(L_crc32c_parallel_loop);
+ // schedule ldf's ahead of crc32c's to hide the load-use latency
+ __ ldf(FloatRegisterImpl::D, buf, 0, F8);
+ __ ldf(FloatRegisterImpl::D, buf, CHUNK_LEN*8, F10);
+ __ ldf(FloatRegisterImpl::D, buf, CHUNK_LEN*16, F12);
+ __ ldf(FloatRegisterImpl::D, buf, CHUNK_LEN*24, F14);
+ __ crc32c(F0, F8, F0);
+ __ crc32c(F2, F10, F2);
+ __ crc32c(F4, F12, F4);
+ __ crc32c(F6, F14, F6);
+ __ inc(buf, 8);
+ __ dec(G4);
+ __ cmp_and_br_short(G4, 0, Assembler::greater, Assembler::pt, L_crc32c_parallel_loop);
+
+ __ ldf(FloatRegisterImpl::D, buf, 0, F8);
+ __ ldf(FloatRegisterImpl::D, buf, CHUNK_LEN*8, F10);
+ __ ldf(FloatRegisterImpl::D, buf, CHUNK_LEN*16, F12);
+ __ crc32c(F0, F8, F0);
+ __ crc32c(F2, F10, F2);
+ __ crc32c(F4, F12, F4);
+
+ __ inc(buf, CHUNK_LEN*24);
+ __ ldfl(FloatRegisterImpl::D, buf, G0, F14); // load in little endian
+ __ inc(buf, 8);
+
+ __ prefetch(buf, 0, Assembler::severalReads);
+ __ prefetch(buf, CHUNK_LEN*8, Assembler::severalReads);
+ __ prefetch(buf, CHUNK_LEN*16, Assembler::severalReads);
+ __ prefetch(buf, CHUNK_LEN*24, Assembler::severalReads);
+
+ // move to INT side, and reverse the byte order of lower 32 bits to little endian
+ __ movftoi_revbytes(F0, O4, G1, G4);
+ __ movftoi_revbytes(F2, O5, G1, G4);
+ __ movftoi_revbytes(F4, G5, G1, G4);
+
+ // combine the results of 4 chunks
+ __ set64(CHUNK_K1, G3, G1);
+ __ xmulx(O4, G3, O4);
+ __ set64(CHUNK_K2, G3, G1);
+ __ xmulx(O5, G3, O5);
+ __ set64(CHUNK_K3, G3, G1);
+ __ xmulx(G5, G3, G5);
+
+ __ movdtox(F14, G4);
+ __ xor3(O4, O5, O5);
+ __ xor3(G5, O5, O5);
+ __ xor3(G4, O5, O5);
+
+ // reverse the byte order to big endian, via stack, and move to FP side
+ __ add(SP, -8, G1);
+ __ srlx(G1, 3, G1);
+ __ sllx(G1, 3, G1);
+ __ stx(O5, G1, G0);
+ __ ldfl(FloatRegisterImpl::D, G1, G0, F2); // load in little endian
+
+ __ crc32c(F6, F2, F0);
+
+ __ set(CHUNK_LEN*8*4, G4);
+ __ sub(len, G4, len);
+ __ cmp_and_br_short(len, G4, Assembler::greaterEqual, Assembler::pt, L_crc32c_parallel);
+ __ nop();
+ __ cmp_and_br_short(len, 0, Assembler::equal, Assembler::pt, L_crc32c_done);
+
+ __ BIND(L_crc32c_serial);
+
+ __ mov(32, G4);
+ __ cmp_and_br_short(len, G4, Assembler::less, Assembler::pn, L_crc32c_x8);
+
+ // ------ process 32B chunks ------
+ __ BIND(L_crc32c_x32_loop);
+ __ ldf(FloatRegisterImpl::D, buf, 0, F2);
+ __ inc(buf, 8);
+ __ crc32c(F0, F2, F0);
+ __ ldf(FloatRegisterImpl::D, buf, 0, F2);
+ __ inc(buf, 8);
+ __ crc32c(F0, F2, F0);
+ __ ldf(FloatRegisterImpl::D, buf, 0, F2);
+ __ inc(buf, 8);
+ __ crc32c(F0, F2, F0);
+ __ ldf(FloatRegisterImpl::D, buf, 0, F2);
+ __ inc(buf, 8);
+ __ crc32c(F0, F2, F0);
+ __ dec(len, 32);
+ __ cmp_and_br_short(len, G4, Assembler::greaterEqual, Assembler::pt, L_crc32c_x32_loop);
+
+ __ BIND(L_crc32c_x8);
+ __ nop();
+ __ cmp_and_br_short(len, 8, Assembler::less, Assembler::pt, L_crc32c_done);
+
+ // ------ process 8B chunks ------
+ __ BIND(L_crc32c_x8_loop);
+ __ ldf(FloatRegisterImpl::D, buf, 0, F2);
+ __ inc(buf, 8);
+ __ crc32c(F0, F2, F0);
+ __ dec(len, 8);
+ __ cmp_and_br_short(len, 8, Assembler::greaterEqual, Assembler::pt, L_crc32c_x8_loop);
+
+ __ BIND(L_crc32c_done);
+
+ // move to INT side, and reverse the byte order of lower 32 bits to little endian
+ __ movftoi_revbytes(F0, crc, G1, G3);
+
+ __ cmp_and_br_short(len, 0, Assembler::equal, Assembler::pt, L_crc32c_return);
+
+ // ------ process the misaligned tail (7 bytes or less) ------
+ __ BIND(L_crc32c_tail);
+
+ // crc = (crc >>> 8) ^ byteTable[(crc ^ b) & 0xFF];
+ __ ldub(buf, 0, G1);
+ __ update_byte_crc32(crc, G1, table);
+
+ __ inc(buf);
+ __ dec(len);
+ __ cmp_and_br_short(len, 0, Assembler::greater, Assembler::pt, L_crc32c_tail);
+
+ __ BIND(L_crc32c_return);
+ __ nop();
+ __ retl();
+ __ delayed()->nop();
+
+ return start;
+ }
+
void generate_initial() {
// Generates all stubs and initializes the entry points
@@ -5001,6 +5201,11 @@
StubRoutines::_sha512_implCompress = generate_sha512_implCompress(false, "sha512_implCompress");
StubRoutines::_sha512_implCompressMB = generate_sha512_implCompress(true, "sha512_implCompressMB");
}
+
+ // generate CRC32C intrinsic code
+ if (UseCRC32CIntrinsics) {
+ StubRoutines::_updateBytesCRC32C = generate_updateBytesCRC32C();
+ }
}
--- a/hotspot/src/cpu/sparc/vm/stubRoutines_sparc.hpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/cpu/sparc/vm/stubRoutines_sparc.hpp Tue Jul 14 15:26:34 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -41,7 +41,7 @@
enum /* platform_dependent_constants */ {
// %%%%%%%% May be able to shrink this a lot
code_size1 = 20000, // simply increase if too small (assembler will crash if too small)
- code_size2 = 23000 // simply increase if too small (assembler will crash if too small)
+ code_size2 = 24000 // simply increase if too small (assembler will crash if too small)
};
class Sparc {
--- a/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp Tue Jul 14 15:26:34 2015 -0700
@@ -230,7 +230,7 @@
assert((OptoLoopAlignment % relocInfo::addr_unit()) == 0, "alignment is not a multiple of NOP size");
char buf[512];
- jio_snprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
+ jio_snprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
(has_v9() ? ", v9" : (has_v8() ? ", v8" : "")),
(has_hardware_popc() ? ", popc" : ""),
(has_vis1() ? ", vis1" : ""),
@@ -242,6 +242,7 @@
(has_sha1() ? ", sha1" : ""),
(has_sha256() ? ", sha256" : ""),
(has_sha512() ? ", sha512" : ""),
+ (has_crc32c() ? ", crc32c" : ""),
(is_ultra3() ? ", ultra3" : ""),
(is_sun4v() ? ", sun4v" : ""),
(is_niagara_plus() ? ", niagara_plus" : (is_niagara() ? ", niagara" : "")),
@@ -363,6 +364,23 @@
}
}
+ // SPARC T4 and above should have support for CRC32C instruction
+ if (has_crc32c()) {
+ if (UseVIS > 2) { // CRC32C intrinsics use VIS3 instructions
+ if (FLAG_IS_DEFAULT(UseCRC32CIntrinsics)) {
+ FLAG_SET_DEFAULT(UseCRC32CIntrinsics, true);
+ }
+ } else {
+ if (UseCRC32CIntrinsics) {
+ warning("SPARC CRC32C intrinsics require VIS3 instruction support. Intrinsics will be disabled.");
+ FLAG_SET_DEFAULT(UseCRC32CIntrinsics, false);
+ }
+ }
+ } else if (UseCRC32CIntrinsics) {
+ warning("CRC32C instruction is not available on this CPU");
+ FLAG_SET_DEFAULT(UseCRC32CIntrinsics, false);
+ }
+
if (FLAG_IS_DEFAULT(ContendedPaddingWidth) &&
(cache_line_size > ContendedPaddingWidth))
ContendedPaddingWidth = cache_line_size;
--- a/hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp Tue Jul 14 15:26:34 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -53,7 +53,8 @@
aes_instructions = 19,
sha1_instruction = 20,
sha256_instruction = 21,
- sha512_instruction = 22
+ sha512_instruction = 22,
+ crc32c_instruction = 23
};
enum Feature_Flag_Set {
@@ -83,6 +84,7 @@
sha1_instruction_m = 1 << sha1_instruction,
sha256_instruction_m = 1 << sha256_instruction,
sha512_instruction_m = 1 << sha512_instruction,
+ crc32c_instruction_m = 1 << crc32c_instruction,
generic_v8_m = v8_instructions_m | hardware_mul32_m | hardware_div32_m | hardware_fsmuld_m,
generic_v9_m = generic_v8_m | v9_instructions_m,
@@ -141,6 +143,7 @@
static bool has_sha1() { return (_features & sha1_instruction_m) != 0; }
static bool has_sha256() { return (_features & sha256_instruction_m) != 0; }
static bool has_sha512() { return (_features & sha512_instruction_m) != 0; }
+ static bool has_crc32c() { return (_features & crc32c_instruction_m) != 0; }
static bool supports_compare_and_exchange()
{ return has_v9(); }
--- a/hotspot/src/cpu/x86/vm/vm_version_x86.cpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/cpu/x86/vm/vm_version_x86.cpp Tue Jul 14 15:26:34 2015 -0700
@@ -699,6 +699,12 @@
FLAG_SET_DEFAULT(UseSHA512Intrinsics, false);
}
+ if (UseCRC32CIntrinsics) {
+ if (!FLAG_IS_DEFAULT(UseCRC32CIntrinsics))
+ warning("CRC32C intrinsics are not available on this CPU");
+ FLAG_SET_DEFAULT(UseCRC32CIntrinsics, false);
+ }
+
// Adjust RTM (Restricted Transactional Memory) flags
if (!supports_rtm() && UseRTMLocking) {
// Can't continue because UseRTMLocking affects UseBiasedLocking flag
--- a/hotspot/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp Tue Jul 14 15:26:34 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -363,6 +363,11 @@
#endif
if (av & AV_SPARC_CBCOND) features |= cbcond_instructions_m;
+#ifndef AV_SPARC_CRC32C
+#define AV_SPARC_CRC32C 0x20000000 /* crc32c instruction supported */
+#endif
+ if (av & AV_SPARC_CRC32C) features |= crc32c_instruction_m;
+
#ifndef AV_SPARC_AES
#define AV_SPARC_AES 0x00020000 /* aes instrs supported */
#endif
--- a/hotspot/src/share/vm/ci/ciField.cpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/share/vm/ci/ciField.cpp Tue Jul 14 15:26:34 2015 -0700
@@ -186,6 +186,10 @@
// Even if general trusting is disabled, trust system-built closures in these packages.
if (holder->is_in_package("java/lang/invoke") || holder->is_in_package("sun/invoke"))
return true;
+ // Trust VM anonymous classes. They are private API (sun.misc.Unsafe) and can't be serialized,
+ // so there is no hacking of finals going on with them.
+ if (holder->is_anonymous())
+ return true;
return TrustFinalNonStaticFields;
}
--- a/hotspot/src/share/vm/ci/ciInstanceKlass.cpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/share/vm/ci/ciInstanceKlass.cpp Tue Jul 14 15:26:34 2015 -0700
@@ -58,6 +58,7 @@
_nonstatic_field_size = ik->nonstatic_field_size();
_has_nonstatic_fields = ik->has_nonstatic_fields();
_has_default_methods = ik->has_default_methods();
+ _is_anonymous = ik->is_anonymous();
_nonstatic_fields = NULL; // initialized lazily by compute_nonstatic_fields:
_has_injected_fields = -1;
_implementor = NULL; // we will fill these lazily
@@ -101,6 +102,7 @@
_has_nonstatic_fields = false;
_nonstatic_fields = NULL;
_has_injected_fields = -1;
+ _is_anonymous = false;
_loader = loader;
_protection_domain = protection_domain;
_is_shared = false;
--- a/hotspot/src/share/vm/ci/ciInstanceKlass.hpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/share/vm/ci/ciInstanceKlass.hpp Tue Jul 14 15:26:34 2015 -0700
@@ -53,6 +53,7 @@
bool _has_subklass;
bool _has_nonstatic_fields;
bool _has_default_methods;
+ bool _is_anonymous;
ciFlags _flags;
jint _nonstatic_field_size;
@@ -179,6 +180,10 @@
return _has_default_methods;
}
+ bool is_anonymous() {
+ return _is_anonymous;
+ }
+
ciInstanceKlass* get_canonical_holder(int offset);
ciField* get_field_by_offset(int field_offset, bool is_static);
ciField* get_field_by_name(ciSymbol* name, ciSymbol* signature, bool is_static);
--- a/hotspot/src/share/vm/classfile/vmSymbols.hpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp Tue Jul 14 15:26:34 2015 -0700
@@ -863,6 +863,12 @@
do_name( updateByteBuffer_name, "updateByteBuffer") \
do_signature(updateByteBuffer_signature, "(IJII)I") \
\
+ /* support for java.util.zip.CRC32C */ \
+ do_class(java_util_zip_CRC32C, "java/util/zip/CRC32C") \
+ do_intrinsic(_updateBytesCRC32C, java_util_zip_CRC32C, updateBytes_name, updateBytes_signature, F_S) \
+ do_intrinsic(_updateDirectByteBufferCRC32C, java_util_zip_CRC32C, updateDirectByteBuffer_name, updateByteBuffer_signature, F_S) \
+ do_name( updateDirectByteBuffer_name, "updateDirectByteBuffer") \
+ \
/* support for sun.misc.Unsafe */ \
do_class(sun_misc_Unsafe, "sun/misc/Unsafe") \
\
--- a/hotspot/src/share/vm/opto/escape.cpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/share/vm/opto/escape.cpp Tue Jul 14 15:26:34 2015 -0700
@@ -962,6 +962,7 @@
(strcmp(call->as_CallLeaf()->_name, "g1_wb_pre") == 0 ||
strcmp(call->as_CallLeaf()->_name, "g1_wb_post") == 0 ||
strcmp(call->as_CallLeaf()->_name, "updateBytesCRC32") == 0 ||
+ strcmp(call->as_CallLeaf()->_name, "updateBytesCRC32C") == 0 ||
strcmp(call->as_CallLeaf()->_name, "aescrypt_encryptBlock") == 0 ||
strcmp(call->as_CallLeaf()->_name, "aescrypt_decryptBlock") == 0 ||
strcmp(call->as_CallLeaf()->_name, "cipherBlockChaining_encryptAESCrypt") == 0 ||
--- a/hotspot/src/share/vm/opto/library_call.cpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/share/vm/opto/library_call.cpp Tue Jul 14 15:26:34 2015 -0700
@@ -197,7 +197,7 @@
CallJavaNode* generate_method_call_virtual(vmIntrinsics::ID method_id) {
return generate_method_call(method_id, true, false);
}
- Node * load_field_from_object(Node * fromObj, const char * fieldName, const char * fieldTypeString, bool is_exact, bool is_static);
+ Node * load_field_from_object(Node * fromObj, const char * fieldName, const char * fieldTypeString, bool is_exact, bool is_static, ciInstanceKlass * fromKls);
Node* make_string_method_node(int opcode, Node* str1_start, Node* cnt1, Node* str2_start, Node* cnt2);
Node* make_string_method_node(int opcode, Node* str1, Node* str2);
@@ -291,6 +291,9 @@
bool inline_updateCRC32();
bool inline_updateBytesCRC32();
bool inline_updateByteBufferCRC32();
+ Node* get_table_from_crc32c_class(ciInstanceKlass *crc32c_class);
+ bool inline_updateBytesCRC32C();
+ bool inline_updateDirectByteBufferCRC32C();
bool inline_multiplyToLen();
bool inline_squareToLen();
bool inline_mulAdd();
@@ -539,6 +542,11 @@
if (!UseCRC32Intrinsics) return NULL;
break;
+ case vmIntrinsics::_updateBytesCRC32C:
+ case vmIntrinsics::_updateDirectByteBufferCRC32C:
+ if (!UseCRC32CIntrinsics) return NULL;
+ break;
+
case vmIntrinsics::_incrementExactI:
case vmIntrinsics::_addExactI:
if (!Matcher::match_rule_supported(Op_OverflowAddI) || !UseMathExactIntrinsics) return NULL;
@@ -947,6 +955,11 @@
case vmIntrinsics::_updateByteBufferCRC32:
return inline_updateByteBufferCRC32();
+ case vmIntrinsics::_updateBytesCRC32C:
+ return inline_updateBytesCRC32C();
+ case vmIntrinsics::_updateDirectByteBufferCRC32C:
+ return inline_updateDirectByteBufferCRC32C();
+
case vmIntrinsics::_profileBoolean:
return inline_profileBoolean();
case vmIntrinsics::_isCompileConstant:
@@ -5536,6 +5549,106 @@
return true;
}
+//------------------------------get_table_from_crc32c_class-----------------------
+Node * LibraryCallKit::get_table_from_crc32c_class(ciInstanceKlass *crc32c_class) {
+ Node* table = load_field_from_object(NULL, "byteTable", "[I", /*is_exact*/ false, /*is_static*/ true, crc32c_class);
+ assert (table != NULL, "wrong version of java.util.zip.CRC32C");
+
+ return table;
+}
+
+//------------------------------inline_updateBytesCRC32C-----------------------
+//
+// Calculate CRC32C for byte[] array.
+// int java.util.zip.CRC32C.updateBytes(int crc, byte[] buf, int off, int end)
+//
+bool LibraryCallKit::inline_updateBytesCRC32C() {
+ assert(UseCRC32CIntrinsics, "need CRC32C instruction support");
+ assert(callee()->signature()->size() == 4, "updateBytes has 4 parameters");
+ assert(callee()->holder()->is_loaded(), "CRC32C class must be loaded");
+ // no receiver since it is a static method
+ Node* crc = argument(0); // type: int
+ Node* src = argument(1); // type: oop
+ Node* offset = argument(2); // type: int
+ Node* end = argument(3); // type: int
+
+ Node* length = _gvn.transform(new SubINode(end, offset));
+
+ const Type* src_type = src->Value(&_gvn);
+ const TypeAryPtr* top_src = src_type->isa_aryptr();
+ if (top_src == NULL || top_src->klass() == NULL) {
+ // failed array check
+ return false;
+ }
+
+ // Figure out the size and type of the elements we will be copying.
+ BasicType src_elem = src_type->isa_aryptr()->klass()->as_array_klass()->element_type()->basic_type();
+ if (src_elem != T_BYTE) {
+ return false;
+ }
+
+ // 'src_start' points to src array + scaled offset
+ Node* src_start = array_element_address(src, offset, src_elem);
+
+ // static final int[] byteTable in class CRC32C
+ Node* table = get_table_from_crc32c_class(callee()->holder());
+ Node* table_start = array_element_address(table, intcon(0), T_INT);
+
+ // We assume that range check is done by caller.
+ // TODO: generate range check (offset+length < src.length) in debug VM.
+
+ // Call the stub.
+ address stubAddr = StubRoutines::updateBytesCRC32C();
+ const char *stubName = "updateBytesCRC32C";
+
+ Node* call = make_runtime_call(RC_LEAF, OptoRuntime::updateBytesCRC32C_Type(),
+ stubAddr, stubName, TypePtr::BOTTOM,
+ crc, src_start, length, table_start);
+ Node* result = _gvn.transform(new ProjNode(call, TypeFunc::Parms));
+ set_result(result);
+ return true;
+}
+
+//------------------------------inline_updateDirectByteBufferCRC32C-----------------------
+//
+// Calculate CRC32C for DirectByteBuffer.
+// int java.util.zip.CRC32C.updateDirectByteBuffer(int crc, long buf, int off, int end)
+//
+bool LibraryCallKit::inline_updateDirectByteBufferCRC32C() {
+ assert(UseCRC32CIntrinsics, "need CRC32C instruction support");
+ assert(callee()->signature()->size() == 5, "updateDirectByteBuffer has 4 parameters and one is long");
+ assert(callee()->holder()->is_loaded(), "CRC32C class must be loaded");
+ // no receiver since it is a static method
+ Node* crc = argument(0); // type: int
+ Node* src = argument(1); // type: long
+ Node* offset = argument(3); // type: int
+ Node* end = argument(4); // type: int
+
+ Node* length = _gvn.transform(new SubINode(end, offset));
+
+ src = ConvL2X(src); // adjust Java long to machine word
+ Node* base = _gvn.transform(new CastX2PNode(src));
+ offset = ConvI2X(offset);
+
+ // 'src_start' points to src array + scaled offset
+ Node* src_start = basic_plus_adr(top(), base, offset);
+
+ // static final int[] byteTable in class CRC32C
+ Node* table = get_table_from_crc32c_class(callee()->holder());
+ Node* table_start = array_element_address(table, intcon(0), T_INT);
+
+ // Call the stub.
+ address stubAddr = StubRoutines::updateBytesCRC32C();
+ const char *stubName = "updateBytesCRC32C";
+
+ Node* call = make_runtime_call(RC_LEAF, OptoRuntime::updateBytesCRC32C_Type(),
+ stubAddr, stubName, TypePtr::BOTTOM,
+ crc, src_start, length, table_start);
+ Node* result = _gvn.transform(new ProjNode(call, TypeFunc::Parms));
+ set_result(result);
+ return true;
+}
+
//----------------------------inline_reference_get----------------------------
// public T java.lang.ref.Reference.get();
bool LibraryCallKit::inline_reference_get() {
@@ -5571,18 +5684,28 @@
Node * LibraryCallKit::load_field_from_object(Node * fromObj, const char * fieldName, const char * fieldTypeString,
- bool is_exact=true, bool is_static=false) {
-
- const TypeInstPtr* tinst = _gvn.type(fromObj)->isa_instptr();
- assert(tinst != NULL, "obj is null");
- assert(tinst->klass()->is_loaded(), "obj is not loaded");
- assert(!is_exact || tinst->klass_is_exact(), "klass not exact");
-
- ciField* field = tinst->klass()->as_instance_klass()->get_field_by_name(ciSymbol::make(fieldName),
- ciSymbol::make(fieldTypeString),
- is_static);
+ bool is_exact=true, bool is_static=false,
+ ciInstanceKlass * fromKls=NULL) {
+ if (fromKls == NULL) {
+ const TypeInstPtr* tinst = _gvn.type(fromObj)->isa_instptr();
+ assert(tinst != NULL, "obj is null");
+ assert(tinst->klass()->is_loaded(), "obj is not loaded");
+ assert(!is_exact || tinst->klass_is_exact(), "klass not exact");
+ fromKls = tinst->klass()->as_instance_klass();
+ } else {
+ assert(is_static, "only for static field access");
+ }
+ ciField* field = fromKls->get_field_by_name(ciSymbol::make(fieldName),
+ ciSymbol::make(fieldTypeString),
+ is_static);
+
+ assert (field != NULL, "undefined field");
if (field == NULL) return (Node *) NULL;
- assert (field != NULL, "undefined field");
+
+ if (is_static) {
+ const TypeInstPtr* tip = TypeInstPtr::make(fromKls->java_mirror());
+ fromObj = makecon(tip);
+ }
// Next code copied from Parse::do_get_xxx():
--- a/hotspot/src/share/vm/opto/runtime.cpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/share/vm/opto/runtime.cpp Tue Jul 14 15:26:34 2015 -0700
@@ -851,6 +851,29 @@
return TypeFunc::make(domain, range);
}
+/**
+ * int updateBytesCRC32C(int crc, byte* buf, int len, int* table)
+ */
+const TypeFunc* OptoRuntime::updateBytesCRC32C_Type() {
+ // create input type (domain)
+ int num_args = 4;
+ int argcnt = num_args;
+ const Type** fields = TypeTuple::fields(argcnt);
+ int argp = TypeFunc::Parms;
+ fields[argp++] = TypeInt::INT; // crc
+ fields[argp++] = TypePtr::NOTNULL; // buf
+ fields[argp++] = TypeInt::INT; // len
+ fields[argp++] = TypePtr::NOTNULL; // table
+ assert(argp == TypeFunc::Parms+argcnt, "correct decoding");
+ const TypeTuple* domain = TypeTuple::make(TypeFunc::Parms+argcnt, fields);
+
+ // result type needed
+ fields = TypeTuple::fields(1);
+ fields[TypeFunc::Parms+0] = TypeInt::INT; // crc result
+ const TypeTuple* range = TypeTuple::make(TypeFunc::Parms+1, fields);
+ return TypeFunc::make(domain, range);
+}
+
// for cipherBlockChaining calls of aescrypt encrypt/decrypt, four pointers and a length, returning int
const TypeFunc* OptoRuntime::cipherBlockChaining_aescrypt_Type() {
// create input type (domain)
--- a/hotspot/src/share/vm/opto/runtime.hpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/share/vm/opto/runtime.hpp Tue Jul 14 15:26:34 2015 -0700
@@ -319,6 +319,7 @@
static const TypeFunc* ghash_processBlocks_Type();
static const TypeFunc* updateBytesCRC32_Type();
+ static const TypeFunc* updateBytesCRC32C_Type();
// leaf on stack replacement interpreter accessor types
static const TypeFunc* osr_end_Type();
--- a/hotspot/src/share/vm/opto/superword.cpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/share/vm/opto/superword.cpp Tue Jul 14 15:26:34 2015 -0700
@@ -183,13 +183,20 @@
break;
}
+ // Ignore nodes with non-primitive type.
+ BasicType bt;
+ if (n->is_Mem()) {
+ bt = n->as_Mem()->memory_type();
+ } else {
+ bt = n->bottom_type()->basic_type();
+ }
+ if (is_java_primitive(bt) == false) {
+ ignored_loop_nodes[i] = n->_idx;
+ continue;
+ }
+
if (n->is_Mem()) {
MemNode* current = n->as_Mem();
- BasicType bt = current->memory_type();
- if (is_java_primitive(bt) == false) {
- ignored_loop_nodes[i] = n->_idx;
- continue;
- }
Node* adr = n->in(MemNode::Address);
Node* n_ctrl = _phase->get_ctrl(adr);
@@ -231,11 +238,12 @@
BasicType bt;
Node* n = lpt()->_body.at(i);
- if (n->is_Store()) {
+ if (n->is_Mem()) {
bt = n->as_Mem()->memory_type();
} else {
bt = n->bottom_type()->basic_type();
}
+ if (is_java_primitive(bt) == false) continue;
int cur_max_vector = Matcher::max_vector_size(bt);
--- a/hotspot/src/share/vm/runtime/arguments.cpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Tue Jul 14 15:26:34 2015 -0700
@@ -3753,8 +3753,12 @@
if (TieredCompilation) {
set_tiered_flags();
} else {
- // Check if the policy is valid. Policies 0 and 1 are valid for non-tiered setup.
- if (CompilationPolicyChoice >= 2) {
+ int max_compilation_policy_choice = 1;
+#ifdef COMPILER2
+ max_compilation_policy_choice = 2;
+#endif
+ // Check if the policy is valid.
+ if (CompilationPolicyChoice >= max_compilation_policy_choice) {
vm_exit_during_initialization(
"Incompatible compilation policy selected", NULL);
}
--- a/hotspot/src/share/vm/runtime/compilationPolicy.cpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/share/vm/runtime/compilationPolicy.cpp Tue Jul 14 15:26:34 2015 -0700
@@ -512,7 +512,7 @@
RegisterMap reg_map(thread, false);
javaVFrame* triggerVF = thread->last_java_vframe(®_map);
// triggerVF is the frame that triggered its counter
- RFrame* first = new InterpretedRFrame(triggerVF->fr(), thread, m);
+ RFrame* first = new InterpretedRFrame(triggerVF->fr(), thread, m());
if (first->top_method()->code() != NULL) {
// called obsolete method/nmethod -- no need to recompile
@@ -557,8 +557,8 @@
if( !next ) // No next frame up the stack?
break; // Then compile with current frame
- methodHandle m = current->top_method();
- methodHandle next_m = next->top_method();
+ Method* m = current->top_method();
+ Method* next_m = next->top_method();
if (TraceCompilationPolicy && Verbose) {
tty->print("[caller: ");
@@ -644,7 +644,7 @@
if (TraceCompilationPolicy && Verbose) {
tty->print("\n\t check caller: ");
next_m->print_short_name(tty);
- tty->print(" ( interpreted " INTPTR_FORMAT ", size=%d ) ", p2i((address)next_m()), next_m->code_size());
+ tty->print(" ( interpreted " INTPTR_FORMAT ", size=%d ) ", p2i((address)next_m), next_m->code_size());
}
current = next;
--- a/hotspot/src/share/vm/runtime/globals.hpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/share/vm/runtime/globals.hpp Tue Jul 14 15:26:34 2015 -0700
@@ -848,6 +848,9 @@
product(bool, UseCRC32Intrinsics, false, \
"use intrinsics for java.util.zip.CRC32") \
\
+ product(bool, UseCRC32CIntrinsics, false, \
+ "use intrinsics for java.util.zip.CRC32C") \
+ \
develop(bool, TraceCallFixup, false, \
"Trace all call fixups") \
\
--- a/hotspot/src/share/vm/runtime/rframe.cpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/share/vm/runtime/rframe.cpp Tue Jul 14 15:26:34 2015 -0700
@@ -52,12 +52,12 @@
: RFrame(fr, thread, callee) {
RegisterMap map(thread, false);
_vf = javaVFrame::cast(vframe::new_vframe(&_fr, &map, thread));
- _method = methodHandle(thread, _vf->method());
+ _method = _vf->method();
assert( _vf->is_interpreted_frame(), "must be interpreted");
init();
}
-InterpretedRFrame::InterpretedRFrame(frame fr, JavaThread* thread, methodHandle m)
+InterpretedRFrame::InterpretedRFrame(frame fr, JavaThread* thread, Method* m)
: RFrame(fr, thread, NULL) {
RegisterMap map(thread, false);
_vf = javaVFrame::cast(vframe::new_vframe(&_fr, &map, thread));
@@ -140,8 +140,8 @@
_nm = compiledVFrame::cast(vf)->code();
vf = vf->top();
_vf = javaVFrame::cast(vf);
- _method = methodHandle(thread(), CodeCache::find_nmethod(_fr.pc())->method());
- assert(_method(), "should have found a method");
+ _method = CodeCache::find_nmethod(_fr.pc())->method();
+ assert(_method, "should have found a method");
#ifndef PRODUCT
_invocations = _method->compiled_invocation_count();
#endif
--- a/hotspot/src/share/vm/runtime/rframe.hpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/share/vm/runtime/rframe.hpp Tue Jul 14 15:26:34 2015 -0700
@@ -60,7 +60,7 @@
frame fr() const { return _fr; }
JavaThread* thread() const { return _thread; }
virtual int cost() const = 0; // estimated inlining cost (size)
- virtual methodHandle top_method() const = 0;
+ virtual Method* top_method() const = 0;
virtual javaVFrame* top_vframe() const = 0;
virtual nmethod* nm() const { ShouldNotCallThis(); return NULL; }
@@ -79,7 +79,7 @@
protected:
nmethod* _nm;
javaVFrame* _vf; // top vframe; may be NULL (for most recent frame)
- methodHandle _method; // top method
+ Method* _method; // top method
CompiledRFrame(frame fr, JavaThread* thread, RFrame*const callee);
void init();
@@ -88,7 +88,7 @@
public:
CompiledRFrame(frame fr, JavaThread* thread); // for nmethod triggering its counter (callee == NULL)
bool is_compiled() const { return true; }
- methodHandle top_method() const { return _method; }
+ Method* top_method() const { return _method; }
javaVFrame* top_vframe() const { return _vf; }
nmethod* nm() const { return _nm; }
int cost() const;
@@ -98,16 +98,16 @@
class InterpretedRFrame : public RFrame { // interpreter frame
protected:
javaVFrame* _vf; // may be NULL (for most recent frame)
- methodHandle _method;
+ Method* _method;
InterpretedRFrame(frame fr, JavaThread* thread, RFrame*const callee);
void init();
friend class RFrame;
public:
- InterpretedRFrame(frame fr, JavaThread* thread, methodHandle m); // constructor for method triggering its invocation counter
+ InterpretedRFrame(frame fr, JavaThread* thread, Method* m); // constructor for method triggering its invocation counter
bool is_interpreted() const { return true; }
- methodHandle top_method() const { return _method; }
+ Method* top_method() const { return _method; }
javaVFrame* top_vframe() const { return _vf; }
int cost() const;
void print();
--- a/hotspot/src/share/vm/runtime/stubRoutines.cpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/share/vm/runtime/stubRoutines.cpp Tue Jul 14 15:26:34 2015 -0700
@@ -137,6 +137,8 @@
address StubRoutines::_updateBytesCRC32 = NULL;
address StubRoutines::_crc_table_adr = NULL;
+address StubRoutines::_updateBytesCRC32C = NULL;
+
address StubRoutines::_multiplyToLen = NULL;
address StubRoutines::_squareToLen = NULL;
address StubRoutines::_mulAdd = NULL;
--- a/hotspot/src/share/vm/runtime/stubRoutines.hpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/share/vm/runtime/stubRoutines.hpp Tue Jul 14 15:26:34 2015 -0700
@@ -197,6 +197,8 @@
static address _updateBytesCRC32;
static address _crc_table_adr;
+ static address _updateBytesCRC32C;
+
static address _multiplyToLen;
static address _squareToLen;
static address _mulAdd;
@@ -359,6 +361,8 @@
static address updateBytesCRC32() { return _updateBytesCRC32; }
static address crc_table_addr() { return _crc_table_adr; }
+ static address updateBytesCRC32C() { return _updateBytesCRC32C; }
+
static address multiplyToLen() {return _multiplyToLen; }
static address squareToLen() {return _squareToLen; }
static address mulAdd() {return _mulAdd; }
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp Tue Jul 14 15:26:34 2015 -0700
@@ -830,6 +830,7 @@
static_field(StubRoutines, _ghash_processBlocks, address) \
static_field(StubRoutines, _updateBytesCRC32, address) \
static_field(StubRoutines, _crc_table_adr, address) \
+ static_field(StubRoutines, _updateBytesCRC32C, address) \
static_field(StubRoutines, _multiplyToLen, address) \
static_field(StubRoutines, _squareToLen, address) \
static_field(StubRoutines, _mulAdd, address) \
--- a/hotspot/test/TEST.groups Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/test/TEST.groups Tue Jul 14 15:26:34 2015 -0700
@@ -147,12 +147,16 @@
gc/survivorAlignment \
gc/TestGCLogRotationViaJcmd.java \
runtime/InternalApi/ThreadCpuTimesDeadlock.java \
+ runtime/NMT/JcmdSummaryDiff.java \
+ runtime/RedefineTests/RedefineAnnotations.java
serviceability/sa/jmap-hashcode/Test8028623.java \
serviceability/threads/TestFalseDeadLock.java \
compiler/codecache/jmx \
compiler/jsr292/RedefineMethodUsedByMultipleMethodHandles.java \
compiler/rangechecks/TestRangeCheckSmearing.java \
- serviceability/dcmd
+ compiler/whitebox/DeoptimizeMultipleOSRTest.java \
+ serviceability/dcmd \
+ testlibrary_tests/whitebox/vm_flags
# Compact 2 adds full VM tests
compact2 = \
--- a/hotspot/test/compiler/codecache/jmx/CodeCacheUtils.java Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/test/compiler/codecache/jmx/CodeCacheUtils.java Tue Jul 14 15:26:34 2015 -0700
@@ -21,6 +21,7 @@
* questions.
*/
+import jdk.test.lib.Asserts;
import jdk.test.lib.Utils;
import java.lang.management.MemoryPoolMXBean;
import javax.management.Notification;
@@ -80,19 +81,42 @@
}
/**
- * A "non-nmethods" code heap is used by interpreter during bytecode
- * execution, thus, it can't be predicted if this code heap usage will be
- * increased or not. Same goes for 'All'.
+ * Checks if the usage of the code heap corresponding to 'btype' can be
+ * predicted at runtime if we disable compilation. The usage of the
+ * 'NonNMethod' code heap can not be predicted because we generate adapters
+ * and buffers at runtime. The 'MethodNonProfiled' code heap is also not
+ * predictable because we may generate compiled versions of method handle
+ * intrinsics while resolving methods at runtime. Same applies to 'All'.
*
* @param btype BlobType to be checked
* @return boolean value, true if respective code heap is predictable
*/
public static boolean isCodeHeapPredictable(BlobType btype) {
- return btype == BlobType.MethodNonProfiled
- || btype == BlobType.MethodProfiled;
+ return btype == BlobType.MethodProfiled;
}
- public static void disableCollectionUsageThresholds(){
+ /**
+ * Verifies that 'newValue' is equal to 'oldValue' if usage of the
+ * corresponding code heap is predictable. Checks the weaker condition
+ * 'newValue >= oldValue' if usage is not predictable because intermediate
+ * allocations may happen.
+ *
+ * @param btype BlobType of the code heap to be checked
+ * @param newValue New value to be verified
+ * @param oldValue Old value to be verified
+ * @param msg Error message if verification fails
+ */
+ public static void assertEQorGTE(BlobType btype, long newValue, long oldValue, String msg) {
+ if (CodeCacheUtils.isCodeHeapPredictable(btype)) {
+ // Usage is predictable, check strong == condition
+ Asserts.assertEQ(newValue, oldValue, msg);
+ } else {
+ // Usage is not predictable, check weaker >= condition
+ Asserts.assertGTE(newValue, oldValue, msg);
+ }
+ }
+
+ public static void disableCollectionUsageThresholds() {
BlobType.getAvailable().stream()
.map(BlobType::getMemoryPool)
.filter(MemoryPoolMXBean::isCollectionUsageThresholdSupported)
--- a/hotspot/test/compiler/codecache/jmx/GetUsageTest.java Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/test/compiler/codecache/jmx/GetUsageTest.java Tue Jul 14 15:26:34 2015 -0700
@@ -52,10 +52,8 @@
public static void main(String[] args) throws Exception {
for (BlobType btype : BlobType.getAvailable()) {
- if (CodeCacheUtils.isCodeHeapPredictable(btype)) {
- for (int allocSize = 10; allocSize < 100000; allocSize *= 10) {
- new GetUsageTest(btype, allocSize).runTest();
- }
+ for (int allocSize = 10; allocSize < 100000; allocSize *= 10) {
+ new GetUsageTest(btype, allocSize).runTest();
}
}
}
@@ -87,13 +85,15 @@
for (MemoryPoolMXBean entry : predictableBeans) {
long diff = current.get(entry) - initial.get(entry);
if (entry.equals(btype.getMemoryPool())) {
- Asserts.assertFalse(diff <= 0L || diff > usageUpperEstimate,
- String.format("Pool %s usage increase was reported "
- + "unexpectedly as increased by %d using "
- + "allocation size %d", entry.getName(),
- diff, allocateSize));
+ if (CodeCacheUtils.isCodeHeapPredictable(btype)) {
+ Asserts.assertFalse(diff <= 0L || diff > usageUpperEstimate,
+ String.format("Pool %s usage increase was reported "
+ + "unexpectedly as increased by %d using "
+ + "allocation size %d", entry.getName(),
+ diff, allocateSize));
+ }
} else {
- Asserts.assertEQ(diff, 0L,
+ CodeCacheUtils.assertEQorGTE(btype, diff, 0L,
String.format("Pool %s usage changed unexpectedly while"
+ " trying to increase: %s using allocation "
+ "size %d", entry.getName(),
--- a/hotspot/test/compiler/codecache/jmx/PeakUsageTest.java Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/test/compiler/codecache/jmx/PeakUsageTest.java Tue Jul 14 15:26:34 2015 -0700
@@ -52,9 +52,7 @@
public static void main(String[] args) {
for (BlobType btype : BlobType.getAvailable()) {
- if (CodeCacheUtils.isCodeHeapPredictable(btype)) {
- new PeakUsageTest(btype).runTest();
- }
+ new PeakUsageTest(btype).runTest();
}
}
@@ -65,7 +63,7 @@
CodeCacheUtils.ALLOCATION_SIZE, btype.id);
long newPeakUsage = bean.getPeakUsage().getUsed();
try {
- Asserts.assertEQ(newPeakUsage, bean.getUsage().getUsed(),
+ CodeCacheUtils.assertEQorGTE(btype, newPeakUsage, bean.getUsage().getUsed(),
"Peak usage does not match usage after allocation for "
+ bean.getName());
} finally {
@@ -73,18 +71,18 @@
CodeCacheUtils.WB.freeCodeBlob(addr);
}
}
- Asserts.assertEQ(newPeakUsage, bean.getPeakUsage().getUsed(),
+ CodeCacheUtils.assertEQorGTE(btype, newPeakUsage, bean.getPeakUsage().getUsed(),
"Code cache peak usage has changed after usage decreased for "
+ bean.getName());
bean.resetPeakUsage();
- Asserts.assertEQ(bean.getPeakUsage().getUsed(),
+ CodeCacheUtils.assertEQorGTE(btype, bean.getPeakUsage().getUsed(),
bean.getUsage().getUsed(),
"Code cache peak usage is not equal to usage after reset for "
+ bean.getName());
long addr2 = CodeCacheUtils.WB.allocateCodeBlob(
CodeCacheUtils.ALLOCATION_SIZE, btype.id);
try {
- Asserts.assertEQ(bean.getPeakUsage().getUsed(),
+ CodeCacheUtils.assertEQorGTE(btype, bean.getPeakUsage().getUsed(),
bean.getUsage().getUsed(),
"Code cache peak usage is not equal to usage after fresh "
+ "allocation for " + bean.getName());
--- a/hotspot/test/compiler/codecache/jmx/PoolsIndependenceTest.java Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/test/compiler/codecache/jmx/PoolsIndependenceTest.java Tue Jul 14 15:26:34 2015 -0700
@@ -97,13 +97,11 @@
return false;
});
for (BlobType bt : BlobType.getAvailable()) {
- if (CodeCacheUtils.isCodeHeapPredictable(bt)) {
- int expectedNotificationsAmount = bt.equals(btype) ? 1 : 0;
- Asserts.assertEQ(counters.get(bt.getMemoryPool().getName()).get(),
- expectedNotificationsAmount, String.format("Unexpected "
- + "amount of notifications for pool: %s",
- bt.getMemoryPool().getName()));
- }
+ int expectedNotificationsAmount = bt.equals(btype) ? 1 : 0;
+ CodeCacheUtils.assertEQorGTE(btype, counters.get(bt.getMemoryPool().getName()).get(),
+ expectedNotificationsAmount, String.format("Unexpected "
+ + "amount of notifications for pool: %s",
+ bt.getMemoryPool().getName()));
}
try {
((NotificationEmitter) ManagementFactory.getMemoryMXBean()).
--- a/hotspot/test/compiler/codecache/jmx/ThresholdNotificationsTest.java Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/test/compiler/codecache/jmx/ThresholdNotificationsTest.java Tue Jul 14 15:26:34 2015 -0700
@@ -54,9 +54,7 @@
public static void main(String[] args) {
for (BlobType bt : BlobType.getAvailable()) {
- if (CodeCacheUtils.isCodeHeapPredictable(bt)) {
- new ThresholdNotificationsTest(bt).runTest();
- }
+ new ThresholdNotificationsTest(bt).runTest();
}
}
@@ -92,7 +90,9 @@
}
Asserts.assertTrue(
Utils.waitForCondition(
- () -> counter == iterationsCount, WAIT_TIME),
+ () -> (CodeCacheUtils.isCodeHeapPredictable(btype) ?
+ (counter == iterationsCount) : (counter >= iterationsCount)),
+ WAIT_TIME),
"Couldn't receive expected notifications count");
try {
((NotificationEmitter) ManagementFactory.getMemoryMXBean()).
--- a/hotspot/test/compiler/codecache/jmx/UsageThresholdExceededTest.java Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/test/compiler/codecache/jmx/UsageThresholdExceededTest.java Tue Jul 14 15:26:34 2015 -0700
@@ -51,13 +51,9 @@
}
public static void main(String[] args) {
- int iterationsCount =
- Integer.getInteger("jdk.test.lib.iterations", 1);
+ int iterationsCount = Integer.getInteger("jdk.test.lib.iterations", 1);
for (BlobType btype : BlobType.getAvailable()) {
- if (CodeCacheUtils.isCodeHeapPredictable(btype)) {
- new UsageThresholdExceededTest(btype, iterationsCount)
- .runTest();
- }
+ new UsageThresholdExceededTest(btype, iterationsCount).runTest();
}
}
@@ -67,9 +63,8 @@
for (int i = 0; i < iterations; i++) {
CodeCacheUtils.hitUsageThreshold(bean, btype);
}
- Asserts.assertEQ(bean.getUsageThresholdCount(), oldValue + iterations,
+ CodeCacheUtils.assertEQorGTE(btype, bean.getUsageThresholdCount(), oldValue + iterations,
"Unexpected threshold usage count");
- System.out.printf("INFO: Scenario finished successfully for %s%n",
- bean.getName());
+ System.out.printf("INFO: Scenario finished successfully for %s%n", bean.getName());
}
}
--- a/hotspot/test/compiler/codecache/jmx/UsageThresholdIncreasedTest.java Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/test/compiler/codecache/jmx/UsageThresholdIncreasedTest.java Tue Jul 14 15:26:34 2015 -0700
@@ -27,7 +27,6 @@
/*
* @test UsageThresholdIncreasedTest
- * @ignore 8129937
* @library /testlibrary /../../test/lib
* @modules java.base/sun.misc
* java.management
@@ -54,14 +53,12 @@
public static void main(String[] args) {
for (BlobType btype : BlobType.getAvailable()) {
- if (CodeCacheUtils.isCodeHeapPredictable(btype)) {
- new UsageThresholdIncreasedTest(btype).runTest();
- }
+ new UsageThresholdIncreasedTest(btype).runTest();
}
}
private void checkUsageThresholdCount(MemoryPoolMXBean bean, long count){
- Asserts.assertEQ(bean.getUsageThresholdCount(), count,
+ CodeCacheUtils.assertEQorGTE(btype, bean.getUsageThresholdCount(), count,
String.format("Usage threshold was hit: %d times for %s "
+ "Threshold value: %d with current usage: %d",
bean.getUsageThresholdCount(), bean.getName(),
--- a/hotspot/test/compiler/codecache/jmx/UsageThresholdNotExceededTest.java Tue Jul 14 20:36:12 2015 +0300
+++ b/hotspot/test/compiler/codecache/jmx/UsageThresholdNotExceededTest.java Tue Jul 14 15:26:34 2015 -0700
@@ -50,9 +50,7 @@
public static void main(String[] args) {
for (BlobType btype : BlobType.getAvailable()) {
- if (CodeCacheUtils.isCodeHeapPredictable(btype)) {
- new UsageThresholdNotExceededTest(btype).runTest();
- }
+ new UsageThresholdNotExceededTest(btype).runTest();
}
}
@@ -65,13 +63,11 @@
- CodeCacheUtils.getHeaderSize(btype), btype.id);
// a gc cycle triggers usage threshold recalculation
CodeCacheUtils.WB.fullGC();
- Asserts.assertEQ(bean.getUsageThresholdCount(), initialThresholdCount,
- String.format("Usage threshold was hit: %d times for %s. "
+ CodeCacheUtils.assertEQorGTE(btype, bean.getUsageThresholdCount(), initialThresholdCount,
+ String.format("Usage threshold was hit: %d times for %s. "
+ "Threshold value: %d with current usage: %d",
bean.getUsageThresholdCount(), bean.getName(),
bean.getUsageThreshold(), bean.getUsage().getUsed()));
-
- System.out.println("INFO: Case finished successfully for "
- + bean.getName());
+ System.out.println("INFO: Case finished successfully for " + bean.getName());
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/intrinsics/crc32c/TestCRC32C.java Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,221 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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 8073583
+ * @summary C2 support for CRC32C on SPARC
+ *
+ * @run main/othervm/timeout=600 -Xbatch TestCRC32C -m
+ */
+
+import java.nio.ByteBuffer;
+import java.util.zip.Checksum;
+import java.util.zip.CRC32C;
+
+public class TestCRC32C {
+ public static void main(String[] args) {
+ int offset = Integer.getInteger("offset", 0);
+ int msgSize = Integer.getInteger("msgSize", 512);
+ boolean multi = false;
+ int iters = 20000;
+ int warmupIters = 20000;
+
+ if (args.length > 0) {
+ if (args[0].equals("-m")) {
+ multi = true;
+ } else {
+ iters = Integer.valueOf(args[0]);
+ }
+ if (args.length > 1) {
+ warmupIters = Integer.valueOf(args[1]);
+ }
+ }
+
+ if (multi) {
+ test_multi(warmupIters);
+ return;
+ }
+
+ System.out.println(" offset = " + offset);
+ System.out.println("msgSize = " + msgSize + " bytes");
+ System.out.println(" iters = " + iters);
+
+ byte[] b = initializedBytes(msgSize, offset);
+
+ CRC32C crc0 = new CRC32C();
+ CRC32C crc1 = new CRC32C();
+ CRC32C crc2 = new CRC32C();
+
+ crc0.update(b, offset, msgSize);
+
+ System.out.println("-------------------------------------------------------");
+
+ /* warm up */
+ for (int i = 0; i < warmupIters; i++) {
+ crc1.reset();
+ crc1.update(b, offset, msgSize);
+ }
+
+ /* measure performance */
+ long start = System.nanoTime();
+ for (int i = 0; i < iters; i++) {
+ crc1.reset();
+ crc1.update(b, offset, msgSize);
+ }
+ long end = System.nanoTime();
+ double total = (double)(end - start)/1e9; // in seconds
+ double thruput = (double)msgSize*iters/1e6/total; // in MB/s
+ System.out.println("CRC32C.update(byte[]) runtime = " + total + " seconds");
+ System.out.println("CRC32C.update(byte[]) throughput = " + thruput + " MB/s");
+
+ /* check correctness */
+ for (int i = 0; i < iters; i++) {
+ crc1.reset();
+ crc1.update(b, offset, msgSize);
+ if (!check(crc0, crc1)) break;
+ }
+ report("CRCs", crc0, crc1);
+
+ System.out.println("-------------------------------------------------------");
+
+ ByteBuffer buf = ByteBuffer.allocateDirect(msgSize);
+ buf.put(b, offset, msgSize);
+ buf.flip();
+
+ /* warm up */
+ for (int i = 0; i < warmupIters; i++) {
+ crc2.reset();
+ crc2.update(buf);
+ buf.rewind();
+ }
+
+ /* measure performance */
+ start = System.nanoTime();
+ for (int i = 0; i < iters; i++) {
+ crc2.reset();
+ crc2.update(buf);
+ buf.rewind();
+ }
+ end = System.nanoTime();
+ total = (double)(end - start)/1e9; // in seconds
+ thruput = (double)msgSize*iters/1e6/total; // in MB/s
+ System.out.println("CRC32C.update(ByteBuffer) runtime = " + total + " seconds");
+ System.out.println("CRC32C.update(ByteBuffer) throughput = " + thruput + " MB/s");
+
+ /* check correctness */
+ for (int i = 0; i < iters; i++) {
+ crc2.reset();
+ crc2.update(buf);
+ buf.rewind();
+ if (!check(crc0, crc2)) break;
+ }
+ report("CRCs", crc0, crc2);
+
+ System.out.println("-------------------------------------------------------");
+ }
+
+ private static void report(String s, Checksum crc0, Checksum crc1) {
+ System.out.printf("%s: crc0 = %08x, crc1 = %08x\n",
+ s, crc0.getValue(), crc1.getValue());
+ }
+
+ private static boolean check(Checksum crc0, Checksum crc1) {
+ if (crc0.getValue() != crc1.getValue()) {
+ System.err.printf("ERROR: crc0 = %08x, crc1 = %08x\n",
+ crc0.getValue(), crc1.getValue());
+ return false;
+ }
+ return true;
+ }
+
+ private static byte[] initializedBytes(int M, int offset) {
+ byte[] bytes = new byte[M + offset];
+ for (int i = 0; i < offset; i++) {
+ bytes[i] = (byte) i;
+ }
+ for (int i = offset; i < bytes.length; i++) {
+ bytes[i] = (byte) (i - offset);
+ }
+ return bytes;
+ }
+
+ private static void test_multi(int iters) {
+ int len1 = 8; // the 8B/iteration loop
+ int len2 = 32; // the 32B/iteration loop
+ int len3 = 4096; // the 4KB/iteration loop
+
+ byte[] b = initializedBytes(len3*16, 0);
+ int[] offsets = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 16, 32, 64, 128, 256, 512 };
+ int[] sizes = { 0, 1, 2, 3, 4, 5, 6, 7,
+ len1, len1+1, len1+2, len1+3, len1+4, len1+5, len1+6, len1+7,
+ len1*2, len1*2+1, len1*2+3, len1*2+5, len1*2+7,
+ len2, len2+1, len2+3, len2+5, len2+7,
+ len2*2, len2*4, len2*8, len2*16, len2*32, len2*64,
+ len3, len3+1, len3+3, len3+5, len3+7,
+ len3*2, len3*4, len3*8,
+ len1+len2, len1+len2+1, len1+len2+3, len1+len2+5, len1+len2+7,
+ len1+len3, len1+len3+1, len1+len3+3, len1+len3+5, len1+len3+7,
+ len2+len3, len2+len3+1, len2+len3+3, len2+len3+5, len2+len3+7,
+ len1+len2+len3, len1+len2+len3+1, len1+len2+len3+3,
+ len1+len2+len3+5, len1+len2+len3+7,
+ (len1+len2+len3)*2, (len1+len2+len3)*2+1, (len1+len2+len3)*2+3,
+ (len1+len2+len3)*2+5, (len1+len2+len3)*2+7,
+ (len1+len2+len3)*3, (len1+len2+len3)*3-1, (len1+len2+len3)*3-3,
+ (len1+len2+len3)*3-5, (len1+len2+len3)*3-7 };
+ CRC32C[] crc0 = new CRC32C[offsets.length*sizes.length];
+ CRC32C[] crc1 = new CRC32C[offsets.length*sizes.length];
+ int i, j, k;
+
+ System.out.printf("testing %d cases ...\n", offsets.length*sizes.length);
+
+ /* set the result from interpreter as reference */
+ for (i = 0; i < offsets.length; i++) {
+ for (j = 0; j < sizes.length; j++) {
+ crc0[i*sizes.length + j] = new CRC32C();
+ crc1[i*sizes.length + j] = new CRC32C();
+ crc0[i*sizes.length + j].update(b, offsets[i], sizes[j]);
+ }
+ }
+
+ /* warm up the JIT compiler and get result */
+ for (k = 0; k < iters; k++) {
+ for (i = 0; i < offsets.length; i++) {
+ for (j = 0; j < sizes.length; j++) {
+ crc1[i*sizes.length + j].reset();
+ crc1[i*sizes.length + j].update(b, offsets[i], sizes[j]);
+ }
+ }
+ }
+
+ /* check correctness */
+ for (i = 0; i < offsets.length; i++) {
+ for (j = 0; j < sizes.length; j++) {
+ if (!check(crc0[i*sizes.length + j], crc1[i*sizes.length + j])) {
+ System.out.printf("offsets[%d] = %d", i, offsets[i]);
+ System.out.printf("\tsizes[%d] = %d\n", j, sizes[j]);
+ }
+ }
+ }
+ }
+}
--- a/jaxp/.hgtags Tue Jul 14 20:36:12 2015 +0300
+++ b/jaxp/.hgtags Tue Jul 14 15:26:34 2015 -0700
@@ -314,3 +314,4 @@
f844a908d3308f47d73cf64e87c98d37d5d76ce8 jdk9-b69
42180703e0a362c1de7cdbf61d2cbc6609e678c4 jdk9-b70
a3200b88f259f904876b9ab13fd4c4ec2726f8ba jdk9-b71
+81e85f3b6174314155991048767452a9931e12e2 jdk9-b72
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/cmdline/Compile.java Tue Jul 14 20:36:12 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,171 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * Copyright 2001-2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id: Compile.java,v 1.2.4.1 2005/08/31 11:24:13 pvedula Exp $
- */
-
-package com.sun.org.apache.xalan.internal.xsltc.cmdline;
-
-import com.sun.org.apache.xalan.internal.utils.FeatureManager;
-import java.io.File;
-import java.net.URL;
-import java.util.Vector;
-
-import com.sun.org.apache.xalan.internal.xsltc.cmdline.getopt.GetOpt;
-import com.sun.org.apache.xalan.internal.xsltc.cmdline.getopt.GetOptsException;
-import com.sun.org.apache.xalan.internal.xsltc.compiler.XSLTC;
-import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMsg;
-
-/**
- * @author Jacek Ambroziak
- * @author Santiago Pericas-Geertsen
- * @author G. Todd Miller
- * @author Morten Jorgensen
- */
-public final class Compile {
-
- // Versioning numbers for the compiler -v option output
- private static int VERSION_MAJOR = 1;
- private static int VERSION_MINOR = 4;
- private static int VERSION_DELTA = 0;
-
-
-
- // This variable should be set to false to prevent any methods in this
- // class from calling System.exit(). As this is a command-line tool,
- // calling System.exit() is normally OK, but we also want to allow for
- // this class being used in other ways as well.
- private static boolean _allowExit = true;
-
-
- public static void printUsage() {
- System.err.println("XSLTC version " +
- VERSION_MAJOR + "." + VERSION_MINOR +
- ((VERSION_DELTA > 0) ? ("." + VERSION_DELTA) : ("")) + "\n" +
- new ErrorMsg(ErrorMsg.COMPILE_USAGE_STR));
- if (_allowExit) System.exit(-1);
- }
-
- /**
- * This method implements the command line compiler. See the USAGE_STRING
- * constant for a description. It may make sense to move the command-line
- * handling to a separate package (ie. make one xsltc.cmdline.Compiler
- * class that contains this main() method and one xsltc.cmdline.Transform
- * class that contains the DefaultRun stuff).
- */
- public static void main(String[] args) {
- try {
- boolean inputIsURL = false;
- boolean useStdIn = false;
- boolean classNameSet = false;
- final GetOpt getopt = new GetOpt(args, "o:d:j:p:uxhsinv");
- if (args.length < 1) printUsage();
-
- final XSLTC xsltc = new XSLTC(true, new FeatureManager());
- xsltc.init();
-
- int c;
- while ((c = getopt.getNextOption()) != -1) {
- switch(c) {
- case 'i':
- useStdIn = true;
- break;
- case 'o':
- xsltc.setClassName(getopt.getOptionArg());
- classNameSet = true;
- break;
- case 'd':
- xsltc.setDestDirectory(getopt.getOptionArg());
- break;
- case 'p':
- xsltc.setPackageName(getopt.getOptionArg());
- break;
- case 'j':
- xsltc.setJarFileName(getopt.getOptionArg());
- break;
- case 'x':
- xsltc.setDebug(true);
- break;
- case 'u':
- inputIsURL = true;
- break;
- case 's':
- _allowExit = false;
- break;
- case 'n':
- xsltc.setTemplateInlining(true); // used to be 'false'
- break;
- case 'v':
- // fall through to case h
- case 'h':
- default:
- printUsage();
- break;
- }
- }
-
- boolean compileOK;
-
- if (useStdIn) {
- if (!classNameSet) {
- System.err.println(new ErrorMsg(ErrorMsg.COMPILE_STDIN_ERR));
- if (_allowExit) System.exit(-1);
- }
- compileOK = xsltc.compile(System.in, xsltc.getClassName());
- }
- else {
- // Generate a vector containg URLs for all stylesheets specified
- final String[] stylesheetNames = getopt.getCmdArgs();
- final Vector stylesheetVector = new Vector();
- for (int i = 0; i < stylesheetNames.length; i++) {
- final String name = stylesheetNames[i];
- URL url;
- if (inputIsURL)
- url = new URL(name);
- else
- url = (new File(name)).toURI().toURL();
- stylesheetVector.addElement(url);
- }
- compileOK = xsltc.compile(stylesheetVector);
- }
-
- // Compile the stylesheet and output class/jar file(s)
- if (compileOK) {
- xsltc.printWarnings();
- if (xsltc.getJarFileName() != null) xsltc.outputToJar();
- if (_allowExit) System.exit(0);
- }
- else {
- xsltc.printWarnings();
- xsltc.printErrors();
- if (_allowExit) System.exit(-1);
- }
- }
- catch (GetOptsException ex) {
- System.err.println(ex);
- printUsage(); // exits with code '-1'
- }
- catch (Exception e) {
- e.printStackTrace();
- if (_allowExit) System.exit(-1);
- }
- }
-
-}
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/cmdline/Transform.java Tue Jul 14 20:36:12 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,292 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * Copyright 2001-2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id: Transform.java,v 1.2.4.1 2005/09/12 09:07:33 pvedula Exp $
- */
-
-package com.sun.org.apache.xalan.internal.xsltc.cmdline;
-
-import com.sun.org.apache.xalan.internal.utils.ObjectFactory;
-import com.sun.org.apache.xalan.internal.xsltc.DOMEnhancedForDTM;
-import com.sun.org.apache.xalan.internal.xsltc.StripFilter;
-import com.sun.org.apache.xalan.internal.xsltc.TransletException;
-import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMsg;
-import com.sun.org.apache.xalan.internal.xsltc.dom.DOMWSFilter;
-import com.sun.org.apache.xalan.internal.xsltc.dom.XSLTCDTMManager;
-import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
-import com.sun.org.apache.xalan.internal.xsltc.runtime.Constants;
-import com.sun.org.apache.xalan.internal.xsltc.runtime.Parameter;
-import com.sun.org.apache.xalan.internal.xsltc.runtime.output.TransletOutputHandlerFactory;
-import com.sun.org.apache.xml.internal.dtm.DTMWSFilter;
-import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
-import java.io.FileNotFoundException;
-import java.net.MalformedURLException;
-import java.net.UnknownHostException;
-import java.util.Vector;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-import javax.xml.transform.sax.SAXSource;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-
-/**
- * @author Jacek Ambroziak
- * @author Santiago Pericas-Geertsen
- * @author G. Todd Miller
- * @author Morten Jorgensen
- */
-final public class Transform {
-
- private SerializationHandler _handler;
-
- private String _fileName;
- private String _className;
- private String _jarFileSrc;
- private boolean _isJarFileSpecified = false;
- private Vector _params = null;
- private boolean _uri, _debug;
- private int _iterations;
-
- public Transform(String className, String fileName,
- boolean uri, boolean debug, int iterations) {
- _fileName = fileName;
- _className = className;
- _uri = uri;
- _debug = debug;
- _iterations = iterations;
- }
-
- public String getFileName(){return _fileName;}
- public String getClassName(){return _className;}
-
- public void setParameters(Vector params) {
- _params = params;
- }
-
- private void setJarFileInputSrc(boolean flag, String jarFile) {
- // TODO: at this time we do not do anything with this
- // information, attempts to add the jarfile to the CLASSPATH
- // were successful via System.setProperty, but the effects
- // were not visible to the running JVM. For now we add jarfile
- // to CLASSPATH in the wrapper script that calls this program.
- _isJarFileSpecified = flag;
- // TODO verify jarFile exists...
- _jarFileSrc = jarFile;
- }
-
- private void doTransform() {
- try {
- final Class clazz = ObjectFactory.findProviderClass(_className, true);
- final AbstractTranslet translet = (AbstractTranslet)clazz.newInstance();
- translet.postInitialization();
-
- // Create a SAX parser and get the XMLReader object it uses
- final SAXParserFactory factory = SAXParserFactory.newInstance();
- try {
- factory.setFeature(Constants.NAMESPACE_FEATURE,true);
- }
- catch (Exception e) {
- factory.setNamespaceAware(true);
- }
- final SAXParser parser = factory.newSAXParser();
- final XMLReader reader = parser.getXMLReader();
-
- // Set the DOM's DOM builder as the XMLReader's SAX2 content handler
- XSLTCDTMManager dtmManager =
- XSLTCDTMManager.createNewDTMManagerInstance();
-
- DTMWSFilter wsfilter;
- if (translet != null && translet instanceof StripFilter) {
- wsfilter = new DOMWSFilter(translet);
- } else {
- wsfilter = null;
- }
-
- final DOMEnhancedForDTM dom =
- (DOMEnhancedForDTM)dtmManager.getDTM(
- new SAXSource(reader, new InputSource(_fileName)),
- false, wsfilter, true, false, translet.hasIdCall());
-
- dom.setDocumentURI(_fileName);
- translet.prepassDocument(dom);
-
- // Pass global parameters
- int n = _params.size();
- for (int i = 0; i < n; i++) {
- Parameter param = (Parameter) _params.elementAt(i);
- translet.addParameter(param._name, param._value);
- }
-
- // Transform the document
- TransletOutputHandlerFactory tohFactory =
- TransletOutputHandlerFactory.newInstance();
- tohFactory.setOutputType(TransletOutputHandlerFactory.STREAM);
- tohFactory.setEncoding(translet._encoding);
- tohFactory.setOutputMethod(translet._method);
-
- if (_iterations == -1) {
- translet.transform(dom, tohFactory.getSerializationHandler());
- }
- else if (_iterations > 0) {
- long mm = System.currentTimeMillis();
- for (int i = 0; i < _iterations; i++) {
- translet.transform(dom,
- tohFactory.getSerializationHandler());
- }
- mm = System.currentTimeMillis() - mm;
-
- System.err.println("\n<!--");
- System.err.println(" transform = "
- + (((double) mm) / ((double) _iterations))
- + " ms");
- System.err.println(" throughput = "
- + (1000.0 / (((double) mm)
- / ((double) _iterations)))
- + " tps");
- System.err.println("-->");
- }
- }
- catch (TransletException e) {
- if (_debug) e.printStackTrace();
- System.err.println(new ErrorMsg(ErrorMsg.RUNTIME_ERROR_KEY)+
- e.getMessage());
- }
- catch (RuntimeException e) {
- if (_debug) e.printStackTrace();
- System.err.println(new ErrorMsg(ErrorMsg.RUNTIME_ERROR_KEY)+
- e.getMessage());
- }
- catch (FileNotFoundException e) {
- if (_debug) e.printStackTrace();
- ErrorMsg err = new ErrorMsg(ErrorMsg.FILE_NOT_FOUND_ERR, _fileName);
- System.err.println(new ErrorMsg(ErrorMsg.RUNTIME_ERROR_KEY)+
- err.toString());
- }
- catch (MalformedURLException e) {
- if (_debug) e.printStackTrace();
- ErrorMsg err = new ErrorMsg(ErrorMsg.INVALID_URI_ERR, _fileName);
- System.err.println(new ErrorMsg(ErrorMsg.RUNTIME_ERROR_KEY)+
- err.toString());
- }
- catch (ClassNotFoundException e) {
- if (_debug) e.printStackTrace();
- ErrorMsg err= new ErrorMsg(ErrorMsg.CLASS_NOT_FOUND_ERR,_className);
- System.err.println(new ErrorMsg(ErrorMsg.RUNTIME_ERROR_KEY)+
- err.toString());
- }
- catch (UnknownHostException e) {
- if (_debug) e.printStackTrace();
- ErrorMsg err = new ErrorMsg(ErrorMsg.INVALID_URI_ERR, _fileName);
- System.err.println(new ErrorMsg(ErrorMsg.RUNTIME_ERROR_KEY)+
- err.toString());
- }
- catch (SAXException e) {
- Exception ex = e.getException();
- if (_debug) {
- if (ex != null) ex.printStackTrace();
- e.printStackTrace();
- }
- System.err.print(new ErrorMsg(ErrorMsg.RUNTIME_ERROR_KEY));
- if (ex != null)
- System.err.println(ex.getMessage());
- else
- System.err.println(e.getMessage());
- }
- catch (Exception e) {
- if (_debug) e.printStackTrace();
- System.err.println(new ErrorMsg(ErrorMsg.RUNTIME_ERROR_KEY)+
- e.getMessage());
- }
- }
-
- public static void printUsage() {
- System.err.println(new ErrorMsg(ErrorMsg.TRANSFORM_USAGE_STR));
- }
-
- public static void main(String[] args) {
- try {
- if (args.length > 0) {
- int i;
- int iterations = -1;
- boolean uri = false, debug = false;
- boolean isJarFileSpecified = false;
- String jarFile = null;
-
- // Parse options starting with '-'
- for (i = 0; i < args.length && args[i].charAt(0) == '-'; i++) {
- if (args[i].equals("-u")) {
- uri = true;
- }
- else if (args[i].equals("-x")) {
- debug = true;
- }
- else if (args[i].equals("-j")) {
- isJarFileSpecified = true;
- jarFile = args[++i];
- }
- else if (args[i].equals("-n")) {
- try {
- iterations = Integer.parseInt(args[++i]);
- }
- catch (NumberFormatException e) {
- // ignore
- }
- }
- else {
- printUsage();
- }
- }
-
- // Enough arguments left ?
- if (args.length - i < 2) printUsage();
-
- // Get document file and class name
- Transform handler = new Transform(args[i+1], args[i], uri,
- debug, iterations);
- handler.setJarFileInputSrc(isJarFileSpecified, jarFile);
-
- // Parse stylesheet parameters
- Vector params = new Vector();
- for (i += 2; i < args.length; i++) {
- final int equal = args[i].indexOf('=');
- if (equal > 0) {
- final String name = args[i].substring(0, equal);
- final String value = args[i].substring(equal+1);
- params.addElement(new Parameter(name, value));
- }
- else {
- printUsage();
- }
- }
-
- if (i == args.length) {
- handler.setParameters(params);
- handler.doTransform();
- }
- } else {
- printUsage();
- }
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
-}
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/cmdline/getopt/GetOpt.java Tue Jul 14 20:36:12 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,258 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * Copyright 2001-2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id: GetOpt.java,v 1.2.4.1 2005/08/31 11:46:04 pvedula Exp $
- */
-
-package com.sun.org.apache.xalan.internal.xsltc.cmdline.getopt;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.ListIterator;
-
-import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMsg;
-
-
-/**
-* GetOpt is a Java equivalent to the C getopt() library function
-* discussed in man page getopt(3C). It provides command line
-* parsing for Java applications. It supports the most rules of the
-* command line standard (see man page intro(1)) including stacked
-* options such as '-sxm' (which is equivalent to -s -x -m); it
-* handles special '--' option that signifies the end of options.
-* Additionally this implementation of getopt will check for
-* mandatory arguments to options such as in the case of
-* '-d <file>' it will throw a MissingOptArgException if the
-* option argument '<file>' is not included on the commandline.
-* getopt(3C) does not check for this.
- * @author G Todd Miller
-*/
-public class GetOpt{
- public GetOpt(String[] args, String optString){
- theOptions = new ArrayList();
- int currOptIndex = 0;
- theCmdArgs = new ArrayList();
- theOptionMatcher = new OptionMatcher(optString);
- // fill in the options list
- for(int i=0; i<args.length; i++){
- String token = args[i];
- int tokenLength = token.length();
- if(token.equals("--")){ // end of opts
- currOptIndex = i+1; // set index of first operand
- break; // end of options
- }
- else if(token.startsWith("-") && tokenLength == 2){
- // simple option token such as '-s' found
- theOptions.add(new Option(token.charAt(1)));
- }
- else if(token.startsWith("-") && tokenLength > 2){
- // stacked options found, such as '-shm'
- // iterate thru the tokens after the dash and
- // add them to theOptions list
- for(int j=1; j<tokenLength; j++){
- theOptions.add(new Option(token.charAt(j)));
- }
- }
- else if(!token.startsWith("-")){
- // case 1- there are not options stored yet therefore
- // this must be an command argument, not an option argument
- if(theOptions.size() == 0){
- currOptIndex = i;
- break; // stop processing options
- }
- else {
- // case 2-
- // there are options stored, check to see if
- // this arg belong to the last arg stored
- int indexoflast=0;
- indexoflast = theOptions.size()-1;
- Option op = (Option)theOptions.get(indexoflast);
- char opLetter = op.getArgLetter();
- if(!op.hasArg() && theOptionMatcher.hasArg(opLetter)){
- op.setArg(token);
- }
- else{
- // case 3 -
- // the last option stored does not take
- // an argument, so again, this argument
- // must be a command argument, not
- // an option argument
- currOptIndex = i;
- break; // end of options
- }
- }
- }// end option does not start with "-"
- } // end for args loop
-
- // attach an iterator to list of options
- theOptionsIterator = theOptions.listIterator();
-
- // options are done, now fill out cmd arg list with remaining args
- for(int i=currOptIndex; i<args.length; i++){
- String token = args[i];
- theCmdArgs.add(token);
- }
- }
-
-
- /**
- * debugging routine to print out all options collected
- */
- public void printOptions(){
- for(ListIterator it=theOptions.listIterator(); it.hasNext();){
- Option opt = (Option)it.next();
- System.out.print("OPT =" + opt.getArgLetter());
- String arg = opt.getArgument();
- if(arg != null){
- System.out.print(" " + arg);
- }
- System.out.println();
- }
- }
-
- /**
- * gets the next option found in the commandline. Distinguishes
- * between two bad cases, one case is when an illegal option
- * is found, and then other case is when an option takes an
- * argument but no argument was found for that option.
- * If the option found was not declared in the optString, then
- * an IllegalArgumentException will be thrown (case 1).
- * If the next option found has been declared to take an argument,
- * and no such argument exists, then a MissingOptArgException
- * is thrown (case 2).
- * @param none
- * @return int - the next option found.
- * @throws IllegalArgumentException, MissingOptArgException.
- */
- public int getNextOption() throws IllegalArgumentException,
- MissingOptArgException
- {
- int retval = -1;
- if(theOptionsIterator.hasNext()){
- theCurrentOption = (Option)theOptionsIterator.next();
- char c = theCurrentOption.getArgLetter();
- boolean shouldHaveArg = theOptionMatcher.hasArg(c);
- String arg = theCurrentOption.getArgument();
- if(!theOptionMatcher.match(c)) {
- ErrorMsg msg = new ErrorMsg(ErrorMsg.ILLEGAL_CMDLINE_OPTION_ERR,
- new Character(c));
- throw (new IllegalArgumentException(msg.toString()));
- }
- else if(shouldHaveArg && (arg == null)) {
- ErrorMsg msg = new ErrorMsg(ErrorMsg.CMDLINE_OPT_MISSING_ARG_ERR,
- new Character(c));
- throw (new MissingOptArgException(msg.toString()));
- }
- retval = c;
- }
- return retval;
- }
-
- /**
- * gets the argument for the current parsed option. For example,
- * in case of '-d <file>', if current option parsed is 'd' then
- * getOptionArg() would return '<file>'.
- * @return String - argument for current parsed option.
- * @param none
- */
- public String getOptionArg(){
- String retval = null;
- String tmp = theCurrentOption.getArgument();
- char c = theCurrentOption.getArgLetter();
- if(theOptionMatcher.hasArg(c)){
- retval = tmp;
- }
- return retval;
- }
-
- /**
- * gets list of the commandline arguments. For example, in command
- * such as 'cmd -s -d file file2 file3 file4' with the usage
- * 'cmd [-s] [-d <file>] <file>...', getCmdArgs() would return
- * the list {file2, file3, file4}.
- * @return String[] - list of command arguments that may appear
- * after options and option arguments.
- * @params none
- */
- public String[] getCmdArgs(){
- String[] retval = new String[theCmdArgs.size()];
- int i=0;
- for(ListIterator it=theCmdArgs.listIterator(); it.hasNext();){
- retval[i++] = (String)it.next();
- }
- return retval;
- }
-
-
- private Option theCurrentOption = null;
- private ListIterator theOptionsIterator;
- private List theOptions = null;
- private List theCmdArgs = null;
- private OptionMatcher theOptionMatcher = null;
-
- ///////////////////////////////////////////////////////////
- //
- // Inner Classes
- //
- ///////////////////////////////////////////////////////////
-
- // inner class to model an option
- class Option{
- private char theArgLetter;
- private String theArgument = null;
- public Option(char argLetter) { theArgLetter = argLetter; }
- public void setArg(String arg) {
- theArgument = arg;
- }
- public boolean hasArg() { return (theArgument != null); }
- public char getArgLetter() { return theArgLetter; }
- public String getArgument() { return theArgument; }
- } // end class Option
-
-
- // inner class to query optString for a possible option match,
- // and whether or not a given legal option takes an argument.
- //
- class OptionMatcher{
- public OptionMatcher(String optString){
- theOptString = optString;
- }
- public boolean match(char c){
- boolean retval = false;
- if(theOptString.indexOf(c) != -1){
- retval = true;
- }
- return retval;
- }
- public boolean hasArg(char c){
- boolean retval = false;
- int index = theOptString.indexOf(c)+1;
- if (index == theOptString.length()){
- // reached end of theOptString
- retval = false;
- }
- else if(theOptString.charAt(index) == ':'){
- retval = true;
- }
- return retval;
- }
- private String theOptString = null;
- } // end class OptionMatcher
-}// end class GetOpt
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/cmdline/getopt/GetOptsException.java Tue Jul 14 20:36:12 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * Copyright 2001-2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id: GetOptsException.java,v 1.2.4.1 2005/08/31 11:47:06 pvedula Exp $
- */
-
-package com.sun.org.apache.xalan.internal.xsltc.cmdline.getopt;
-
-/**
- * @author G Todd Miller
- */
-public class GetOptsException extends Exception{
- static final long serialVersionUID = 8736874967183039804L;
- public GetOptsException(String msg){
- super(msg);
- }
-}
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/cmdline/getopt/IllegalArgumentException.java Tue Jul 14 20:36:12 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * Copyright 2001-2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id: IllegalArgumentException.java,v 1.2.4.1 2005/08/31 11:47:56 pvedula Exp $
- */
-
-package com.sun.org.apache.xalan.internal.xsltc.cmdline.getopt;
-
-
-class IllegalArgumentException extends GetOptsException{
- static final long serialVersionUID = 8642122427294793651L;
- public IllegalArgumentException(String msg){
- super(msg);
- }
-}
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/cmdline/getopt/MissingOptArgException.java Tue Jul 14 20:36:12 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * Copyright 2001-2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id: MissingOptArgException.java,v 1.2.4.1 2005/08/31 11:49:21 pvedula Exp $
- */
-
-package com.sun.org.apache.xalan.internal.xsltc.cmdline.getopt;
-
-
-/**
- * @author G Todd Miller
- */
-class MissingOptArgException extends GetOptsException{
- static final long serialVersionUID = -1972471465394544822L;
- public MissingOptArgException(String msg){
- super(msg);
- }
-}
--- a/jaxp/src/java.xml/share/classes/javax/xml/stream/XMLEventReader.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jaxp/src/java.xml/share/classes/javax/xml/stream/XMLEventReader.java Tue Jul 14 15:26:34 2015 -0700
@@ -49,7 +49,7 @@
* Get the next XMLEvent
* @see XMLEvent
* @throws XMLStreamException if there is an error with the underlying XML.
- * @throws NoSuchElementException iteration has no more elements.
+ * @throws java.util.NoSuchElementException iteration has no more elements.
*/
public XMLEvent nextEvent() throws XMLStreamException;
--- a/jaxp/src/java.xml/share/classes/javax/xml/stream/events/XMLEvent.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jaxp/src/java.xml/share/classes/javax/xml/stream/events/XMLEvent.java Tue Jul 14 15:26:34 2015 -0700
@@ -170,7 +170,7 @@
* infoset expressed.
*
* @param writer The writer that will output the data
- * @throws XMLStreamException if there is a fatal error writing the event
+ * @throws javax.xml.stream.XMLStreamException if there is a fatal error writing the event
*/
public void writeAsEncodedUnicode(Writer writer)
throws javax.xml.stream.XMLStreamException;
--- a/jaxws/.hgtags Tue Jul 14 20:36:12 2015 +0300
+++ b/jaxws/.hgtags Tue Jul 14 15:26:34 2015 -0700
@@ -317,3 +317,4 @@
f5911c6155c29ac24b6f9068273207e5ebd3a3df jdk9-b69
94084caa27a3c8a09a7510aef596ebd64e97c569 jdk9-b70
61caeb7061bbf8cc74a767997e5d17cc00712629 jdk9-b71
+1d87054e2d2f405c114f0061b97cbf8214bddf0a jdk9-b72
--- a/jdk/.hgtags Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/.hgtags Tue Jul 14 15:26:34 2015 -0700
@@ -314,3 +314,4 @@
551323004d0ce2f1d4b0e99552f7e0cdcebc6fca jdk9-b69
a7f731125b7fb0e4b0186172f85a21e2d5139f7e jdk9-b70
e47d3bfbc61accc3fbd372a674fdce2933b54f31 jdk9-b71
+f376824d4940f45719d91838f3f6249f873440db jdk9-b72
--- a/jdk/make/non-build-utils/sharing/README.txt Tue Jul 14 20:36:12 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-This directory contains tools and tests associated with creating the
-class list for class data sharing.
-
-The class list is produced by running the refWorkload startup3 benchmark with
-the -XX:+TraceClassLoadingPreorder option. The -Xshare:off option must also be
-used so that bootclasspath classes are loaded from rt.jar. The MakeClasslist
-program should be built into the jar file makeclasslist.jar and is run
-on one of the logs from each of the benchmarks in the following fashion:
-
-cd .../<resultsdir>/results.startup3
-$JAVA_HOME/bin/java -jar makeclasslist.jar results.Noop/results_1/log results.Framer/results_1/log results.XFramer/results_1/log results.JEdit/results_1/log results.LimeWire/results_1/log results.NetBeans50/results_1/log
-
-Presently, $JAVA_HOME must be the same path used to run the startup3 benchmark.
-
-The logs are deliberately concatenated in roughly smallest to largest order
-based on application size. The resulting output is redirected into a file
-and results in one of classlist.solaris, classlist.linux, classlist.macosx,
-or classlist.windows. These files are checked in to the workspace. A
-necessary checksum (AddJsum.java) is added to the final classlist
-(installed in lib/ or jre/lib/) during the build process by the
-makefiles in make/java/redist.
-
-In a forthcoming JDK build we plan to manually add the dependent
-classes for the calendar manager Glow, which pulls in the Preferences
-classes and, on Unix platforms, the XML parsing classes.
-
-The properties file supplied to the refworkload is approximately the
-following:
-
-javahome=/usr/java/j2sdk1.8.0
-resultsdir=classlist-run
-iterations=1
-benchmarks=startup3
-globalvmoptions=-client -Xshare:off -XX:+TraceClassLoadingPreorder
--- a/jdk/make/non-build-utils/sharing/tests/GHello.java Tue Jul 14 20:36:12 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-import java.awt.Font;
-import java.awt.Frame;
-import java.awt.Label;
-
-public class GHello extends Frame {
-
- public static void main(String[] args) {
- System.out.println("Hello");
-
- new GHello().show();
- if (args.length == 1 && args[0].equals("quit")) {
- try {
- Thread.currentThread().sleep(200);
- } catch (InterruptedException e) {
- }
- System.exit(0);
- }
- }
-
-
- GHello() {
- Label label = new Label("Hello");
- label.setFont(new Font("Monospaced", Font.PLAIN, 144));
- add(label);
- pack();
- }
-}
--- a/jdk/make/non-build-utils/sharing/tests/Hello.java Tue Jul 14 20:36:12 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-
-public class Hello {
- public static void main(String[] args) {
- System.out.println("Hello, World!");
- }
-}
--- a/jdk/make/non-build-utils/sharing/tests/JHello.java Tue Jul 14 20:36:12 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-import java.awt.Font;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-
-public class JHello extends JFrame {
-
- public static void main(String[] args) {
- System.out.println("Hello");
-
- new JHello().show();
- if (args.length == 1 && args[0].equals("quit")) {
- try {
- Thread.currentThread().sleep(1000);
- } catch (InterruptedException e) {
- }
- System.exit(0);
- }
- }
-
-
- JHello() {
- JLabel jlabel = new JLabel("Hello");
- jlabel.setFont(new Font("Monospaced", Font.PLAIN, 144));
- getContentPane().add(jlabel);
- pack();
- }
-}
--- a/jdk/make/non-build-utils/src/build/tools/makeclasslist/MakeClasslist.java Tue Jul 14 20:36:12 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,130 +0,0 @@
-/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package build.tools.makeclasslist;
-
-import java.io.*;
-import java.util.*;
-import java.util.jar.*;
-
-/** Reads a set of files containing the output of java
- -XX:+TraceClassLoadingPreorder runs. Finds all classes that were
- loaded from the bootstrap class path by comparing the prefix of
- the load path to the current JRE's java.home system property.
- Prints the names of these classes to stdout.
-*/
-
-public class MakeClasslist {
- public static void main(String[] args) throws IOException {
- List<String> classes = new ArrayList<>();
- String origJavaHome = System.getProperty("java.home");
- String javaHome = origJavaHome.toLowerCase();
- if (javaHome.endsWith("jre")) {
- origJavaHome = origJavaHome.substring(0, origJavaHome.length() - 4);
- javaHome = javaHome.substring(0, javaHome.length() - 4);
- }
- for (int i = 0; i < args.length; i++) {
- try {
- File file = new File(args[i]);
- BufferedReader reader = new BufferedReader(new FileReader(file));
- String line = null;
- while ((line = reader.readLine()) != null) {
- StringTokenizer tok = new StringTokenizer(line, "[ \t\n\r\f");
- if (tok.hasMoreTokens()) {
- String t = tok.nextToken();
- // Understand only "Loading" from -XX:+TraceClassLoadingPreorder.
- // This ignores old "Loaded" from -verbose:class to force correct
- // classlist generation on Mustang.
- if (t.equals("Loading")) {
- t = tok.nextToken();
- t = t.replace('.', '/');
-
- // Check to make sure it came from the boot class path
- if (tok.hasMoreTokens()) {
- String tmp = tok.nextToken();
- if (tmp.equals("from")) {
- if (tok.hasMoreTokens()) {
- tmp = tok.nextToken().toLowerCase();
- // System.err.println("Loaded " + t + " from " + tmp);
- if (tmp.startsWith(javaHome)) {
- // OK, remember this class for later
- classes.add(t);
- }
- }
- }
- }
- }
- }
- }
- } catch (IOException e) {
- System.err.println("Error reading file " + args[i]);
- throw(e);
- }
- }
-
- Set<String> seenClasses = new HashSet<>();
-
- for (String str : classes) {
- if (seenClasses.add(str)) {
- System.out.println(str);
- }
- }
-
- // Try to complete certain packages
- // Note: not using this new code yet; need to consider whether the
- // footprint increase is worth any startup gains
- // Note also that the packages considered below for completion are
- // (obviously) platform-specific
- // JarFile rtJar = new JarFile(origJavaHome + File.separator +
- // "jre" + File.separator +
- // "lib" + File.separator +
- // "rt.jar");
- // completePackage(seenClasses, rtJar, "java/awt");
- // completePackage(seenClasses, rtJar, "sun/awt");
- // completePackage(seenClasses, rtJar, "sun/awt/X11");
- // completePackage(seenClasses, rtJar, "java/awt/im/spi");
- // completePackage(seenClasses, rtJar, "java/lang");
- }
-
- private static void completePackage(Set<String> seenClasses,
- JarFile jar,
- String packageName) {
- int len = packageName.length();
- Enumeration<JarEntry> entries = jar.entries();
- while (entries.hasMoreElements()) {
- JarEntry entry = entries.nextElement();
- String name = entry.getName();
- if (name.startsWith(packageName) &&
- name.endsWith(".class") &&
- name.lastIndexOf('/') == len) {
- // Trim ".class" from end
- name = name.substring(0, name.length() - 6);
- if (seenClasses.add(name)) {
- System.out.println(name);
- }
- }
- }
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/non-build-utils/src/build/tools/makeclasslist/makeClasslist.js Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * This tool is used to help create the class list for class data sharing.
+ *
+ * The classlist is produced internally by first running a select number of
+ * startup benchmarks with the -XX:DumpLoadedClassList=<file> option, then
+ * running this tool in the following fashion to produce a complete classlist:
+ *
+ * jjs -scripting makeClasslist.js -- list1 list2 list3 > classlist.platform
+ *
+ * The lists should be listed in roughly smallest to largest order based on
+ * application size.
+ *
+ * After generating the classlist it's necessary to add a checksum (using
+ * AddJsum.java) before checking it into the workspace as the corresponding
+ * platform-specific classlist, such as make/data/classlist/classlist.linux
+ */
+"use strict";
+var classlist = [];
+var seenClasses = {};
+
+for (var a in $ARG) {
+ var arg = $ARG[a];
+
+ var classes = readFully(arg).replace(/[\r\n]+/g, "\n").split("\n");
+
+ for (var c in classes) {
+ var clazz = classes[c];
+ if (clazz !== "" && seenClasses[clazz] === undefined) {
+ seenClasses[clazz] = clazz;
+ classlist.push(clazz);
+ }
+ }
+}
+
+for (c in classlist) {
+ print(classlist[c]);
+}
--- a/jdk/src/java.base/share/classes/java/net/ContentHandler.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/net/ContentHandler.java Tue Jul 14 15:26:34 2015 -0700
@@ -44,14 +44,14 @@
* instance of a subclass of {@code ContentHandler}, and its
* {@code getContent} method is called to create the object.
* <p>
- * If no content handler could be found, URLConnection will
- * look for a content handler in a user-defineable set of places.
+ * If no content handler could be {@linkplain URLConnection#getContent() found},
+ * URLConnection will look for a content handler in a user-definable set of places.
* Users can define a vertical-bar delimited set of class prefixes
- * to search through by defining the <i>java.content.handler.pkgs</i>
+ * to search through by defining the <i>{@value java.net.URLConnection#contentPathProp}</i>
* property. The class name must be of the form:
* <blockquote>
* <i>{package-prefix}.{major}.{minor}</i>
- * <P>
+ * <p>
* where <i>{major}.{minor}</i> is formed by taking the
* content-type string, replacing all slash characters with a
* {@code period} ('.'), and all other non-alphanumeric characters
@@ -82,6 +82,7 @@
* @since 1.0
*/
abstract public class ContentHandler {
+
/**
* Given a URL connect stream positioned at the beginning of the
* representation of an object, this method reads that stream and
@@ -104,8 +105,8 @@
* @param urlc a URL connection.
* @param classes an array of types requested
* @return the object read by the {@code ContentHandler} that is
- * the first match of the suggested types.
- * null if none of the requested are supported.
+ * the first match of the suggested types or
+ * {@code null} if none of the requested are supported.
* @exception IOException if an I/O error occurs while reading the object.
* @since 1.3
*/
@@ -113,12 +114,11 @@
public Object getContent(URLConnection urlc, Class[] classes) throws IOException {
Object obj = getContent(urlc);
- for (int i = 0; i < classes.length; i++) {
- if (classes[i].isInstance(obj)) {
+ for (Class<?> c : classes) {
+ if (c.isInstance(obj)) {
return obj;
- }
+ }
}
return null;
}
-
}
--- a/jdk/src/java.base/share/classes/java/net/ContentHandlerFactory.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/net/ContentHandlerFactory.java Tue Jul 14 15:26:34 2015 -0700
@@ -39,12 +39,13 @@
* @since 1.0
*/
public interface ContentHandlerFactory {
+
/**
* Creates a new {@code ContentHandler} to read an object from
* a {@code URLStreamHandler}.
*
* @param mimetype the MIME type for which a content handler is desired.
-
+ *
* @return a new {@code ContentHandler} to read an object from a
* {@code URLStreamHandler}.
* @see java.net.ContentHandler
--- a/jdk/src/java.base/share/classes/java/net/URLConnection.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/net/URLConnection.java Tue Jul 14 15:26:34 2015 -0700
@@ -28,8 +28,12 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.security.PrivilegedAction;
import java.util.Hashtable;
import java.util.Date;
+import java.util.Iterator;
+import java.util.ServiceConfigurationError;
+import java.util.ServiceLoader;
import java.util.StringTokenizer;
import java.util.Collections;
import java.util.Map;
@@ -107,7 +111,7 @@
* <li>{@code getContentType}
* <li>{@code getDate}
* <li>{@code getExpiration}
- * <li>{@code getLastModifed}
+ * <li>{@code getLastModified}
* </ul>
* <p>
* provide convenient access to these fields. The
@@ -695,16 +699,30 @@
* This method first determines the content type of the object by
* calling the {@code getContentType} method. If this is
* the first time that the application has seen that specific content
- * type, a content handler for that content type is created:
+ * type, a content handler for that content type is created.
+ * <p> This is done as follows:
* <ol>
* <li>If the application has set up a content handler factory instance
* using the {@code setContentHandlerFactory} method, the
* {@code createContentHandler} method of that instance is called
* with the content type as an argument; the result is a content
* handler for that content type.
- * <li>If no content handler factory has yet been set up, or if the
- * factory's {@code createContentHandler} method returns
- * {@code null}, then this method tries to load a content handler
+ * <li>If no {@code ContentHandlerFactory} has yet been set up,
+ * or if the factory's {@code createContentHandler} method
+ * returns {@code null}, then the {@linkplain java.util.ServiceLoader
+ * ServiceLoader} mechanism is used to locate {@linkplain
+ * java.net.ContentHandlerFactory ContentHandlerFactory}
+ * implementations using the system class
+ * loader. The order that factories are located is implementation
+ * specific, and an implementation is free to cache the located
+ * factories. A {@linkplain java.util.ServiceConfigurationError
+ * ServiceConfigurationError}, {@code Error} or {@code RuntimeException}
+ * thrown from the {@code createContentHandler}, if encountered, will
+ * be propagated to the calling thread. The {@code
+ * createContentHandler} method of each factory, if instantiated, is
+ * invoked, with the content type, until a factory returns non-null,
+ * or all factories have been exhausted.
+ * <li>Failing that, this method tries to load a content handler
* class as defined by {@link java.net.ContentHandler ContentHandler}.
* If the class does not exist, or is not a subclass of {@code
* ContentHandler}, then an {@code UnknownServiceException} is thrown.
@@ -855,8 +873,7 @@
* @see #getDoInput()
*/
public void setDoInput(boolean doinput) {
- if (connected)
- throw new IllegalStateException("Already connected");
+ checkConnected();
doInput = doinput;
}
@@ -885,8 +902,7 @@
* @see #getDoOutput()
*/
public void setDoOutput(boolean dooutput) {
- if (connected)
- throw new IllegalStateException("Already connected");
+ checkConnected();
doOutput = dooutput;
}
@@ -911,8 +927,7 @@
* @see #getAllowUserInteraction()
*/
public void setAllowUserInteraction(boolean allowuserinteraction) {
- if (connected)
- throw new IllegalStateException("Already connected");
+ checkConnected();
allowUserInteraction = allowuserinteraction;
}
@@ -974,8 +989,7 @@
* @see #getUseCaches()
*/
public void setUseCaches(boolean usecaches) {
- if (connected)
- throw new IllegalStateException("Already connected");
+ checkConnected();
useCaches = usecaches;
}
@@ -1000,8 +1014,7 @@
* @see #getIfModifiedSince()
*/
public void setIfModifiedSince(long ifmodifiedsince) {
- if (connected)
- throw new IllegalStateException("Already connected");
+ checkConnected();
ifModifiedSince = ifmodifiedsince;
}
@@ -1055,12 +1068,11 @@
* (e.g., "{@code Accept}").
* @param value the value associated with it.
* @throws IllegalStateException if already connected
- * @throws NullPointerException if key is <CODE>null</CODE>
+ * @throws NullPointerException if key is {@code null}
* @see #getRequestProperty(java.lang.String)
*/
public void setRequestProperty(String key, String value) {
- if (connected)
- throw new IllegalStateException("Already connected");
+ checkConnected();
if (key == null)
throw new NullPointerException ("key is null");
@@ -1084,8 +1096,7 @@
* @since 1.4
*/
public void addRequestProperty(String key, String value) {
- if (connected)
- throw new IllegalStateException("Already connected");
+ checkConnected();
if (key == null)
throw new NullPointerException ("key is null");
@@ -1107,8 +1118,7 @@
* @see #setRequestProperty(java.lang.String, java.lang.String)
*/
public String getRequestProperty(String key) {
- if (connected)
- throw new IllegalStateException("Already connected");
+ checkConnected();
if (requests == null)
return null;
@@ -1129,8 +1139,7 @@
* @since 1.4
*/
public Map<String,List<String>> getRequestProperties() {
- if (connected)
- throw new IllegalStateException("Already connected");
+ checkConnected();
if (requests == null)
return Collections.emptyMap();
@@ -1183,7 +1192,7 @@
/**
* The ContentHandler factory.
*/
- static ContentHandlerFactory factory;
+ private static volatile ContentHandlerFactory factory;
/**
* Sets the {@code ContentHandlerFactory} of an
@@ -1216,37 +1225,45 @@
factory = fac;
}
- private static Hashtable<String, ContentHandler> handlers = new Hashtable<>();
+ private static final Hashtable<String, ContentHandler> handlers = new Hashtable<>();
/**
* Gets the Content Handler appropriate for this connection.
*/
- synchronized ContentHandler getContentHandler()
- throws UnknownServiceException
- {
+ private ContentHandler getContentHandler() throws UnknownServiceException {
String contentType = stripOffParameters(getContentType());
- ContentHandler handler = null;
- if (contentType == null)
+ if (contentType == null) {
throw new UnknownServiceException("no content-type");
- try {
- handler = handlers.get(contentType);
+ }
+
+ ContentHandler handler = handlers.get(contentType);
+ if (handler != null)
+ return handler;
+
+ if (factory != null) {
+ handler = factory.createContentHandler(contentType);
if (handler != null)
return handler;
- } catch(Exception e) {
+ }
+
+ handler = lookupContentHandlerViaProvider(contentType);
+
+ if (handler != null) {
+ ContentHandler h = handlers.putIfAbsent(contentType, handler);
+ return h != null ? h : handler;
}
- if (factory != null)
- handler = factory.createContentHandler(contentType);
- if (handler == null) {
- try {
- handler = lookupContentHandlerClassFor(contentType);
- } catch(Exception e) {
- e.printStackTrace();
- handler = UnknownContentHandler.INSTANCE;
- }
- handlers.put(contentType, handler);
+ try {
+ handler = lookupContentHandlerClassFor(contentType);
+ } catch (Exception e) {
+ e.printStackTrace();
+ handler = UnknownContentHandler.INSTANCE;
}
- return handler;
+
+ assert handler != null;
+
+ ContentHandler h = handlers.putIfAbsent(contentType, handler);
+ return h != null ? h : handler;
}
/*
@@ -1270,10 +1287,10 @@
private static final String contentPathProp = "java.content.handler.pkgs";
/**
- * Looks for a content handler in a user-defineable set of places.
- * By default it looks in sun.net.www.content, but users can define a
- * vertical-bar delimited set of class prefixes to search through in
- * addition by defining the java.content.handler.pkgs property.
+ * Looks for a content handler in a user-definable set of places.
+ * By default it looks in {@value #contentClassPrefix}, but users can define
+ * a vertical-bar delimited set of class prefixes to search through in
+ * addition by defining the {@value #contentPathProp} property.
* The class name must be of the form:
* <pre>
* {package-prefix}.{major}.{minor}
@@ -1281,11 +1298,10 @@
* YoyoDyne.experimental.text.plain
* </pre>
*/
- private ContentHandler lookupContentHandlerClassFor(String contentType)
- throws InstantiationException, IllegalAccessException, ClassNotFoundException {
+ private ContentHandler lookupContentHandlerClassFor(String contentType) {
String contentHandlerClassName = typeToPackageName(contentType);
- String contentHandlerPkgPrefixes =getContentHandlerPkgPrefixes();
+ String contentHandlerPkgPrefixes = getContentHandlerPkgPrefixes();
StringTokenizer packagePrefixIter =
new StringTokenizer(contentHandlerPkgPrefixes, "|");
@@ -1305,17 +1321,46 @@
}
}
if (cls != null) {
- ContentHandler handler =
- (ContentHandler)cls.newInstance();
- return handler;
+ return (ContentHandler) cls.newInstance();
}
- } catch(Exception e) {
- }
+ } catch(Exception ignored) { }
}
return UnknownContentHandler.INSTANCE;
}
+ private ContentHandler lookupContentHandlerViaProvider(String contentType) {
+ return AccessController.doPrivileged(
+ new PrivilegedAction<>() {
+ @Override
+ public ContentHandler run() {
+ ClassLoader cl = ClassLoader.getSystemClassLoader();
+ ServiceLoader<ContentHandlerFactory> sl =
+ ServiceLoader.load(ContentHandlerFactory.class, cl);
+
+ Iterator<ContentHandlerFactory> iterator = sl.iterator();
+
+ ContentHandler handler = null;
+ while (iterator.hasNext()) {
+ ContentHandlerFactory f;
+ try {
+ f = iterator.next();
+ } catch (ServiceConfigurationError e) {
+ if (e.getCause() instanceof SecurityException) {
+ continue;
+ }
+ throw e;
+ }
+ handler = f.createContentHandler(contentType);
+ if (handler != null) {
+ break;
+ }
+ }
+ return handler;
+ }
+ });
+ }
+
/**
* Utility function to map a MIME content type into an equivalent
* pair of class name components. For example: "text/html" would
@@ -1345,8 +1390,8 @@
* Returns a vertical bar separated list of package prefixes for potential
* content handlers. Tries to get the java.content.handler.pkgs property
* to use as a set of package prefixes to search. Whether or not
- * that property has been defined, the sun.net.www.content is always
- * the last one on the returned package list.
+ * that property has been defined, the {@value #contentClassPrefix}
+ * is always the last one on the returned package list.
*/
private String getContentHandlerPkgPrefixes() {
String packagePrefixList = AccessController.doPrivileged(
@@ -1764,9 +1809,12 @@
return skipped;
}
+ private void checkConnected() {
+ if (connected)
+ throw new IllegalStateException("Already connected");
+ }
}
-
class UnknownContentHandler extends ContentHandler {
static final ContentHandler INSTANCE = new UnknownContentHandler();
--- a/jdk/src/java.base/share/classes/java/security/AccessControlContext.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/security/AccessControlContext.java Tue Jul 14 15:26:34 2015 -0700
@@ -76,7 +76,7 @@
public final class AccessControlContext {
- private ProtectionDomain context[];
+ private ProtectionDomain[] context;
// isPrivileged and isAuthorized are referenced by the VM - do not remove
// or change their names
private boolean isPrivileged;
@@ -89,13 +89,13 @@
private DomainCombiner combiner = null;
// limited privilege scope
- private Permission permissions[];
+ private Permission[] permissions;
private AccessControlContext parent;
private boolean isWrapped;
// is constrained by limited privilege scope?
private boolean isLimited;
- private ProtectionDomain limitedContext[];
+ private ProtectionDomain[] limitedContext;
private static boolean debugInit = false;
private static Debug debug = null;
@@ -123,7 +123,7 @@
* changes to the array will not affect this AccessControlContext.
* @throws NullPointerException if {@code context} is {@code null}
*/
- public AccessControlContext(ProtectionDomain context[])
+ public AccessControlContext(ProtectionDomain[] context)
{
if (context.length == 0) {
this.context = null;
@@ -282,7 +282,7 @@
* package private constructor for AccessController.getContext()
*/
- AccessControlContext(ProtectionDomain context[],
+ AccessControlContext(ProtectionDomain[] context,
boolean isPrivileged)
{
this.context = context;
@@ -643,7 +643,7 @@
/*
* Combine the current (stack) and assigned domains.
*/
- private static ProtectionDomain[] combine(ProtectionDomain[]current,
+ private static ProtectionDomain[] combine(ProtectionDomain[] current,
ProtectionDomain[] assigned) {
// current could be null if only system code is on the stack;
@@ -666,7 +666,7 @@
int n = (skipAssigned) ? 0 : assigned.length;
// now we combine both of them, and create a new context
- ProtectionDomain pd[] = new ProtectionDomain[slen + n];
+ ProtectionDomain[] pd = new ProtectionDomain[slen + n];
// first copy in the assigned context domains, no need to compress
if (!skipAssigned) {
@@ -695,7 +695,7 @@
} else if (skipAssigned && n == slen) {
return current;
}
- ProtectionDomain tmp[] = new ProtectionDomain[n];
+ ProtectionDomain[] tmp = new ProtectionDomain[n];
System.arraycopy(pd, 0, tmp, 0, n);
pd = tmp;
}
--- a/jdk/src/java.base/share/classes/java/security/CodeSource.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/security/CodeSource.java Tue Jul 14 15:26:34 2015 -0700
@@ -65,7 +65,7 @@
/*
* The code signers. Certificate chains are concatenated.
*/
- private transient java.security.cert.Certificate certs[] = null;
+ private transient java.security.cert.Certificate[] certs = null;
// cached SocketPermission used for matchLocation
private transient SocketPermission sp;
@@ -91,7 +91,7 @@
* @param certs the certificate(s). It may be null. The contents of the
* array are copied to protect against subsequent modification.
*/
- public CodeSource(URL url, java.security.cert.Certificate certs[]) {
+ public CodeSource(URL url, java.security.cert.Certificate[] certs) {
this.location = url;
if (url != null) {
this.locationNoFragString = URLUtil.urlNoFragString(url);
--- a/jdk/src/java.base/share/classes/java/security/Permissions.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/security/Permissions.java Tue Jul 14 15:26:34 2015 -0700
@@ -289,9 +289,9 @@
if (unresolvedPerms == null)
return null;
- java.security.cert.Certificate certs[] = null;
+ java.security.cert.Certificate[] certs = null;
- Object signers[] = p.getClass().getSigners();
+ Object[] signers = p.getClass().getSigners();
int n = 0;
if (signers != null) {
--- a/jdk/src/java.base/share/classes/java/security/SecureRandom.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/security/SecureRandom.java Tue Jul 14 15:26:34 2015 -0700
@@ -69,7 +69,7 @@
*
* <pre>
* SecureRandom random = new SecureRandom();
- * byte bytes[] = new byte[20];
+ * byte[] bytes = new byte[20];
* random.nextBytes(bytes);
* </pre>
*
@@ -77,7 +77,7 @@
* to generate a given number of seed bytes (to seed other random number
* generators, for example):
* <pre>
- * byte seed[] = random.generateSeed(20);
+ * byte[] seed = random.generateSeed(20);
* </pre>
*
* Note: Depending on the implementation, the {@code generateSeed} and
@@ -186,7 +186,7 @@
*
* @param seed the seed.
*/
- public SecureRandom(byte seed[]) {
+ public SecureRandom(byte[] seed) {
super(0);
getDefaultPRNG(true, seed);
}
@@ -486,7 +486,7 @@
@Override
final protected int next(int numBits) {
int numBytes = (numBits+7)/8;
- byte b[] = new byte[numBytes];
+ byte[] b = new byte[numBytes];
int next = 0;
nextBytes(b);
--- a/jdk/src/java.base/share/classes/java/security/UnresolvedPermission.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/security/UnresolvedPermission.java Tue Jul 14 15:26:34 2015 -0700
@@ -130,7 +130,7 @@
*/
private String actions;
- private transient java.security.cert.Certificate certs[];
+ private transient java.security.cert.Certificate[] certs;
/**
* Creates a new UnresolvedPermission containing the permission
@@ -152,7 +152,7 @@
public UnresolvedPermission(String type,
String name,
String actions,
- java.security.cert.Certificate certs[])
+ java.security.cert.Certificate[] certs)
{
super(type);
@@ -224,7 +224,7 @@
* try and resolve this permission using the class loader of the permission
* that was passed in.
*/
- Permission resolve(Permission p, java.security.cert.Certificate certs[]) {
+ Permission resolve(Permission p, java.security.cert.Certificate[] certs) {
if (this.certs != null) {
// if p wasn't signed, we don't have a match
if (certs == null) {
--- a/jdk/src/java.base/share/classes/java/security/spec/RSAMultiPrimePrivateCrtKeySpec.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/security/spec/RSAMultiPrimePrivateCrtKeySpec.java Tue Jul 14 15:26:34 2015 -0700
@@ -54,7 +54,7 @@
private final BigInteger primeExponentP;
private final BigInteger primeExponentQ;
private final BigInteger crtCoefficient;
- private final RSAOtherPrimeInfo otherPrimeInfo[];
+ private final RSAOtherPrimeInfo[] otherPrimeInfo;
/**
* Creates a new {@code RSAMultiPrimePrivateCrtKeySpec}
--- a/jdk/src/java.base/share/classes/java/util/ArrayList.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/ArrayList.java Tue Jul 14 15:26:34 2015 -0700
@@ -178,7 +178,8 @@
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
- // c.toArray might (incorrectly) not return Object[] (see 6260652)
+ // defend against c.toArray (incorrectly) not returning Object[]
+ // (see e.g. https://bugs.openjdk.java.net/browse/JDK-6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
--- a/jdk/src/java.base/share/classes/java/util/Arrays.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/Arrays.java Tue Jul 14 15:26:34 2015 -0700
@@ -3820,7 +3820,7 @@
@Override
public Object[] toArray() {
- return a.clone();
+ return Arrays.copyOf(a, a.length, Object[].class);
}
@Override
--- a/jdk/src/java.base/share/classes/java/util/Vector.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/Vector.java Tue Jul 14 15:26:34 2015 -0700
@@ -174,7 +174,8 @@
public Vector(Collection<? extends E> c) {
elementData = c.toArray();
elementCount = elementData.length;
- // c.toArray might (incorrectly) not return Object[] (see 6260652)
+ // defend against c.toArray (incorrectly) not returning Object[]
+ // (see e.g. https://bugs.openjdk.java.net/browse/JDK-6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, elementCount, Object[].class);
}
--- a/jdk/src/java.base/share/classes/java/util/concurrent/CopyOnWriteArrayList.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/CopyOnWriteArrayList.java Tue Jul 14 15:26:34 2015 -0700
@@ -134,7 +134,8 @@
elements = ((CopyOnWriteArrayList<?>)c).getArray();
else {
elements = c.toArray();
- // c.toArray might (incorrectly) not return Object[] (see 6260652)
+ // defend against c.toArray (incorrectly) not returning Object[]
+ // (see e.g. https://bugs.openjdk.java.net/browse/JDK-6260652)
if (elements.getClass() != Object[].class)
elements = Arrays.copyOf(elements, elements.length, Object[].class);
}
--- a/jdk/src/java.base/share/classes/java/util/stream/AbstractPipeline.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/stream/AbstractPipeline.java Tue Jul 14 15:26:34 2015 -0700
@@ -489,15 +489,17 @@
@Override
@SuppressWarnings("unchecked")
- final <P_IN> void copyIntoWithCancel(Sink<P_IN> wrappedSink, Spliterator<P_IN> spliterator) {
+ final <P_IN> boolean copyIntoWithCancel(Sink<P_IN> wrappedSink, Spliterator<P_IN> spliterator) {
@SuppressWarnings({"rawtypes","unchecked"})
AbstractPipeline p = AbstractPipeline.this;
while (p.depth > 0) {
p = p.previousStage;
}
+
wrappedSink.begin(spliterator.getExactSizeIfKnown());
- p.forEachWithCancel(spliterator, wrappedSink);
+ boolean cancelled = p.forEachWithCancel(spliterator, wrappedSink);
wrappedSink.end();
+ return cancelled;
}
@Override
@@ -602,8 +604,9 @@
*
* @param spliterator the spliterator to pull elements from
* @param sink the sink to push elements to
+ * @return true if the cancellation was requested
*/
- abstract void forEachWithCancel(Spliterator<E_OUT> spliterator, Sink<E_OUT> sink);
+ abstract boolean forEachWithCancel(Spliterator<E_OUT> spliterator, Sink<E_OUT> sink);
/**
* Make a node builder compatible with this stream shape.
--- a/jdk/src/java.base/share/classes/java/util/stream/DoublePipeline.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/stream/DoublePipeline.java Tue Jul 14 15:26:34 2015 -0700
@@ -40,6 +40,7 @@
import java.util.function.DoubleToLongFunction;
import java.util.function.DoubleUnaryOperator;
import java.util.function.IntFunction;
+import java.util.function.LongPredicate;
import java.util.function.ObjDoubleConsumer;
import java.util.function.Supplier;
@@ -153,10 +154,12 @@
}
@Override
- final void forEachWithCancel(Spliterator<Double> spliterator, Sink<Double> sink) {
+ final boolean forEachWithCancel(Spliterator<Double> spliterator, Sink<Double> sink) {
Spliterator.OfDouble spl = adapt(spliterator);
DoubleConsumer adaptedSink = adapt(sink);
- do { } while (!sink.cancellationRequested() && spl.tryAdvance(adaptedSink));
+ boolean cancelled;
+ do { } while (!(cancelled = sink.cancellationRequested()) && spl.tryAdvance(adaptedSink));
+ return cancelled;
}
@Override
@@ -353,6 +356,16 @@
}
@Override
+ public final DoubleStream takeWhile(DoublePredicate predicate) {
+ return WhileOps.makeTakeWhileDouble(this, predicate);
+ }
+
+ @Override
+ public final DoubleStream dropWhile(DoublePredicate predicate) {
+ return WhileOps.makeDropWhileDouble(this, predicate);
+ }
+
+ @Override
public final DoubleStream sorted() {
return SortedOps.makeDouble(this);
}
--- a/jdk/src/java.base/share/classes/java/util/stream/DoubleStream.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/stream/DoubleStream.java Tue Jul 14 15:26:34 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,18 +24,13 @@
*/
package java.util.stream;
-import java.nio.charset.Charset;
-import java.nio.file.Files;
-import java.nio.file.Path;
import java.util.Arrays;
-import java.util.Collection;
import java.util.DoubleSummaryStatistics;
import java.util.Objects;
import java.util.OptionalDouble;
import java.util.PrimitiveIterator;
import java.util.Spliterator;
import java.util.Spliterators;
-import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BiConsumer;
import java.util.function.DoubleBinaryOperator;
import java.util.function.DoubleConsumer;
@@ -280,6 +275,137 @@
DoubleStream skip(long n);
/**
+ * Returns, if this stream is ordered, a stream consisting of the longest
+ * prefix of elements taken from this stream that match the given predicate.
+ * Otherwise returns, if this stream is unordered, a stream consisting of a
+ * subset of elements taken from this stream that match the given predicate.
+ *
+ * <p>If this stream is ordered then the longest prefix is a contiguous
+ * sequence of elements of this stream that match the given predicate. The
+ * first element of the sequence is the first element of this stream, and
+ * the element immediately following the last element of the sequence does
+ * not match the given predicate.
+ *
+ * <p>If this stream is unordered, and some (but not all) elements of this
+ * stream match the given predicate, then the behavior of this operation is
+ * nondeterministic; it is free to take any subset of matching elements
+ * (which includes the empty set).
+ *
+ * <p>Independent of whether this stream is ordered or unordered if all
+ * elements of this stream match the given predicate then this operation
+ * takes all elements (the result is the same is the input), or if no
+ * elements of the stream match the given predicate then no elements are
+ * taken (the result is an empty stream).
+ *
+ * <p>This is a <a href="package-summary.html#StreamOps">short-circuiting
+ * stateful intermediate operation</a>.
+ *
+ * @implSpec
+ * The default implementation obtains the {@link #spliterator() spliterator}
+ * of this stream, wraps that spliterator so as to support the semantics
+ * of this operation on traversal, and returns a new stream associated with
+ * the wrapped spliterator. The returned stream preserves the execution
+ * characteristics of this stream (namely parallel or sequential execution
+ * as per {@link #isParallel()}) but the wrapped spliterator may choose to
+ * not support splitting. When the returned stream is closed, the close
+ * handlers for both the returned and this stream are invoked.
+ *
+ * @apiNote
+ * While {@code takeWhile()} is generally a cheap operation on sequential
+ * stream pipelines, it can be quite expensive on ordered parallel
+ * pipelines, since the operation is constrained to return not just any
+ * valid prefix, but the longest prefix of elements in the encounter order.
+ * Using an unordered stream source (such as
+ * {@link #generate(DoubleSupplier)}) or removing the ordering constraint
+ * with {@link #unordered()} may result in significant speedups of
+ * {@code takeWhile()} in parallel pipelines, if the semantics of your
+ * situation permit. If consistency with encounter order is required, and
+ * you are experiencing poor performance or memory utilization with
+ * {@code takeWhile()} in parallel pipelines, switching to sequential
+ * execution with {@link #sequential()} may improve performance.
+ *
+ * @param predicate a <a href="package-summary.html#NonInterference">non-interfering</a>,
+ * <a href="package-summary.html#Statelessness">stateless</a>
+ * predicate to apply to elements to determine the longest
+ * prefix of elements.
+ * @return the new stream
+ */
+ default DoubleStream takeWhile(DoublePredicate predicate) {
+ Objects.requireNonNull(predicate);
+ // Reuses the unordered spliterator, which, when encounter is present,
+ // is safe to use as long as it configured not to split
+ return StreamSupport.doubleStream(
+ new WhileOps.UnorderedWhileSpliterator.OfDouble.Taking(spliterator(), true, predicate),
+ isParallel()).onClose(this::close);
+ }
+
+ /**
+ * Returns, if this stream is ordered, a stream consisting of the remaining
+ * elements of this stream after dropping the longest prefix of elements
+ * that match the given predicate. Otherwise returns, if this stream is
+ * unordered, a stream consisting of the remaining elements of this stream
+ * after dropping a subset of elements that match the given predicate.
+ *
+ * <p>If this stream is ordered then the longest prefix is a contiguous
+ * sequence of elements of this stream that match the given predicate. The
+ * first element of the sequence is the first element of this stream, and
+ * the element immediately following the last element of the sequence does
+ * not match the given predicate.
+ *
+ * <p>If this stream is unordered, and some (but not all) elements of this
+ * stream match the given predicate, then the behavior of this operation is
+ * nondeterministic; it is free to drop any subset of matching elements
+ * (which includes the empty set).
+ *
+ * <p>Independent of whether this stream is ordered or unordered if all
+ * elements of this stream match the given predicate then this operation
+ * drops all elements (the result is an empty stream), or if no elements of
+ * the stream match the given predicate then no elements are dropped (the
+ * result is the same is the input).
+ *
+ * <p>This is a <a href="package-summary.html#StreamOps">stateful
+ * intermediate operation</a>.
+ *
+ * @implSpec
+ * The default implementation obtains the {@link #spliterator() spliterator}
+ * of this stream, wraps that spliterator so as to support the semantics
+ * of this operation on traversal, and returns a new stream associated with
+ * the wrapped spliterator. The returned stream preserves the execution
+ * characteristics of this stream (namely parallel or sequential execution
+ * as per {@link #isParallel()}) but the wrapped spliterator may choose to
+ * not support splitting. When the returned stream is closed, the close
+ * handlers for both the returned and this stream are invoked.
+ *
+ * @apiNote
+ * While {@code dropWhile()} is generally a cheap operation on sequential
+ * stream pipelines, it can be quite expensive on ordered parallel
+ * pipelines, since the operation is constrained to return not just any
+ * valid prefix, but the longest prefix of elements in the encounter order.
+ * Using an unordered stream source (such as
+ * {@link #generate(DoubleSupplier)}) or removing the ordering constraint
+ * with {@link #unordered()} may result in significant speedups of
+ * {@code dropWhile()} in parallel pipelines, if the semantics of your
+ * situation permit. If consistency with encounter order is required, and
+ * you are experiencing poor performance or memory utilization with
+ * {@code dropWhile()} in parallel pipelines, switching to sequential
+ * execution with {@link #sequential()} may improve performance.
+ *
+ * @param predicate a <a href="package-summary.html#NonInterference">non-interfering</a>,
+ * <a href="package-summary.html#Statelessness">stateless</a>
+ * predicate to apply to elements to determine the longest
+ * prefix of elements.
+ * @return the new stream
+ */
+ default DoubleStream dropWhile(DoublePredicate predicate) {
+ Objects.requireNonNull(predicate);
+ // Reuses the unordered spliterator, which, when encounter is present,
+ // is safe to use as long as it configured not to split
+ return StreamSupport.doubleStream(
+ new WhileOps.UnorderedWhileSpliterator.OfDouble.Dropping(spliterator(), true, predicate),
+ isParallel()).onClose(this::close);
+ }
+
+ /**
* Performs an action for each element of this stream.
*
* <p>This is a <a href="package-summary.html#StreamOps">terminal
--- a/jdk/src/java.base/share/classes/java/util/stream/IntPipeline.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/stream/IntPipeline.java Tue Jul 14 15:26:34 2015 -0700
@@ -156,10 +156,12 @@
}
@Override
- final void forEachWithCancel(Spliterator<Integer> spliterator, Sink<Integer> sink) {
+ final boolean forEachWithCancel(Spliterator<Integer> spliterator, Sink<Integer> sink) {
Spliterator.OfInt spl = adapt(spliterator);
IntConsumer adaptedSink = adapt(sink);
- do { } while (!sink.cancellationRequested() && spl.tryAdvance(adaptedSink));
+ boolean cancelled;
+ do { } while (!(cancelled = sink.cancellationRequested()) && spl.tryAdvance(adaptedSink));
+ return cancelled;
}
@Override
@@ -387,6 +389,16 @@
}
@Override
+ public final IntStream takeWhile(IntPredicate predicate) {
+ return WhileOps.makeTakeWhileInt(this, predicate);
+ }
+
+ @Override
+ public final IntStream dropWhile(IntPredicate predicate) {
+ return WhileOps.makeDropWhileInt(this, predicate);
+ }
+
+ @Override
public final IntStream sorted() {
return SortedOps.makeInt(this);
}
--- a/jdk/src/java.base/share/classes/java/util/stream/IntStream.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/stream/IntStream.java Tue Jul 14 15:26:34 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -273,6 +273,135 @@
IntStream skip(long n);
/**
+ * Returns, if this stream is ordered, a stream consisting of the longest
+ * prefix of elements taken from this stream that match the given predicate.
+ * Otherwise returns, if this stream is unordered, a stream consisting of a
+ * subset of elements taken from this stream that match the given predicate.
+ *
+ * <p>If this stream is ordered then the longest prefix is a contiguous
+ * sequence of elements of this stream that match the given predicate. The
+ * first element of the sequence is the first element of this stream, and
+ * the element immediately following the last element of the sequence does
+ * not match the given predicate.
+ *
+ * <p>If this stream is unordered, and some (but not all) elements of this
+ * stream match the given predicate, then the behavior of this operation is
+ * nondeterministic; it is free to take any subset of matching elements
+ * (which includes the empty set).
+ *
+ * <p>Independent of whether this stream is ordered or unordered if all
+ * elements of this stream match the given predicate then this operation
+ * takes all elements (the result is the same is the input), or if no
+ * elements of the stream match the given predicate then no elements are
+ * taken (the result is an empty stream).
+ *
+ * <p>This is a <a href="package-summary.html#StreamOps">short-circuiting
+ * stateful intermediate operation</a>.
+ *
+ * @implSpec
+ * The default implementation obtains the {@link #spliterator() spliterator}
+ * of this stream, wraps that spliterator so as to support the semantics
+ * of this operation on traversal, and returns a new stream associated with
+ * the wrapped spliterator. The returned stream preserves the execution
+ * characteristics of this stream (namely parallel or sequential execution
+ * as per {@link #isParallel()}) but the wrapped spliterator may choose to
+ * not support splitting. When the returned stream is closed, the close
+ * handlers for both the returned and this stream are invoked.
+ *
+ * @apiNote
+ * While {@code takeWhile()} is generally a cheap operation on sequential
+ * stream pipelines, it can be quite expensive on ordered parallel
+ * pipelines, since the operation is constrained to return not just any
+ * valid prefix, but the longest prefix of elements in the encounter order.
+ * Using an unordered stream source (such as {@link #generate(IntSupplier)})
+ * or removing the ordering constraint with {@link #unordered()} may result
+ * in significant speedups of {@code takeWhile()} in parallel pipelines, if
+ * the semantics of your situation permit. If consistency with encounter
+ * order is required, and you are experiencing poor performance or memory
+ * utilization with {@code takeWhile()} in parallel pipelines, switching to
+ * sequential execution with {@link #sequential()} may improve performance.
+ *
+ * @param predicate a <a href="package-summary.html#NonInterference">non-interfering</a>,
+ * <a href="package-summary.html#Statelessness">stateless</a>
+ * predicate to apply to elements to determine the longest
+ * prefix of elements.
+ * @return the new stream
+ */
+ default IntStream takeWhile(IntPredicate predicate) {
+ Objects.requireNonNull(predicate);
+ // Reuses the unordered spliterator, which, when encounter is present,
+ // is safe to use as long as it configured not to split
+ return StreamSupport.intStream(
+ new WhileOps.UnorderedWhileSpliterator.OfInt.Taking(spliterator(), true, predicate),
+ isParallel()).onClose(this::close);
+ }
+
+ /**
+ * Returns, if this stream is ordered, a stream consisting of the remaining
+ * elements of this stream after dropping the longest prefix of elements
+ * that match the given predicate. Otherwise returns, if this stream is
+ * unordered, a stream consisting of the remaining elements of this stream
+ * after dropping a subset of elements that match the given predicate.
+ *
+ * <p>If this stream is ordered then the longest prefix is a contiguous
+ * sequence of elements of this stream that match the given predicate. The
+ * first element of the sequence is the first element of this stream, and
+ * the element immediately following the last element of the sequence does
+ * not match the given predicate.
+ *
+ * <p>If this stream is unordered, and some (but not all) elements of this
+ * stream match the given predicate, then the behavior of this operation is
+ * nondeterministic; it is free to drop any subset of matching elements
+ * (which includes the empty set).
+ *
+ * <p>Independent of whether this stream is ordered or unordered if all
+ * elements of this stream match the given predicate then this operation
+ * drops all elements (the result is an empty stream), or if no elements of
+ * the stream match the given predicate then no elements are dropped (the
+ * result is the same is the input).
+ *
+ * <p>This is a <a href="package-summary.html#StreamOps">stateful
+ * intermediate operation</a>.
+ *
+ * @implSpec
+ * The default implementation obtains the {@link #spliterator() spliterator}
+ * of this stream, wraps that spliterator so as to support the semantics
+ * of this operation on traversal, and returns a new stream associated with
+ * the wrapped spliterator. The returned stream preserves the execution
+ * characteristics of this stream (namely parallel or sequential execution
+ * as per {@link #isParallel()}) but the wrapped spliterator may choose to
+ * not support splitting. When the returned stream is closed, the close
+ * handlers for both the returned and this stream are invoked.
+ *
+ * @apiNote
+ * While {@code dropWhile()} is generally a cheap operation on sequential
+ * stream pipelines, it can be quite expensive on ordered parallel
+ * pipelines, since the operation is constrained to return not just any
+ * valid prefix, but the longest prefix of elements in the encounter order.
+ * Using an unordered stream source (such as {@link #generate(IntSupplier)})
+ * or removing the ordering constraint with {@link #unordered()} may result
+ * in significant speedups of {@code dropWhile()} in parallel pipelines, if
+ * the semantics of your situation permit. If consistency with encounter
+ * order is required, and you are experiencing poor performance or memory
+ * utilization with {@code dropWhile()} in parallel pipelines, switching to
+ * sequential execution with {@link #sequential()} may improve performance.
+ *
+ * @param predicate a <a href="package-summary.html#NonInterference">non-interfering</a>,
+ * <a href="package-summary.html#Statelessness">stateless</a>
+ * predicate to apply to elements to determine the longest
+ * prefix of elements.
+ * @return the new stream
+ */
+ default IntStream dropWhile(IntPredicate predicate) {
+ Objects.requireNonNull(predicate);
+ // Reuses the unordered spliterator, which, when encounter is present,
+ // is safe to use as long as it configured not to split
+ return StreamSupport.intStream(
+ new WhileOps.UnorderedWhileSpliterator.OfInt.Dropping(spliterator(), true, predicate),
+ isParallel()).onClose(this::close);
+ }
+
+ /**
* Performs an action for each element of this stream.
*
* <p>This is a <a href="package-summary.html#StreamOps">terminal
--- a/jdk/src/java.base/share/classes/java/util/stream/LongPipeline.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/stream/LongPipeline.java Tue Jul 14 15:26:34 2015 -0700
@@ -154,10 +154,12 @@
}
@Override
- final void forEachWithCancel(Spliterator<Long> spliterator, Sink<Long> sink) {
+ final boolean forEachWithCancel(Spliterator<Long> spliterator, Sink<Long> sink) {
Spliterator.OfLong spl = adapt(spliterator);
LongConsumer adaptedSink = adapt(sink);
- do { } while (!sink.cancellationRequested() && spl.tryAdvance(adaptedSink));
+ boolean cancelled;
+ do { } while (!(cancelled = sink.cancellationRequested()) && spl.tryAdvance(adaptedSink));
+ return cancelled;
}
@Override
@@ -368,6 +370,16 @@
}
@Override
+ public final LongStream takeWhile(LongPredicate predicate) {
+ return WhileOps.makeTakeWhileLong(this, predicate);
+ }
+
+ @Override
+ public final LongStream dropWhile(LongPredicate predicate) {
+ return WhileOps.makeDropWhileLong(this, predicate);
+ }
+
+ @Override
public final LongStream sorted() {
return SortedOps.makeLong(this);
}
--- a/jdk/src/java.base/share/classes/java/util/stream/LongStream.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/stream/LongStream.java Tue Jul 14 15:26:34 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,11 +24,7 @@
*/
package java.util.stream;
-import java.nio.charset.Charset;
-import java.nio.file.Files;
-import java.nio.file.Path;
import java.util.Arrays;
-import java.util.Collection;
import java.util.LongSummaryStatistics;
import java.util.Objects;
import java.util.OptionalDouble;
@@ -36,7 +32,6 @@
import java.util.PrimitiveIterator;
import java.util.Spliterator;
import java.util.Spliterators;
-import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.function.LongBinaryOperator;
@@ -278,6 +273,137 @@
LongStream skip(long n);
/**
+ * Returns, if this stream is ordered, a stream consisting of the longest
+ * prefix of elements taken from this stream that match the given predicate.
+ * Otherwise returns, if this stream is unordered, a stream consisting of a
+ * subset of elements taken from this stream that match the given predicate.
+ *
+ * <p>If this stream is ordered then the longest prefix is a contiguous
+ * sequence of elements of this stream that match the given predicate. The
+ * first element of the sequence is the first element of this stream, and
+ * the element immediately following the last element of the sequence does
+ * not match the given predicate.
+ *
+ * <p>If this stream is unordered, and some (but not all) elements of this
+ * stream match the given predicate, then the behavior of this operation is
+ * nondeterministic; it is free to take any subset of matching elements
+ * (which includes the empty set).
+ *
+ * <p>Independent of whether this stream is ordered or unordered if all
+ * elements of this stream match the given predicate then this operation
+ * takes all elements (the result is the same is the input), or if no
+ * elements of the stream match the given predicate then no elements are
+ * taken (the result is an empty stream).
+ *
+ * <p>This is a <a href="package-summary.html#StreamOps">short-circuiting
+ * stateful intermediate operation</a>.
+ *
+ * @implSpec
+ * The default implementation obtains the {@link #spliterator() spliterator}
+ * of this stream, wraps that spliterator so as to support the semantics
+ * of this operation on traversal, and returns a new stream associated with
+ * the wrapped spliterator. The returned stream preserves the execution
+ * characteristics of this stream (namely parallel or sequential execution
+ * as per {@link #isParallel()}) but the wrapped spliterator may choose to
+ * not support splitting. When the returned stream is closed, the close
+ * handlers for both the returned and this stream are invoked.
+ *
+ * @apiNote
+ * While {@code takeWhile()} is generally a cheap operation on sequential
+ * stream pipelines, it can be quite expensive on ordered parallel
+ * pipelines, since the operation is constrained to return not just any
+ * valid prefix, but the longest prefix of elements in the encounter order.
+ * Using an unordered stream source (such as
+ * {@link #generate(LongSupplier)}) or removing the ordering constraint with
+ * {@link #unordered()} may result in significant speedups of
+ * {@code takeWhile()} in parallel pipelines, if the semantics of your
+ * situation permit. If consistency with encounter order is required, and
+ * you are experiencing poor performance or memory utilization with
+ * {@code takeWhile()} in parallel pipelines, switching to sequential
+ * execution with {@link #sequential()} may improve performance.
+ *
+ * @param predicate a <a href="package-summary.html#NonInterference">non-interfering</a>,
+ * <a href="package-summary.html#Statelessness">stateless</a>
+ * predicate to apply to elements to determine the longest
+ * prefix of elements.
+ * @return the new stream
+ */
+ default LongStream takeWhile(LongPredicate predicate) {
+ Objects.requireNonNull(predicate);
+ // Reuses the unordered spliterator, which, when encounter is present,
+ // is safe to use as long as it configured not to split
+ return StreamSupport.longStream(
+ new WhileOps.UnorderedWhileSpliterator.OfLong.Taking(spliterator(), true, predicate),
+ isParallel()).onClose(this::close);
+ }
+
+ /**
+ * Returns, if this stream is ordered, a stream consisting of the remaining
+ * elements of this stream after dropping the longest prefix of elements
+ * that match the given predicate. Otherwise returns, if this stream is
+ * unordered, a stream consisting of the remaining elements of this stream
+ * after dropping a subset of elements that match the given predicate.
+ *
+ * <p>If this stream is ordered then the longest prefix is a contiguous
+ * sequence of elements of this stream that match the given predicate. The
+ * first element of the sequence is the first element of this stream, and
+ * the element immediately following the last element of the sequence does
+ * not match the given predicate.
+ *
+ * <p>If this stream is unordered, and some (but not all) elements of this
+ * stream match the given predicate, then the behavior of this operation is
+ * nondeterministic; it is free to drop any subset of matching elements
+ * (which includes the empty set).
+ *
+ * <p>Independent of whether this stream is ordered or unordered if all
+ * elements of this stream match the given predicate then this operation
+ * drops all elements (the result is an empty stream), or if no elements of
+ * the stream match the given predicate then no elements are dropped (the
+ * result is the same is the input).
+ *
+ * <p>This is a <a href="package-summary.html#StreamOps">stateful
+ * intermediate operation</a>.
+ *
+ * @implSpec
+ * The default implementation obtains the {@link #spliterator() spliterator}
+ * of this stream, wraps that spliterator so as to support the semantics
+ * of this operation on traversal, and returns a new stream associated with
+ * the wrapped spliterator. The returned stream preserves the execution
+ * characteristics of this stream (namely parallel or sequential execution
+ * as per {@link #isParallel()}) but the wrapped spliterator may choose to
+ * not support splitting. When the returned stream is closed, the close
+ * handlers for both the returned and this stream are invoked.
+ *
+ * @apiNote
+ * While {@code dropWhile()} is generally a cheap operation on sequential
+ * stream pipelines, it can be quite expensive on ordered parallel
+ * pipelines, since the operation is constrained to return not just any
+ * valid prefix, but the longest prefix of elements in the encounter order.
+ * Using an unordered stream source (such as
+ * {@link #generate(LongSupplier)}) or removing the ordering constraint with
+ * {@link #unordered()} may result in significant speedups of
+ * {@code dropWhile()} in parallel pipelines, if the semantics of your
+ * situation permit. If consistency with encounter order is required, and
+ * you are experiencing poor performance or memory utilization with
+ * {@code dropWhile()} in parallel pipelines, switching to sequential
+ * execution with {@link #sequential()} may improve performance.
+ *
+ * @param predicate a <a href="package-summary.html#NonInterference">non-interfering</a>,
+ * <a href="package-summary.html#Statelessness">stateless</a>
+ * predicate to apply to elements to determine the longest
+ * prefix of elements.
+ * @return the new stream
+ */
+ default LongStream dropWhile(LongPredicate predicate) {
+ Objects.requireNonNull(predicate);
+ // Reuses the unordered spliterator, which, when encounter is present,
+ // is safe to use as long as it configured not to split
+ return StreamSupport.longStream(
+ new WhileOps.UnorderedWhileSpliterator.OfLong.Dropping(spliterator(), true, predicate),
+ isParallel()).onClose(this::close);
+ }
+
+ /**
* Performs an action for each element of this stream.
*
* <p>This is a <a href="package-summary.html#StreamOps">terminal
--- a/jdk/src/java.base/share/classes/java/util/stream/Node.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/stream/Node.java Tue Jul 14 15:26:34 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -125,7 +125,11 @@
Node.Builder<T> nodeBuilder = Nodes.builder(size, generator);
nodeBuilder.begin(size);
for (int i = 0; i < from && spliterator.tryAdvance(e -> { }); i++) { }
- for (int i = 0; (i < size) && spliterator.tryAdvance(nodeBuilder); i++) { }
+ if (to == count()) {
+ spliterator.forEachRemaining(nodeBuilder);
+ } else {
+ for (int i = 0; i < size && spliterator.tryAdvance(nodeBuilder); i++) { }
+ }
nodeBuilder.end();
return nodeBuilder.build();
}
@@ -360,7 +364,11 @@
Node.Builder.OfInt nodeBuilder = Nodes.intBuilder(size);
nodeBuilder.begin(size);
for (int i = 0; i < from && spliterator.tryAdvance((IntConsumer) e -> { }); i++) { }
- for (int i = 0; (i < size) && spliterator.tryAdvance((IntConsumer) nodeBuilder); i++) { }
+ if (to == count()) {
+ spliterator.forEachRemaining((IntConsumer) nodeBuilder);
+ } else {
+ for (int i = 0; i < size && spliterator.tryAdvance((IntConsumer) nodeBuilder); i++) { }
+ }
nodeBuilder.end();
return nodeBuilder.build();
}
@@ -433,7 +441,11 @@
Node.Builder.OfLong nodeBuilder = Nodes.longBuilder(size);
nodeBuilder.begin(size);
for (int i = 0; i < from && spliterator.tryAdvance((LongConsumer) e -> { }); i++) { }
- for (int i = 0; (i < size) && spliterator.tryAdvance((LongConsumer) nodeBuilder); i++) { }
+ if (to == count()) {
+ spliterator.forEachRemaining((LongConsumer) nodeBuilder);
+ } else {
+ for (int i = 0; i < size && spliterator.tryAdvance((LongConsumer) nodeBuilder); i++) { }
+ }
nodeBuilder.end();
return nodeBuilder.build();
}
@@ -508,7 +520,11 @@
Node.Builder.OfDouble nodeBuilder = Nodes.doubleBuilder(size);
nodeBuilder.begin(size);
for (int i = 0; i < from && spliterator.tryAdvance((DoubleConsumer) e -> { }); i++) { }
- for (int i = 0; (i < size) && spliterator.tryAdvance((DoubleConsumer) nodeBuilder); i++) { }
+ if (to == count()) {
+ spliterator.forEachRemaining((DoubleConsumer) nodeBuilder);
+ } else {
+ for (int i = 0; i < size && spliterator.tryAdvance((DoubleConsumer) nodeBuilder); i++) { }
+ }
nodeBuilder.end();
return nodeBuilder.build();
}
--- a/jdk/src/java.base/share/classes/java/util/stream/Nodes.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/stream/Nodes.java Tue Jul 14 15:26:34 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -69,6 +69,14 @@
private static final Node.OfLong EMPTY_LONG_NODE = new EmptyNode.OfLong();
private static final Node.OfDouble EMPTY_DOUBLE_NODE = new EmptyNode.OfDouble();
+ /**
+ * @return an array generator for an array whose elements are of type T.
+ */
+ @SuppressWarnings("unchecked")
+ static <T> IntFunction<T[]> castingArray() {
+ return size -> (T[]) new Object[size];
+ }
+
// General shape-based node creation methods
/**
--- a/jdk/src/java.base/share/classes/java/util/stream/PipelineHelper.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/stream/PipelineHelper.java Tue Jul 14 15:26:34 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -136,8 +136,9 @@
*
* @param wrappedSink the destination {@code Sink}
* @param spliterator the source {@code Spliterator}
+ * @return true if the cancellation was requested
*/
- abstract <P_IN> void copyIntoWithCancel(Sink<P_IN> wrappedSink, Spliterator<P_IN> spliterator);
+ abstract <P_IN> boolean copyIntoWithCancel(Sink<P_IN> wrappedSink, Spliterator<P_IN> spliterator);
/**
* Takes a {@code Sink} that accepts elements of the output type of the
--- a/jdk/src/java.base/share/classes/java/util/stream/ReferencePipeline.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/stream/ReferencePipeline.java Tue Jul 14 15:26:34 2015 -0700
@@ -122,8 +122,10 @@
}
@Override
- final void forEachWithCancel(Spliterator<P_OUT> spliterator, Sink<P_OUT> sink) {
- do { } while (!sink.cancellationRequested() && spliterator.tryAdvance(sink));
+ final boolean forEachWithCancel(Spliterator<P_OUT> spliterator, Sink<P_OUT> sink) {
+ boolean cancelled;
+ do { } while (!(cancelled = sink.cancellationRequested()) && spliterator.tryAdvance(sink));
+ return cancelled;
}
@Override
@@ -411,6 +413,16 @@
return SliceOps.makeRef(this, n, -1);
}
+ @Override
+ public final Stream<P_OUT> takeWhile(Predicate<? super P_OUT> predicate) {
+ return WhileOps.makeTakeWhileRef(this, predicate);
+ }
+
+ @Override
+ public final Stream<P_OUT> dropWhile(Predicate<? super P_OUT> predicate) {
+ return WhileOps.makeDropWhileRef(this, predicate);
+ }
+
// Terminal operations from Stream
@Override
--- a/jdk/src/java.base/share/classes/java/util/stream/SliceOps.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/stream/SliceOps.java Tue Jul 14 15:26:34 2015 -0700
@@ -96,11 +96,6 @@
}
}
- @SuppressWarnings("unchecked")
- private static <T> IntFunction<T[]> castingArray() {
- return size -> (T[]) new Object[size];
- }
-
/**
* Appends a "slice" operation to the provided stream. The slice operation
* may be may be skip-only, limit-only, or skip-and-limit.
@@ -151,7 +146,7 @@
// cancellation will be more aggressive cancelling later tasks
// if the target slice size has been reached from a given task,
// cancellation should also clear local results if any
- return new SliceTask<>(this, helper, spliterator, castingArray(), skip, limit).
+ return new SliceTask<>(this, helper, spliterator, Nodes.castingArray(), skip, limit).
invoke().spliterator();
}
}
--- a/jdk/src/java.base/share/classes/java/util/stream/Stream.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/stream/Stream.java Tue Jul 14 15:26:34 2015 -0700
@@ -24,7 +24,6 @@
*/
package java.util.stream;
-import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
@@ -481,6 +480,135 @@
Stream<T> skip(long n);
/**
+ * Returns, if this stream is ordered, a stream consisting of the longest
+ * prefix of elements taken from this stream that match the given predicate.
+ * Otherwise returns, if this stream is unordered, a stream consisting of a
+ * subset of elements taken from this stream that match the given predicate.
+ *
+ * <p>If this stream is ordered then the longest prefix is a contiguous
+ * sequence of elements of this stream that match the given predicate. The
+ * first element of the sequence is the first element of this stream, and
+ * the element immediately following the last element of the sequence does
+ * not match the given predicate.
+ *
+ * <p>If this stream is unordered, and some (but not all) elements of this
+ * stream match the given predicate, then the behavior of this operation is
+ * nondeterministic; it is free to take any subset of matching elements
+ * (which includes the empty set).
+ *
+ * <p>Independent of whether this stream is ordered or unordered if all
+ * elements of this stream match the given predicate then this operation
+ * takes all elements (the result is the same is the input), or if no
+ * elements of the stream match the given predicate then no elements are
+ * taken (the result is an empty stream).
+ *
+ * <p>This is a <a href="package-summary.html#StreamOps">short-circuiting
+ * stateful intermediate operation</a>.
+ *
+ * @implSpec
+ * The default implementation obtains the {@link #spliterator() spliterator}
+ * of this stream, wraps that spliterator so as to support the semantics
+ * of this operation on traversal, and returns a new stream associated with
+ * the wrapped spliterator. The returned stream preserves the execution
+ * characteristics of this stream (namely parallel or sequential execution
+ * as per {@link #isParallel()}) but the wrapped spliterator may choose to
+ * not support splitting. When the returned stream is closed, the close
+ * handlers for both the returned and this stream are invoked.
+ *
+ * @apiNote
+ * While {@code takeWhile()} is generally a cheap operation on sequential
+ * stream pipelines, it can be quite expensive on ordered parallel
+ * pipelines, since the operation is constrained to return not just any
+ * valid prefix, but the longest prefix of elements in the encounter order.
+ * Using an unordered stream source (such as {@link #generate(Supplier)}) or
+ * removing the ordering constraint with {@link #unordered()} may result in
+ * significant speedups of {@code takeWhile()} in parallel pipelines, if the
+ * semantics of your situation permit. If consistency with encounter order
+ * is required, and you are experiencing poor performance or memory
+ * utilization with {@code takeWhile()} in parallel pipelines, switching to
+ * sequential execution with {@link #sequential()} may improve performance.
+ *
+ * @param predicate a <a href="package-summary.html#NonInterference">non-interfering</a>,
+ * <a href="package-summary.html#Statelessness">stateless</a>
+ * predicate to apply to elements to determine the longest
+ * prefix of elements.
+ * @return the new stream
+ */
+ default Stream<T> takeWhile(Predicate<? super T> predicate) {
+ Objects.requireNonNull(predicate);
+ // Reuses the unordered spliterator, which, when encounter is present,
+ // is safe to use as long as it configured not to split
+ return StreamSupport.stream(
+ new WhileOps.UnorderedWhileSpliterator.OfRef.Taking<>(spliterator(), true, predicate),
+ isParallel()).onClose(this::close);
+ }
+
+ /**
+ * Returns, if this stream is ordered, a stream consisting of the remaining
+ * elements of this stream after dropping the longest prefix of elements
+ * that match the given predicate. Otherwise returns, if this stream is
+ * unordered, a stream consisting of the remaining elements of this stream
+ * after dropping a subset of elements that match the given predicate.
+ *
+ * <p>If this stream is ordered then the longest prefix is a contiguous
+ * sequence of elements of this stream that match the given predicate. The
+ * first element of the sequence is the first element of this stream, and
+ * the element immediately following the last element of the sequence does
+ * not match the given predicate.
+ *
+ * <p>If this stream is unordered, and some (but not all) elements of this
+ * stream match the given predicate, then the behavior of this operation is
+ * nondeterministic; it is free to drop any subset of matching elements
+ * (which includes the empty set).
+ *
+ * <p>Independent of whether this stream is ordered or unordered if all
+ * elements of this stream match the given predicate then this operation
+ * drops all elements (the result is an empty stream), or if no elements of
+ * the stream match the given predicate then no elements are dropped (the
+ * result is the same is the input).
+ *
+ * <p>This is a <a href="package-summary.html#StreamOps">stateful
+ * intermediate operation</a>.
+ *
+ * @implSpec
+ * The default implementation obtains the {@link #spliterator() spliterator}
+ * of this stream, wraps that spliterator so as to support the semantics
+ * of this operation on traversal, and returns a new stream associated with
+ * the wrapped spliterator. The returned stream preserves the execution
+ * characteristics of this stream (namely parallel or sequential execution
+ * as per {@link #isParallel()}) but the wrapped spliterator may choose to
+ * not support splitting. When the returned stream is closed, the close
+ * handlers for both the returned and this stream are invoked.
+ *
+ * @apiNote
+ * While {@code dropWhile()} is generally a cheap operation on sequential
+ * stream pipelines, it can be quite expensive on ordered parallel
+ * pipelines, since the operation is constrained to return not just any
+ * valid prefix, but the longest prefix of elements in the encounter order.
+ * Using an unordered stream source (such as {@link #generate(Supplier)}) or
+ * removing the ordering constraint with {@link #unordered()} may result in
+ * significant speedups of {@code dropWhile()} in parallel pipelines, if the
+ * semantics of your situation permit. If consistency with encounter order
+ * is required, and you are experiencing poor performance or memory
+ * utilization with {@code dropWhile()} in parallel pipelines, switching to
+ * sequential execution with {@link #sequential()} may improve performance.
+ *
+ * @param predicate a <a href="package-summary.html#NonInterference">non-interfering</a>,
+ * <a href="package-summary.html#Statelessness">stateless</a>
+ * predicate to apply to elements to determine the longest
+ * prefix of elements.
+ * @return the new stream
+ */
+ default Stream<T> dropWhile(Predicate<? super T> predicate) {
+ Objects.requireNonNull(predicate);
+ // Reuses the unordered spliterator, which, when encounter is present,
+ // is safe to use as long as it configured not to split
+ return StreamSupport.stream(
+ new WhileOps.UnorderedWhileSpliterator.OfRef.Dropping<>(spliterator(), true, predicate),
+ isParallel()).onClose(this::close);
+ }
+
+ /**
* Performs an action for each element of this stream.
*
* <p>This is a <a href="package-summary.html#StreamOps">terminal
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/share/classes/java/util/stream/WhileOps.java Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,1394 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package java.util.stream;
+
+import java.util.Comparator;
+import java.util.Objects;
+import java.util.Spliterator;
+import java.util.concurrent.CountedCompleter;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Consumer;
+import java.util.function.DoubleConsumer;
+import java.util.function.DoublePredicate;
+import java.util.function.IntConsumer;
+import java.util.function.IntFunction;
+import java.util.function.IntPredicate;
+import java.util.function.LongConsumer;
+import java.util.function.LongPredicate;
+import java.util.function.Predicate;
+
+/**
+ * Factory for instances of a takeWhile and dropWhile operations
+ * that produce subsequences of their input stream.
+ *
+ * @since 1.9
+ */
+final class WhileOps {
+
+ static final int TAKE_FLAGS = StreamOpFlag.NOT_SIZED | StreamOpFlag.IS_SHORT_CIRCUIT;
+
+ static final int DROP_FLAGS = StreamOpFlag.NOT_SIZED;
+
+ /**
+ * Appends a "takeWhile" operation to the provided Stream.
+ *
+ * @param <T> the type of both input and output elements
+ * @param upstream a reference stream with element type T
+ * @param predicate the predicate that returns false to halt taking.
+ */
+ static <T> Stream<T> makeTakeWhileRef(AbstractPipeline<?, T, ?> upstream,
+ Predicate<? super T> predicate) {
+ Objects.requireNonNull(predicate);
+ return new ReferencePipeline.StatefulOp<T, T>(upstream, StreamShape.REFERENCE, TAKE_FLAGS) {
+ @Override
+ <P_IN> Spliterator<T> opEvaluateParallelLazy(PipelineHelper<T> helper,
+ Spliterator<P_IN> spliterator) {
+ if (StreamOpFlag.ORDERED.isKnown(helper.getStreamAndOpFlags())) {
+ return opEvaluateParallel(helper, spliterator, Nodes.castingArray())
+ .spliterator();
+ }
+ else {
+ return new UnorderedWhileSpliterator.OfRef.Taking<>(
+ helper.wrapSpliterator(spliterator), false, predicate);
+ }
+ }
+
+ @Override
+ <P_IN> Node<T> opEvaluateParallel(PipelineHelper<T> helper,
+ Spliterator<P_IN> spliterator,
+ IntFunction<T[]> generator) {
+ return new TakeWhileTask<>(this, helper, spliterator, generator)
+ .invoke();
+ }
+
+ @Override
+ Sink<T> opWrapSink(int flags, Sink<T> sink) {
+ return new Sink.ChainedReference<T, T>(sink) {
+ boolean take = true;
+
+ @Override
+ public void begin(long size) {
+ downstream.begin(-1);
+ }
+
+ @Override
+ public void accept(T t) {
+ if (take = predicate.test(t)) {
+ downstream.accept(t);
+ }
+ }
+
+ @Override
+ public boolean cancellationRequested() {
+ return !take || downstream.cancellationRequested();
+ }
+ };
+ }
+ };
+ }
+
+ /**
+ * Appends a "takeWhile" operation to the provided IntStream.
+ *
+ * @param upstream a reference stream with element type T
+ * @param predicate the predicate that returns false to halt taking.
+ */
+ static IntStream makeTakeWhileInt(AbstractPipeline<?, Integer, ?> upstream,
+ IntPredicate predicate) {
+ Objects.requireNonNull(predicate);
+ return new IntPipeline.StatefulOp<Integer>(upstream, StreamShape.INT_VALUE, TAKE_FLAGS) {
+ @Override
+ <P_IN> Spliterator<Integer> opEvaluateParallelLazy(PipelineHelper<Integer> helper,
+ Spliterator<P_IN> spliterator) {
+ if (StreamOpFlag.ORDERED.isKnown(helper.getStreamAndOpFlags())) {
+ return opEvaluateParallel(helper, spliterator, Integer[]::new)
+ .spliterator();
+ }
+ else {
+ return new UnorderedWhileSpliterator.OfInt.Taking(
+ (Spliterator.OfInt) helper.wrapSpliterator(spliterator), false, predicate);
+ }
+ }
+
+ @Override
+ <P_IN> Node<Integer> opEvaluateParallel(PipelineHelper<Integer> helper,
+ Spliterator<P_IN> spliterator,
+ IntFunction<Integer[]> generator) {
+ return new TakeWhileTask<>(this, helper, spliterator, generator)
+ .invoke();
+ }
+
+ @Override
+ Sink<Integer> opWrapSink(int flags, Sink<Integer> sink) {
+ return new Sink.ChainedInt<Integer>(sink) {
+ boolean take = true;
+
+ @Override
+ public void begin(long size) {
+ downstream.begin(-1);
+ }
+
+ @Override
+ public void accept(int t) {
+ if (take = predicate.test(t)) {
+ downstream.accept(t);
+ }
+ }
+
+ @Override
+ public boolean cancellationRequested() {
+ return !take || downstream.cancellationRequested();
+ }
+ };
+ }
+ };
+ }
+
+ /**
+ * Appends a "takeWhile" operation to the provided LongStream.
+ *
+ * @param upstream a reference stream with element type T
+ * @param predicate the predicate that returns false to halt taking.
+ */
+ static LongStream makeTakeWhileLong(AbstractPipeline<?, Long, ?> upstream,
+ LongPredicate predicate) {
+ Objects.requireNonNull(predicate);
+ return new LongPipeline.StatefulOp<Long>(upstream, StreamShape.LONG_VALUE, TAKE_FLAGS) {
+ @Override
+ <P_IN> Spliterator<Long> opEvaluateParallelLazy(PipelineHelper<Long> helper,
+ Spliterator<P_IN> spliterator) {
+ if (StreamOpFlag.ORDERED.isKnown(helper.getStreamAndOpFlags())) {
+ return opEvaluateParallel(helper, spliterator, Long[]::new)
+ .spliterator();
+ }
+ else {
+ return new UnorderedWhileSpliterator.OfLong.Taking(
+ (Spliterator.OfLong) helper.wrapSpliterator(spliterator), false, predicate);
+ }
+ }
+
+ @Override
+ <P_IN> Node<Long> opEvaluateParallel(PipelineHelper<Long> helper,
+ Spliterator<P_IN> spliterator,
+ IntFunction<Long[]> generator) {
+ return new TakeWhileTask<>(this, helper, spliterator, generator)
+ .invoke();
+ }
+
+ @Override
+ Sink<Long> opWrapSink(int flags, Sink<Long> sink) {
+ return new Sink.ChainedLong<Long>(sink) {
+ boolean take = true;
+
+ @Override
+ public void begin(long size) {
+ downstream.begin(-1);
+ }
+
+ @Override
+ public void accept(long t) {
+ if (take = predicate.test(t)) {
+ downstream.accept(t);
+ }
+ }
+
+ @Override
+ public boolean cancellationRequested() {
+ return !take || downstream.cancellationRequested();
+ }
+ };
+ }
+ };
+ }
+
+ /**
+ * Appends a "takeWhile" operation to the provided DoubleStream.
+ *
+ * @param upstream a reference stream with element type T
+ * @param predicate the predicate that returns false to halt taking.
+ */
+ static DoubleStream makeTakeWhileDouble(AbstractPipeline<?, Double, ?> upstream,
+ DoublePredicate predicate) {
+ Objects.requireNonNull(predicate);
+ return new DoublePipeline.StatefulOp<Double>(upstream, StreamShape.DOUBLE_VALUE, TAKE_FLAGS) {
+ @Override
+ <P_IN> Spliterator<Double> opEvaluateParallelLazy(PipelineHelper<Double> helper,
+ Spliterator<P_IN> spliterator) {
+ if (StreamOpFlag.ORDERED.isKnown(helper.getStreamAndOpFlags())) {
+ return opEvaluateParallel(helper, spliterator, Double[]::new)
+ .spliterator();
+ }
+ else {
+ return new UnorderedWhileSpliterator.OfDouble.Taking(
+ (Spliterator.OfDouble) helper.wrapSpliterator(spliterator), false, predicate);
+ }
+ }
+
+ @Override
+ <P_IN> Node<Double> opEvaluateParallel(PipelineHelper<Double> helper,
+ Spliterator<P_IN> spliterator,
+ IntFunction<Double[]> generator) {
+ return new TakeWhileTask<>(this, helper, spliterator, generator)
+ .invoke();
+ }
+
+ @Override
+ Sink<Double> opWrapSink(int flags, Sink<Double> sink) {
+ return new Sink.ChainedDouble<Double>(sink) {
+ boolean take = true;
+
+ @Override
+ public void begin(long size) {
+ downstream.begin(-1);
+ }
+
+ @Override
+ public void accept(double t) {
+ if (take = predicate.test(t)) {
+ downstream.accept(t);
+ }
+ }
+
+ @Override
+ public boolean cancellationRequested() {
+ return !take || downstream.cancellationRequested();
+ }
+ };
+ }
+ };
+ }
+
+ /**
+ * A specialization for the dropWhile operation that controls if
+ * elements to be dropped are counted and passed downstream.
+ * <p>
+ * This specialization is utilized by the {@link TakeWhileTask} for
+ * pipelines that are ordered. In such cases elements cannot be dropped
+ * until all elements have been collected.
+ *
+ * @param <T> the type of both input and output elements
+ */
+ interface DropWhileOp<T> {
+ /**
+ * Accepts a {@code Sink} which will receive the results of this
+ * dropWhile operation, and return a {@code DropWhileSink} which
+ * accepts
+ * elements and which performs the dropWhile operation passing the
+ * results to the provided {@code Sink}.
+ *
+ * @param sink sink to which elements should be sent after processing
+ * @param retainAndCountDroppedElements true if elements to be dropped
+ * are counted and passed to the sink, otherwise such elements
+ * are actually dropped and not passed to the sink.
+ * @return a dropWhile sink
+ */
+ DropWhileSink<T> opWrapSink(Sink<T> sink, boolean retainAndCountDroppedElements);
+ }
+
+ /**
+ * A specialization for a dropWhile sink.
+ *
+ * @param <T> the type of both input and output elements
+ */
+ interface DropWhileSink<T> extends Sink<T> {
+ /**
+ * @return the could of elements that would have been dropped and
+ * instead were passed downstream.
+ */
+ long getDropCount();
+ }
+
+ /**
+ * Appends a "dropWhile" operation to the provided Stream.
+ *
+ * @param <T> the type of both input and output elements
+ * @param upstream a reference stream with element type T
+ * @param predicate the predicate that returns false to halt dropping.
+ */
+ static <T> Stream<T> makeDropWhileRef(AbstractPipeline<?, T, ?> upstream,
+ Predicate<? super T> predicate) {
+ Objects.requireNonNull(predicate);
+
+ class Op extends ReferencePipeline.StatefulOp<T, T> implements DropWhileOp<T> {
+ public Op(AbstractPipeline<?, T, ?> upstream, StreamShape inputShape, int opFlags) {
+ super(upstream, inputShape, opFlags);
+ }
+
+ @Override
+ <P_IN> Spliterator<T> opEvaluateParallelLazy(PipelineHelper<T> helper,
+ Spliterator<P_IN> spliterator) {
+ if (StreamOpFlag.ORDERED.isKnown(helper.getStreamAndOpFlags())) {
+ return opEvaluateParallel(helper, spliterator, Nodes.castingArray())
+ .spliterator();
+ }
+ else {
+ return new UnorderedWhileSpliterator.OfRef.Dropping<>(
+ helper.wrapSpliterator(spliterator), false, predicate);
+ }
+ }
+
+ @Override
+ <P_IN> Node<T> opEvaluateParallel(PipelineHelper<T> helper,
+ Spliterator<P_IN> spliterator,
+ IntFunction<T[]> generator) {
+ return new DropWhileTask<>(this, helper, spliterator, generator)
+ .invoke();
+ }
+
+ @Override
+ Sink<T> opWrapSink(int flags, Sink<T> sink) {
+ return opWrapSink(sink, false);
+ }
+
+ public DropWhileSink<T> opWrapSink(Sink<T> sink, boolean retainAndCountDroppedElements) {
+ class OpSink extends Sink.ChainedReference<T, T> implements DropWhileSink<T> {
+ long dropCount;
+ boolean take;
+
+ OpSink() {
+ super(sink);
+ }
+
+ @Override
+ public void accept(T t) {
+ boolean takeElement = take || (take = !predicate.test(t));
+
+ // If ordered and element is dropped increment index
+ // for possible future truncation
+ if (retainAndCountDroppedElements && !takeElement)
+ dropCount++;
+
+ // If ordered need to process element, otherwise
+ // skip if element is dropped
+ if (retainAndCountDroppedElements || takeElement)
+ downstream.accept(t);
+ }
+
+ @Override
+ public long getDropCount() {
+ return dropCount;
+ }
+ }
+ return new OpSink();
+ }
+ }
+ return new Op(upstream, StreamShape.REFERENCE, DROP_FLAGS);
+ }
+
+ /**
+ * Appends a "dropWhile" operation to the provided IntStream.
+ *
+ * @param upstream a reference stream with element type T
+ * @param predicate the predicate that returns false to halt dropping.
+ */
+ static IntStream makeDropWhileInt(AbstractPipeline<?, Integer, ?> upstream,
+ IntPredicate predicate) {
+ Objects.requireNonNull(predicate);
+ class Op extends IntPipeline.StatefulOp<Integer> implements DropWhileOp<Integer> {
+ public Op(AbstractPipeline<?, Integer, ?> upstream, StreamShape inputShape, int opFlags) {
+ super(upstream, inputShape, opFlags);
+ }
+
+ @Override
+ <P_IN> Spliterator<Integer> opEvaluateParallelLazy(PipelineHelper<Integer> helper,
+ Spliterator<P_IN> spliterator) {
+ if (StreamOpFlag.ORDERED.isKnown(helper.getStreamAndOpFlags())) {
+ return opEvaluateParallel(helper, spliterator, Integer[]::new)
+ .spliterator();
+ }
+ else {
+ return new UnorderedWhileSpliterator.OfInt.Dropping(
+ (Spliterator.OfInt) helper.wrapSpliterator(spliterator), false, predicate);
+ }
+ }
+
+ @Override
+ <P_IN> Node<Integer> opEvaluateParallel(PipelineHelper<Integer> helper,
+ Spliterator<P_IN> spliterator,
+ IntFunction<Integer[]> generator) {
+ return new DropWhileTask<>(this, helper, spliterator, generator)
+ .invoke();
+ }
+
+ @Override
+ Sink<Integer> opWrapSink(int flags, Sink<Integer> sink) {
+ return opWrapSink(sink, false);
+ }
+
+ public DropWhileSink<Integer> opWrapSink(Sink<Integer> sink, boolean retainAndCountDroppedElements) {
+ class OpSink extends Sink.ChainedInt<Integer> implements DropWhileSink<Integer> {
+ long dropCount;
+ boolean take;
+
+ OpSink() {
+ super(sink);
+ }
+
+ @Override
+ public void accept(int t) {
+ boolean takeElement = take || (take = !predicate.test(t));
+
+ // If ordered and element is dropped increment index
+ // for possible future truncation
+ if (retainAndCountDroppedElements && !takeElement)
+ dropCount++;
+
+ // If ordered need to process element, otherwise
+ // skip if element is dropped
+ if (retainAndCountDroppedElements || takeElement)
+ downstream.accept(t);
+ }
+
+ @Override
+ public long getDropCount() {
+ return dropCount;
+ }
+ }
+ return new OpSink();
+ }
+ }
+ return new Op(upstream, StreamShape.INT_VALUE, DROP_FLAGS);
+ }
+
+ /**
+ * Appends a "dropWhile" operation to the provided LongStream.
+ *
+ * @param upstream a reference stream with element type T
+ * @param predicate the predicate that returns false to halt dropping.
+ */
+ static LongStream makeDropWhileLong(AbstractPipeline<?, Long, ?> upstream,
+ LongPredicate predicate) {
+ Objects.requireNonNull(predicate);
+ class Op extends LongPipeline.StatefulOp<Long> implements DropWhileOp<Long> {
+ public Op(AbstractPipeline<?, Long, ?> upstream, StreamShape inputShape, int opFlags) {
+ super(upstream, inputShape, opFlags);
+ }
+
+ @Override
+ <P_IN> Spliterator<Long> opEvaluateParallelLazy(PipelineHelper<Long> helper,
+ Spliterator<P_IN> spliterator) {
+ if (StreamOpFlag.ORDERED.isKnown(helper.getStreamAndOpFlags())) {
+ return opEvaluateParallel(helper, spliterator, Long[]::new)
+ .spliterator();
+ }
+ else {
+ return new UnorderedWhileSpliterator.OfLong.Dropping(
+ (Spliterator.OfLong) helper.wrapSpliterator(spliterator), false, predicate);
+ }
+ }
+
+ @Override
+ <P_IN> Node<Long> opEvaluateParallel(PipelineHelper<Long> helper,
+ Spliterator<P_IN> spliterator,
+ IntFunction<Long[]> generator) {
+ return new DropWhileTask<>(this, helper, spliterator, generator)
+ .invoke();
+ }
+
+ @Override
+ Sink<Long> opWrapSink(int flags, Sink<Long> sink) {
+ return opWrapSink(sink, false);
+ }
+
+ public DropWhileSink<Long> opWrapSink(Sink<Long> sink, boolean retainAndCountDroppedElements) {
+ class OpSink extends Sink.ChainedLong<Long> implements DropWhileSink<Long> {
+ long dropCount;
+ boolean take;
+
+ OpSink() {
+ super(sink);
+ }
+
+ @Override
+ public void accept(long t) {
+ boolean takeElement = take || (take = !predicate.test(t));
+
+ // If ordered and element is dropped increment index
+ // for possible future truncation
+ if (retainAndCountDroppedElements && !takeElement)
+ dropCount++;
+
+ // If ordered need to process element, otherwise
+ // skip if element is dropped
+ if (retainAndCountDroppedElements || takeElement)
+ downstream.accept(t);
+ }
+
+ @Override
+ public long getDropCount() {
+ return dropCount;
+ }
+ }
+ return new OpSink();
+ }
+ }
+ return new Op(upstream, StreamShape.LONG_VALUE, DROP_FLAGS);
+ }
+
+ /**
+ * Appends a "dropWhile" operation to the provided DoubleStream.
+ *
+ * @param upstream a reference stream with element type T
+ * @param predicate the predicate that returns false to halt dropping.
+ */
+ static DoubleStream makeDropWhileDouble(AbstractPipeline<?, Double, ?> upstream,
+ DoublePredicate predicate) {
+ Objects.requireNonNull(predicate);
+ class Op extends DoublePipeline.StatefulOp<Double> implements DropWhileOp<Double> {
+ public Op(AbstractPipeline<?, Double, ?> upstream, StreamShape inputShape, int opFlags) {
+ super(upstream, inputShape, opFlags);
+ }
+
+ @Override
+ <P_IN> Spliterator<Double> opEvaluateParallelLazy(PipelineHelper<Double> helper,
+ Spliterator<P_IN> spliterator) {
+ if (StreamOpFlag.ORDERED.isKnown(helper.getStreamAndOpFlags())) {
+ return opEvaluateParallel(helper, spliterator, Double[]::new)
+ .spliterator();
+ }
+ else {
+ return new UnorderedWhileSpliterator.OfDouble.Dropping(
+ (Spliterator.OfDouble) helper.wrapSpliterator(spliterator), false, predicate);
+ }
+ }
+
+ @Override
+ <P_IN> Node<Double> opEvaluateParallel(PipelineHelper<Double> helper,
+ Spliterator<P_IN> spliterator,
+ IntFunction<Double[]> generator) {
+ return new DropWhileTask<>(this, helper, spliterator, generator)
+ .invoke();
+ }
+
+ @Override
+ Sink<Double> opWrapSink(int flags, Sink<Double> sink) {
+ return opWrapSink(sink, false);
+ }
+
+ public DropWhileSink<Double> opWrapSink(Sink<Double> sink, boolean retainAndCountDroppedElements) {
+ class OpSink extends Sink.ChainedDouble<Double> implements DropWhileSink<Double> {
+ long dropCount;
+ boolean take;
+
+ OpSink() {
+ super(sink);
+ }
+
+ @Override
+ public void accept(double t) {
+ boolean takeElement = take || (take = !predicate.test(t));
+
+ // If ordered and element is dropped increment index
+ // for possible future truncation
+ if (retainAndCountDroppedElements && !takeElement)
+ dropCount++;
+
+ // If ordered need to process element, otherwise
+ // skip if element is dropped
+ if (retainAndCountDroppedElements || takeElement)
+ downstream.accept(t);
+ }
+
+ @Override
+ public long getDropCount() {
+ return dropCount;
+ }
+ }
+ return new OpSink();
+ }
+ }
+ return new Op(upstream, StreamShape.DOUBLE_VALUE, DROP_FLAGS);
+ }
+
+ //
+
+ /**
+ * A spliterator supporting takeWhile and dropWhile operations over an
+ * underlying spliterator whose covered elements have no encounter order.
+ * <p>
+ * Concrete subclasses of this spliterator support reference and primitive
+ * types for takeWhile and dropWhile.
+ * <p>
+ * For the takeWhile operation if during traversal taking completes then
+ * taking is cancelled globally for the splitting and traversal of all
+ * related spliterators.
+ * Cancellation is governed by a shared {@link AtomicBoolean} instance. A
+ * spliterator in the process of taking when cancellation occurs will also
+ * be cancelled but not necessarily immediately. To reduce contention on
+ * the {@link AtomicBoolean} instance, cancellation make be acted on after
+ * a small number of additional elements have been traversed.
+ * <p>
+ * For the dropWhile operation if during traversal dropping completes for
+ * some, but not all elements, then it is cancelled globally for the
+ * traversal of all related spliterators (splitting is not cancelled).
+ * Cancellation is governed in the same manner as for the takeWhile
+ * operation.
+ *
+ * @param <T> the type of elements returned by this spliterator
+ * @param <T_SPLITR> the type of the spliterator
+ */
+ static abstract class UnorderedWhileSpliterator<T, T_SPLITR extends Spliterator<T>> implements Spliterator<T> {
+ // Power of two constant minus one used for modulus of count
+ static final int CANCEL_CHECK_COUNT = (1 << 6) - 1;
+
+ // The underlying spliterator
+ final T_SPLITR s;
+ // True if no splitting should be performed, if true then
+ // this spliterator may be used for an underlying spliterator whose
+ // covered elements have an encounter order
+ // See use in stream take/dropWhile default default methods
+ final boolean noSplitting;
+ // True when operations are cancelled for all related spliterators
+ // For taking, spliterators cannot split or traversed
+ // For dropping, spliterators cannot be traversed
+ final AtomicBoolean cancel;
+ // True while taking or dropping should be performed when traversing
+ boolean takeOrDrop = true;
+ // The count of elements traversed
+ int count;
+
+ UnorderedWhileSpliterator(T_SPLITR s, boolean noSplitting) {
+ this.s = s;
+ this.noSplitting = noSplitting;
+ this.cancel = new AtomicBoolean();
+ }
+
+ UnorderedWhileSpliterator(T_SPLITR s, UnorderedWhileSpliterator<T, T_SPLITR> parent) {
+ this.s = s;
+ this.noSplitting = parent.noSplitting;
+ this.cancel = parent.cancel;
+ }
+
+ @Override
+ public long estimateSize() {
+ return s.estimateSize();
+ }
+
+ @Override
+ public int characteristics() {
+ // Size is not known
+ return s.characteristics() & ~(Spliterator.SIZED | Spliterator.SUBSIZED);
+ }
+
+ @Override
+ public long getExactSizeIfKnown() {
+ return -1L;
+ }
+
+ @Override
+ public Comparator<? super T> getComparator() {
+ return s.getComparator();
+ }
+
+ @Override
+ public T_SPLITR trySplit() {
+ @SuppressWarnings("unchecked")
+ T_SPLITR ls = noSplitting ? null : (T_SPLITR) s.trySplit();
+ return ls != null ? makeSpliterator(ls) : null;
+ }
+
+ boolean checkCancelOnCount() {
+ return count != 0 || !cancel.get();
+ }
+
+ abstract T_SPLITR makeSpliterator(T_SPLITR s);
+
+ static abstract class OfRef<T> extends UnorderedWhileSpliterator<T, Spliterator<T>> implements Consumer<T> {
+ final Predicate<? super T> p;
+ T t;
+
+ OfRef(Spliterator<T> s, boolean noSplitting, Predicate<? super T> p) {
+ super(s, noSplitting);
+ this.p = p;
+ }
+
+ OfRef(Spliterator<T> s, OfRef<T> parent) {
+ super(s, parent);
+ this.p = parent.p;
+ }
+
+ @Override
+ public void accept(T t) {
+ count = (count + 1) & CANCEL_CHECK_COUNT;
+ this.t = t;
+ }
+
+ static final class Taking<T> extends OfRef<T> {
+ Taking(Spliterator<T> s, boolean noSplitting, Predicate<? super T> p) {
+ super(s, noSplitting, p);
+ }
+
+ Taking(Spliterator<T> s, Taking<T> parent) {
+ super(s, parent);
+ }
+
+ @Override
+ public boolean tryAdvance(Consumer<? super T> action) {
+ boolean test = true;
+ if (takeOrDrop && // If can take
+ checkCancelOnCount() && // and if not cancelled
+ s.tryAdvance(this) && // and if advanced one element
+ (test = p.test(t))) { // and test on element passes
+ action.accept(t); // then accept element
+ return true;
+ }
+ else {
+ // Taking is finished
+ takeOrDrop = false;
+ // Cancel all further traversal and splitting operations
+ // only if test of element failed (short-circuited)
+ if (!test)
+ cancel.set(true);
+ return false;
+ }
+ }
+
+ @Override
+ public Spliterator<T> trySplit() {
+ // Do not split if all operations are cancelled
+ return cancel.get() ? null : super.trySplit();
+ }
+
+ @Override
+ Spliterator<T> makeSpliterator(Spliterator<T> s) {
+ return new Taking<>(s, this);
+ }
+ }
+
+ static final class Dropping<T> extends OfRef<T> {
+ Dropping(Spliterator<T> s, boolean noSplitting, Predicate<? super T> p) {
+ super(s, noSplitting, p);
+ }
+
+ Dropping(Spliterator<T> s, Dropping<T> parent) {
+ super(s, parent);
+ }
+
+ @Override
+ public boolean tryAdvance(Consumer<? super T> action) {
+ if (takeOrDrop) {
+ takeOrDrop = false;
+ boolean adv;
+ boolean dropped = false;
+ while ((adv = s.tryAdvance(this)) && // If advanced one element
+ checkCancelOnCount() && // and if not cancelled
+ p.test(t)) { // and test on element passes
+ dropped = true; // then drop element
+ }
+
+ // Report advanced element, if any
+ if (adv) {
+ // Cancel all further dropping if one or more elements
+ // were previously dropped
+ if (dropped)
+ cancel.set(true);
+ action.accept(t);
+ }
+ return adv;
+ }
+ else {
+ return s.tryAdvance(action);
+ }
+ }
+
+ @Override
+ Spliterator<T> makeSpliterator(Spliterator<T> s) {
+ return new Dropping<>(s, this);
+ }
+ }
+ }
+
+ static abstract class OfInt extends UnorderedWhileSpliterator<Integer, Spliterator.OfInt> implements IntConsumer, Spliterator.OfInt {
+ final IntPredicate p;
+ int t;
+
+ OfInt(Spliterator.OfInt s, boolean noSplitting, IntPredicate p) {
+ super(s, noSplitting);
+ this.p = p;
+ }
+
+ OfInt(Spliterator.OfInt s, UnorderedWhileSpliterator.OfInt parent) {
+ super(s, parent);
+ this.p = parent.p;
+ }
+
+ @Override
+ public void accept(int t) {
+ count = (count + 1) & CANCEL_CHECK_COUNT;
+ this.t = t;
+ }
+
+ static final class Taking extends UnorderedWhileSpliterator.OfInt {
+ Taking(Spliterator.OfInt s, boolean noSplitting, IntPredicate p) {
+ super(s, noSplitting, p);
+ }
+
+ Taking(Spliterator.OfInt s, UnorderedWhileSpliterator.OfInt parent) {
+ super(s, parent);
+ }
+
+ @Override
+ public boolean tryAdvance(IntConsumer action) {
+ boolean test = true;
+ if (takeOrDrop && // If can take
+ checkCancelOnCount() && // and if not cancelled
+ s.tryAdvance(this) && // and if advanced one element
+ (test = p.test(t))) { // and test on element passes
+ action.accept(t); // then accept element
+ return true;
+ }
+ else {
+ // Taking is finished
+ takeOrDrop = false;
+ // Cancel all further traversal and splitting operations
+ // only if test of element failed (short-circuited)
+ if (!test)
+ cancel.set(true);
+ return false;
+ }
+ }
+
+ @Override
+ public Spliterator.OfInt trySplit() {
+ // Do not split if all operations are cancelled
+ return cancel.get() ? null : super.trySplit();
+ }
+
+ @Override
+ Spliterator.OfInt makeSpliterator(Spliterator.OfInt s) {
+ return new Taking(s, this);
+ }
+ }
+
+ static final class Dropping extends UnorderedWhileSpliterator.OfInt {
+ Dropping(Spliterator.OfInt s, boolean noSplitting, IntPredicate p) {
+ super(s, noSplitting, p);
+ }
+
+ Dropping(Spliterator.OfInt s, UnorderedWhileSpliterator.OfInt parent) {
+ super(s, parent);
+ }
+
+ @Override
+ public boolean tryAdvance(IntConsumer action) {
+ if (takeOrDrop) {
+ takeOrDrop = false;
+ boolean adv;
+ boolean dropped = false;
+ while ((adv = s.tryAdvance(this)) && // If advanced one element
+ checkCancelOnCount() && // and if not cancelled
+ p.test(t)) { // and test on element passes
+ dropped = true; // then drop element
+ }
+
+ // Report advanced element, if any
+ if (adv) {
+ // Cancel all further dropping if one or more elements
+ // were previously dropped
+ if (dropped)
+ cancel.set(true);
+ action.accept(t);
+ }
+ return adv;
+ }
+ else {
+ return s.tryAdvance(action);
+ }
+ }
+
+ @Override
+ Spliterator.OfInt makeSpliterator(Spliterator.OfInt s) {
+ return new Dropping(s, this);
+ }
+ }
+ }
+
+ static abstract class OfLong extends UnorderedWhileSpliterator<Long, Spliterator.OfLong> implements LongConsumer, Spliterator.OfLong {
+ final LongPredicate p;
+ long t;
+
+ OfLong(Spliterator.OfLong s, boolean noSplitting, LongPredicate p) {
+ super(s, noSplitting);
+ this.p = p;
+ }
+
+ OfLong(Spliterator.OfLong s, UnorderedWhileSpliterator.OfLong parent) {
+ super(s, parent);
+ this.p = parent.p;
+ }
+
+ @Override
+ public void accept(long t) {
+ count = (count + 1) & CANCEL_CHECK_COUNT;
+ this.t = t;
+ }
+
+ static final class Taking extends UnorderedWhileSpliterator.OfLong {
+ Taking(Spliterator.OfLong s, boolean noSplitting, LongPredicate p) {
+ super(s, noSplitting, p);
+ }
+
+ Taking(Spliterator.OfLong s, UnorderedWhileSpliterator.OfLong parent) {
+ super(s, parent);
+ }
+
+ @Override
+ public boolean tryAdvance(LongConsumer action) {
+ boolean test = true;
+ if (takeOrDrop && // If can take
+ checkCancelOnCount() && // and if not cancelled
+ s.tryAdvance(this) && // and if advanced one element
+ (test = p.test(t))) { // and test on element passes
+ action.accept(t); // then accept element
+ return true;
+ }
+ else {
+ // Taking is finished
+ takeOrDrop = false;
+ // Cancel all further traversal and splitting operations
+ // only if test of element failed (short-circuited)
+ if (!test)
+ cancel.set(true);
+ return false;
+ }
+ }
+
+ @Override
+ public Spliterator.OfLong trySplit() {
+ // Do not split if all operations are cancelled
+ return cancel.get() ? null : super.trySplit();
+ }
+
+ @Override
+ Spliterator.OfLong makeSpliterator(Spliterator.OfLong s) {
+ return new Taking(s, this);
+ }
+ }
+
+ static final class Dropping extends UnorderedWhileSpliterator.OfLong {
+ Dropping(Spliterator.OfLong s, boolean noSplitting, LongPredicate p) {
+ super(s, noSplitting, p);
+ }
+
+ Dropping(Spliterator.OfLong s, UnorderedWhileSpliterator.OfLong parent) {
+ super(s, parent);
+ }
+
+ @Override
+ public boolean tryAdvance(LongConsumer action) {
+ if (takeOrDrop) {
+ takeOrDrop = false;
+ boolean adv;
+ boolean dropped = false;
+ while ((adv = s.tryAdvance(this)) && // If advanced one element
+ checkCancelOnCount() && // and if not cancelled
+ p.test(t)) { // and test on element passes
+ dropped = true; // then drop element
+ }
+
+ // Report advanced element, if any
+ if (adv) {
+ // Cancel all further dropping if one or more elements
+ // were previously dropped
+ if (dropped)
+ cancel.set(true);
+ action.accept(t);
+ }
+ return adv;
+ }
+ else {
+ return s.tryAdvance(action);
+ }
+ }
+
+ @Override
+ Spliterator.OfLong makeSpliterator(Spliterator.OfLong s) {
+ return new Dropping(s, this);
+ }
+ }
+ }
+
+ static abstract class OfDouble extends UnorderedWhileSpliterator<Double, Spliterator.OfDouble> implements DoubleConsumer, Spliterator.OfDouble {
+ final DoublePredicate p;
+ double t;
+
+ OfDouble(Spliterator.OfDouble s, boolean noSplitting, DoublePredicate p) {
+ super(s, noSplitting);
+ this.p = p;
+ }
+
+ OfDouble(Spliterator.OfDouble s, UnorderedWhileSpliterator.OfDouble parent) {
+ super(s, parent);
+ this.p = parent.p;
+ }
+
+ @Override
+ public void accept(double t) {
+ count = (count + 1) & CANCEL_CHECK_COUNT;
+ this.t = t;
+ }
+
+ static final class Taking extends UnorderedWhileSpliterator.OfDouble {
+ Taking(Spliterator.OfDouble s, boolean noSplitting, DoublePredicate p) {
+ super(s, noSplitting, p);
+ }
+
+ Taking(Spliterator.OfDouble s, UnorderedWhileSpliterator.OfDouble parent) {
+ super(s, parent);
+ }
+
+ @Override
+ public boolean tryAdvance(DoubleConsumer action) {
+ boolean test = true;
+ if (takeOrDrop && // If can take
+ checkCancelOnCount() && // and if not cancelled
+ s.tryAdvance(this) && // and if advanced one element
+ (test = p.test(t))) { // and test on element passes
+ action.accept(t); // then accept element
+ return true;
+ }
+ else {
+ // Taking is finished
+ takeOrDrop = false;
+ // Cancel all further traversal and splitting operations
+ // only if test of element failed (short-circuited)
+ if (!test)
+ cancel.set(true);
+ return false;
+ }
+ }
+
+ @Override
+ public Spliterator.OfDouble trySplit() {
+ // Do not split if all operations are cancelled
+ return cancel.get() ? null : super.trySplit();
+ }
+
+ @Override
+ Spliterator.OfDouble makeSpliterator(Spliterator.OfDouble s) {
+ return new Taking(s, this);
+ }
+ }
+
+ static final class Dropping extends UnorderedWhileSpliterator.OfDouble {
+ Dropping(Spliterator.OfDouble s, boolean noSplitting, DoublePredicate p) {
+ super(s, noSplitting, p);
+ }
+
+ Dropping(Spliterator.OfDouble s, UnorderedWhileSpliterator.OfDouble parent) {
+ super(s, parent);
+ }
+
+ @Override
+ public boolean tryAdvance(DoubleConsumer action) {
+ if (takeOrDrop) {
+ takeOrDrop = false;
+ boolean adv;
+ boolean dropped = false;
+ while ((adv = s.tryAdvance(this)) && // If advanced one element
+ checkCancelOnCount() && // and if not cancelled
+ p.test(t)) { // and test on element passes
+ dropped = true; // then drop element
+ }
+
+ // Report advanced element, if any
+ if (adv) {
+ // Cancel all further dropping if one or more elements
+ // were previously dropped
+ if (dropped)
+ cancel.set(true);
+ action.accept(t);
+ }
+ return adv;
+ }
+ else {
+ return s.tryAdvance(action);
+ }
+ }
+
+ @Override
+ Spliterator.OfDouble makeSpliterator(Spliterator.OfDouble s) {
+ return new Dropping(s, this);
+ }
+ }
+ }
+ }
+
+
+ //
+
+ /**
+ * {@code ForkJoinTask} implementing takeWhile computation.
+ * <p>
+ * If the pipeline has encounter order then all tasks to the right of
+ * a task where traversal was short-circuited are cancelled.
+ * The results of completed (and cancelled) tasks are discarded.
+ * The result of merging a short-circuited left task and right task (which
+ * may or may not be short-circuited) is that left task.
+ * <p>
+ * If the pipeline has no encounter order then all tasks to the right of
+ * a task where traversal was short-circuited are cancelled.
+ * The results of completed (and possibly cancelled) tasks are not
+ * discarded, as there is no need to throw away computed results.
+ * The result of merging does not change if a left task was
+ * short-circuited.
+ * No attempt is made, once a leaf task stopped taking, for it to cancel
+ * all other tasks, and further more, short-circuit the computation with its
+ * result.
+ *
+ * @param <P_IN> Input element type to the stream pipeline
+ * @param <P_OUT> Output element type from the stream pipeline
+ */
+ @SuppressWarnings("serial")
+ private static final class TakeWhileTask<P_IN, P_OUT>
+ extends AbstractShortCircuitTask<P_IN, P_OUT, Node<P_OUT>, TakeWhileTask<P_IN, P_OUT>> {
+ private final AbstractPipeline<P_OUT, P_OUT, ?> op;
+ private final IntFunction<P_OUT[]> generator;
+ private final boolean isOrdered;
+ private long thisNodeSize;
+ // True if a short-circuited
+ private boolean shortCircuited;
+ // True if completed, must be set after the local result
+ private volatile boolean completed;
+
+ TakeWhileTask(AbstractPipeline<P_OUT, P_OUT, ?> op,
+ PipelineHelper<P_OUT> helper,
+ Spliterator<P_IN> spliterator,
+ IntFunction<P_OUT[]> generator) {
+ super(helper, spliterator);
+ this.op = op;
+ this.generator = generator;
+ this.isOrdered = StreamOpFlag.ORDERED.isKnown(helper.getStreamAndOpFlags());
+ }
+
+ TakeWhileTask(TakeWhileTask<P_IN, P_OUT> parent, Spliterator<P_IN> spliterator) {
+ super(parent, spliterator);
+ this.op = parent.op;
+ this.generator = parent.generator;
+ this.isOrdered = parent.isOrdered;
+ }
+
+ @Override
+ protected TakeWhileTask<P_IN, P_OUT> makeChild(Spliterator<P_IN> spliterator) {
+ return new TakeWhileTask<>(this, spliterator);
+ }
+
+ @Override
+ protected final Node<P_OUT> getEmptyResult() {
+ return Nodes.emptyNode(op.getOutputShape());
+ }
+
+ @Override
+ protected final Node<P_OUT> doLeaf() {
+ Node.Builder<P_OUT> builder = helper.makeNodeBuilder(-1, generator);
+ Sink<P_OUT> s = op.opWrapSink(helper.getStreamAndOpFlags(), builder);
+
+ if (shortCircuited = helper.copyIntoWithCancel(helper.wrapSink(s), spliterator)) {
+ // Cancel later nodes if the predicate returned false
+ // during traversal
+ cancelLaterNodes();
+ }
+
+ Node<P_OUT> node = builder.build();
+ thisNodeSize = node.count();
+ return node;
+ }
+
+ @Override
+ public final void onCompletion(CountedCompleter<?> caller) {
+ if (!isLeaf()) {
+ Node<P_OUT> result;
+ shortCircuited = leftChild.shortCircuited | rightChild.shortCircuited;
+ if (isOrdered && canceled) {
+ thisNodeSize = 0;
+ result = getEmptyResult();
+ }
+ else if (isOrdered && leftChild.shortCircuited) {
+ // If taking finished on the left node then
+ // use the left node result
+ thisNodeSize = leftChild.thisNodeSize;
+ result = leftChild.getLocalResult();
+ }
+ else {
+ thisNodeSize = leftChild.thisNodeSize + rightChild.thisNodeSize;
+ result = merge();
+ }
+
+ setLocalResult(result);
+ }
+
+ completed = true;
+ super.onCompletion(caller);
+ }
+
+ Node<P_OUT> merge() {
+ if (leftChild.thisNodeSize == 0) {
+ // If the left node size is 0 then
+ // use the right node result
+ return rightChild.getLocalResult();
+ }
+ else if (rightChild.thisNodeSize == 0) {
+ // If the right node size is 0 then
+ // use the left node result
+ return leftChild.getLocalResult();
+ }
+ else {
+ // Combine the left and right nodes
+ return Nodes.conc(op.getOutputShape(),
+ leftChild.getLocalResult(), rightChild.getLocalResult());
+ }
+ }
+
+ @Override
+ protected void cancel() {
+ super.cancel();
+ if (isOrdered && completed)
+ // If the task is completed then clear the result, if any
+ // to aid GC
+ setLocalResult(getEmptyResult());
+ }
+ }
+
+ /**
+ * {@code ForkJoinTask} implementing dropWhile computation.
+ * <p>
+ * If the pipeline has encounter order then each leaf task will not
+ * drop elements but will obtain a count of the elements that would have
+ * been otherwise dropped. That count is used as an index to track
+ * elements to be dropped. Merging will update the index so it corresponds
+ * to the index that is the end of the global prefix of elements to be
+ * dropped. The root is truncated according to that index.
+ * <p>
+ * If the pipeline has no encounter order then each leaf task will drop
+ * elements. Leaf tasks are ordinarily merged. No truncation of the root
+ * node is required.
+ * No attempt is made, once a leaf task stopped dropping, for it to cancel
+ * all other tasks, and further more, short-circuit the computation with
+ * its result.
+ *
+ * @param <P_IN> Input element type to the stream pipeline
+ * @param <P_OUT> Output element type from the stream pipeline
+ */
+ @SuppressWarnings("serial")
+ private static final class DropWhileTask<P_IN, P_OUT>
+ extends AbstractTask<P_IN, P_OUT, Node<P_OUT>, DropWhileTask<P_IN, P_OUT>> {
+ private final AbstractPipeline<P_OUT, P_OUT, ?> op;
+ private final IntFunction<P_OUT[]> generator;
+ private final boolean isOrdered;
+ private long thisNodeSize;
+ // The index from which elements of the node should be taken
+ // i.e. the node should be truncated from [takeIndex, thisNodeSize)
+ // Equivalent to the count of dropped elements
+ private long index;
+
+ DropWhileTask(AbstractPipeline<P_OUT, P_OUT, ?> op,
+ PipelineHelper<P_OUT> helper,
+ Spliterator<P_IN> spliterator,
+ IntFunction<P_OUT[]> generator) {
+ super(helper, spliterator);
+ assert op instanceof DropWhileOp;
+ this.op = op;
+ this.generator = generator;
+ this.isOrdered = StreamOpFlag.ORDERED.isKnown(helper.getStreamAndOpFlags());
+ }
+
+ DropWhileTask(DropWhileTask<P_IN, P_OUT> parent, Spliterator<P_IN> spliterator) {
+ super(parent, spliterator);
+ this.op = parent.op;
+ this.generator = parent.generator;
+ this.isOrdered = parent.isOrdered;
+ }
+
+ @Override
+ protected DropWhileTask<P_IN, P_OUT> makeChild(Spliterator<P_IN> spliterator) {
+ return new DropWhileTask<>(this, spliterator);
+ }
+
+ @Override
+ protected final Node<P_OUT> doLeaf() {
+ boolean isChild = !isRoot();
+ // If this not the root and pipeline is ordered and size is known
+ // then pre-size the builder
+ long sizeIfKnown = isChild && isOrdered && StreamOpFlag.SIZED.isPreserved(op.sourceOrOpFlags)
+ ? op.exactOutputSizeIfKnown(spliterator)
+ : -1;
+ Node.Builder<P_OUT> builder = helper.makeNodeBuilder(sizeIfKnown, generator);
+ @SuppressWarnings("unchecked")
+ DropWhileOp<P_OUT> dropOp = (DropWhileOp<P_OUT>) op;
+ // If this leaf is the root then there is no merging on completion
+ // and there is no need to retain dropped elements
+ DropWhileSink<P_OUT> s = dropOp.opWrapSink(builder, isOrdered && isChild);
+ helper.wrapAndCopyInto(s, spliterator);
+
+ Node<P_OUT> node = builder.build();
+ thisNodeSize = node.count();
+ index = s.getDropCount();
+ return node;
+ }
+
+ @Override
+ public final void onCompletion(CountedCompleter<?> caller) {
+ if (!isLeaf()) {
+ if (isOrdered) {
+ index = leftChild.index;
+ // If a contiguous sequence of dropped elements
+ // include those of the right node, if any
+ if (index == leftChild.thisNodeSize)
+ index += rightChild.index;
+ }
+
+ thisNodeSize = leftChild.thisNodeSize + rightChild.thisNodeSize;
+ Node<P_OUT> result = merge();
+ setLocalResult(isRoot() ? doTruncate(result) : result);
+ }
+
+ super.onCompletion(caller);
+ }
+
+ private Node<P_OUT> merge() {
+ if (leftChild.thisNodeSize == 0) {
+ // If the left node size is 0 then
+ // use the right node result
+ return rightChild.getLocalResult();
+ }
+ else if (rightChild.thisNodeSize == 0) {
+ // If the right node size is 0 then
+ // use the left node result
+ return leftChild.getLocalResult();
+ }
+ else {
+ // Combine the left and right nodes
+ return Nodes.conc(op.getOutputShape(),
+ leftChild.getLocalResult(), rightChild.getLocalResult());
+ }
+ }
+
+ private Node<P_OUT> doTruncate(Node<P_OUT> input) {
+ return isOrdered
+ ? input.truncate(index, input.count(), generator)
+ : input;
+ }
+ }
+}
--- a/jdk/src/java.base/share/classes/javax/net/ssl/SSLEngineResult.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/javax/net/ssl/SSLEngineResult.java Tue Jul 14 15:26:34 2015 -0700
@@ -156,8 +156,10 @@
* This value is used to indicate that not-yet-interpreted data
* has been previously received from the remote side, and does
* not need to be received again.
+ * <P>
+ * This handshake status only applies to DTLS.
*
- * @since 1.9
+ * @since 9
*/
NEED_UNWRAP_AGAIN;
}
@@ -219,7 +221,7 @@
* arguments are null, or if {@code bytesConsumed} or
* {@code bytesProduced} is negative
*
- * @since 1.9
+ * @since 9
*/
public SSLEngineResult(Status status, HandshakeStatus handshakeStatus,
int bytesConsumed, int bytesProduced, long sequenceNumber) {
@@ -302,7 +304,7 @@
*
* @see java.lang.Long#compareUnsigned(long, long)
*
- * @since 1.9
+ * @since 9
*/
final public long sequenceNumber() {
return sequenceNumber;
--- a/jdk/src/java.base/share/classes/sun/security/pkcs/PKCS7.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/pkcs/PKCS7.java Tue Jul 14 15:26:34 2015 -0700
@@ -507,7 +507,7 @@
// certificates (optional)
if (certificates != null && certificates.length != 0) {
// cast to X509CertImpl[] since X509CertImpl implements DerEncoder
- X509CertImpl implCerts[] = new X509CertImpl[certificates.length];
+ X509CertImpl[] implCerts = new X509CertImpl[certificates.length];
for (int i = 0; i < certificates.length; i++) {
if (certificates[i] instanceof X509CertImpl)
implCerts[i] = (X509CertImpl) certificates[i];
--- a/jdk/src/java.base/share/classes/sun/security/pkcs/PKCS8Key.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/pkcs/PKCS8Key.java Tue Jul 14 15:26:34 2015 -0700
@@ -78,7 +78,7 @@
* data is stored and transmitted losslessly, but no knowledge
* about this particular algorithm is available.
*/
- private PKCS8Key (AlgorithmId algid, byte key [])
+ private PKCS8Key (AlgorithmId algid, byte[] key)
throws InvalidKeyException {
this.algid = algid;
this.key = key;
--- a/jdk/src/java.base/share/classes/sun/security/pkcs12/PKCS12KeyStore.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/pkcs12/PKCS12KeyStore.java Tue Jul 14 15:26:34 2015 -0700
@@ -154,28 +154,28 @@
private static final Debug debug = Debug.getInstance("pkcs12");
- private static final int keyBag[] = {1, 2, 840, 113549, 1, 12, 10, 1, 2};
- private static final int certBag[] = {1, 2, 840, 113549, 1, 12, 10, 1, 3};
- private static final int secretBag[] = {1, 2, 840, 113549, 1, 12, 10, 1, 5};
+ private static final int[] keyBag = {1, 2, 840, 113549, 1, 12, 10, 1, 2};
+ private static final int[] certBag = {1, 2, 840, 113549, 1, 12, 10, 1, 3};
+ private static final int[] secretBag = {1, 2, 840, 113549, 1, 12, 10, 1, 5};
- private static final int pkcs9Name[] = {1, 2, 840, 113549, 1, 9, 20};
- private static final int pkcs9KeyId[] = {1, 2, 840, 113549, 1, 9, 21};
+ private static final int[] pkcs9Name = {1, 2, 840, 113549, 1, 9, 20};
+ private static final int[] pkcs9KeyId = {1, 2, 840, 113549, 1, 9, 21};
- private static final int pkcs9certType[] = {1, 2, 840, 113549, 1, 9, 22, 1};
+ private static final int[] pkcs9certType = {1, 2, 840, 113549, 1, 9, 22, 1};
- private static final int pbeWithSHAAnd40BitRC2CBC[] =
+ private static final int[] pbeWithSHAAnd40BitRC2CBC =
{1, 2, 840, 113549, 1, 12, 1, 6};
- private static final int pbeWithSHAAnd3KeyTripleDESCBC[] =
+ private static final int[] pbeWithSHAAnd3KeyTripleDESCBC =
{1, 2, 840, 113549, 1, 12, 1, 3};
- private static final int pbes2[] = {1, 2, 840, 113549, 1, 5, 13};
+ private static final int[] pbes2 = {1, 2, 840, 113549, 1, 5, 13};
// TODO: temporary Oracle OID
/*
* { joint-iso-itu-t(2) country(16) us(840) organization(1) oracle(113894)
* jdk(746875) crypto(1) id-at-trustedKeyUsage(1) }
*/
- private static final int TrustedKeyUsage[] =
+ private static final int[] TrustedKeyUsage =
{2, 16, 840, 1, 113894, 746875, 1, 1};
- private static final int AnyExtendedKeyUsage[] = {2, 5, 29, 37, 0};
+ private static final int[] AnyExtendedKeyUsage = {2, 5, 29, 37, 0};
private static ObjectIdentifier PKCS8ShroudedKeyBag_OID;
private static ObjectIdentifier CertBag_OID;
@@ -243,7 +243,7 @@
// A private key entry and its supporting certificate chain
private static class PrivateKeyEntry extends KeyEntry {
byte[] protectedPrivKey;
- Certificate chain[];
+ Certificate[] chain;
};
// A secret key
--- a/jdk/src/java.base/share/classes/sun/security/provider/AuthPolicyFile.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/provider/AuthPolicyFile.java Tue Jul 14 15:26:34 2015 -0700
@@ -403,7 +403,7 @@
debug.println(" "+perm);
}
} catch (ClassNotFoundException cnfe) {
- Certificate certs[];
+ Certificate[] certs;
if (pe.signedBy != null) {
certs = getCertificates(keyStore, pe.signedBy);
} else {
@@ -623,7 +623,7 @@
init();
}
- final CodeSource codesource[] = {null};
+ final CodeSource[] codesource = {null};
codesource[0] = canonicalizeCodebase(cs, true);
@@ -666,7 +666,7 @@
// now see if any of the keys are trusted ids.
if (!ignoreIdentityScope) {
- Certificate certs[] = codesource[0].getCertificates();
+ Certificate[] certs = codesource[0].getCertificates();
if (certs != null) {
for (int k=0; k < certs.length; k++) {
if (aliasMapping.get(certs[k]) == null &&
--- a/jdk/src/java.base/share/classes/sun/security/provider/DSAParameterGenerator.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/provider/DSAParameterGenerator.java Tue Jul 14 15:26:34 2015 -0700
@@ -237,7 +237,7 @@
BigInteger offset = ONE;
/* Step 11 */
for (counter = 0; counter < 4*valueL; counter++) {
- BigInteger V[] = new BigInteger[n + 1];
+ BigInteger[] V = new BigInteger[n + 1];
/* Step 11.1 */
for (int j = 0; j <= n; j++) {
BigInteger J = BigInteger.valueOf(j);
--- a/jdk/src/java.base/share/classes/sun/security/provider/JavaKeyStore.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/provider/JavaKeyStore.java Tue Jul 14 15:26:34 2015 -0700
@@ -82,7 +82,7 @@
private static class KeyEntry {
Date date; // the creation date of this entry
byte[] protectedPrivKey;
- Certificate chain[];
+ Certificate[] chain;
};
// Trusted certificates
@@ -604,7 +604,7 @@
* the keystore (such as deleting or modifying key or
* certificate entries).
*/
- byte digest[] = md.digest();
+ byte[] digest = md.digest();
dos.write(digest);
dos.flush();
@@ -770,9 +770,8 @@
* with
*/
if (password != null) {
- byte computed[], actual[];
- computed = md.digest();
- actual = new byte[computed.length];
+ byte[] computed = md.digest();
+ byte[] actual = new byte[computed.length];
dis.readFully(actual);
for (int i = 0; i < computed.length; i++) {
if (computed[i] != actual[i]) {
--- a/jdk/src/java.base/share/classes/sun/security/provider/PolicyFile.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/provider/PolicyFile.java Tue Jul 14 15:26:34 2015 -0700
@@ -795,7 +795,7 @@
// an unresolved permission which will be resolved
// when implies is called
// Add it to entry
- Certificate certs[];
+ Certificate[] certs;
if (pe.signedBy != null) {
certs = getCertificates(keyStore,
pe.signedBy,
@@ -817,7 +817,7 @@
debug.println(" "+perm);
}
} catch (ClassNotFoundException cnfe) {
- Certificate certs[];
+ Certificate[] certs;
if (pe.signedBy != null) {
certs = getCertificates(keyStore,
pe.signedBy,
@@ -2032,7 +2032,7 @@
*
* @serial
*/
- private Certificate certs[];
+ private Certificate[] certs;
/**
* Creates a new SelfPermission containing the permission
@@ -2048,7 +2048,7 @@
* certificate first and the (root) certificate authority last).
*/
public SelfPermission(String type, String name, String actions,
- Certificate certs[])
+ Certificate[] certs)
{
super(type);
if (type == null) {
--- a/jdk/src/java.base/share/classes/sun/security/provider/PolicyParser.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/provider/PolicyParser.java Tue Jul 14 15:26:34 2015 -0700
@@ -1353,7 +1353,7 @@
}
}
- public static void main(String arg[]) throws Exception {
+ public static void main(String[] arg) throws Exception {
try (FileReader fr = new FileReader(arg[0]);
FileWriter fw = new FileWriter(arg[1])) {
PolicyParser pp = new PolicyParser(true);
--- a/jdk/src/java.base/share/classes/sun/security/provider/SecureRandom.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/provider/SecureRandom.java Tue Jul 14 15:26:34 2015 -0700
@@ -85,7 +85,7 @@
*
* @param seed the seed.
*/
- private SecureRandom(byte seed[]) {
+ private SecureRandom(byte[] seed) {
init(seed);
}
--- a/jdk/src/java.base/share/classes/sun/security/ssl/ByteBufferInputStream.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/ByteBufferInputStream.java Tue Jul 14 15:26:34 2015 -0700
@@ -70,7 +70,7 @@
* Increments position().
*/
@Override
- public int read(byte b[]) throws IOException {
+ public int read(byte[] b) throws IOException {
if (bb == null) {
throw new IOException("read on a closed InputStream");
@@ -85,7 +85,7 @@
* Increments position().
*/
@Override
- public int read(byte b[], int off, int len) throws IOException {
+ public int read(byte[] b, int off, int len) throws IOException {
if (bb == null) {
throw new IOException("read on a closed InputStream");
--- a/jdk/src/java.base/share/classes/sun/security/ssl/ClientHandshaker.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/ClientHandshaker.java Tue Jul 14 15:26:34 2015 -0700
@@ -810,7 +810,7 @@
String alias = null;
int keytypesTmpSize = keytypesTmp.size();
if (keytypesTmpSize != 0) {
- String keytypes[] =
+ String[] keytypes =
keytypesTmp.toArray(new String[keytypesTmpSize]);
if (conn != null) {
--- a/jdk/src/java.base/share/classes/sun/security/ssl/DHClientKeyExchange.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/DHClientKeyExchange.java Tue Jul 14 15:26:34 2015 -0700
@@ -48,7 +48,7 @@
* This value may be empty if it was included in the
* client's certificate ...
*/
- private byte dh_Yc[]; // 1 to 2^16 -1 bytes
+ private byte[] dh_Yc; // 1 to 2^16 -1 bytes
BigInteger getClientPublicKey() {
return dh_Yc == null ? null : new BigInteger(1, dh_Yc);
--- a/jdk/src/java.base/share/classes/sun/security/ssl/HandshakeInStream.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/HandshakeInStream.java Tue Jul 14 15:26:34 2015 -0700
@@ -146,7 +146,7 @@
byte[] getBytes8() throws IOException {
int len = getInt8();
verifyLength(len);
- byte b[] = new byte[len];
+ byte[] b = new byte[len];
read(b);
return b;
@@ -155,7 +155,7 @@
public byte[] getBytes16() throws IOException {
int len = getInt16();
verifyLength(len);
- byte b[] = new byte[len];
+ byte[] b = new byte[len];
read(b);
return b;
@@ -164,7 +164,7 @@
byte[] getBytes24() throws IOException {
int len = getInt24();
verifyLength(len);
- byte b[] = new byte[len];
+ byte[] b = new byte[len];
read(b);
return b;
--- a/jdk/src/java.base/share/classes/sun/security/ssl/HandshakeMessage.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/HandshakeMessage.java Tue Jul 14 15:26:34 2015 -0700
@@ -689,8 +689,8 @@
static final
class RSA_ServerKeyExchange extends ServerKeyExchange
{
- private byte rsa_modulus[]; // 1 to 2^16 - 1 bytes
- private byte rsa_exponent[]; // 1 to 2^16 - 1 bytes
+ private byte[] rsa_modulus; // 1 to 2^16 - 1 bytes
+ private byte[] rsa_exponent; // 1 to 2^16 - 1 bytes
private Signature signature;
private byte[] signatureBytes;
@@ -698,7 +698,7 @@
/*
* Hash the nonces and the ephemeral RSA public key.
*/
- private void updateSignature(byte clntNonce[], byte svrNonce[])
+ private void updateSignature(byte[] clntNonce, byte[] svrNonce)
throws SignatureException {
int tmp;
@@ -827,11 +827,11 @@
private final static boolean dhKeyExchangeFix =
Debug.getBooleanProperty("com.sun.net.ssl.dhKeyExchangeFix", true);
- private byte dh_p []; // 1 to 2^16 - 1 bytes
- private byte dh_g []; // 1 to 2^16 - 1 bytes
- private byte dh_Ys []; // 1 to 2^16 - 1 bytes
+ private byte[] dh_p; // 1 to 2^16 - 1 bytes
+ private byte[] dh_g; // 1 to 2^16 - 1 bytes
+ private byte[] dh_Ys; // 1 to 2^16 - 1 bytes
- private byte signature [];
+ private byte[] signature;
// protocol version being established using this ServerKeyExchange message
ProtocolVersion protocolVersion;
@@ -857,8 +857,8 @@
* with the cert chain which was sent ... for DHE_DSS and DHE_RSA
* key exchange. (Constructor called by server.)
*/
- DH_ServerKeyExchange(DHCrypt obj, PrivateKey key, byte clntNonce[],
- byte svrNonce[], SecureRandom sr,
+ DH_ServerKeyExchange(DHCrypt obj, PrivateKey key, byte[] clntNonce,
+ byte[] svrNonce, SecureRandom sr,
SignatureAndHashAlgorithm signAlgorithm,
ProtocolVersion protocolVersion) throws GeneralSecurityException {
@@ -913,7 +913,7 @@
* DHE_DSS or DHE_RSA key exchange. (Called by client.)
*/
DH_ServerKeyExchange(HandshakeInStream input, PublicKey publicKey,
- byte clntNonce[], byte svrNonce[], int messageSize,
+ byte[] clntNonce, byte[] svrNonce, int messageSize,
Collection<SignatureAndHashAlgorithm> localSupportedSignAlgs,
ProtocolVersion protocolVersion)
throws IOException, GeneralSecurityException {
@@ -948,7 +948,7 @@
}
// read the signature
- byte signature[];
+ byte[] signature;
if (dhKeyExchangeFix) {
signature = input.getBytes16();
} else {
@@ -1004,8 +1004,8 @@
/*
* Update sig with nonces and Diffie-Hellman public key.
*/
- private void updateSignature(Signature sig, byte clntNonce[],
- byte svrNonce[]) throws SignatureException {
+ private void updateSignature(Signature sig, byte[] clntNonce,
+ byte[] svrNonce) throws SignatureException {
int tmp;
sig.update(clntNonce);
@@ -1268,8 +1268,8 @@
}
}
- private void updateSignature(Signature sig, byte clntNonce[],
- byte svrNonce[]) throws SignatureException {
+ private void updateSignature(Signature sig, byte[] clntNonce,
+ byte[] svrNonce) throws SignatureException {
sig.update(clntNonce);
sig.update(svrNonce);
@@ -1334,7 +1334,7 @@
* DER encoded distinguished name.
* TLS requires that its not longer than 65535 bytes.
*/
- byte name[];
+ byte[] name;
DistinguishedName(HandshakeInStream input) throws IOException {
name = input.getBytes16();
@@ -1411,8 +1411,8 @@
private final static byte[] TYPES_ECC =
{ cct_rsa_sign, cct_dss_sign, cct_ecdsa_sign };
- byte types []; // 1 to 255 types
- DistinguishedName authorities []; // 3 to 2^16 - 1
+ byte[] types; // 1 to 255 types
+ DistinguishedName[] authorities; // 3 to 2^16 - 1
// ... "3" because that's the smallest DER-encoded X500 DN
// protocol version being established using this CertificateRequest message
@@ -1424,7 +1424,7 @@
// length of supported_signature_algorithms
private int algorithmsLen;
- CertificateRequest(X509Certificate ca[], KeyExchange keyExchange,
+ CertificateRequest(X509Certificate[] ca, KeyExchange keyExchange,
Collection<SignatureAndHashAlgorithm> signAlgs,
ProtocolVersion protocolVersion) throws IOException {
@@ -2063,7 +2063,7 @@
if (protocolVersion.useTLS10PlusSpec()) {
// TLS 1.0+
try {
- byte [] seed;
+ byte[] seed;
String prfAlg;
PRF prf;
--- a/jdk/src/java.base/share/classes/sun/security/ssl/HandshakeOutStream.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/HandshakeOutStream.java Tue Jul 14 15:26:34 2015 -0700
@@ -119,7 +119,7 @@
}
}
- public void putBytes16(byte b[]) throws IOException {
+ public void putBytes16(byte[] b) throws IOException {
if (b == null) {
putInt16(0);
} else {
@@ -128,7 +128,7 @@
}
}
- void putBytes24(byte b[]) throws IOException {
+ void putBytes24(byte[] b) throws IOException {
if (b == null) {
putInt24(0);
} else {
--- a/jdk/src/java.base/share/classes/sun/security/ssl/MAC.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/MAC.java Tue Jul 14 15:26:34 2015 -0700
@@ -52,7 +52,7 @@
final static MAC TLS_NULL = new MAC(false);
// Value of the null MAC is fixed
- private static final byte nullMAC[] = new byte[0];
+ private static final byte[] nullMAC = new byte[0];
// internal identifier for the MAC algorithm
private final MacAlg macAlg;
--- a/jdk/src/java.base/share/classes/sun/security/ssl/RandomCookie.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/RandomCookie.java Tue Jul 14 15:26:34 2015 -0700
@@ -38,7 +38,7 @@
*/
final class RandomCookie {
- byte random_bytes[]; // exactly 32 bytes
+ byte[] random_bytes; // exactly 32 bytes
RandomCookie(SecureRandom generator) {
long temp = System.currentTimeMillis() / 1000;
--- a/jdk/src/java.base/share/classes/sun/security/ssl/ServerHandshaker.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/ServerHandshaker.java Tue Jul 14 15:26:34 2015 -0700
@@ -986,7 +986,7 @@
ClientKeyExchangeService.find(keyExchange.name) == null) {
CertificateRequest m4;
- X509Certificate caCerts[];
+ X509Certificate[] caCerts;
Collection<SignatureAndHashAlgorithm> localSignAlgs = null;
if (protocolVersion.useTLS12PlusSpec()) {
--- a/jdk/src/java.base/share/classes/sun/security/ssl/SessionId.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/SessionId.java Tue Jul 14 15:26:34 2015 -0700
@@ -43,7 +43,7 @@
class SessionId
{
static int MAX_LENGTH = 32;
- private byte sessionId []; // max 32 bytes
+ private byte[] sessionId; // max 32 bytes
/** Constructs a new session ID ... perhaps for a rejoinable session */
SessionId (boolean isRejoinable, SecureRandom generator)
@@ -56,7 +56,7 @@
}
/** Constructs a session ID from a byte array (max size 32 bytes) */
- SessionId (byte sessionId [])
+ SessionId (byte[] sessionId)
{ this.sessionId = sessionId; }
/** Returns the length of the ID, in bytes */
@@ -64,7 +64,7 @@
{ return sessionId.length; }
/** Returns the bytes in the ID. May be an empty array. */
- byte [] getId ()
+ byte[] getId ()
{
return sessionId.clone ();
}
@@ -106,7 +106,7 @@
return false;
SessionId s = (SessionId) obj;
- byte b [] = s.getId ();
+ byte[] b = s.getId ();
if (b.length != sessionId.length)
return false;
--- a/jdk/src/java.base/share/classes/sun/security/ssl/X509TrustManagerImpl.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/X509TrustManagerImpl.java Tue Jul 14 15:26:34 2015 -0700
@@ -94,13 +94,13 @@
}
@Override
- public void checkClientTrusted(X509Certificate chain[], String authType)
+ public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
checkTrusted(chain, authType, (Socket)null, true);
}
@Override
- public void checkServerTrusted(X509Certificate chain[], String authType)
+ public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
checkTrusted(chain, authType, (Socket)null, false);
}
--- a/jdk/src/java.base/share/classes/sun/security/util/ManifestDigester.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/util/ManifestDigester.java Tue Jul 14 15:26:34 2015 -0700
@@ -37,7 +37,7 @@
public static final String MF_MAIN_ATTRS = "Manifest-Main-Attributes";
/** the raw bytes of the manifest */
- private byte rawBytes[];
+ private byte[] rawBytes;
/** the offset/length pair for a section */
private HashMap<String, Entry> entries; // key is a UTF-8 string
@@ -107,7 +107,7 @@
return false;
}
- public ManifestDigester(byte bytes[])
+ public ManifestDigester(byte[] bytes)
{
rawBytes = bytes;
entries = new HashMap<>();
@@ -181,7 +181,7 @@
}
}
- private boolean isNameAttr(byte bytes[], int start)
+ private boolean isNameAttr(byte[] bytes, int start)
{
return ((bytes[start] == 'N') || (bytes[start] == 'n')) &&
((bytes[start+1] == 'a') || (bytes[start+1] == 'A')) &&
@@ -261,11 +261,10 @@
return e;
}
- public byte[] manifestDigest(MessageDigest md)
- {
- md.reset();
- md.update(rawBytes, 0, rawBytes.length);
- return md.digest();
- }
+ public byte[] manifestDigest(MessageDigest md) {
+ md.reset();
+ md.update(rawBytes, 0, rawBytes.length);
+ return md.digest();
+ }
}
--- a/jdk/src/java.base/share/classes/sun/security/util/ManifestEntryVerifier.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/util/ManifestEntryVerifier.java Tue Jul 14 15:26:34 2015 -0700
@@ -165,7 +165,7 @@
/**
* update the digests for the digests we are interested in
*/
- public void update(byte buffer[], int off, int len) {
+ public void update(byte[] buffer, int off, int len) {
if (skip) return;
for (int i=0; i < digests.size(); i++) {
--- a/jdk/src/java.base/share/classes/sun/security/util/ObjectIdentifier.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/util/ObjectIdentifier.java Tue Jul 14 15:26:34 2015 -0700
@@ -212,7 +212,7 @@
* Constructor, from an array of integers.
* Validity check included.
*/
- public ObjectIdentifier (int values []) throws IOException
+ public ObjectIdentifier(int[] values) throws IOException
{
checkCount(values.length);
checkFirstComponent(values[0]);
--- a/jdk/src/java.base/share/classes/sun/security/util/SignatureFileVerifier.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/util/SignatureFileVerifier.java Tue Jul 14 15:26:34 2015 -0700
@@ -55,7 +55,7 @@
private PKCS7 block;
/** the raw bytes of the .SF file */
- private byte sfBytes[];
+ private byte[] sfBytes;
/** the name of the signature block file, uppercased and without
* the extension (.DSA/.RSA/.EC)
@@ -84,7 +84,7 @@
public SignatureFileVerifier(ArrayList<CodeSigner[]> signerCache,
ManifestDigester md,
String name,
- byte rawBytes[])
+ byte[] rawBytes)
throws IOException, CertificateException
{
// new PKCS7() calls CertificateFactory.getInstance()
@@ -129,7 +129,7 @@
* used to set the raw bytes of the .SF file when it
* is external to the signature block file.
*/
- public void setSignatureFile(byte sfBytes[])
+ public void setSignatureFile(byte[] sfBytes)
{
this.sfBytes = sfBytes;
}
@@ -511,7 +511,7 @@
* CodeSigner objects. We do this only *once* for a given
* signature block file.
*/
- private CodeSigner[] getSigners(SignerInfo infos[], PKCS7 block)
+ private CodeSigner[] getSigners(SignerInfo[] infos, PKCS7 block)
throws IOException, NoSuchAlgorithmException, SignatureException,
CertificateException {
--- a/jdk/src/java.base/share/classes/sun/security/x509/AVA.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/AVA.java Tue Jul 14 15:26:34 2015 -0700
@@ -967,7 +967,7 @@
previousWhite = false;
- byte valueBytes[] = null;
+ byte[] valueBytes = null;
try {
valueBytes = Character.toString(c).getBytes("UTF8");
} catch (IOException ie) {
@@ -1051,7 +1051,7 @@
// using the hex format below. This will be used only
// when the value is not a string type
- byte data [] = value.toByteArray();
+ byte[] data = value.toByteArray();
retval.append('#');
for (int i = 0; i < data.length; i++) {
--- a/jdk/src/java.base/share/classes/sun/security/x509/AlgIdDSA.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/AlgIdDSA.java Tue Jul 14 15:26:34 2015 -0700
@@ -117,7 +117,7 @@
* @param q the DSS/DSA parameter "Q"
* @param g the DSS/DSA parameter "G"
*/
- public AlgIdDSA (byte p [], byte q [], byte g [])
+ public AlgIdDSA (byte[] p, byte[] q, byte[] g)
throws IOException
{
this (new BigInteger (1, p),
--- a/jdk/src/java.base/share/classes/sun/security/x509/AlgorithmId.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/AlgorithmId.java Tue Jul 14 15:26:34 2015 -0700
@@ -648,12 +648,12 @@
/*
* COMMON PUBLIC KEY TYPES
*/
- private static final int DH_data[] = { 1, 2, 840, 113549, 1, 3, 1 };
- private static final int DH_PKIX_data[] = { 1, 2, 840, 10046, 2, 1 };
- private static final int DSA_OIW_data[] = { 1, 3, 14, 3, 2, 12 };
- private static final int DSA_PKIX_data[] = { 1, 2, 840, 10040, 4, 1 };
- private static final int RSA_data[] = { 2, 5, 8, 1, 1 };
- private static final int RSAEncryption_data[] =
+ private static final int[] DH_data = { 1, 2, 840, 113549, 1, 3, 1 };
+ private static final int[] DH_PKIX_data = { 1, 2, 840, 10046, 2, 1 };
+ private static final int[] DSA_OIW_data = { 1, 3, 14, 3, 2, 12 };
+ private static final int[] DSA_PKIX_data = { 1, 2, 840, 10040, 4, 1 };
+ private static final int[] RSA_data = { 2, 5, 8, 1, 1 };
+ private static final int[] RSAEncryption_data =
{ 1, 2, 840, 113549, 1, 1, 1 };
public static final ObjectIdentifier DH_oid;
@@ -674,27 +674,27 @@
/*
* COMMON SIGNATURE ALGORITHMS
*/
- private static final int md2WithRSAEncryption_data[] =
+ private static final int[] md2WithRSAEncryption_data =
{ 1, 2, 840, 113549, 1, 1, 2 };
- private static final int md5WithRSAEncryption_data[] =
+ private static final int[] md5WithRSAEncryption_data =
{ 1, 2, 840, 113549, 1, 1, 4 };
- private static final int sha1WithRSAEncryption_data[] =
+ private static final int[] sha1WithRSAEncryption_data =
{ 1, 2, 840, 113549, 1, 1, 5 };
- private static final int sha1WithRSAEncryption_OIW_data[] =
+ private static final int[] sha1WithRSAEncryption_OIW_data =
{ 1, 3, 14, 3, 2, 29 };
- private static final int sha224WithRSAEncryption_data[] =
+ private static final int[] sha224WithRSAEncryption_data =
{ 1, 2, 840, 113549, 1, 1, 14 };
- private static final int sha256WithRSAEncryption_data[] =
+ private static final int[] sha256WithRSAEncryption_data =
{ 1, 2, 840, 113549, 1, 1, 11 };
- private static final int sha384WithRSAEncryption_data[] =
+ private static final int[] sha384WithRSAEncryption_data =
{ 1, 2, 840, 113549, 1, 1, 12 };
- private static final int sha512WithRSAEncryption_data[] =
+ private static final int[] sha512WithRSAEncryption_data =
{ 1, 2, 840, 113549, 1, 1, 13 };
- private static final int shaWithDSA_OIW_data[] =
+ private static final int[] shaWithDSA_OIW_data =
{ 1, 3, 14, 3, 2, 13 };
- private static final int sha1WithDSA_OIW_data[] =
+ private static final int[] sha1WithDSA_OIW_data =
{ 1, 3, 14, 3, 2, 27 };
- private static final int dsaWithSHA1_PKIX_data[] =
+ private static final int[] dsaWithSHA1_PKIX_data =
{ 1, 2, 840, 10040, 4, 3 };
public static final ObjectIdentifier md2WithRSAEncryption_oid;
--- a/jdk/src/java.base/share/classes/sun/security/x509/NetscapeCertTypeExtension.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/NetscapeCertTypeExtension.java Tue Jul 14 15:26:34 2015 -0700
@@ -69,7 +69,7 @@
public static final String S_MIME_CA = "s_mime_ca";
public static final String OBJECT_SIGNING_CA = "object_signing_ca";
- private static final int CertType_data[] = { 2, 16, 840, 1, 113730, 1, 1 };
+ private static final int[] CertType_data = { 2, 16, 840, 1, 113730, 1, 1 };
/**
* Object identifier for the Netscape-Cert-Type extension.
--- a/jdk/src/java.base/share/classes/sun/security/x509/OIDMap.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/OIDMap.java Tue Jul 14 15:26:34 2015 -0700
@@ -102,7 +102,7 @@
private static final String OCSPNOCHECK = ROOT + "." +
OCSPNoCheckExtension.NAME;
- private static final int NetscapeCertType_data[] =
+ private static final int[] NetscapeCertType_data =
{ 2, 16, 840, 1, 113730, 1, 1 };
/** Map ObjectIdentifier(oid) -> OIDInfo(info) */
--- a/jdk/src/java.base/share/classes/sun/security/x509/PKIXExtensions.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/PKIXExtensions.java Tue Jul 14 15:26:34 2015 -0700
@@ -49,32 +49,32 @@
*/
public class PKIXExtensions {
// The object identifiers
- private static final int AuthorityKey_data [] = { 2, 5, 29, 35 };
- private static final int SubjectKey_data [] = { 2, 5, 29, 14 };
- private static final int KeyUsage_data [] = { 2, 5, 29, 15 };
- private static final int PrivateKeyUsage_data [] = { 2, 5, 29, 16 };
- private static final int CertificatePolicies_data [] = { 2, 5, 29, 32 };
- private static final int PolicyMappings_data [] = { 2, 5, 29, 33 };
- private static final int SubjectAlternativeName_data [] = { 2, 5, 29, 17 };
- private static final int IssuerAlternativeName_data [] = { 2, 5, 29, 18 };
- private static final int SubjectDirectoryAttributes_data [] = { 2, 5, 29, 9 };
- private static final int BasicConstraints_data [] = { 2, 5, 29, 19 };
- private static final int NameConstraints_data [] = { 2, 5, 29, 30 };
- private static final int PolicyConstraints_data [] = { 2, 5, 29, 36 };
- private static final int CRLDistributionPoints_data [] = { 2, 5, 29, 31 };
- private static final int CRLNumber_data [] = { 2, 5, 29, 20 };
- private static final int IssuingDistributionPoint_data [] = { 2, 5, 29, 28 };
- private static final int DeltaCRLIndicator_data [] = { 2, 5, 29, 27 };
- private static final int ReasonCode_data [] = { 2, 5, 29, 21 };
- private static final int HoldInstructionCode_data [] = { 2, 5, 29, 23 };
- private static final int InvalidityDate_data [] = { 2, 5, 29, 24 };
- private static final int ExtendedKeyUsage_data [] = { 2, 5, 29, 37 };
- private static final int InhibitAnyPolicy_data [] = { 2, 5, 29, 54 };
- private static final int CertificateIssuer_data [] = { 2, 5, 29, 29 };
- private static final int AuthInfoAccess_data [] = { 1, 3, 6, 1, 5, 5, 7, 1, 1};
- private static final int SubjectInfoAccess_data [] = { 1, 3, 6, 1, 5, 5, 7, 1, 11};
- private static final int FreshestCRL_data [] = { 2, 5, 29, 46 };
- private static final int OCSPNoCheck_data [] = { 1, 3, 6, 1, 5, 5, 7,
+ private static final int[] AuthorityKey_data = { 2, 5, 29, 35 };
+ private static final int[] SubjectKey_data = { 2, 5, 29, 14 };
+ private static final int[] KeyUsage_data = { 2, 5, 29, 15 };
+ private static final int[] PrivateKeyUsage_data = { 2, 5, 29, 16 };
+ private static final int[] CertificatePolicies_data = { 2, 5, 29, 32 };
+ private static final int[] PolicyMappings_data = { 2, 5, 29, 33 };
+ private static final int[] SubjectAlternativeName_data = { 2, 5, 29, 17 };
+ private static final int[] IssuerAlternativeName_data = { 2, 5, 29, 18 };
+ private static final int[] SubjectDirectoryAttributes_data = { 2, 5, 29, 9 };
+ private static final int[] BasicConstraints_data = { 2, 5, 29, 19 };
+ private static final int[] NameConstraints_data = { 2, 5, 29, 30 };
+ private static final int[] PolicyConstraints_data = { 2, 5, 29, 36 };
+ private static final int[] CRLDistributionPoints_data = { 2, 5, 29, 31 };
+ private static final int[] CRLNumber_data = { 2, 5, 29, 20 };
+ private static final int[] IssuingDistributionPoint_data = { 2, 5, 29, 28 };
+ private static final int[] DeltaCRLIndicator_data = { 2, 5, 29, 27 };
+ private static final int[] ReasonCode_data = { 2, 5, 29, 21 };
+ private static final int[] HoldInstructionCode_data = { 2, 5, 29, 23 };
+ private static final int[] InvalidityDate_data = { 2, 5, 29, 24 };
+ private static final int[] ExtendedKeyUsage_data = { 2, 5, 29, 37 };
+ private static final int[] InhibitAnyPolicy_data = { 2, 5, 29, 54 };
+ private static final int[] CertificateIssuer_data = { 2, 5, 29, 29 };
+ private static final int[] AuthInfoAccess_data = { 1, 3, 6, 1, 5, 5, 7, 1, 1};
+ private static final int[] SubjectInfoAccess_data = { 1, 3, 6, 1, 5, 5, 7, 1, 11};
+ private static final int[] FreshestCRL_data = { 2, 5, 29, 46 };
+ private static final int[] OCSPNoCheck_data = { 1, 3, 6, 1, 5, 5, 7,
48, 1, 5};
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/X500Name.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/X500Name.java Tue Jul 14 15:26:34 2015 -0700
@@ -1119,25 +1119,25 @@
* Includes all those specified in RFC 5280 as MUST or SHOULD
* be recognized
*/
- private static final int commonName_data[] = { 2, 5, 4, 3 };
- private static final int SURNAME_DATA[] = { 2, 5, 4, 4 };
- private static final int SERIALNUMBER_DATA[] = { 2, 5, 4, 5 };
- private static final int countryName_data[] = { 2, 5, 4, 6 };
- private static final int localityName_data[] = { 2, 5, 4, 7 };
- private static final int stateName_data[] = { 2, 5, 4, 8 };
- private static final int streetAddress_data[] = { 2, 5, 4, 9 };
- private static final int orgName_data[] = { 2, 5, 4, 10 };
- private static final int orgUnitName_data[] = { 2, 5, 4, 11 };
- private static final int title_data[] = { 2, 5, 4, 12 };
- private static final int GIVENNAME_DATA[] = { 2, 5, 4, 42 };
- private static final int INITIALS_DATA[] = { 2, 5, 4, 43 };
- private static final int GENERATIONQUALIFIER_DATA[] = { 2, 5, 4, 44 };
- private static final int DNQUALIFIER_DATA[] = { 2, 5, 4, 46 };
+ private static final int[] commonName_data = { 2, 5, 4, 3 };
+ private static final int[] SURNAME_DATA = { 2, 5, 4, 4 };
+ private static final int[] SERIALNUMBER_DATA = { 2, 5, 4, 5 };
+ private static final int[] countryName_data = { 2, 5, 4, 6 };
+ private static final int[] localityName_data = { 2, 5, 4, 7 };
+ private static final int[] stateName_data = { 2, 5, 4, 8 };
+ private static final int[] streetAddress_data = { 2, 5, 4, 9 };
+ private static final int[] orgName_data = { 2, 5, 4, 10 };
+ private static final int[] orgUnitName_data = { 2, 5, 4, 11 };
+ private static final int[] title_data = { 2, 5, 4, 12 };
+ private static final int[] GIVENNAME_DATA = { 2, 5, 4, 42 };
+ private static final int[] INITIALS_DATA = { 2, 5, 4, 43 };
+ private static final int[] GENERATIONQUALIFIER_DATA = { 2, 5, 4, 44 };
+ private static final int[] DNQUALIFIER_DATA = { 2, 5, 4, 46 };
- private static final int ipAddress_data[] = { 1, 3, 6, 1, 4, 1, 42, 2, 11, 2, 1 };
- private static final int DOMAIN_COMPONENT_DATA[] =
+ private static final int[] ipAddress_data = { 1, 3, 6, 1, 4, 1, 42, 2, 11, 2, 1 };
+ private static final int[] DOMAIN_COMPONENT_DATA =
{ 0, 9, 2342, 19200300, 100, 1, 25 };
- private static final int userid_data[] =
+ private static final int[] userid_data =
{ 0, 9, 2342, 19200300, 100, 1, 1 };
--- a/jdk/src/java.base/share/classes/sun/security/x509/X509CRLImpl.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/X509CRLImpl.java Tue Jul 14 15:26:34 2015 -0700
@@ -1086,7 +1086,7 @@
throw new CRLException("Invalid DER-encoded CRL data");
signedCRL = val.toByteArray();
- DerValue seq[] = new DerValue[3];
+ DerValue[] seq = new DerValue[3];
seq[0] = val.data.getDerValue();
seq[1] = val.data.getDerValue();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/share/classes/META-INF/services/java.net.ContentHandlerFactory Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation. Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+
+# Provider for content handlers
+sun.awt.www.content.MultimediaContentHandlers
--- a/jdk/src/java.desktop/share/classes/sun/awt/util/IdentityArrayList.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.desktop/share/classes/sun/awt/util/IdentityArrayList.java Tue Jul 14 15:26:34 2015 -0700
@@ -142,7 +142,8 @@
public IdentityArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;
- // c.toArray might (incorrectly) not return Object[] (see 6260652)
+ // defend against c.toArray (incorrectly) not returning Object[]
+ // (see e.g. https://bugs.openjdk.java.net/browse/JDK-6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/share/classes/sun/awt/www/content/MultimediaContentHandlers.java Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package sun.awt.www.content;
+
+import sun.awt.www.content.audio.wav;
+import sun.awt.www.content.audio.x_aiff;
+import sun.awt.www.content.image.gif;
+import sun.awt.www.content.audio.aiff;
+import sun.awt.www.content.audio.basic;
+import sun.awt.www.content.audio.x_wav;
+import sun.awt.www.content.image.jpeg;
+import sun.awt.www.content.image.png;
+import sun.awt.www.content.image.x_xbitmap;
+import sun.awt.www.content.image.x_xpixmap;
+
+import java.net.ContentHandler;
+import java.net.ContentHandlerFactory;
+
+public final class MultimediaContentHandlers implements ContentHandlerFactory {
+
+ @Override
+ public ContentHandler createContentHandler(String mimetype) {
+ switch (mimetype) {
+ case "audio/aiff": return new aiff();
+ case "audio/basic": return new basic();
+ case "audio/wav": return new wav();
+ case "audio/x-aiff": return new x_aiff();
+ case "audio/x-wav": return new x_wav();
+ case "image/gif": return new gif();
+ case "image/jpeg": return new jpeg();
+ case "image/png": return new png();
+ case "image/x-xbitmap": return new x_xbitmap();
+ case "image/x-xpixmap": return new x_xpixmap();
+ default: return null;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/share/classes/sun/awt/www/content/audio/aiff.java Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 1999, 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.
+ */
+
+/**
+ * Basic .aiff audio handler.
+ * @author Jeff Nisewanger
+ */
+package sun.awt.www.content.audio;
+
+import java.net.*;
+import java.io.IOException;
+import sun.applet.AppletAudioClip;
+
+/**
+ * Returns an AppletAudioClip object.
+ */
+public class aiff extends ContentHandler {
+ public Object getContent(URLConnection uc) throws IOException {
+ return new AppletAudioClip(uc);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/share/classes/sun/awt/www/content/audio/basic.java Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 1999, 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.
+ */
+
+/**
+ * Basic .au and .snd audio handler.
+ * @author Jeff Nisewanger
+ */
+package sun.awt.www.content.audio;
+
+import java.net.*;
+import java.io.IOException;
+import sun.applet.AppletAudioClip;
+
+/**
+ * Returns an AppletAudioClip object.
+ * This provides backwards compatibility with the behavior
+ * of ClassLoader.getResource().getContent() on JDK1.1.
+ */
+public class basic extends ContentHandler {
+ public Object getContent(URLConnection uc) throws IOException {
+ return new AppletAudioClip(uc);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/share/classes/sun/awt/www/content/audio/wav.java Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 1999, 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.
+ */
+
+/**
+ * Basic .wav audio handler.
+ * @author Jeff Nisewanger
+ */
+package sun.awt.www.content.audio;
+
+import java.net.*;
+import java.io.IOException;
+import sun.applet.AppletAudioClip;
+
+/**
+ * Returns an AppletAudioClip object.
+ */
+public class wav extends ContentHandler {
+ public Object getContent(URLConnection uc) throws IOException {
+ return new AppletAudioClip(uc);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/share/classes/sun/awt/www/content/audio/x_aiff.java Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 1999, 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.
+ */
+
+/**
+ * Basic .aiff audio handler.
+ * @author Jeff Nisewanger
+ */
+package sun.awt.www.content.audio;
+
+import java.net.*;
+import java.io.IOException;
+import sun.applet.AppletAudioClip;
+
+/**
+ * Returns an AppletAudioClip object.
+ */
+public class x_aiff extends ContentHandler {
+ public Object getContent(URLConnection uc) throws IOException {
+ return new AppletAudioClip(uc);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/share/classes/sun/awt/www/content/audio/x_wav.java Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 1999, 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.
+ */
+
+/**
+ * Basic .wav audio handler.
+ * @author Jeff Nisewanger
+ */
+package sun.awt.www.content.audio;
+
+import java.net.*;
+import java.io.IOException;
+import sun.applet.AppletAudioClip;
+
+/**
+ * Returns an AppletAudioClip object.
+ */
+public class x_wav extends ContentHandler {
+ public Object getContent(URLConnection uc) throws IOException {
+ return new AppletAudioClip(uc);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/share/classes/sun/awt/www/content/image/gif.java Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.awt.www.content.image;
+
+import java.net.*;
+import sun.awt.image.*;
+import java.io.IOException;
+import java.awt.Image;
+import java.awt.Toolkit;
+
+
+public class gif extends ContentHandler {
+ public Object getContent(URLConnection urlc) throws java.io.IOException {
+ return new URLImageSource(urlc);
+ }
+
+ @SuppressWarnings("rawtypes")
+ public Object getContent(URLConnection urlc, Class[] classes) throws IOException {
+ Class<?>[] cls = classes;
+ for (int i = 0; i < cls.length; i++) {
+ if (cls[i].isAssignableFrom(URLImageSource.class)) {
+ return new URLImageSource(urlc);
+ }
+ if (cls[i].isAssignableFrom(Image.class)) {
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ return tk.createImage(new URLImageSource(urlc));
+ }
+ }
+ return null;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/share/classes/sun/awt/www/content/image/jpeg.java Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.awt.www.content.image;
+
+import java.net.*;
+import sun.awt.image.*;
+import java.io.IOException;
+import java.awt.Image;
+import java.awt.Toolkit;
+
+public class jpeg extends ContentHandler {
+ public Object getContent(URLConnection urlc) throws java.io.IOException {
+ return new URLImageSource(urlc);
+ }
+
+ @SuppressWarnings("rawtypes")
+ public Object getContent(URLConnection urlc, Class[] classes) throws IOException {
+ Class<?>[] cls = classes;
+ for (int i = 0; i < cls.length; i++) {
+ if (cls[i].isAssignableFrom(URLImageSource.class)) {
+ return new URLImageSource(urlc);
+ }
+ if (cls[i].isAssignableFrom(Image.class)) {
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ return tk.createImage(new URLImageSource(urlc));
+ }
+ }
+ return null;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/share/classes/sun/awt/www/content/image/png.java Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.awt.www.content.image;
+
+import java.net.*;
+import java.io.IOException;
+import sun.awt.image.*;
+import java.awt.Image;
+import java.awt.Toolkit;
+
+public class png extends ContentHandler {
+ public Object getContent(URLConnection urlc) throws java.io.IOException {
+ return new URLImageSource(urlc);
+ }
+
+ @SuppressWarnings("rawtypes")
+ public Object getContent(URLConnection urlc, Class[] classes) throws IOException {
+ Class<?>[] cls = classes;
+ for (int i = 0; i < cls.length; i++) {
+ if (cls[i].isAssignableFrom(URLImageSource.class)) {
+ return new URLImageSource(urlc);
+ }
+ if (cls[i].isAssignableFrom(Image.class)) {
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ return tk.createImage(new URLImageSource(urlc));
+ }
+ }
+ return null;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/share/classes/sun/awt/www/content/image/x_xbitmap.java Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.awt.www.content.image;
+
+import java.net.*;
+import sun.awt.image.*;
+import java.awt.Image;
+import java.awt.Toolkit;
+
+public class x_xbitmap extends ContentHandler {
+ public Object getContent(URLConnection urlc) throws java.io.IOException {
+ return new URLImageSource(urlc);
+ }
+
+ @SuppressWarnings("rawtypes")
+ public Object getContent(URLConnection urlc, Class[] classes) throws java.io.IOException {
+ Class<?>[] cls = classes;
+ for (int i = 0; i < cls.length; i++) {
+ if (cls[i].isAssignableFrom(URLImageSource.class)) {
+ return new URLImageSource(urlc);
+ }
+ if (cls[i].isAssignableFrom(Image.class)) {
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ return tk.createImage(new URLImageSource(urlc));
+ }
+ }
+ return null;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/share/classes/sun/awt/www/content/image/x_xpixmap.java Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.awt.www.content.image;
+
+import java.net.*;
+import sun.awt.image.*;
+import java.awt.Image;
+import java.awt.Toolkit;
+
+public class x_xpixmap extends ContentHandler {
+ public Object getContent(URLConnection urlc) throws java.io.IOException {
+ return new URLImageSource(urlc);
+ }
+
+ @SuppressWarnings("rawtypes")
+ public Object getContent(URLConnection urlc, Class[] classes) throws java.io.IOException {
+ Class<?>[] cls = classes;
+ for (int i = 0; i < cls.length; i++) {
+ if (cls[i].isAssignableFrom(URLImageSource.class)) {
+ return new URLImageSource(urlc);
+ }
+ if (cls[i].isAssignableFrom(Image.class)) {
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ return tk.createImage(new URLImageSource(urlc));
+ }
+ }
+ return null;
+ }
+}
--- a/jdk/src/java.desktop/share/classes/sun/net/www/content/audio/aiff.java Tue Jul 14 20:36:12 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 1999, 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.
- */
-
-/**
- * Basic .aiff audio handler.
- * @author Jeff Nisewanger
- */
-package sun.net.www.content.audio;
-
-import java.net.*;
-import java.io.IOException;
-import sun.applet.AppletAudioClip;
-
-/**
- * Returns an AppletAudioClip object.
- */
-public class aiff extends ContentHandler {
- public Object getContent(URLConnection uc) throws IOException {
- return new AppletAudioClip(uc);
- }
-}
--- a/jdk/src/java.desktop/share/classes/sun/net/www/content/audio/basic.java Tue Jul 14 20:36:12 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 1999, 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.
- */
-
-/**
- * Basic .au and .snd audio handler.
- * @author Jeff Nisewanger
- */
-package sun.net.www.content.audio;
-
-import java.net.*;
-import java.io.IOException;
-import sun.applet.AppletAudioClip;
-
-/**
- * Returns an AppletAudioClip object.
- * This provides backwards compatibility with the behavior
- * of ClassLoader.getResource().getContent() on JDK1.1.
- */
-public class basic extends ContentHandler {
- public Object getContent(URLConnection uc) throws IOException {
- return new AppletAudioClip(uc);
- }
-}
--- a/jdk/src/java.desktop/share/classes/sun/net/www/content/audio/wav.java Tue Jul 14 20:36:12 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 1999, 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.
- */
-
-/**
- * Basic .wav audio handler.
- * @author Jeff Nisewanger
- */
-package sun.net.www.content.audio;
-
-import java.net.*;
-import java.io.IOException;
-import sun.applet.AppletAudioClip;
-
-/**
- * Returns an AppletAudioClip object.
- */
-public class wav extends ContentHandler {
- public Object getContent(URLConnection uc) throws IOException {
- return new AppletAudioClip(uc);
- }
-}
--- a/jdk/src/java.desktop/share/classes/sun/net/www/content/audio/x_aiff.java Tue Jul 14 20:36:12 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 1999, 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.
- */
-
-/**
- * Basic .aiff audio handler.
- * @author Jeff Nisewanger
- */
-package sun.net.www.content.audio;
-
-import java.net.*;
-import java.io.IOException;
-import sun.applet.AppletAudioClip;
-
-/**
- * Returns an AppletAudioClip object.
- */
-public class x_aiff extends ContentHandler {
- public Object getContent(URLConnection uc) throws IOException {
- return new AppletAudioClip(uc);
- }
-}
--- a/jdk/src/java.desktop/share/classes/sun/net/www/content/audio/x_wav.java Tue Jul 14 20:36:12 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 1999, 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.
- */
-
-/**
- * Basic .wav audio handler.
- * @author Jeff Nisewanger
- */
-package sun.net.www.content.audio;
-
-import java.net.*;
-import java.io.IOException;
-import sun.applet.AppletAudioClip;
-
-/**
- * Returns an AppletAudioClip object.
- */
-public class x_wav extends ContentHandler {
- public Object getContent(URLConnection uc) throws IOException {
- return new AppletAudioClip(uc);
- }
-}
--- a/jdk/src/java.desktop/share/classes/sun/net/www/content/image/gif.java Tue Jul 14 20:36:12 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.net.www.content.image;
-
-import java.net.*;
-import sun.awt.image.*;
-import java.io.IOException;
-import java.awt.Image;
-import java.awt.Toolkit;
-
-
-public class gif extends ContentHandler {
- public Object getContent(URLConnection urlc) throws java.io.IOException {
- return new URLImageSource(urlc);
- }
-
- @SuppressWarnings("rawtypes")
- public Object getContent(URLConnection urlc, Class[] classes) throws IOException {
- Class<?>[] cls = classes;
- for (int i = 0; i < cls.length; i++) {
- if (cls[i].isAssignableFrom(URLImageSource.class)) {
- return new URLImageSource(urlc);
- }
- if (cls[i].isAssignableFrom(Image.class)) {
- Toolkit tk = Toolkit.getDefaultToolkit();
- return tk.createImage(new URLImageSource(urlc));
- }
- }
- return null;
- }
-}
--- a/jdk/src/java.desktop/share/classes/sun/net/www/content/image/jpeg.java Tue Jul 14 20:36:12 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.net.www.content.image;
-
-import java.net.*;
-import sun.awt.image.*;
-import java.io.IOException;
-import java.awt.Image;
-import java.awt.Toolkit;
-
-public class jpeg extends ContentHandler {
- public Object getContent(URLConnection urlc) throws java.io.IOException {
- return new URLImageSource(urlc);
- }
-
- @SuppressWarnings("rawtypes")
- public Object getContent(URLConnection urlc, Class[] classes) throws IOException {
- Class<?>[] cls = classes;
- for (int i = 0; i < cls.length; i++) {
- if (cls[i].isAssignableFrom(URLImageSource.class)) {
- return new URLImageSource(urlc);
- }
- if (cls[i].isAssignableFrom(Image.class)) {
- Toolkit tk = Toolkit.getDefaultToolkit();
- return tk.createImage(new URLImageSource(urlc));
- }
- }
- return null;
- }
-}
--- a/jdk/src/java.desktop/share/classes/sun/net/www/content/image/png.java Tue Jul 14 20:36:12 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.net.www.content.image;
-
-import java.net.*;
-import java.io.IOException;
-import sun.awt.image.*;
-import java.awt.Image;
-import java.awt.Toolkit;
-
-public class png extends ContentHandler {
- public Object getContent(URLConnection urlc) throws java.io.IOException {
- return new URLImageSource(urlc);
- }
-
- @SuppressWarnings("rawtypes")
- public Object getContent(URLConnection urlc, Class[] classes) throws IOException {
- Class<?>[] cls = classes;
- for (int i = 0; i < cls.length; i++) {
- if (cls[i].isAssignableFrom(URLImageSource.class)) {
- return new URLImageSource(urlc);
- }
- if (cls[i].isAssignableFrom(Image.class)) {
- Toolkit tk = Toolkit.getDefaultToolkit();
- return tk.createImage(new URLImageSource(urlc));
- }
- }
- return null;
- }
-}
--- a/jdk/src/java.desktop/share/classes/sun/net/www/content/image/x_xbitmap.java Tue Jul 14 20:36:12 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-/*
- * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.net.www.content.image;
-
-import java.net.*;
-import sun.awt.image.*;
-import java.awt.Image;
-import java.awt.Toolkit;
-
-public class x_xbitmap extends ContentHandler {
- public Object getContent(URLConnection urlc) throws java.io.IOException {
- return new URLImageSource(urlc);
- }
-
- @SuppressWarnings("rawtypes")
- public Object getContent(URLConnection urlc, Class[] classes) throws java.io.IOException {
- Class<?>[] cls = classes;
- for (int i = 0; i < cls.length; i++) {
- if (cls[i].isAssignableFrom(URLImageSource.class)) {
- return new URLImageSource(urlc);
- }
- if (cls[i].isAssignableFrom(Image.class)) {
- Toolkit tk = Toolkit.getDefaultToolkit();
- return tk.createImage(new URLImageSource(urlc));
- }
- }
- return null;
- }
-}
--- a/jdk/src/java.desktop/share/classes/sun/net/www/content/image/x_xpixmap.java Tue Jul 14 20:36:12 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-/*
- * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.net.www.content.image;
-
-import java.net.*;
-import sun.awt.image.*;
-import java.awt.Image;
-import java.awt.Toolkit;
-
-public class x_xpixmap extends ContentHandler {
- public Object getContent(URLConnection urlc) throws java.io.IOException {
- return new URLImageSource(urlc);
- }
-
- @SuppressWarnings("rawtypes")
- public Object getContent(URLConnection urlc, Class[] classes) throws java.io.IOException {
- Class<?>[] cls = classes;
- for (int i = 0; i < cls.length; i++) {
- if (cls[i].isAssignableFrom(URLImageSource.class)) {
- return new URLImageSource(urlc);
- }
- if (cls[i].isAssignableFrom(Image.class)) {
- Toolkit tk = Toolkit.getDefaultToolkit();
- return tk.createImage(new URLImageSource(urlc));
- }
- }
- return null;
- }
-}
--- a/jdk/src/java.security.jgss/share/classes/javax/security/auth/kerberos/ServicePermission.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/javax/security/auth/kerberos/ServicePermission.java Tue Jul 14 15:26:34 2015 -0700
@@ -427,7 +427,7 @@
/*
- public static void main(String args[]) throws Exception {
+ public static void main(String[] args) throws Exception {
ServicePermission this_ =
new ServicePermission(args[0], "accept");
ServicePermission that_ =
--- a/jdk/src/java.security.jgss/share/classes/sun/security/jgss/GSSCredentialImpl.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/jgss/GSSCredentialImpl.java Tue Jul 14 15:26:34 2015 -0700
@@ -75,7 +75,7 @@
}
GSSCredentialImpl(GSSManagerImpl gssManager, GSSName name,
- int lifetime, Oid mechs[], int usage)
+ int lifetime, Oid[] mechs, int usage)
throws GSSException {
init(gssManager);
boolean defaultList = false;
--- a/jdk/src/java.security.jgss/share/classes/sun/security/jgss/GSSManagerImpl.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/jgss/GSSManagerImpl.java Tue Jul 14 15:26:34 2015 -0700
@@ -128,7 +128,7 @@
return new GSSNameImpl(this, nameStr, nameType);
}
- public GSSName createName(byte name[], Oid nameType)
+ public GSSName createName(byte[] name, Oid nameType)
throws GSSException {
return new GSSNameImpl(this, name, nameType);
}
@@ -138,7 +138,7 @@
return new GSSNameImpl(this, nameStr, nameType, mech);
}
- public GSSName createName(byte name[], Oid nameType, Oid mech)
+ public GSSName createName(byte[] name, Oid nameType, Oid mech)
throws GSSException {
return new GSSNameImpl(this, name, nameType, mech);
}
@@ -155,7 +155,7 @@
}
public GSSCredential createCredential(GSSName aName,
- int lifetime, Oid mechs[], int usage)
+ int lifetime, Oid[] mechs, int usage)
throws GSSException {
return wrap(new GSSCredentialImpl(this, aName, lifetime, mechs, usage));
}
--- a/jdk/src/java.security.jgss/share/classes/sun/security/jgss/krb5/Krb5Context.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/jgss/krb5/Krb5Context.java Tue Jul 14 15:26:34 2015 -0700
@@ -159,7 +159,7 @@
/**
* Constructor for Krb5Context to import a previously exported context.
*/
- public Krb5Context(GSSCaller caller, byte [] interProcessToken)
+ public Krb5Context(GSSCaller caller, byte[] interProcessToken)
throws GSSException {
throw new GSSException(GSSException.UNAVAILABLE,
-1, "GSS Import Context not available");
@@ -905,7 +905,7 @@
* and verifyMIC care about the remote sequence number (peerSeqNumber).
*/
- public final byte[] wrap(byte inBuf[], int offset, int len,
+ public final byte[] wrap(byte[] inBuf, int offset, int len,
MessageProp msgProp) throws GSSException {
if (DEBUG) {
System.out.println("Krb5Context.wrap: data=["
@@ -943,7 +943,7 @@
}
}
- public final int wrap(byte inBuf[], int inOffset, int len,
+ public final int wrap(byte[] inBuf, int inOffset, int len,
byte[] outBuf, int outOffset,
MessageProp msgProp) throws GSSException {
@@ -977,7 +977,7 @@
}
}
- public final void wrap(byte inBuf[], int offset, int len,
+ public final void wrap(byte[] inBuf, int offset, int len,
OutputStream os, MessageProp msgProp)
throws GSSException {
@@ -1032,7 +1032,7 @@
wrap(data, 0, data.length, os, msgProp);
}
- public final byte[] unwrap(byte inBuf[], int offset, int len,
+ public final byte[] unwrap(byte[] inBuf, int offset, int len,
MessageProp msgProp)
throws GSSException {
@@ -1069,7 +1069,7 @@
return data;
}
- public final int unwrap(byte inBuf[], int inOffset, int len,
+ public final int unwrap(byte[] inBuf, int inOffset, int len,
byte[] outBuf, int outOffset,
MessageProp msgProp) throws GSSException {
@@ -1141,7 +1141,7 @@
}
}
- public final byte[] getMIC(byte []inMsg, int offset, int len,
+ public final byte[] getMIC(byte[] inMsg, int offset, int len,
MessageProp msgProp)
throws GSSException {
@@ -1166,7 +1166,7 @@
}
}
- private int getMIC(byte []inMsg, int offset, int len,
+ private int getMIC(byte[] inMsg, int offset, int len,
byte[] outBuf, int outOffset,
MessageProp msgProp)
throws GSSException {
@@ -1236,7 +1236,7 @@
getMIC(data, 0, data.length, os, msgProp);
}
- public final void verifyMIC(byte []inTok, int tokOffset, int tokLen,
+ public final void verifyMIC(byte[] inTok, int tokOffset, int tokLen,
byte[] inMsg, int msgOffset, int msgLen,
MessageProp msgProp)
throws GSSException {
@@ -1293,7 +1293,7 @@
* @param os the output token will be written to this stream
* @exception GSSException
*/
- public final byte [] export() throws GSSException {
+ public final byte[] export() throws GSSException {
throw new GSSException(GSSException.UNAVAILABLE, -1,
"GSS Export Context not available");
}
--- a/jdk/src/java.security.jgss/share/classes/sun/security/jgss/spi/GSSContextSpi.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/jgss/spi/GSSContextSpi.java Tue Jul 14 15:26:34 2015 -0700
@@ -265,7 +265,7 @@
/**
* For apps that want simplicity and don't care about buffer copies.
*/
- public byte[] wrap(byte inBuf[], int offset, int len,
+ public byte[] wrap(byte[] inBuf, int offset, int len,
MessageProp msgProp) throws GSSException;
/**
@@ -275,7 +275,7 @@
*
* NOTE: This method is not defined in public class org.ietf.jgss.GSSContext
*
- public int wrap(byte inBuf[], int inOffset, int len,
+ public int wrap(byte[] inBuf, int inOffset, int len,
byte[] outBuf, int outOffset,
MessageProp msgProp) throws GSSException;
@@ -292,7 +292,7 @@
*
* NOTE: This method is not defined in public class org.ietf.jgss.GSSContext
*
- public void wrap(byte inBuf[], int offset, int len,
+ public void wrap(byte[] inBuf, int offset, int len,
OutputStream os, MessageProp msgProp)
throws GSSException;
*/
@@ -314,7 +314,7 @@
/**
* For apps that want simplicity and don't care about buffer copies.
*/
- public byte[] unwrap(byte inBuf[], int offset, int len,
+ public byte[] unwrap(byte[] inBuf, int offset, int len,
MessageProp msgProp) throws GSSException;
/**
@@ -324,7 +324,7 @@
*
* NOTE: This method is not defined in public class org.ietf.jgss.GSSContext
*
- public int unwrap(byte inBuf[], int inOffset, int len,
+ public int unwrap(byte[] inBuf, int inOffset, int len,
byte[] outBuf, int outOffset,
MessageProp msgProp) throws GSSException;
@@ -356,7 +356,7 @@
MessageProp msgProp)
throws GSSException;
- public byte[] getMIC(byte []inMsg, int offset, int len,
+ public byte[] getMIC(byte[] inMsg, int offset, int len,
MessageProp msgProp) throws GSSException;
/**
@@ -372,7 +372,7 @@
public void verifyMIC(InputStream is, InputStream msgStr,
MessageProp mProp) throws GSSException;
- public void verifyMIC(byte []inTok, int tokOffset, int tokLen,
+ public void verifyMIC(byte[] inTok, int tokOffset, int tokLen,
byte[] inMsg, int msgOffset, int msgLen,
MessageProp msgProp) throws GSSException;
--- a/jdk/src/java.security.jgss/share/classes/sun/security/jgss/wrapper/NativeGSSContext.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/jgss/wrapper/NativeGSSContext.java Tue Jul 14 15:26:34 2015 -0700
@@ -372,7 +372,7 @@
}
return cStub.wrap(pContext, data, msgProp);
}
- public void wrap(byte inBuf[], int offset, int len,
+ public void wrap(byte[] inBuf, int offset, int len,
OutputStream os, MessageProp msgProp)
throws GSSException {
try {
--- a/jdk/src/java.security.jgss/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java Tue Jul 14 15:26:34 2015 -0700
@@ -78,7 +78,7 @@
if (DEBUG) err.printStackTrace();
return null;
}
- String gssLibs[] = new String[0];
+ String[] gssLibs = new String[0];
String defaultLib = System.getProperty(LIB_PROP);
if (defaultLib == null || defaultLib.trim().equals("")) {
String osname = System.getProperty("os.name");
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/PrincipalName.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/PrincipalName.java Tue Jul 14 15:26:34 2015 -0700
@@ -568,7 +568,7 @@
temp.putInteger(bint);
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x00), temp);
temp = new DerOutputStream();
- DerValue der[] = new DerValue[nameStrings.length];
+ DerValue[] der = new DerValue[nameStrings.length];
for (int i = 0; i < nameStrings.length; i++) {
der[i] = new KerberosString(nameStrings[i]).toDerValue();
}
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/Authenticator.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/Authenticator.java Tue Jul 14 15:26:34 2015 -0700
@@ -198,7 +198,7 @@
if (authorizationData != null) {
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte) 0x08), authorizationData.asn1Encode()));
}
- DerValue der[] = new DerValue[v.size()];
+ DerValue[] der = new DerValue[v.size()];
v.copyInto(der);
temp = new DerOutputStream();
temp.putSequence(der);
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/AuthorizationData.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/AuthorizationData.java Tue Jul 14 15:26:34 2015 -0700
@@ -120,7 +120,7 @@
*/
public byte[] asn1Encode() throws Asn1Exception, IOException {
DerOutputStream bytes = new DerOutputStream();
- DerValue der[] = new DerValue[entry.length];
+ DerValue[] der = new DerValue[entry.length];
for (int i = 0; i < entry.length; i++) {
der[i] = new DerValue(entry[i].asn1Encode());
}
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/EncAPRepPart.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/EncAPRepPart.java Tue Jul 14 15:26:34 2015 -0700
@@ -151,7 +151,7 @@
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT,
true, (byte) 0x03), temp.toByteArray()));
}
- DerValue der[] = new DerValue[v.size()];
+ DerValue[] der = new DerValue[v.size()];
v.copyInto(der);
temp = new DerOutputStream();
temp.putSequence(der);
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/EncKrbCredPart.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/EncKrbCredPart.java Tue Jul 14 15:26:34 2015 -0700
@@ -129,7 +129,7 @@
subDer = der.getData().getDerValue();
if ((subDer.getTag() & (byte) 0x1F) == (byte) 0x00) {
- DerValue derValues[] = subDer.getData().getSequence(1);
+ DerValue[] derValues = subDer.getData().getSequence(1);
ticketInfo = new KrbCredInfo[derValues.length];
for (int i = 0; i < derValues.length; i++) {
ticketInfo[i] = new KrbCredInfo(derValues[i]);
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/HostAddresses.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/HostAddresses.java Tue Jul 14 15:26:34 2015 -0700
@@ -98,8 +98,8 @@
throw new KrbException(Krb5.KRB_ERR_GENERIC, "Bad name");
String host = components[1];
- InetAddress addr[] = InetAddress.getAllByName(host);
- HostAddress hAddrs[] = new HostAddress[addr.length];
+ InetAddress[] addr = InetAddress.getAllByName(host);
+ HostAddress[] hAddrs = new HostAddress[addr.length];
for (int i = 0; i < addr.length; i++) {
hAddrs[i] = new HostAddress(addr[i]);
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/KDCReqBody.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/KDCReqBody.java Tue Jul 14 15:26:34 2015 -0700
@@ -269,7 +269,7 @@
ticketsTemp.write(DerValue.tag_SequenceOf, temp);
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x0B), ticketsTemp.toByteArray()));
}
- DerValue der[] = new DerValue[v.size()];
+ DerValue[] der = new DerValue[v.size()];
v.copyInto(der);
temp = new DerOutputStream();
temp.putSequence(der);
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/KrbCredInfo.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/KrbCredInfo.java Tue Jul 14 15:26:34 2015 -0700
@@ -172,7 +172,7 @@
}
if (caddr != null)
v.addElement(new DerValue(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x0A), caddr.asn1Encode()));
- DerValue der[] = new DerValue[v.size()];
+ DerValue[] der = new DerValue[v.size()];
v.copyInto(der);
DerOutputStream out = new DerOutputStream();
out.putSequence(der);
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/NetClient.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/NetClient.java Tue Jul 14 15:26:34 2015 -0700
@@ -200,7 +200,7 @@
@Override
public byte[] receive() throws IOException {
- byte ibuf[] = new byte[bufSize];
+ byte[] ibuf = new byte[bufSize];
dgPacketIn = new DatagramPacket(ibuf, ibuf.length);
try {
dgSocket.receive(dgPacketIn);
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/Ticket.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/Ticket.java Tue Jul 14 15:26:34 2015 -0700
@@ -135,7 +135,7 @@
public byte[] asn1Encode() throws Asn1Exception, IOException {
DerOutputStream bytes = new DerOutputStream();
DerOutputStream temp = new DerOutputStream();
- DerValue der[] = new DerValue[4];
+ DerValue[] der = new DerValue[4];
temp.putInteger(BigInteger.valueOf(tkt_vno));
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x00), temp);
bytes.write(DerValue.createTag(DerValue.TAG_CONTEXT, true, (byte)0x01), sname.getRealm().asn1Encode());
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/ccache/CCacheInputStream.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/ccache/CCacheInputStream.java Tue Jul 14 15:26:34 2015 -0700
@@ -357,7 +357,7 @@
if (DEBUG) {
System.out.println(">>>DEBUG <CCacheInputStream> key type: " + key.getEType());
}
- long times[] = readTimes();
+ long[] times = readTimes();
KerberosTime authtime = new KerberosTime(times[0]);
KerberosTime starttime =
(times[1]==0) ? null : new KerberosTime(times[1]);
@@ -374,9 +374,9 @@
((renewTill==null)?"null":renewTill.toDate().toString()));
}
boolean skey = readskey();
- boolean flags[] = readFlags();
+ boolean[] flags = readFlags();
TicketFlags tFlags = new TicketFlags(flags);
- HostAddress addr[] = readAddr();
+ HostAddress[] addr = readAddr();
HostAddresses addrs = null;
if (addr != null) {
addrs = new HostAddresses(addr);
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/crc32.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/crc32.java Tue Jul 14 15:26:34 2015 -0700
@@ -112,7 +112,7 @@
* This version is more efficient than the byte-at-a-time version;
* it avoids data copies and reduces per-byte call overhead.
*/
- protected synchronized void engineUpdate(byte input[], int offset,
+ protected synchronized void engineUpdate(byte[] input, int offset,
int len) {
processData(input, offset, len);
}
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/ssl/KerberosPreMasterSecret.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/ssl/KerberosPreMasterSecret.java Tue Jul 14 15:26:34 2015 -0700
@@ -53,8 +53,8 @@
final class KerberosPreMasterSecret {
private ProtocolVersion protocolVersion; // preMaster [0,1]
- private byte preMaster[]; // 48 bytes
- private byte encrypted[];
+ private byte[] preMaster; // 48 bytes
+ private byte[] encrypted;
/**
* Constructor used by client to generate premaster secret.
--- a/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/ClientFactoryImpl.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/ClientFactoryImpl.java Tue Jul 14 15:26:34 2015 -0700
@@ -47,13 +47,13 @@
* @author Rosanna Lee
*/
final public class ClientFactoryImpl implements SaslClientFactory {
- private static final String myMechs[] = {
+ private static final String[] myMechs = {
"EXTERNAL",
"CRAM-MD5",
"PLAIN",
};
- private static final int mechPolicies[] = {
+ private static final int[] mechPolicies = {
// %%% RL: Policies should actually depend on the external channel
PolicyUtils.NOPLAINTEXT|PolicyUtils.NOACTIVE|PolicyUtils.NODICTIONARY,
PolicyUtils.NOPLAINTEXT|PolicyUtils.NOANONYMOUS, // CRAM-MD5
--- a/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/CramMD5Server.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/CramMD5Server.java Tue Jul 14 15:26:34 2015 -0700
@@ -165,7 +165,7 @@
PasswordCallback pcb =
new PasswordCallback("CRAM-MD5 password: ", false);
cbh.handle(new Callback[]{ncb,pcb});
- char pwChars[] = pcb.getPassword();
+ char[] pwChars = pcb.getPassword();
if (pwChars == null || pwChars.length == 0) {
// user has no password; OK to disclose to server
aborted = true;
@@ -190,7 +190,7 @@
clearPassword();
// Check whether digest is as expected
- byte [] expectedDigest = digest.getBytes("UTF8");
+ byte[] expectedDigest = digest.getBytes("UTF8");
int digestLen = responseData.length - ulen - 1;
if (expectedDigest.length != digestLen) {
aborted = true;
--- a/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/ServerFactoryImpl.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/ServerFactoryImpl.java Tue Jul 14 15:26:34 2015 -0700
@@ -41,11 +41,11 @@
* @author Rosanna Lee
*/
final public class ServerFactoryImpl implements SaslServerFactory {
- private static final String myMechs[] = {
+ private static final String[] myMechs = {
"CRAM-MD5", //
};
- private static final int mechPolicies[] = {
+ private static final int[] mechPolicies = {
PolicyUtils.NOPLAINTEXT|PolicyUtils.NOANONYMOUS, // CRAM-MD5
};
--- a/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/digest/DigestMD5Base.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/digest/DigestMD5Base.java Tue Jul 14 15:26:34 2015 -0700
@@ -272,7 +272,7 @@
*/
/** This array maps the characters to their 6 bit values */
- private final static char pem_array[] = {
+ private final static char[] pem_array = {
// 0 1 2 3 4 5 6 7
'A','B','C','D','E','F','G','H', // 0
'I','J','K','L','M','N','O','P', // 1
@@ -1068,7 +1068,7 @@
byte[] hMAC_MD5 = m.doFinal();
/* First 10 bytes of HMAC_MD5 digest */
- byte macBuffer[] = new byte[10];
+ byte[] macBuffer = new byte[10];
System.arraycopy(hMAC_MD5, 0, macBuffer, 0, 10);
return macBuffer;
--- a/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/digest/FactoryImpl.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/digest/FactoryImpl.java Tue Jul 14 15:26:34 2015 -0700
@@ -44,9 +44,9 @@
public final class FactoryImpl implements SaslClientFactory,
SaslServerFactory{
- private static final String myMechs[] = { "DIGEST-MD5" };
+ private static final String[] myMechs = { "DIGEST-MD5" };
private static final int DIGEST_MD5 = 0;
- private static final int mechPolicies[] = {
+ private static final int[] mechPolicies = {
PolicyUtils.NOPLAINTEXT|PolicyUtils.NOANONYMOUS};
/**
--- a/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/ntlm/FactoryImpl.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/ntlm/FactoryImpl.java Tue Jul 14 15:26:34 2015 -0700
@@ -43,8 +43,8 @@
public final class FactoryImpl implements SaslClientFactory,
SaslServerFactory{
- private static final String myMechs[] = { "NTLM" };
- private static final int mechPolicies[] = {
+ private static final String[] myMechs = { "NTLM" };
+ private static final int[] mechPolicies = {
PolicyUtils.NOPLAINTEXT|PolicyUtils.NOANONYMOUS
};
--- a/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/KeyStore.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/KeyStore.java Tue Jul 14 15:26:34 2015 -0700
@@ -66,7 +66,7 @@
class KeyEntry
{
private Key privateKey;
- private X509Certificate certChain[];
+ private X509Certificate[] certChain;
private String alias;
KeyEntry(Key key, X509Certificate[] chain) {
--- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Cipher.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Cipher.java Tue Jul 14 15:26:34 2015 -0700
@@ -175,7 +175,7 @@
this.algorithm = algorithm;
this.mechanism = mechanism;
- String algoParts[] = algorithm.split("/");
+ String[] algoParts = algorithm.split("/");
if (algoParts[0].startsWith("AES")) {
blockSize = 16;
--- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11KeyStore.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11KeyStore.java Tue Jul 14 15:26:34 2015 -0700
@@ -164,7 +164,7 @@
private X509Certificate cert = null;
// chain
- private X509Certificate chain[] = null;
+ private X509Certificate[] chain = null;
// true if CKA_ID for private key and cert match up
private boolean matched = false;
--- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/wrapper/CK_AES_CTR_PARAMS.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/wrapper/CK_AES_CTR_PARAMS.java Tue Jul 14 15:26:34 2015 -0700
@@ -42,7 +42,7 @@
public class CK_AES_CTR_PARAMS {
private final long ulCounterBits;
- private final byte cb[];
+ private final byte[] cb;
public CK_AES_CTR_PARAMS(byte[] cb) {
ulCounterBits = 128;
--- a/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/UcryptoException.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/UcryptoException.java Tue Jul 14 15:26:34 2015 -0700
@@ -40,7 +40,7 @@
private static final long serialVersionUID = -933864511110035746L;
// NOTE: check /usr/include/sys/crypto/common.h for updates
- private static final String ERROR_MSG[] = {
+ private static final String[] ERROR_MSG = {
"CRYPTO_SUCCESS",
"CRYPTO_CANCEL",
"CRYPTO_HOST_MEMORY",
--- a/jdk/src/jdk.security.auth/share/classes/com/sun/security/auth/module/Crypt.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/jdk.security.auth/share/classes/com/sun/security/auth/module/Crypt.java Tue Jul 14 15:26:34 2015 -0700
@@ -377,7 +377,7 @@
*
*/
- public static void main(String arg[]) {
+ public static void main(String[] arg) {
if (arg.length!=2) {
System.err.println("usage: Crypt password salt");
@@ -386,7 +386,7 @@
Crypt c = new Crypt();
try {
- byte result[] = c.crypt
+ byte[] result = c.crypt
(arg[0].getBytes("ISO-8859-1"), arg[1].getBytes("ISO-8859-1"));
for (int i=0; i<result.length; i++) {
System.out.println(" "+i+" "+(char)result[i]);
--- a/jdk/src/jdk.security.auth/share/classes/com/sun/security/auth/module/JndiLoginModule.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/jdk.security.auth/share/classes/com/sun/security/auth/module/JndiLoginModule.java Tue Jul 14 15:26:34 2015 -0700
@@ -729,8 +729,8 @@
Crypt c = new Crypt();
try {
- byte oldCrypt[] = encryptedPassword.getBytes("UTF8");
- byte newCrypt[] = c.crypt(password.getBytes("UTF8"),
+ byte[] oldCrypt = encryptedPassword.getBytes("UTF8");
+ byte[] newCrypt = c.crypt(password.getBytes("UTF8"),
oldCrypt);
if (newCrypt.length != oldCrypt.length)
return false;
--- a/jdk/src/jdk.security.auth/share/classes/com/sun/security/auth/module/Krb5LoginModule.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/jdk.security.auth/share/classes/com/sun/security/auth/module/Krb5LoginModule.java Tue Jul 14 15:26:34 2015 -0700
@@ -122,8 +122,9 @@
* must also be set to true; Otherwise a configuration error will
* be returned.</dd>
* <dt>{@code renewTGT}:</dt>
- * <dd>Set this to true, if you want to renew
- * the TGT. If this is set, {@code useTicketCache} must also be
+ * <dd>Set this to true, if you want to renew the TGT when it's more than
+ * half-way expired (the time until expiration is less than the time
+ * since start time). If this is set, {@code useTicketCache} must also be
* set to true; otherwise a configuration error will be returned.</dd>
* <dt>{@code doNotPrompt}:</dt>
* <dd>Set this to true if you do not want to be
@@ -649,17 +650,19 @@
(principal, ticketCacheName);
if (cred != null) {
- // check to renew credentials
+ if (renewTGT && isOld(cred)) {
+ // renew if ticket is old.
+ Credentials newCred = renewCredentials(cred);
+ if (newCred != null) {
+ cred = newCred;
+ }
+ }
if (!isCurrent(cred)) {
- if (renewTGT) {
- cred = renewCredentials(cred);
- } else {
- // credentials have expired
- cred = null;
- if (debug)
- System.out.println("Credentials are" +
- " no longer valid");
- }
+ // credentials have expired
+ cred = null;
+ if (debug)
+ System.out.println("Credentials are" +
+ " no longer valid");
}
}
@@ -968,7 +971,7 @@
}
}
- private boolean isCurrent(Credentials creds)
+ private static boolean isCurrent(Credentials creds)
{
Date endTime = creds.getEndTime();
if (endTime != null) {
@@ -977,6 +980,23 @@
return true;
}
+ private static boolean isOld(Credentials creds)
+ {
+ Date endTime = creds.getEndTime();
+ if (endTime != null) {
+ Date authTime = creds.getAuthTime();
+ long now = System.currentTimeMillis();
+ if (authTime != null) {
+ // pass the mid between auth and end
+ return now - authTime.getTime() > endTime.getTime() - now;
+ } else {
+ // will expire in less than 2 hours
+ return now <= endTime.getTime() - 1000*3600*2L;
+ }
+ }
+ return false;
+ }
+
private Credentials renewCredentials(Credentials creds)
{
Credentials lcreds;
--- a/jdk/src/jdk.security.auth/share/classes/com/sun/security/auth/module/NTLoginModule.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/jdk.security.auth/share/classes/com/sun/security/auth/module/NTLoginModule.java Tue Jul 14 15:26:34 2015 -0700
@@ -81,7 +81,7 @@
private NTDomainPrincipal userDomain; // user domain
private NTSidDomainPrincipal domainSID; // domain SID
private NTSidPrimaryGroupPrincipal primaryGroup; // primary group
- private NTSidGroupPrincipal groups[]; // supplementary groups
+ private NTSidGroupPrincipal[] groups; // supplementary groups
private NTNumericCredential iToken; // impersonation token
/**
@@ -194,7 +194,7 @@
if (ntSystem.getGroupIDs() != null &&
ntSystem.getGroupIDs().length > 0) {
- String groupSIDs[] = ntSystem.getGroupIDs();
+ String[] groupSIDs = ntSystem.getGroupIDs();
groups = new NTSidGroupPrincipal[groupSIDs.length];
for (int i = 0; i < groupSIDs.length; i++) {
groups[i] = new NTSidGroupPrincipal(groupSIDs[i]);
--- a/jdk/src/jdk.security.auth/share/classes/com/sun/security/auth/module/NTSystem.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/jdk.security.auth/share/classes/com/sun/security/auth/module/NTSystem.java Tue Jul 14 15:26:34 2015 -0700
@@ -40,7 +40,7 @@
private String domain;
private String domainSID;
private String userSID;
- private String groupIDs[];
+ private String[] groupIDs;
private String primaryGroupID;
private long impersonationToken;
--- a/jdk/src/jdk.security.jgss/share/classes/com/sun/security/sasl/gsskerb/FactoryImpl.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/src/jdk.security.jgss/share/classes/com/sun/security/sasl/gsskerb/FactoryImpl.java Tue Jul 14 15:26:34 2015 -0700
@@ -38,10 +38,10 @@
* @author Rosanna Lee
*/
public final class FactoryImpl implements SaslClientFactory, SaslServerFactory {
- private static final String myMechs[] = {
+ private static final String[] myMechs = {
"GSSAPI"};
- private static final int mechPolicies[] = {
+ private static final int[] mechPolicies = {
PolicyUtils.NOPLAINTEXT|PolicyUtils.NOANONYMOUS|PolicyUtils.NOACTIVE
};
--- a/jdk/test/ProblemList.txt Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/test/ProblemList.txt Tue Jul 14 15:26:34 2015 -0700
@@ -298,6 +298,9 @@
# 8051770
sun/security/provider/SecureRandom/StrongSecureRandom.java macosx-10.10
+# 8074580
+sun/security/pkcs11/rsa/TestKeyPairGenerator.java generic-all
+
############################################################################
# jdk_sound
--- a/jdk/test/java/lang/ProcessHandle/InfoTest.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/test/java/lang/ProcessHandle/InfoTest.java Tue Jul 14 15:26:34 2015 -0700
@@ -32,24 +32,24 @@
import java.nio.file.attribute.UserPrincipal;
import java.time.Duration;
import java.time.Instant;
-import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Random;
-import java.util.Scanner;
-import java.util.StringTokenizer;
import java.util.concurrent.TimeUnit;
import jdk.testlibrary.Platform;
+import jdk.testlibrary.Utils;
+
import org.testng.Assert;
import org.testng.annotations.Test;
import org.testng.TestNG;
/*
* @test
+ * @build jdk.testlibrary.*
* @library /lib/testlibrary
* @summary Functions of ProcessHandle.Info
* @author Roger Riggs
@@ -91,16 +91,16 @@
"test runner is included.");
ProcessHandle self = ProcessHandle.current();
- Duration somecpu = Duration.ofMillis(200L);
- Instant end = Instant.now().plus(somecpu);
+ Duration someCPU = Duration.ofMillis(200L);
+ Instant end = Instant.now().plus(someCPU);
while (Instant.now().isBefore(end)) {
// waste the cpu
}
ProcessHandle.Info info = self.info();
System.out.printf(" info: %s%n", info);
Optional<Duration> totalCpu = info.totalCpuDuration();
- if (totalCpu.isPresent() && (totalCpu.get().compareTo(somecpu) < 0)) {
- Assert.fail("reported cputime less than expected: " + somecpu + ", " +
+ if (totalCpu.isPresent() && (totalCpu.get().compareTo(someCPU) < 0)) {
+ Assert.fail("reported cputime less than expected: " + someCPU + ", " +
"actual: " + info.totalCpuDuration());
}
}
@@ -111,17 +111,16 @@
@Test
public static void test2() {
try {
- long cpulooptime = 1 << 8;
+ long cpuLoopTime = 100; // 100 ms
String[] extraArgs = {"pid", "parent", "stdin"};
- Instant beforeStart = Instant.now().truncatedTo(ChronoUnit.SECONDS);
JavaChild p1 = JavaChild.spawnJavaChild((Object[])extraArgs);
Instant afterStart = Instant.now();
try (BufferedReader lines = p1.outputReader()) {
Duration lastCpu = Duration.ofMillis(0L);
- for (int j = 0; j < 20; j++) {
+ for (int j = 0; j < 10; j++) {
- p1.sendAction("cpuloop", cpulooptime);
+ p1.sendAction("cpuloop", cpuLoopTime);
p1.sendAction("cputime", "");
// Read cputime from child
@@ -187,17 +186,21 @@
if (info.totalCpuDuration().isPresent()) {
Duration totalCPU = info.totalCpuDuration().get();
Duration epsilon = Duration.ofMillis(200L);
- Assert.assertTrue(totalCPU.toNanos() > 0L,
- "total cpu time expected > 0ms, actual: " + totalCPU);
- Assert.assertTrue(totalCPU.toNanos() < lastCpu.toNanos() + 10_000_000_000L,
- "total cpu time expected < 10s more than previous iteration, actual: " + totalCPU);
if (childCpuTime != null) {
System.out.printf(" info.totalCPU: %s, childCpuTime: %s, diff: %s%n",
- totalCPU.toNanos(), childCpuTime.toNanos(), childCpuTime.toNanos() - totalCPU.toNanos());
+ totalCPU.toNanos(), childCpuTime.toNanos(),
+ childCpuTime.toNanos() - totalCPU.toNanos());
Assert.assertTrue(checkEpsilon(childCpuTime, totalCPU, epsilon),
childCpuTime + " should be within " +
epsilon + " of " + totalCPU);
}
+ Assert.assertTrue(totalCPU.toNanos() > 0L,
+ "total cpu time expected > 0ms, actual: " + totalCPU);
+ long t = Utils.adjustTimeout(10L); // Adjusted timeout seconds
+ Assert.assertTrue(totalCPU.toNanos() < lastCpu.toNanos() + t * 1_000_000_000L,
+ "total cpu time expected < " + t
+ + " seconds more than previous iteration, actual: "
+ + (totalCPU.toNanos() - lastCpu.toNanos()));
lastCpu = totalCPU;
}
@@ -209,7 +212,7 @@
}
}
}
- p1.waitFor(5, TimeUnit.SECONDS);
+ p1.waitFor(Utils.adjustTimeout(5), TimeUnit.SECONDS);
} catch (IOException | InterruptedException ie) {
ie.printStackTrace(System.out);
Assert.fail("unexpected exception", ie);
@@ -252,7 +255,7 @@
Assert.assertTrue(p.waitFor(15, TimeUnit.SECONDS));
}
} catch (IOException | InterruptedException ex) {
- ex.printStackTrace(System.out);;
+ ex.printStackTrace(System.out);
} finally {
// Destroy any children that still exist
ProcessUtil.destroyProcessTree(ProcessHandle.current());
@@ -274,7 +277,7 @@
if (dur1.isPresent() && dur2.isPresent()) {
Duration total1 = dur1.get();
- Duration total2 = dur2.get(); ;
+ Duration total2 = dur2.get();
System.out.printf(" total1 vs. mbean: %s, getProcessCpuTime: %s, diff: %s%n",
Objects.toString(total1), myCputime1, myCputime1.minus(total1));
System.out.printf(" total2 vs. mbean: %s, getProcessCpuTime: %s, diff: %s%n",
@@ -326,7 +329,7 @@
* @param d1 a Duration - presumed to be shorter
* @param d2 a 2nd Duration - presumed to be greater (or within Epsilon)
* @param epsilon Epsilon the amount of overlap allowed
- * @return
+ * @return true if d2 is greater than d1 or within epsilon, false otherwise
*/
static boolean checkEpsilon(Duration d1, Duration d2, Duration epsilon) {
if (d1.toNanos() <= d2.toNanos()) {
@@ -339,7 +342,7 @@
/**
* Spawn a native process with the provided arguments.
* @param command the executable of native process
- * @args
+ * @param args to start a new process
* @return the Process that was started
* @throws IOException thrown by ProcessBuilder.start
*/
--- a/jdk/test/java/lang/ProcessHandle/JavaChild.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/test/java/lang/ProcessHandle/JavaChild.java Tue Jul 14 15:26:34 2015 -0700
@@ -281,12 +281,12 @@
sendResult(action, Integer.toString(millis));
break;
case "cpuloop":
- long times = Long.valueOf(args[nextArg++]);
- Instant end = Instant.now().plusMillis(times);
- while (Instant.now().isBefore(end)) {
- // burn the cpu til the time is up
+ long cpuMillis = Long.valueOf(args[nextArg++]);
+ long cpuTarget = getCpuTime() + cpuMillis * 1_000_000L;
+ while (getCpuTime() < cpuTarget) {
+ // burn the cpu until the time is up
}
- sendResult(action, times);
+ sendResult(action, cpuMillis);
break;
case "cputime":
sendResult(action, getCpuTime());
--- a/jdk/test/java/lang/ProcessHandle/OnExitTest.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/test/java/lang/ProcessHandle/OnExitTest.java Tue Jul 14 15:26:34 2015 -0700
@@ -27,16 +27,19 @@
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
-import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException;
+
+import jdk.testlibrary.Utils;
+
import org.testng.annotations.Test;
import org.testng.Assert;
import org.testng.TestNG;
/*
* @test
+ * @build jdk.testlibrary.Utils
* @summary Functions of Process.onExit and ProcessHandle.onExit
* @author Roger Riggs
*/
@@ -88,6 +91,7 @@
*/
@Test
public static void test2() {
+ ProcessHandle procHandle = null;
try {
ConcurrentHashMap<ProcessHandle, ProcessHandle> processes = new ConcurrentHashMap<>();
List<ProcessHandle> children = getChildren(ProcessHandle.current());
@@ -96,7 +100,7 @@
"Expected to start with zero children; " + children);
JavaChild proc = JavaChild.spawnJavaChild("stdin");
- ProcessHandle procHandle = proc.toHandle();
+ procHandle = proc.toHandle();
printf(" spawned: %d%n", proc.getPid());
proc.forEachOutputLine((s) -> {
@@ -114,7 +118,8 @@
// Poll until all 9 child processes exist or the timeout is reached
int expected = 9;
- Instant endTimeout = Instant.now().plusSeconds(10L);
+ long timeout = Utils.adjustTimeout(10L);
+ Instant endTimeout = Instant.now().plusSeconds(timeout);
do {
Thread.sleep(200L);
printf(" subprocess count: %d, waiting for %d%n", processes.size(), expected);
@@ -123,16 +128,17 @@
children = getAllChildren(procHandle);
- ArrayBlockingQueue<ProcessHandle> completions = new ArrayBlockingQueue<>(expected + 1);
+ ConcurrentHashMap<ProcessHandle, CompletableFuture<ProcessHandle>> completions =
+ new ConcurrentHashMap<>();
Instant startTime = Instant.now();
// Create a future for each of the 9 children
processes.forEach( (p, parent) -> {
- p.onExit().whenComplete((ph, ex) -> {
+ CompletableFuture<ProcessHandle> cf = p.onExit().whenComplete((ph, ex) -> {
Duration elapsed = Duration.between(startTime, Instant.now());
- completions.add(ph);
printf("whenComplete: pid: %s, exception: %s, thread: %s, elapsed: %s%n",
ph, ex, Thread.currentThread(), elapsed);
});
+ completions.put(p, cf);
});
// Check that each of the spawned processes is included in the children
@@ -153,20 +159,23 @@
proc.destroy(); // kill off the parent
proc.waitFor();
- // Wait for all the processes to be completed
+ // Wait for all the processes and corresponding onExit CF to be completed
processes.forEach((p, parent) -> {
try {
p.onExit().get();
+ completions.get(p).join();
} catch (InterruptedException | ExecutionException ex) {
// ignore
}
});
- // Verify that all 9 exit handlers were called
- processes.forEach((p, parent) ->
- Assert.assertTrue(completions.contains(p), "Child onExit not called: " + p
- + ", parent: " + parent
- + ": " + p.info()));
+ // Verify that all 9 exit handlers were called with the correct ProcessHandle
+ processes.forEach((p, parent) -> {
+ ProcessHandle value = completions.get(p).getNow(null);
+ Assert.assertEquals(p, value, "onExit.get value expected: " + p
+ + ", actual: " + value
+ + ": " + p.info());
+ });
// Show the status of the original children
children.forEach(p -> printProcess(p, "after onExit:"));
@@ -176,13 +185,12 @@
List<ProcessHandle> children2 = getAllChildren(procHandle);
printf(" children2: %s%n", children2.toString());
Assert.assertEquals(children2.size(), 0, "After onExit, expected no children");
-
- Assert.assertEquals(remaining.size(), 0, "Unaccounted for children");
-
} catch (IOException | InterruptedException ex) {
Assert.fail(ex.getMessage());
} finally {
- destroyProcessTree(ProcessHandle.current());
+ if (procHandle != null) {
+ destroyProcessTree(procHandle);
+ }
}
}
--- a/jdk/test/java/lang/ProcessHandle/TreeTest.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/test/java/lang/ProcessHandle/TreeTest.java Tue Jul 14 15:26:34 2015 -0700
@@ -75,10 +75,12 @@
spawned.add(JavaChild.spawnJavaChild("pid", "stdin"));
}
- List<ProcessHandle> subprocesses = getChildren(self);
- subprocesses.forEach(ProcessUtil::printProcess);
- count = subprocesses.size();
- Assert.assertEquals(count, MAXCHILDREN, "Wrong number of spawned children");
+ // Verify spawned Process is in list of children
+ final List<ProcessHandle> initialChildren = getChildren(self);
+ spawned.stream()
+ .map(Process::toHandle)
+ .filter(p -> !initialChildren.contains(p))
+ .forEach(p -> Assert.fail("Spawned process missing from children: " + p));
// Send exit command to each spawned Process
spawned.forEach(p -> {
@@ -102,20 +104,25 @@
});
// Verify that ProcessHandle.isAlive sees each of them as not alive
- for (ProcessHandle ph : subprocesses) {
+ for (Process p : spawned) {
+ ProcessHandle ph = p.toHandle();
Assert.assertFalse(ph.isAlive(),
"ProcessHandle.isAlive for exited process: " + ph);
}
- // Verify no current children are visible
- count = getChildren(self).size();
- Assert.assertEquals(count, 0, "Children destroyed, should be zero");
+ // Verify spawned processes are not visible as children
+ final List<ProcessHandle> afterChildren = getChildren(self);
+ spawned.stream()
+ .map(Process::toHandle)
+ .filter(p -> afterChildren.contains(p))
+ .forEach(p -> Assert.fail("Spawned process missing from children: " + p));
} catch (IOException ioe) {
Assert.fail("unable to spawn process", ioe);
} finally {
// Cleanup any left over processes
- spawned.stream().map(Process::toHandle)
+ spawned.stream()
+ .map(Process::toHandle)
.filter(ProcessHandle::isAlive)
.forEach(ph -> printDeep(ph, "test1 cleanup: "));
destroyProcessTree(ProcessHandle.current());
@@ -127,7 +134,6 @@
*/
@Test
public static void test2() {
- ProcessHandle p1Handle = null;
try {
ProcessHandle self = ProcessHandle.current();
List<ProcessHandle> initialChildren = getChildren(self);
@@ -138,7 +144,7 @@
}
JavaChild p1 = JavaChild.spawnJavaChild("stdin");
- p1Handle = p1.toHandle();
+ ProcessHandle p1Handle = p1.toHandle();
printf(" p1 pid: %d%n", p1.getPid());
int spawnNew = 3;
@@ -187,9 +193,6 @@
throw new RuntimeException(t);
} finally {
// Cleanup any left over processes
- if (p1Handle.isAlive()) {
- printDeep(p1Handle, "test2 cleanup: ");
- }
destroyProcessTree(ProcessHandle.current());
}
}
@@ -205,7 +208,10 @@
JavaChild p1 = JavaChild.spawnJavaChild("stdin");
ProcessHandle p1Handle = p1.toHandle();
printf(" p1: %s%n", p1.getPid());
- long count = getChildren(self).size();
+
+ List<ProcessHandle> subprocesses = getChildren(self);
+ subprocesses.forEach(ProcessUtil::printProcess);
+ long count = subprocesses.size();
Assert.assertEquals(count, 1, "Wrong number of spawned children");
int newChildren = 3;
@@ -213,7 +219,7 @@
p1.sendAction("spawn", newChildren, "stdin");
// Wait for the new processes and save the list
- List<ProcessHandle> subprocesses = waitForAllChildren(p1Handle, newChildren);
+ subprocesses = waitForAllChildren(p1Handle, newChildren);
printDeep(p1Handle, "allChildren");
Assert.assertEquals(subprocesses.size(), newChildren, "Wrong number of children");
@@ -249,6 +255,9 @@
Assert.fail("Spawn of subprocess failed", ioe);
} catch (InterruptedException inte) {
Assert.fail("InterruptedException", inte);
+ } finally {
+ // Cleanup any left over processes
+ destroyProcessTree(ProcessHandle.current());
}
}
@@ -299,16 +308,15 @@
}
/**
- * A test for scale; launch a large number (39) of subprocesses.
+ * A test for scale; launch a large number (14) of subprocesses.
*/
@Test
public static void test5() {
int factor = 2;
- ProcessHandle p1Handle = null;
Instant start = Instant.now();
try {
JavaChild p1 = JavaChild.spawnJavaChild("stdin");
- p1Handle = p1.toHandle();
+ ProcessHandle p1Handle = p1.toHandle();
printf("Spawning %d x %d x %d processes, pid: %d%n",
factor, factor, factor, p1.getPid());
@@ -325,18 +333,14 @@
int newChildren = factor * (1 + factor * (1 + factor));
List<ProcessHandle> children = ProcessUtil.waitForAllChildren(p1Handle, newChildren);
- Assert.assertEquals(p1.children()
- .filter(ProcessUtil::isNotWindowsConsole)
- .count(), factor, "expected direct children");
- Assert.assertEquals(p1.allChildren()
- .filter(ProcessUtil::isNotWindowsConsole)
- .count(),
- factor * factor * factor + factor * factor + factor,
- "expected all children");
+ Assert.assertEquals(getChildren(p1Handle).size(),
+ factor, "expected direct children");
+ long count = getAllChildren(p1Handle).size();
+ long totalChildren = factor * factor * factor + factor * factor + factor;
+ Assert.assertTrue(count >= totalChildren,
+ "expected at least " + totalChildren + ", actual: " + count);
- List<ProcessHandle> subprocesses = p1.allChildren()
- .filter(ProcessUtil::isNotWindowsConsole)
- .collect(Collectors.toList());
+ List<ProcessHandle> subprocesses = getAllChildren(p1Handle);
printf(" allChildren: %s%n",
subprocesses.stream().map(p -> p.getPid())
.collect(Collectors.toList()));
@@ -347,10 +351,6 @@
Assert.fail("Unexpected Exception", ex);
} finally {
printf("Duration: %s%n", Duration.between(start, Instant.now()));
- // Cleanup any left over processes
- if (p1Handle.isAlive()) {
- printDeep(p1Handle, "test5 cleanup: ");
- }
destroyProcessTree(ProcessHandle.current());
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/URLConnection/ContentHandlers/ContentHandlersTest.java Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,371 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.SequenceInputStream;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static java.lang.String.format;
+import static java.util.Arrays.asList;
+import static java.util.Collections.emptyMap;
+import static java.util.Collections.singleton;
+import static java.util.Collections.singletonMap;
+
+/*
+ * @test
+ * @bug 8064925
+ * @summary Basic test for ContentHandler. Ensures discovery paths for content
+ * handlers follow a particular order.
+ */
+public class ContentHandlersTest {
+
+ public static void main(String[] args) throws Throwable {
+ step1_ContentHandlerFactory();
+ step2_ServiceLoader();
+ step3_UserDefined();
+ step4_BuiltIn();
+ }
+
+ private static void step1_ContentHandlerFactory() throws IOException {
+ String factoryClassFqn = "net.java.openjdk.test.TestContentHandlerFactory";
+
+ Path tmp = Files.createDirectory(Paths.get("ContentHandlersTest-1"));
+
+ Path src = templatesHome().resolve("test.template");
+ Path dst = tmp.resolve("Test.java");
+ Files.copy(src, dst);
+
+ Path build = Files.createDirectory(tmp.resolve("build"));
+
+ Path dst1 = fromTemplate(templatesHome().resolve("broken_factory.template"),
+ factoryClassFqn, tmp);
+
+ javac(build, dst, dst1);
+
+ Result r = java(emptyMap(), singleton(build), "Test", factoryClassFqn);
+
+ if (r.exitValue == 0 || !r.output.startsWith(
+ stackTraceStringForBrokenFactory(factoryClassFqn))) {
+ throw new RuntimeException(
+ "Expected a different kind of failure: " + r.output);
+ }
+ }
+
+ private static void step2_ServiceLoader() throws IOException {
+ String factoryClassFqn = "net.java.openjdk.test.TestContentHandlerFactory";
+
+ Path tmp = Files.createDirectory(Paths.get("ContentHandlersTest-2"));
+
+ Path src = templatesHome().resolve("test.template");
+ Path dst = tmp.resolve("Test.java");
+ Files.copy(src, dst);
+
+ Path dst1 = fromTemplate(templatesHome().resolve("broken_constructor_factory.template"),
+ factoryClassFqn, tmp);
+
+ Path build = Files.createDirectory(tmp.resolve("build"));
+
+ javac(build, dst);
+
+ Path explodedJar = Files.createDirectory(tmp.resolve("exploded-jar"));
+ Path services = Files.createDirectories(explodedJar.resolve("META-INF")
+ .resolve("services"));
+
+ Path s = services.resolve("java.net.ContentHandlerFactory");
+
+ try (FileWriter fw = new FileWriter(s.toFile())) {
+ fw.write(factoryClassFqn);
+ }
+
+ javac(explodedJar, dst1);
+ jar(tmp.resolve("test.jar"), explodedJar);
+
+ Files.copy(tmp.resolve("test.jar"), build.resolve("test.jar"));
+
+ Result r = java(emptyMap(), asList(build.resolve("test.jar"), build), "Test");
+
+ if (r.exitValue == 0 || !verifyOutput(r.output, factoryClassFqn))
+ throw new RuntimeException(r.output);
+ }
+
+ private static void step3_UserDefined() throws IOException {
+ String packagePrefix = "net.java.openjdk.test";
+ String fqn = packagePrefix + ".text.plain";
+
+ Path tmp = Files.createDirectory(Paths.get("ContentHandlersTest-3"));
+
+ Path src = templatesHome().resolve("test.template");
+ Path dst = tmp.resolve("Test.java");
+ Files.copy(src, dst);
+
+ Path dst1 = fromTemplate(templatesHome().resolve("plain.template"),
+ fqn, tmp);
+
+ Path build = Files.createDirectory(tmp.resolve("build"));
+
+ javac(build, dst);
+
+ Path classes = Files.createDirectory(tmp.resolve("classes"));
+
+ javac(classes, dst1);
+
+ Map<String, String> m = singletonMap("java.content.handler.pkgs", packagePrefix);
+ Result r = java(m, asList(build, classes), "Test");
+
+ if (r.exitValue != 0 || !r.output.contains(fqn))
+ throw new RuntimeException(r.output);
+ }
+
+ private static void step4_BuiltIn() throws IOException {
+ Path tmp = Files.createDirectory(Paths.get("ContentHandlersTest-4"));
+
+ Path src = templatesHome().resolve("test.template");
+ Path dst = tmp.resolve("Test.java");
+ Files.copy(src, dst);
+
+ Path build = Files.createDirectory(tmp.resolve("build"));
+
+ javac(build, dst);
+
+ Result r = java(emptyMap(), singleton(build), "Test");
+
+ if (r.exitValue != 0 || !r.output.contains("sun.net.www.content.text.PlainTextInputStream"))
+ throw new RuntimeException(r.output);
+ }
+
+ private static String stackTraceStringForBrokenFactory(String fqn) {
+ return "Exception in thread \"main\" java.lang.RuntimeException: " +
+ "This is a broken factory. It is supposed to throw this exception.";
+ }
+
+ private static Path fromTemplate(Path srcTemplate,
+ String factoryFqn,
+ Path dstFolder) throws IOException {
+
+ String factorySimpleName, packageName;
+ int i = factoryFqn.lastIndexOf('.');
+ if (i < 0) {
+ packageName = "";
+ factorySimpleName = factoryFqn;
+ } else {
+ packageName = factoryFqn.substring(0, i);
+ factorySimpleName = factoryFqn.substring(i + 1);
+ }
+
+ Path result = dstFolder.resolve(factorySimpleName + ".java");
+ File dst = result.toFile();
+ File src = srcTemplate.toFile();
+ try (BufferedReader r = new BufferedReader(new FileReader(src));
+ BufferedWriter w = new BufferedWriter(new FileWriter(dst))) {
+
+ List<String> lines = processTemplate(packageName, factorySimpleName,
+ r.lines()).collect(Collectors.toList());
+
+ Iterator<String> it = lines.iterator();
+ if (it.hasNext())
+ w.write(it.next());
+ while (it.hasNext()) {
+ w.newLine();
+ w.write(it.next());
+ }
+ }
+ return result;
+ }
+
+ private static Stream<String> processTemplate(String packageName,
+ String factorySimpleName,
+ Stream<String> lines) {
+ Function<String, String> pckg;
+
+ if (packageName.isEmpty()) {
+ pckg = s -> s.contains("$package") ? "" : s;
+ } else {
+ pckg = s -> s.replaceAll("\\$package", packageName);
+ }
+
+ Function<String, String> factory
+ = s -> s.replaceAll("\\$className", factorySimpleName);
+
+ return lines.map(pckg).map(factory);
+ }
+
+ // IMO, that's the easiest way that gives you a fair amount of confidence in
+ // that j.u.ServiceLoader is loading a factory rather than Class.forName
+ private static boolean verifyOutput(String output, String fqn) {
+ String s1 = String.format("java.util.ServiceConfigurationError: " +
+ "java.net.ContentHandlerFactory: " +
+ "Provider %s could not be instantiated", fqn);
+
+ return output.contains(s1);
+ }
+
+ private static void jar(Path jarName, Path jarRoot) {
+ String jar = getJDKTool("jar");
+ ProcessBuilder p = new ProcessBuilder(jar, "cf", jarName.toString(),
+ "-C", jarRoot.toString(), ".");
+ quickFail(run(p));
+ }
+
+ private static void javac(Path compilationOutput, Path... sourceFiles) {
+ String javac = getJDKTool("javac");
+ List<String> commands = new ArrayList<>();
+ commands.addAll(asList(javac, "-d", compilationOutput.toString()));
+ List<Path> paths = asList(sourceFiles);
+ commands.addAll(paths.stream()
+ .map(Path::toString)
+ .collect(Collectors.toList()));
+ quickFail(run(new ProcessBuilder(commands)));
+ }
+
+ private static void quickFail(Result r) {
+ if (r.exitValue != 0)
+ throw new RuntimeException(r.output);
+ }
+
+ private static Result java(Map<String, String> properties,
+ Collection<Path> classpath,
+ String classname, String... args) {
+
+ String java = getJDKTool("java");
+
+ List<String> commands = new ArrayList<>();
+ commands.add(java);
+ commands.addAll(properties.entrySet()
+ .stream()
+ .map(e -> "-D" + e.getKey() + "=" + e.getValue())
+ .collect(Collectors.toList()));
+
+ String cp = classpath.stream()
+ .map(Path::toString)
+ .collect(Collectors.joining(File.pathSeparator));
+ commands.add("-cp");
+ commands.add(cp);
+ commands.add(classname);
+ commands.addAll(Arrays.asList(args));
+
+ return run(new ProcessBuilder(commands));
+ }
+
+ private static Result run(ProcessBuilder b) {
+ Process p;
+ try {
+ p = b.start();
+ } catch (IOException e) {
+ throw new RuntimeException(
+ format("Couldn't start process '%s'", b.command()), e);
+ }
+
+ String output;
+ try {
+ output = toString(p.getInputStream(), p.getErrorStream());
+ } catch (IOException e) {
+ throw new RuntimeException(
+ format("Couldn't read process output '%s'", b.command()), e);
+ }
+
+ try {
+ p.waitFor();
+ } catch (InterruptedException e) {
+ throw new RuntimeException(
+ format("Process hasn't finished '%s'", b.command()), e);
+ }
+
+ return new Result(p.exitValue(), output);
+ }
+
+ private static String getJDKTool(String name) {
+ String testJdk = System.getProperty("test.jdk");
+ if (testJdk == null)
+ throw new RuntimeException("Please provide test.jdk property at a startup");
+ return testJdk + File.separator + "bin" + File.separator + name;
+ }
+
+ private static Path templatesHome() {
+ String testSrc = System.getProperty("test.src");
+ if (testSrc == null)
+ throw new RuntimeException("Please provide test.src property at a startup");
+ return Paths.get(testSrc);
+ }
+
+ private static String toString(InputStream... src) throws IOException {
+ StringWriter dst = new StringWriter();
+ Reader concatenated =
+ new InputStreamReader(
+ new SequenceInputStream(
+ Collections.enumeration(asList(src))));
+ copy(concatenated, dst);
+ return dst.toString();
+ }
+
+ private static void copy(Reader src, Writer dst) throws IOException {
+ int len;
+ char[] buf = new char[1024];
+ try {
+ while ((len = src.read(buf)) != -1)
+ dst.write(buf, 0, len);
+ } finally {
+ try {
+ src.close();
+ } catch (IOException ignored1) {
+ } finally {
+ try {
+ dst.close();
+ } catch (IOException ignored2) {
+ }
+ }
+ }
+ }
+
+ private static class Result {
+
+ final int exitValue;
+ final String output;
+
+ private Result(int exitValue, String output) {
+ this.exitValue = exitValue;
+ this.output = output;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/URLConnection/ContentHandlers/broken_constructor_factory.template Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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 $package;
+
+import java.net.ContentHandler;
+import java.net.ContentHandlerFactory;
+
+public class $className implements ContentHandlerFactory {
+
+ public $className() {
+ throw new RuntimeException(
+ "This is a broken factory. It is supposed to throw this exception.");
+ }
+
+ @Override
+ public ContentHandler createContentHandler(String mimetype) {
+ throw new RuntimeException( "This method is not supposed to be called.");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/URLConnection/ContentHandlers/broken_factory.template Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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 $package;
+
+import java.net.ContentHandler;
+import java.net.ContentHandlerFactory;
+
+public class $className implements ContentHandlerFactory {
+
+ @Override
+ public ContentHandler createContentHandler(String mimetype) {
+ throw new RuntimeException(
+ "This is a broken factory. It is supposed to throw this exception.");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/URLConnection/ContentHandlers/plain.template Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package $package;
+
+import java.io.IOException;
+import java.net.ContentHandler;
+import java.net.URLConnection;
+
+public final class $className extends ContentHandler {
+
+ @Override
+ public Object getContent(URLConnection urlc) throws IOException {
+ return this;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/URLConnection/ContentHandlers/test.template Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.net.ContentHandlerFactory;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLStreamHandler;
+import java.net.URLStreamHandlerFactory;
+
+public class Test {
+
+ public static void main(String[] args) throws Exception {
+ if (args.length > 0) {
+ String fqn = args[0];
+
+ @SuppressWarnings("unchecked")
+ Class<? extends ContentHandlerFactory> c =
+ (Class<? extends ContentHandlerFactory>) Class.forName(fqn);
+
+ ContentHandlerFactory f = c.newInstance();
+
+ URLConnection.setContentHandlerFactory(f);
+ }
+
+ // One does not simply use a ContentHandler...
+ // From an end user perspective ContentHandler is used indirectly
+ // and it's more like SPI rather than API. So there's a certain amount
+ // of preparations needs to be done beforehand.
+
+ URLStreamHandlerFactory streamHandlerFactory =
+ (protocol) ->
+ new URLStreamHandler() {
+ @Override
+ protected URLConnection openConnection(URL u) {
+ return newUrlConnection(u);
+ }
+ };
+
+ URL.setURLStreamHandlerFactory(streamHandlerFactory);
+
+ // Finally
+ Object content = new URL("whatever:").getContent();
+
+ System.out.println("Content class is: " + content.getClass());
+ }
+
+ private static URLConnection newUrlConnection(URL u) {
+ return new URLConnection(u) {
+ @Override public void connect() { }
+
+ @Override
+ public InputStream getInputStream() { return null; }
+
+ @Override public String getContentType() { return "text/plain"; }
+ };
+ }
+}
--- a/jdk/test/java/util/Collection/MOAT.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/test/java/util/Collection/MOAT.java Tue Jul 14 15:26:34 2015 -0700
@@ -356,13 +356,7 @@
}
check(c.toArray().length == c.size());
- check(c.toArray().getClass() == Object[].class
- ||
- // !!!!
- // 6260652: (coll) Arrays.asList(x).toArray().getClass()
- // should be Object[].class
- (c.getClass().getName().equals("java.util.Arrays$ArrayList"))
- );
+ check(c.toArray().getClass() == Object[].class);
for (int size : new int[]{0,1,c.size(), c.size()+1}) {
Integer[] a = c.toArray(new Integer[size]);
check((size > c.size()) || a.length == c.size());
--- a/jdk/test/java/util/logging/LoggingDeadlock2.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/test/java/util/logging/LoggingDeadlock2.java Tue Jul 14 15:26:34 2015 -0700
@@ -57,35 +57,59 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.LogManager;
import java.io.File;
+import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
+import java.util.concurrent.TimeUnit;
public class LoggingDeadlock2 {
+ // ask child process to dumpstack after 60secs
+ public static final long DUMP_STACK_FREQUENCY_MS = 60000;
+
+ // A marker that allows to validate the subprocess output.
+ public static final String MARKER = "$";
+
public static void realMain(String arg[]) throws Throwable {
try {
System.out.println(javaChildArgs);
ProcessBuilder pb = new ProcessBuilder(javaChildArgs);
ProcessResults r = run(pb.start());
equal(r.exitValue(), 99);
- equal(r.out(), "");
+
+ // output of subprocess should end with "$"
+ final String out = r.out();
+ final String trailingOutput = out.indexOf(MARKER) > -1
+ ? out.substring(out.indexOf(MARKER)+MARKER.length())
+ : out;
+ equal(trailingOutput, "");
equal(r.err(), "");
+ equal(out.startsWith("JavaChild started"), true);
+ equal(out.endsWith("$"), true);
} catch (Throwable t) { unexpected(t); }
}
public static class JavaChild {
public static void main(String args[]) throws Throwable {
+ System.out.println("JavaChild started");
+
final CyclicBarrier startingGate = new CyclicBarrier(2);
final Throwable[] thrown = new Throwable[1];
// Some random variation, to help tickle races.
final Random rnd = new Random();
+ final long seed = rnd.nextLong();
+ rnd.setSeed(seed);
+ System.out.println("seed=" + seed);
final boolean dojoin = rnd.nextBoolean();
final int JITTER = 1024;
final int iters1 = rnd.nextInt(JITTER);
final int iters2 = JITTER - iters1;
final AtomicInteger counter = new AtomicInteger(0);
+ System.out.println("dojoin=" + dojoin);
+ System.out.println("iters1=" + iters1);
+ System.out.println("iters2=" + iters2);
Thread exiter = new Thread() {
public void run() {
@@ -101,6 +125,12 @@
}};
exiter.start();
+ System.out.println("exiter started");
+
+ // signal end of verbose output
+ System.out.print(MARKER);
+ System.out.flush();
+
startingGate.await();
for (int i = 0; i < iters2; i++)
counter.getAndIncrement();
@@ -124,6 +154,9 @@
private static final String javaExe =
System.getProperty("java.home") +
File.separator + "bin" + File.separator + "java";
+ private static final String jstackExe =
+ System.getProperty("java.home") +
+ File.separator + "bin" + File.separator + "jstack";
private static final String classpath =
System.getProperty("java.class.path");
@@ -182,10 +215,15 @@
public void run() {
try {
Reader r = new InputStreamReader(is);
- char[] buf = new char[4096];
int n;
- while ((n = r.read(buf)) > 0) {
- sb.append(buf,0,n);
+ while ((n = r.read()) > 0) {
+ sb.append((char)n);
+
+ // prints everything immediately to System.out so that we can
+ // see the traces even in the event of a test timeout
+ System.out.write((char)n);
+ System.out.flush();
+
}
} catch (Throwable t) {
throwable = t;
@@ -196,6 +234,56 @@
}
}
+ /**
+ * If the child process deadlocks, then the parent may fail in timeout.
+ * In that case, we won't have any interesting traces, unless we manage
+ * to get a thread dump from the child.
+ * It is unsure whether obtaining a thread dump from a deadlocked child
+ * will work - but maybe we could see something if the timeout is a false
+ * positive (the child has not deadlocked but hasn't managed to fully start
+ * yet, for instance).
+ * The idea here is to periodically try to obtain a thread dump from the
+ * child, every 60sec - which should be always less than the jtreg timeout.
+ */
+ private static class TimeoutThread extends Thread {
+ final long ms;
+ final Process process;
+ TimeoutThread(long ms, Process p) {
+ super("TimeoutThread");
+ setDaemon(true);
+ this.ms = ms;
+ this.process = p;
+ }
+
+ @Override
+ public void run() {
+ long start = System.nanoTime();
+ try {
+ while (true) {
+ sleep(ms);
+ System.err.println("Timeout reached: " + ms);
+ if (process.isAlive()) {
+ long pid = process.getPid();
+ ProcessBuilder jstack = new ProcessBuilder(jstackExe, String.valueOf(pid));
+ System.err.println("Dumping subprocess stack: " + pid);
+ Process p = jstack.inheritIO().start();
+ p.waitFor(ms, TimeUnit.MILLISECONDS);
+ } else {
+ System.err.println("Process is not alive!");
+ break;
+ }
+ }
+ } catch (InterruptedException ex) {
+ System.err.println("Interrupted: " + ex);
+ } catch (IOException io) {
+ System.err.println("Failed to get stack from subprocess");
+ io.printStackTrace();
+ }
+ }
+
+
+ }
+
private static ProcessResults run(Process p) {
Throwable throwable = null;
int exitValue = -1;
@@ -208,10 +296,15 @@
new StreamAccumulator(p.getErrorStream());
try {
+ System.out.println("Waiting for child process to exit");
outAccumulator.start();
errAccumulator.start();
+ // ask subprocess to dump stack every 60 secs.
+ new TimeoutThread(DUMP_STACK_FREQUENCY_MS, p).start();
+
exitValue = p.waitFor();
+ System.out.println("\nChild exited with status: " + exitValue);
outAccumulator.join();
errAccumulator.join();
--- a/jdk/test/java/util/regex/RegExTest.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/test/java/util/regex/RegExTest.java Tue Jul 14 15:26:34 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -32,11 +32,11 @@
* 6358731 6178785 6284152 6231989 6497148 6486934 6233084 6504326 6635133
* 6350801 6676425 6878475 6919132 6931676 6948903 6990617 7014645 7039066
* 7067045 7014640 7189363 8007395 8013252 8013254 8012646 8023647 6559590
- * 8027645 8035076 8039124 8035975 8074678
+ * 8027645 8035076 8039124 8035975 8074678 6854417
* @library /lib/testlibrary
* @build jdk.testlibrary.*
* @run main RegExTest
- * @key intermittent randomness
+ * @key randomness
*/
import java.util.function.Function;
@@ -3554,15 +3554,26 @@
// Create a short pattern to search for
int patternLength = generator.nextInt(7) + 4;
StringBuffer patternBuffer = new StringBuffer(patternLength);
- for (int x=0; x<patternLength; x++) {
- int ch = baseCharacter + generator.nextInt(26);
- if (Character.isSupplementaryCodePoint(ch)) {
- patternBuffer.append(Character.toChars(ch));
- } else {
- patternBuffer.append((char)ch);
+ String pattern;
+ retry: for (;;) {
+ for (int x=0; x<patternLength; x++) {
+ int ch = baseCharacter + generator.nextInt(26);
+ if (Character.isSupplementaryCodePoint(ch)) {
+ patternBuffer.append(Character.toChars(ch));
+ } else {
+ patternBuffer.append((char)ch);
+ }
}
+ pattern = patternBuffer.toString();
+
+ // Avoid patterns that start and end with the same substring
+ // See JDK-6854417
+ for (int x=1; x <patternLength; x++) {
+ if (pattern.startsWith(pattern.substring(x)))
+ continue retry;
+ }
+ break;
}
- String pattern = patternBuffer.toString();
Pattern p = Pattern.compile(pattern);
// Create a buffer with random ASCII chars that does
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/stream/bootlib/java/util/stream/DefaultMethodStreams.java Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,984 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package java.util.stream;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.Comparator;
+import java.util.DoubleSummaryStatistics;
+import java.util.IntSummaryStatistics;
+import java.util.Iterator;
+import java.util.LongSummaryStatistics;
+import java.util.Optional;
+import java.util.OptionalDouble;
+import java.util.OptionalInt;
+import java.util.OptionalLong;
+import java.util.PrimitiveIterator;
+import java.util.Set;
+import java.util.Spliterator;
+import java.util.function.BiConsumer;
+import java.util.function.BiFunction;
+import java.util.function.BinaryOperator;
+import java.util.function.Consumer;
+import java.util.function.DoubleBinaryOperator;
+import java.util.function.DoubleConsumer;
+import java.util.function.DoubleFunction;
+import java.util.function.DoublePredicate;
+import java.util.function.DoubleToIntFunction;
+import java.util.function.DoubleToLongFunction;
+import java.util.function.DoubleUnaryOperator;
+import java.util.function.Function;
+import java.util.function.IntBinaryOperator;
+import java.util.function.IntConsumer;
+import java.util.function.IntFunction;
+import java.util.function.IntPredicate;
+import java.util.function.IntToDoubleFunction;
+import java.util.function.IntToLongFunction;
+import java.util.function.IntUnaryOperator;
+import java.util.function.LongBinaryOperator;
+import java.util.function.LongConsumer;
+import java.util.function.LongFunction;
+import java.util.function.LongPredicate;
+import java.util.function.LongToDoubleFunction;
+import java.util.function.LongToIntFunction;
+import java.util.function.LongUnaryOperator;
+import java.util.function.ObjDoubleConsumer;
+import java.util.function.ObjIntConsumer;
+import java.util.function.ObjLongConsumer;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+import java.util.function.ToDoubleFunction;
+
+import java.util.function.ToIntFunction;
+import java.util.function.ToLongFunction;
+
+import static java.util.stream.Collectors.*;
+
+public final class DefaultMethodStreams {
+
+ static {
+ // Verify that default methods are not overridden
+ verify(DefaultMethodRefStream.class);
+ verify(DefaultMethodIntStream.class);
+ verify(DefaultMethodLongStream.class);
+ verify(DefaultMethodDoubleStream.class);
+ }
+
+ static void verify(Class<?> del) {
+ // Find the stream interface
+ Class<?> s = Stream.of(del.getInterfaces())
+ .filter(c -> BaseStream.class.isAssignableFrom(c))
+ .findFirst().get();
+
+ // Get all default methods on the stream class
+ Set<String> dms = Stream.of(s.getMethods())
+ .filter(m -> !Modifier.isStatic(m.getModifiers()))
+ .filter(m -> !m.isBridge())
+ .filter(Method::isDefault)
+ .map(Method::getName)
+ .collect(toSet());
+
+ // Get all methods on the delegating class
+ Set<String> ims = Stream.of(del.getMethods())
+ .filter(m -> !Modifier.isStatic(m.getModifiers()))
+ .filter(m -> m.getDeclaringClass() == del)
+ .map(Method::getName)
+ .collect(toSet());
+
+ if (ims.stream().anyMatch(dms::contains)) {
+ throw new AssertionError(String.format("%s overrides default methods of %s\n", del, s));
+ }
+ }
+
+ /**
+ * Creates a stream that for the next operation either delegates to
+ * a default method on {@link Stream}, if present for that operation,
+ * otherwise delegates to an underlying stream.
+ *
+ * @param s the underlying stream to be delegated to for non-default
+ * methods.
+ * @param <T> the type of the stream elements
+ * @return the delegating stream
+ */
+ public static <T> Stream<T> delegateTo(Stream<T> s) {
+ return new DefaultMethodRefStream<>(s);
+ }
+
+ /**
+ * Creates a stream that for the next operation either delegates to
+ * a default method on {@link IntStream}, if present for that operation,
+ * otherwise delegates to an underlying stream.
+ *
+ * @param s the underlying stream to be delegated to for non-default
+ * methods.
+ * @return the delegating stream
+ */
+ public static IntStream delegateTo(IntStream s) {
+ return new DefaultMethodIntStream(s);
+ }
+
+ /**
+ * Creates a stream that for the next operation either delegates to
+ * a default method on {@link LongStream}, if present for that operation,
+ * otherwise delegates to an underlying stream.
+ *
+ * @param s the underlying stream to be delegated to for non-default
+ * methods.
+ * @return the delegating stream
+ */
+ public static LongStream delegateTo(LongStream s) {
+ return new DefaultMethodLongStream(s);
+ }
+
+ /**
+ * Creates a stream that for the next operation either delegates to
+ * a default method on {@link DoubleStream}, if present for that operation,
+ * otherwise delegates to an underlying stream.
+ *
+ * @param s the underlying stream to be delegated to for non-default
+ * methods.
+ * @return the delegating stream
+ */
+ public static DoubleStream delegateTo(DoubleStream s) {
+ return new DefaultMethodDoubleStream(s);
+ }
+
+ /**
+ * A stream that delegates the next operation to a default method, if
+ * present, or to the same operation of an underlying stream.
+ *
+ * @param <T> the type of the stream elements
+ */
+ static final class DefaultMethodRefStream<T> implements Stream<T> {
+ final Stream<T> s;
+
+ DefaultMethodRefStream(Stream<T> s) {
+ this.s = s;
+ }
+
+
+ // Delegating non-default methods
+
+ @Override
+ public Stream<T> filter(Predicate<? super T> predicate) {
+ return s.filter(predicate);
+ }
+
+ @Override
+ public <R> Stream<R> map(Function<? super T, ? extends R> mapper) {
+ return s.map(mapper);
+ }
+
+ @Override
+ public IntStream mapToInt(ToIntFunction<? super T> mapper) {
+ return s.mapToInt(mapper);
+ }
+
+ @Override
+ public LongStream mapToLong(ToLongFunction<? super T> mapper) {
+ return s.mapToLong(mapper);
+ }
+
+ @Override
+ public DoubleStream mapToDouble(ToDoubleFunction<? super T> mapper) {
+ return s.mapToDouble(mapper);
+ }
+
+ @Override
+ public <R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper) {
+ return s.flatMap(mapper);
+ }
+
+ @Override
+ public IntStream flatMapToInt(Function<? super T, ? extends IntStream> mapper) {
+ return s.flatMapToInt(mapper);
+ }
+
+ @Override
+ public LongStream flatMapToLong(Function<? super T, ? extends LongStream> mapper) {
+ return s.flatMapToLong(mapper);
+ }
+
+ @Override
+ public DoubleStream flatMapToDouble(Function<? super T, ? extends DoubleStream> mapper) {
+ return s.flatMapToDouble(mapper);
+ }
+
+ @Override
+ public Stream<T> distinct() {
+ return s.distinct();
+ }
+
+ @Override
+ public Stream<T> sorted() {
+ return s.sorted();
+ }
+
+ @Override
+ public Stream<T> sorted(Comparator<? super T> comparator) {
+ return s.sorted(comparator);
+ }
+
+ @Override
+ public Stream<T> peek(Consumer<? super T> action) {
+ return s.peek(action);
+ }
+
+ @Override
+ public Stream<T> limit(long maxSize) {
+ return s.limit(maxSize);
+ }
+
+ @Override
+ public Stream<T> skip(long n) {
+ return s.skip(n);
+ }
+
+ @Override
+ public void forEach(Consumer<? super T> action) {
+ s.forEach(action);
+ }
+
+ @Override
+ public void forEachOrdered(Consumer<? super T> action) {
+ s.forEachOrdered(action);
+ }
+
+ @Override
+ public Object[] toArray() {
+ return s.toArray();
+ }
+
+ @Override
+ public <A> A[] toArray(IntFunction<A[]> generator) {
+ return s.toArray(generator);
+ }
+
+ @Override
+ public T reduce(T identity, BinaryOperator<T> accumulator) {
+ return s.reduce(identity, accumulator);
+ }
+
+ @Override
+ public Optional<T> reduce(BinaryOperator<T> accumulator) {
+ return s.reduce(accumulator);
+ }
+
+ @Override
+ public <U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner) {
+ return s.reduce(identity, accumulator, combiner);
+ }
+
+ @Override
+ public <R> R collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner) {
+ return s.collect(supplier, accumulator, combiner);
+ }
+
+ @Override
+ public <R, A> R collect(Collector<? super T, A, R> collector) {
+ return s.collect(collector);
+ }
+
+ @Override
+ public Optional<T> min(Comparator<? super T> comparator) {
+ return s.min(comparator);
+ }
+
+ @Override
+ public Optional<T> max(Comparator<? super T> comparator) {
+ return s.max(comparator);
+ }
+
+ @Override
+ public long count() {
+ return s.count();
+ }
+
+ @Override
+ public boolean anyMatch(Predicate<? super T> predicate) {
+ return s.anyMatch(predicate);
+ }
+
+ @Override
+ public boolean allMatch(Predicate<? super T> predicate) {
+ return s.allMatch(predicate);
+ }
+
+ @Override
+ public boolean noneMatch(Predicate<? super T> predicate) {
+ return s.noneMatch(predicate);
+ }
+
+ @Override
+ public Optional<T> findFirst() {
+ return s.findFirst();
+ }
+
+ @Override
+ public Optional<T> findAny() {
+ return s.findAny();
+ }
+
+ @Override
+ public Iterator<T> iterator() {
+ return s.iterator();
+ }
+
+ @Override
+ public Spliterator<T> spliterator() {
+ return s.spliterator();
+ }
+
+ @Override
+ public boolean isParallel() {
+ return s.isParallel();
+ }
+
+ @Override
+ public Stream<T> sequential() {
+ return s.sequential();
+ }
+
+ @Override
+ public Stream<T> parallel() {
+ return s.parallel();
+ }
+
+ @Override
+ public Stream<T> unordered() {
+ return s.unordered();
+ }
+
+ @Override
+ public Stream<T> onClose(Runnable closeHandler) {
+ return s.onClose(closeHandler);
+ }
+
+ @Override
+ public void close() {
+ s.close();
+ }
+ }
+
+ static final class DefaultMethodIntStream implements IntStream {
+ final IntStream s;
+
+ public DefaultMethodIntStream(IntStream s) {
+ this.s = s;
+ }
+
+
+ // Delegating non-default methods
+
+ @Override
+ public IntStream filter(IntPredicate predicate) {
+ return s.filter(predicate);
+ }
+
+ @Override
+ public IntStream map(IntUnaryOperator mapper) {
+ return s.map(mapper);
+ }
+
+ @Override
+ public <U> Stream<U> mapToObj(IntFunction<? extends U> mapper) {
+ return s.mapToObj(mapper);
+ }
+
+ @Override
+ public LongStream mapToLong(IntToLongFunction mapper) {
+ return s.mapToLong(mapper);
+ }
+
+ @Override
+ public DoubleStream mapToDouble(IntToDoubleFunction mapper) {
+ return s.mapToDouble(mapper);
+ }
+
+ @Override
+ public IntStream flatMap(IntFunction<? extends IntStream> mapper) {
+ return s.flatMap(mapper);
+ }
+
+ @Override
+ public IntStream distinct() {
+ return s.distinct();
+ }
+
+ @Override
+ public IntStream sorted() {
+ return s.sorted();
+ }
+
+ @Override
+ public IntStream peek(IntConsumer action) {
+ return s.peek(action);
+ }
+
+ @Override
+ public IntStream limit(long maxSize) {
+ return s.limit(maxSize);
+ }
+
+ @Override
+ public IntStream skip(long n) {
+ return s.skip(n);
+ }
+
+ @Override
+ public void forEach(IntConsumer action) {
+ s.forEach(action);
+ }
+
+ @Override
+ public void forEachOrdered(IntConsumer action) {
+ s.forEachOrdered(action);
+ }
+
+ @Override
+ public int[] toArray() {
+ return s.toArray();
+ }
+
+ @Override
+ public int reduce(int identity, IntBinaryOperator op) {
+ return s.reduce(identity, op);
+ }
+
+ @Override
+ public OptionalInt reduce(IntBinaryOperator op) {
+ return s.reduce(op);
+ }
+
+ @Override
+ public <R> R collect(Supplier<R> supplier, ObjIntConsumer<R> accumulator, BiConsumer<R, R> combiner) {
+ return s.collect(supplier, accumulator, combiner);
+ }
+
+ @Override
+ public int sum() {
+ return s.sum();
+ }
+
+ @Override
+ public OptionalInt min() {
+ return s.min();
+ }
+
+ @Override
+ public OptionalInt max() {
+ return s.max();
+ }
+
+ @Override
+ public long count() {
+ return s.count();
+ }
+
+ @Override
+ public OptionalDouble average() {
+ return s.average();
+ }
+
+ @Override
+ public IntSummaryStatistics summaryStatistics() {
+ return s.summaryStatistics();
+ }
+
+ @Override
+ public boolean anyMatch(IntPredicate predicate) {
+ return s.anyMatch(predicate);
+ }
+
+ @Override
+ public boolean allMatch(IntPredicate predicate) {
+ return s.allMatch(predicate);
+ }
+
+ @Override
+ public boolean noneMatch(IntPredicate predicate) {
+ return s.noneMatch(predicate);
+ }
+
+ @Override
+ public OptionalInt findFirst() {
+ return s.findFirst();
+ }
+
+ @Override
+ public OptionalInt findAny() {
+ return s.findAny();
+ }
+
+ @Override
+ public LongStream asLongStream() {
+ return s.asLongStream();
+ }
+
+ @Override
+ public DoubleStream asDoubleStream() {
+ return s.asDoubleStream();
+ }
+
+ @Override
+ public Stream<Integer> boxed() {
+ return s.boxed();
+ }
+
+ @Override
+ public IntStream sequential() {
+ return s.sequential();
+ }
+
+ @Override
+ public IntStream parallel() {
+ return s.parallel();
+ }
+
+ @Override
+ public PrimitiveIterator.OfInt iterator() {
+ return s.iterator();
+ }
+
+ @Override
+ public Spliterator.OfInt spliterator() {
+ return s.spliterator();
+ }
+
+ @Override
+ public boolean isParallel() {
+ return s.isParallel();
+ }
+
+ @Override
+ public IntStream unordered() {
+ return s.unordered();
+ }
+
+ @Override
+ public IntStream onClose(Runnable closeHandler) {
+ return s.onClose(closeHandler);
+ }
+
+ @Override
+ public void close() {
+ s.close();
+ }
+ }
+
+ static final class DefaultMethodLongStream implements LongStream {
+ final LongStream s;
+
+ public DefaultMethodLongStream(LongStream s) {
+ this.s = s;
+ }
+
+
+ // Delegating non-default methods
+
+ @Override
+ public void forEach(LongConsumer action) {
+ s.forEach(action);
+ }
+
+ @Override
+ public LongStream filter(LongPredicate predicate) {
+ return s.filter(predicate);
+ }
+
+ @Override
+ public LongStream map(LongUnaryOperator mapper) {
+ return s.map(mapper);
+ }
+
+ @Override
+ public <U> Stream<U> mapToObj(LongFunction<? extends U> mapper) {
+ return s.mapToObj(mapper);
+ }
+
+ @Override
+ public IntStream mapToInt(LongToIntFunction mapper) {
+ return s.mapToInt(mapper);
+ }
+
+ @Override
+ public DoubleStream mapToDouble(LongToDoubleFunction mapper) {
+ return s.mapToDouble(mapper);
+ }
+
+ @Override
+ public LongStream flatMap(LongFunction<? extends LongStream> mapper) {
+ return s.flatMap(mapper);
+ }
+
+ @Override
+ public LongStream distinct() {
+ return s.distinct();
+ }
+
+ @Override
+ public LongStream sorted() {
+ return s.sorted();
+ }
+
+ @Override
+ public LongStream peek(LongConsumer action) {
+ return s.peek(action);
+ }
+
+ @Override
+ public LongStream limit(long maxSize) {
+ return s.limit(maxSize);
+ }
+
+ @Override
+ public LongStream skip(long n) {
+ return s.skip(n);
+ }
+
+ @Override
+ public void forEachOrdered(LongConsumer action) {
+ s.forEachOrdered(action);
+ }
+
+ @Override
+ public long[] toArray() {
+ return s.toArray();
+ }
+
+ @Override
+ public long reduce(long identity, LongBinaryOperator op) {
+ return s.reduce(identity, op);
+ }
+
+ @Override
+ public OptionalLong reduce(LongBinaryOperator op) {
+ return s.reduce(op);
+ }
+
+ @Override
+ public <R> R collect(Supplier<R> supplier, ObjLongConsumer<R> accumulator, BiConsumer<R, R> combiner) {
+ return s.collect(supplier, accumulator, combiner);
+ }
+
+ @Override
+ public long sum() {
+ return s.sum();
+ }
+
+ @Override
+ public OptionalLong min() {
+ return s.min();
+ }
+
+ @Override
+ public OptionalLong max() {
+ return s.max();
+ }
+
+ @Override
+ public long count() {
+ return s.count();
+ }
+
+ @Override
+ public OptionalDouble average() {
+ return s.average();
+ }
+
+ @Override
+ public LongSummaryStatistics summaryStatistics() {
+ return s.summaryStatistics();
+ }
+
+ @Override
+ public boolean anyMatch(LongPredicate predicate) {
+ return s.anyMatch(predicate);
+ }
+
+ @Override
+ public boolean allMatch(LongPredicate predicate) {
+ return s.allMatch(predicate);
+ }
+
+ @Override
+ public boolean noneMatch(LongPredicate predicate) {
+ return s.noneMatch(predicate);
+ }
+
+ @Override
+ public OptionalLong findFirst() {
+ return s.findFirst();
+ }
+
+ @Override
+ public OptionalLong findAny() {
+ return s.findAny();
+ }
+
+ @Override
+ public DoubleStream asDoubleStream() {
+ return s.asDoubleStream();
+ }
+
+ @Override
+ public Stream<Long> boxed() {
+ return s.boxed();
+ }
+
+ @Override
+ public LongStream sequential() {
+ return s.sequential();
+ }
+
+ @Override
+ public LongStream parallel() {
+ return s.parallel();
+ }
+
+ @Override
+ public PrimitiveIterator.OfLong iterator() {
+ return s.iterator();
+ }
+
+ @Override
+ public Spliterator.OfLong spliterator() {
+ return s.spliterator();
+ }
+
+ @Override
+ public boolean isParallel() {
+ return s.isParallel();
+ }
+
+ @Override
+ public LongStream unordered() {
+ return s.unordered();
+ }
+
+ @Override
+ public LongStream onClose(Runnable closeHandler) {
+ return s.onClose(closeHandler);
+ }
+
+ @Override
+ public void close() {
+ s.close();
+ }
+ }
+
+ static final class DefaultMethodDoubleStream implements DoubleStream {
+ final DoubleStream s;
+
+ public DefaultMethodDoubleStream(DoubleStream s) {
+ this.s = s;
+ }
+
+ @Override
+ public DoubleStream filter(DoublePredicate predicate) {
+ return s.filter(predicate);
+ }
+
+ @Override
+ public DoubleStream map(DoubleUnaryOperator mapper) {
+ return s.map(mapper);
+ }
+
+ @Override
+ public <U> Stream<U> mapToObj(DoubleFunction<? extends U> mapper) {
+ return s.mapToObj(mapper);
+ }
+
+ @Override
+ public IntStream mapToInt(DoubleToIntFunction mapper) {
+ return s.mapToInt(mapper);
+ }
+
+ @Override
+ public LongStream mapToLong(DoubleToLongFunction mapper) {
+ return s.mapToLong(mapper);
+ }
+
+ @Override
+ public DoubleStream flatMap(DoubleFunction<? extends DoubleStream> mapper) {
+ return s.flatMap(mapper);
+ }
+
+ @Override
+ public DoubleStream distinct() {
+ return s.distinct();
+ }
+
+ @Override
+ public DoubleStream sorted() {
+ return s.sorted();
+ }
+
+ @Override
+ public DoubleStream peek(DoubleConsumer action) {
+ return s.peek(action);
+ }
+
+ @Override
+ public DoubleStream limit(long maxSize) {
+ return s.limit(maxSize);
+ }
+
+ @Override
+ public DoubleStream skip(long n) {
+ return s.skip(n);
+ }
+
+ @Override
+ public void forEach(DoubleConsumer action) {
+ s.forEach(action);
+ }
+
+ @Override
+ public void forEachOrdered(DoubleConsumer action) {
+ s.forEachOrdered(action);
+ }
+
+ @Override
+ public double[] toArray() {
+ return s.toArray();
+ }
+
+ @Override
+ public double reduce(double identity, DoubleBinaryOperator op) {
+ return s.reduce(identity, op);
+ }
+
+ @Override
+ public OptionalDouble reduce(DoubleBinaryOperator op) {
+ return s.reduce(op);
+ }
+
+ @Override
+ public <R> R collect(Supplier<R> supplier, ObjDoubleConsumer<R> accumulator, BiConsumer<R, R> combiner) {
+ return s.collect(supplier, accumulator, combiner);
+ }
+
+ @Override
+ public double sum() {
+ return s.sum();
+ }
+
+ @Override
+ public OptionalDouble min() {
+ return s.min();
+ }
+
+ @Override
+ public OptionalDouble max() {
+ return s.max();
+ }
+
+ @Override
+ public long count() {
+ return s.count();
+ }
+
+ @Override
+ public OptionalDouble average() {
+ return s.average();
+ }
+
+ @Override
+ public DoubleSummaryStatistics summaryStatistics() {
+ return s.summaryStatistics();
+ }
+
+ @Override
+ public boolean anyMatch(DoublePredicate predicate) {
+ return s.anyMatch(predicate);
+ }
+
+ @Override
+ public boolean allMatch(DoublePredicate predicate) {
+ return s.allMatch(predicate);
+ }
+
+ @Override
+ public boolean noneMatch(DoublePredicate predicate) {
+ return s.noneMatch(predicate);
+ }
+
+ @Override
+ public OptionalDouble findFirst() {
+ return s.findFirst();
+ }
+
+ @Override
+ public OptionalDouble findAny() {
+ return s.findAny();
+ }
+
+ @Override
+ public Stream<Double> boxed() {
+ return s.boxed();
+ }
+
+ @Override
+ public DoubleStream sequential() {
+ return s.sequential();
+ }
+
+ @Override
+ public DoubleStream parallel() {
+ return s.parallel();
+ }
+
+ @Override
+ public PrimitiveIterator.OfDouble iterator() {
+ return s.iterator();
+ }
+
+ @Override
+ public Spliterator.OfDouble spliterator() {
+ return s.spliterator();
+ }
+
+ @Override
+ public boolean isParallel() {
+ return s.isParallel();
+ }
+
+ @Override
+ public DoubleStream unordered() {
+ return s.unordered();
+ }
+
+ @Override
+ public DoubleStream onClose(Runnable closeHandler) {
+ return s.onClose(closeHandler);
+ }
+
+ @Override
+ public void close() {
+ s.close();
+ }
+ }
+}
\ No newline at end of file
--- a/jdk/test/java/util/stream/bootlib/java/util/stream/StreamTestDataProvider.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/test/java/util/stream/bootlib/java/util/stream/StreamTestDataProvider.java Tue Jul 14 15:26:34 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -119,7 +119,7 @@
// Simple combination of numbers and null values, probably excessive but may catch
// errors for initialization/termination/sequence
- // @@@ This is separate from the other data for now until nulls are consitently supported by
+ // @@@ This is separate from the other data for now until nulls are consistently supported by
// all operations
{
List<Object[]> list = new ArrayList<>();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/WhileOpStatefulTest.java Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,304 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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 org.openjdk.tests.java.util.stream;
+
+import org.testng.annotations.Test;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.BooleanSupplier;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Supplier;
+import java.util.stream.DefaultMethodStreams;
+import java.util.stream.DoubleStream;
+import java.util.stream.IntStream;
+import java.util.stream.LongStream;
+import java.util.stream.OpTestCase;
+import java.util.stream.Stream;
+
+import static java.util.stream.Collectors.toCollection;
+
+/*
+ * @test
+ * @bug 8071597
+ */
+@Test
+public class WhileOpStatefulTest extends OpTestCase {
+ static final long COUNT_PERIOD = 100;
+
+ static final long EXECUTION_TIME_LIMIT = TimeUnit.SECONDS.toMillis(10);
+
+ static final long TAKE_WHILE_COUNT_LIMIT = 100_000;
+
+ static final int DROP_SOURCE_SIZE = 10_000;
+
+ static final long DROP_WHILE_COUNT_LIMIT = 5000;
+
+ @Test
+ public void testTimedTakeWithCount() {
+ testTakeWhileMulti(
+ s -> {
+ BooleanSupplier isWithinTakePeriod =
+ within(System.currentTimeMillis(), COUNT_PERIOD);
+ s.takeWhile(e -> isWithinTakePeriod.getAsBoolean())
+ .mapToLong(e -> 1).reduce(0, Long::sum);
+ },
+ s -> {
+ BooleanSupplier isWithinTakePeriod =
+ within(System.currentTimeMillis(), COUNT_PERIOD);
+ s.takeWhile(e -> isWithinTakePeriod.getAsBoolean())
+ .mapToLong(e -> 1).reduce(0, Long::sum);
+ },
+ s -> {
+ BooleanSupplier isWithinTakePeriod =
+ within(System.currentTimeMillis(), COUNT_PERIOD);
+ s.takeWhile(e -> isWithinTakePeriod.getAsBoolean())
+ .map(e -> 1).reduce(0, Long::sum);
+ },
+ s -> {
+ BooleanSupplier isWithinTakePeriod =
+ within(System.currentTimeMillis(), COUNT_PERIOD);
+ s.takeWhile(e -> isWithinTakePeriod.getAsBoolean())
+ .mapToLong(e -> 1).reduce(0, Long::sum);
+ });
+ }
+
+ @Test
+ public void testCountTakeWithCount() {
+ testTakeWhileMulti(
+ s -> {
+ AtomicLong c = new AtomicLong();
+ long rc = s.takeWhile(e -> c.getAndIncrement() < TAKE_WHILE_COUNT_LIMIT)
+ .mapToLong(e -> 1).reduce(0, Long::sum);
+ assertTrue(rc <= c.get());
+ },
+ s -> {
+ AtomicLong c = new AtomicLong();
+ long rc = s.takeWhile(e -> c.getAndIncrement() < TAKE_WHILE_COUNT_LIMIT)
+ .mapToLong(e -> 1).reduce(0, Long::sum);
+ assertTrue(rc <= c.get());
+ },
+ s -> {
+ AtomicLong c = new AtomicLong();
+ long rc = s.takeWhile(e -> c.getAndIncrement() < TAKE_WHILE_COUNT_LIMIT)
+ .map(e -> 1).reduce(0, Long::sum);
+ assertTrue(rc <= c.get());
+ },
+ s -> {
+ AtomicLong c = new AtomicLong();
+ long rc = s.takeWhile(e -> c.getAndIncrement() < TAKE_WHILE_COUNT_LIMIT)
+ .mapToLong(e -> 1).reduce(0, Long::sum);
+ assertTrue(rc <= c.get());
+ });
+ }
+
+ @Test
+ public void testCountTakeWithToArray() {
+ testTakeWhileMulti(
+ s -> {
+ AtomicLong c = new AtomicLong();
+ Object[] ra = s.takeWhile(e -> c.getAndIncrement() < TAKE_WHILE_COUNT_LIMIT)
+ .toArray();
+ assertTrue(ra.length <= c.get());
+ },
+ s -> {
+ AtomicLong c = new AtomicLong();
+ int[] ra = s.takeWhile(e -> c.getAndIncrement() < TAKE_WHILE_COUNT_LIMIT)
+ .toArray();
+ assertTrue(ra.length <= c.get());
+ },
+ s -> {
+ AtomicLong c = new AtomicLong();
+ long[] ra = s.takeWhile(e -> c.getAndIncrement() < TAKE_WHILE_COUNT_LIMIT)
+ .toArray();
+ assertTrue(ra.length <= c.get());
+ },
+ s -> {
+ AtomicLong c = new AtomicLong();
+ double[] ra = s.takeWhile(e -> c.getAndIncrement() < TAKE_WHILE_COUNT_LIMIT)
+ .toArray();
+ assertTrue(ra.length <= c.get());
+ });
+ }
+
+
+ @Test
+ public void testCountDropWithCount() {
+ testDropWhileMulti(
+ s -> {
+ AtomicLong c = new AtomicLong();
+ long rc = s.dropWhile(e -> c.getAndIncrement() < DROP_WHILE_COUNT_LIMIT)
+ .mapToLong(e -> 1).reduce(0, Long::sum);
+ assertTrue(c.get() >= DROP_WHILE_COUNT_LIMIT);
+ assertTrue(rc <= DROP_SOURCE_SIZE);
+ },
+ s -> {
+ AtomicLong c = new AtomicLong();
+ long rc = s.dropWhile(e -> c.getAndIncrement() < DROP_WHILE_COUNT_LIMIT)
+ .mapToLong(e -> 1).reduce(0, Long::sum);
+ assertTrue(c.get() >= DROP_WHILE_COUNT_LIMIT);
+ assertTrue(rc <= DROP_SOURCE_SIZE);
+ },
+ s -> {
+ AtomicLong c = new AtomicLong();
+ long rc = s.dropWhile(e -> c.getAndIncrement() < DROP_WHILE_COUNT_LIMIT)
+ .map(e -> 1).reduce(0, Long::sum);
+ assertTrue(c.get() >= DROP_WHILE_COUNT_LIMIT);
+ assertTrue(rc <= DROP_SOURCE_SIZE);
+ },
+ s -> {
+ AtomicLong c = new AtomicLong();
+ long rc = s.dropWhile(e -> c.getAndIncrement() < DROP_WHILE_COUNT_LIMIT)
+ .mapToLong(e -> 1).reduce(0, Long::sum);
+ assertTrue(c.get() >= DROP_WHILE_COUNT_LIMIT);
+ assertTrue(rc <= DROP_SOURCE_SIZE);
+ });
+ }
+
+ @Test
+ public void testCountDropWithToArray() {
+ testDropWhileMulti(
+ s -> {
+ AtomicLong c = new AtomicLong();
+ Object[] ra = s.dropWhile(e -> c.getAndIncrement() < DROP_WHILE_COUNT_LIMIT)
+ .toArray();
+ assertTrue(c.get() >= DROP_WHILE_COUNT_LIMIT);
+ assertTrue(ra.length <= DROP_SOURCE_SIZE);
+ },
+ s -> {
+ AtomicLong c = new AtomicLong();
+ int[] ra = s.dropWhile(e -> c.getAndIncrement() < DROP_WHILE_COUNT_LIMIT)
+ .toArray();
+ assertTrue(c.get() >= DROP_WHILE_COUNT_LIMIT);
+ assertTrue(ra.length <= DROP_SOURCE_SIZE);
+ },
+ s -> {
+ AtomicLong c = new AtomicLong();
+ long[] ra = s.dropWhile(e -> c.getAndIncrement() < DROP_WHILE_COUNT_LIMIT)
+ .toArray();
+ assertTrue(c.get() >= DROP_WHILE_COUNT_LIMIT);
+ assertTrue(ra.length <= DROP_SOURCE_SIZE);
+ },
+ s -> {
+ AtomicLong c = new AtomicLong();
+ double[] ra = s.dropWhile(e -> c.getAndIncrement() < DROP_WHILE_COUNT_LIMIT)
+ .toArray();
+ assertTrue(c.get() >= DROP_WHILE_COUNT_LIMIT);
+ assertTrue(ra.length <= DROP_SOURCE_SIZE);
+ });
+ }
+
+
+ private void testTakeWhileMulti(Consumer<Stream<Integer>> mRef,
+ Consumer<IntStream> mInt,
+ Consumer<LongStream> mLong,
+ Consumer<DoubleStream> mDouble) {
+ Map<String, Supplier<Stream<Integer>>> sources = new HashMap<>();
+ sources.put("Stream.generate()", () -> Stream.generate(() -> 1));
+ sources.put("Stream.iterate()", () -> Stream.iterate(1, x -> 1));
+ sources.put("Stream.iterate().unordered()", () -> Stream.iterate(1, x -> 1));
+ testWhileMulti(sources, mRef, mInt, mLong, mDouble);
+ }
+
+ private void testDropWhileMulti(Consumer<Stream<Integer>> mRef,
+ Consumer<IntStream> mInt,
+ Consumer<LongStream> mLong,
+ Consumer<DoubleStream> mDouble) {
+ Map<String, Supplier<Stream<Integer>>> sources = new HashMap<>();
+ sources.put("IntStream.range().boxed()",
+ () -> IntStream.range(0, DROP_SOURCE_SIZE).boxed());
+ sources.put("IntStream.range().boxed().unordered()",
+ () -> IntStream.range(0, DROP_SOURCE_SIZE).boxed().unordered());
+ sources.put("LinkedList.stream()",
+ () -> IntStream.range(0, DROP_SOURCE_SIZE).boxed()
+ .collect(toCollection(LinkedList::new))
+ .stream());
+ sources.put("LinkedList.stream().unordered()",
+ () -> IntStream.range(0, DROP_SOURCE_SIZE).boxed()
+ .collect(toCollection(LinkedList::new))
+ .stream()
+ .unordered());
+ testWhileMulti(sources, mRef, mInt, mLong, mDouble);
+ }
+
+ private void testWhileMulti(Map<String, Supplier<Stream<Integer>>> sources,
+ Consumer<Stream<Integer>> mRef,
+ Consumer<IntStream> mInt,
+ Consumer<LongStream> mLong,
+ Consumer<DoubleStream> mDouble) {
+ Map<String, Function<Stream<Integer>, Stream<Integer>>> transforms = new HashMap<>();
+ transforms.put("Stream.sequential()", s -> {
+ BooleanSupplier isWithinExecutionPeriod = within(System.currentTimeMillis(),
+ EXECUTION_TIME_LIMIT);
+ return s.peek(e -> {
+ if (!isWithinExecutionPeriod.getAsBoolean()) {
+ throw new RuntimeException();
+ }
+ });
+ });
+ transforms.put("Stream.parallel()", s -> {
+ BooleanSupplier isWithinExecutionPeriod = within(System.currentTimeMillis(),
+ EXECUTION_TIME_LIMIT);
+ return s.parallel()
+ .peek(e -> {
+ if (!isWithinExecutionPeriod.getAsBoolean()) {
+ throw new RuntimeException();
+ }
+ });
+ });
+
+ Map<String, Consumer<Stream<Integer>>> actions = new HashMap<>();
+ actions.put("Ref", mRef);
+ actions.put("Int", s -> mInt.accept(s.mapToInt(e -> e)));
+ actions.put("Long", s -> mLong.accept(s.mapToLong(e -> e)));
+ actions.put("Double", s -> mDouble.accept(s.mapToDouble(e -> e)));
+ actions.put("Ref using defaults", s -> mRef.accept(DefaultMethodStreams.delegateTo(s)));
+ actions.put("Int using defaults", s -> mInt.accept(DefaultMethodStreams.delegateTo(s.mapToInt(e -> e))));
+ actions.put("Long using defaults", s -> mLong.accept(DefaultMethodStreams.delegateTo(s.mapToLong(e -> e))));
+ actions.put("Double using defaults", s -> mDouble.accept(DefaultMethodStreams.delegateTo(s.mapToDouble(e -> e))));
+
+ for (Map.Entry<String, Supplier<Stream<Integer>>> s : sources.entrySet()) {
+ setContext("source", s.getKey());
+
+ for (Map.Entry<String, Function<Stream<Integer>, Stream<Integer>>> t : transforms.entrySet()) {
+ setContext("transform", t.getKey());
+
+ for (Map.Entry<String, Consumer<Stream<Integer>>> a : actions.entrySet()) {
+ setContext("shape", a.getKey());
+
+ Stream<Integer> stream = s.getValue().get();
+ stream = t.getValue().apply(stream);
+ a.getValue().accept(stream);
+ }
+ }
+ }
+ }
+
+ static BooleanSupplier within(long start, long durationInMillis) {
+ return () -> (System.currentTimeMillis() - start) < durationInMillis;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/WhileOpTest.java Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,361 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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 org.openjdk.tests.java.util.stream;
+
+import org.testng.annotations.Test;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.stream.DefaultMethodStreams;
+import java.util.stream.DoubleStream;
+import java.util.stream.IntStream;
+import java.util.stream.LambdaTestHelpers;
+import java.util.stream.LongStream;
+import java.util.stream.OpTestCase;
+import java.util.stream.Stream;
+import java.util.stream.StreamTestDataProvider;
+import java.util.stream.TestData;
+
+/*
+ * @test
+ * @bug 8071597
+ */
+@Test
+public class WhileOpTest extends OpTestCase {
+
+ @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class)
+ public void testTakeWhileOps(String name, TestData.OfRef<Integer> data) {
+ for (int size : sizes(data.size())) {
+ setContext("takeWhile", size);
+
+ testWhileMulti(data,
+ whileResultAsserter(data, WhileOp.Take, e -> e < size),
+ s -> s.takeWhile(e -> e < size),
+ s -> s.takeWhile(e -> e < size),
+ s -> s.takeWhile(e -> e < size),
+ s -> s.takeWhile(e -> e < size));
+
+
+ testWhileMulti(data,
+ whileResultAsserter(data, WhileOp.Take, e -> e < size / 2),
+ s -> s.takeWhile(e -> e < size).takeWhile(e -> e < size / 2),
+ s -> s.takeWhile(e -> e < size).takeWhile(e -> e < size / 2),
+ s -> s.takeWhile(e -> e < size).takeWhile(e -> e < size / 2),
+ s -> s.takeWhile(e -> e < size).takeWhile(e -> e < size / 2));
+ }
+ }
+
+ @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class)
+ public void testDropWhileOps(String name, TestData.OfRef<Integer> data) {
+ for (int size : sizes(data.size())) {
+ setContext("dropWhile", size);
+
+ testWhileMulti(data,
+ whileResultAsserter(data, WhileOp.Drop, e -> e < size),
+ s -> s.dropWhile(e -> e < size),
+ s -> s.dropWhile(e -> e < size),
+ s -> s.dropWhile(e -> e < size),
+ s -> s.dropWhile(e -> e < size));
+
+ testWhileMulti(data,
+ whileResultAsserter(data, WhileOp.Drop, e -> e < size),
+ s -> s.dropWhile(e -> e < size / 2).dropWhile(e -> e < size),
+ s -> s.dropWhile(e -> e < size / 2).dropWhile(e -> e < size),
+ s -> s.dropWhile(e -> e < size / 2).dropWhile(e -> e < size),
+ s -> s.dropWhile(e -> e < size / 2).dropWhile(e -> e < size));
+ }
+ }
+
+ @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class)
+ public void testDropTakeWhileOps(String name, TestData.OfRef<Integer> data) {
+ for (int size : sizes(data.size())) {
+ setContext("dropWhile", size);
+
+ testWhileMulti(data,
+ whileResultAsserter(data, WhileOp.Undefined, null),
+ s -> s.dropWhile(e -> e < size / 2).takeWhile(e -> e < size),
+ s -> s.dropWhile(e -> e < size / 2).takeWhile(e -> e < size),
+ s -> s.dropWhile(e -> e < size / 2).takeWhile(e -> e < size),
+ s -> s.dropWhile(e -> e < size / 2).takeWhile(e -> e < size));
+ }
+ }
+
+ /**
+ * While operation type to be asserted on
+ */
+ enum WhileOp {
+ /**
+ * The takeWhile operation
+ */
+ Take,
+ /**
+ * The dropWhile operation
+ */
+ Drop,
+ /**
+ * The operation(s) are undefined
+ */
+ Undefined
+ }
+
+ /**
+ * Create a result asserter for takeWhile or dropWhile operations.
+ * <p>
+ * If the stream pipeline consists of the takeWhile operation
+ * ({@link WhileOp#Take}) or the dropWhile operation ({@link WhileOp#Drop})
+ * then specific assertions can be made on the actual result based on the
+ * input elements, {@code inputData}, and whether those elements match the
+ * predicate, {@code p}, of the operation.
+ * <p>
+ * If the input elements have an encounter order then the actual result
+ * is asserted against the result of operating sequentially on input
+ * elements given the predicate and in accordance with the operation
+ * semantics. (The actual result whether produced sequentially or in
+ * parallel should the same.)
+ * <p>
+ * If the input elements have no encounter order then an actual result
+ * is, for practical purposes, considered non-deterministic.
+ * Consider an input list of lists that contains all possible permutations
+ * of the input elements, and a output list of lists that is the result of
+ * applying the pipeline with the operation sequentially to each input
+ * list.
+ * Any list in the output lists is a valid result. It's not practical to
+ * test in such a manner.
+ * For a takeWhile operation the following assertions can be made if
+ * only some of the input elements match the predicate (i.e. taking will
+ * short-circuit the pipeline):
+ * <ol>
+ * <li>The set of output elements is a subset of the set of matching
+ * input elements</li>
+ * <li>The set of output elements and the set of non-matching input
+ * element are disjoint</li>
+ * </ol>
+ * For a dropWhile operation the following assertions can be made:
+ * <ol>
+ * <li>The set of non-matching input elements is a subset of the set of
+ * output elements</li>
+ * <li>The set of matching output elements is a subset of the set of
+ * matching input elements</li>
+ * </ol>
+ *
+ * @param inputData the elements input into the stream pipeline
+ * @param op the operation of the stream pipeline, one of takeWhile,
+ * dropWhile, or an undefined set of operations (possibly including
+ * two or more takeWhile and/or dropWhile operations, or because
+ * the predicate is not stateless).
+ * @param p the stateless predicate applied to the operation, ignored if
+ * the
+ * operation is {@link WhileOp#Undefined}.
+ * @param <T> the type of elements
+ * @return a result asserter
+ */
+ private <T> ResultAsserter<Iterable<T>> whileResultAsserter(Iterable<T> inputData,
+ WhileOp op,
+ Predicate<? super T> p) {
+ return (act, exp, ord, par) -> {
+ if (par & !ord) {
+ List<T> input = new ArrayList<>();
+ inputData.forEach(input::add);
+
+ List<T> output = new ArrayList<>();
+ act.forEach(output::add);
+
+ if (op == WhileOp.Take) {
+ List<T> matchingInput = new ArrayList<>();
+ List<T> nonMatchingInput = new ArrayList<>();
+ input.forEach(t -> {
+ if (p.test(t))
+ matchingInput.add(t);
+ else
+ nonMatchingInput.add(t);
+ });
+
+ // If some, not all, elements are taken
+ if (matchingInput.size() < input.size()) {
+ assertTrue(output.size() <= matchingInput.size(),
+ "Output is larger than the matching input");
+
+ // The output must be a subset of the matching input
+ assertTrue(matchingInput.containsAll(output),
+ "Output is not a subset of the matching input");
+
+ // The output must not contain any non matching elements
+ for (T nonMatching : nonMatchingInput) {
+ assertFalse(output.contains(nonMatching),
+ "Output and non-matching input are not disjoint");
+ }
+ }
+ }
+ else if (op == WhileOp.Drop) {
+ List<T> matchingInput = new ArrayList<>();
+ List<T> nonMatchingInput = new ArrayList<>();
+ input.forEach(t -> {
+ if (p.test(t))
+ matchingInput.add(t);
+ else
+ nonMatchingInput.add(t);
+ });
+
+ // The non matching input must be a subset of output
+ assertTrue(output.containsAll(nonMatchingInput),
+ "Non-matching input is not a subset of the output");
+
+ // The matching output must be a subset of the matching input
+ List<T> matchingOutput = new ArrayList<>();
+ output.forEach(i -> {
+ if (p.test(i))
+ matchingOutput.add(i);
+ });
+ assertTrue(matchingInput.containsAll(matchingOutput),
+ "Matching output is not a subset of matching input");
+ }
+
+ // Note: if there is a combination of takeWhile and dropWhile then specific
+ // assertions cannot be performed.
+ // All that can be reliably asserted is the output is a subset of the input
+
+ assertTrue(input.containsAll(output));
+ }
+ else {
+ // For specific operations derive expected result from the input
+ if (op == WhileOp.Take) {
+ List<T> takeInput = new ArrayList<>();
+ for (T t : inputData) {
+ if (p.test(t))
+ takeInput.add(t);
+ else
+ break;
+ }
+
+ LambdaTestHelpers.assertContents(act, takeInput);
+ }
+ else if (op == WhileOp.Drop) {
+ List<T> dropInput = new ArrayList<>();
+ for (T t : inputData) {
+ if (dropInput.size() > 0 || !p.test(t))
+ dropInput.add(t);
+ }
+
+ LambdaTestHelpers.assertContents(act, dropInput);
+ }
+
+ LambdaTestHelpers.assertContents(act, exp);
+ }
+ };
+ }
+
+ private Collection<Integer> sizes(int s) {
+ Set<Integer> sizes = new LinkedHashSet<>();
+
+ sizes.add(0);
+ sizes.add(1);
+ sizes.add(s / 4);
+ sizes.add(s / 2);
+ sizes.add(3 * s / 4);
+ sizes.add(Math.max(0, s - 1));
+ sizes.add(s);
+ sizes.add(Integer.MAX_VALUE);
+
+ return sizes;
+ }
+
+ private void testWhileMulti(TestData.OfRef<Integer> data,
+ ResultAsserter<Iterable<Integer>> ra,
+ Function<Stream<Integer>, Stream<Integer>> mRef,
+ Function<IntStream, IntStream> mInt,
+ Function<LongStream, LongStream> mLong,
+ Function<DoubleStream, DoubleStream> mDouble) {
+ Map<String, Function<Stream<Integer>, Stream<Integer>>> ms = new HashMap<>();
+ ms.put("Ref", mRef);
+ ms.put("Int", s -> mInt.apply(s.mapToInt(e -> e)).mapToObj(e -> e));
+ ms.put("Long", s -> mLong.apply(s.mapToLong(e -> e)).mapToObj(e -> (int) e));
+ ms.put("Double", s -> mDouble.apply(s.mapToDouble(e -> e)).mapToObj(e -> (int) e));
+ ms.put("Ref using defaults", s -> mRef.apply(DefaultMethodStreams.delegateTo(s)));
+ ms.put("Int using defaults", s -> mInt.apply(DefaultMethodStreams.delegateTo(s.mapToInt(e -> e))).mapToObj(e -> e));
+ ms.put("Long using defaults", s -> mLong.apply(DefaultMethodStreams.delegateTo(s.mapToLong(e -> e))).mapToObj(e -> (int) e));
+ ms.put("Double using defaults", s -> mDouble.apply(DefaultMethodStreams.delegateTo(s.mapToDouble(e -> e))).mapToObj(e -> (int) e));
+
+ testWhileMulti(data, ra, ms);
+ }
+
+ private final void testWhileMulti(TestData.OfRef<Integer> data,
+ ResultAsserter<Iterable<Integer>> ra,
+ Map<String, Function<Stream<Integer>, Stream<Integer>>> ms) {
+ for (Map.Entry<String, Function<Stream<Integer>, Stream<Integer>>> e : ms.entrySet()) {
+ setContext("shape", e.getKey());
+
+ withData(data)
+ .stream(e.getValue())
+ .resultAsserter(ra)
+ .exercise();
+ }
+ }
+
+ @Test
+ public void testRefDefaultClose() {
+ AtomicBoolean isClosed = new AtomicBoolean();
+ Stream<Integer> s = Stream.of(1, 2, 3).onClose(() -> isClosed.set(true));
+ try (Stream<Integer> ds = DefaultMethodStreams.delegateTo(s).takeWhile(e -> e < 3)) {
+ ds.count();
+ }
+ assertTrue(isClosed.get());
+ }
+
+ @Test
+ public void testIntDefaultClose() {
+ AtomicBoolean isClosed = new AtomicBoolean();
+ IntStream s = IntStream.of(1, 2, 3).onClose(() -> isClosed.set(true));
+ try (IntStream ds = DefaultMethodStreams.delegateTo(s).takeWhile(e -> e < 3)) {
+ ds.count();
+ }
+ assertTrue(isClosed.get());
+ }
+
+ @Test
+ public void testLongDefaultClose() {
+ AtomicBoolean isClosed = new AtomicBoolean();
+ LongStream s = LongStream.of(1, 2, 3).onClose(() -> isClosed.set(true));
+ try (LongStream ds = DefaultMethodStreams.delegateTo(s).takeWhile(e -> e < 3)) {
+ ds.count();
+ }
+ assertTrue(isClosed.get());
+ }
+
+ @Test
+ public void testDoubleDefaultClose() {
+ AtomicBoolean isClosed = new AtomicBoolean();
+ DoubleStream s = DoubleStream.of(1, 2, 3).onClose(() -> isClosed.set(true));
+ try (DoubleStream ds = DefaultMethodStreams.delegateTo(s).takeWhile(e -> e < 3)) {
+ ds.count();
+ }
+ assertTrue(isClosed.get());
+ }
+}
--- a/jdk/test/javax/net/ssl/DTLS/DTLSOverDatagram.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSOverDatagram.java Tue Jul 14 15:26:34 2015 -0700
@@ -46,8 +46,8 @@
* An example to show the way to use SSLEngine in datagram connections.
*/
public class DTLSOverDatagram {
- private static int MAX_HANDSHAKE_LOOPS = 60;
- private static int MAX_APP_READ_LOOPS = 10;
+ private static int MAX_HANDSHAKE_LOOPS = 200;
+ private static int MAX_APP_READ_LOOPS = 60;
/*
* The following is to set up the keystores.
--- a/jdk/test/sun/security/krb5/auto/BadKdc1.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/test/sun/security/krb5/auto/BadKdc1.java Tue Jul 14 15:26:34 2015 -0700
@@ -53,7 +53,7 @@
// k3 off k2 on
"(122212(22){1,2}|1222323232-)", // 1
// k1 on
- "(12(12){1,2}|122232-)" // empty
+ "(12(12){1,2}|122212|122232-)" // empty
);
}
}
--- a/jdk/test/sun/security/krb5/auto/KDC.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/test/sun/security/krb5/auto/KDC.java Tue Jul 14 15:26:34 2015 -0700
@@ -811,7 +811,7 @@
new TransitedEncoding(1, new byte[0]), // TODO
new KerberosTime(new Date()),
body.from,
- till, body.rtime,
+ till, etp.renewTill,
body.addresses != null ? body.addresses
: etp.caddr,
null);
@@ -834,7 +834,7 @@
tFlags,
new KerberosTime(new Date()),
body.from,
- till, body.rtime,
+ till, etp.renewTill,
service,
body.addresses
);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/krb5/auto/Renew.java Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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 8058290
+ * @summary JAAS Krb5LoginModule has suspect ticket-renewal logic,
+ * relies on clockskew grace
+ * @modules java.base/sun.net.spi.nameservice
+ * java.base/sun.security.util
+ * java.security.jgss/sun.security.krb5
+ * java.security.jgss/sun.security.krb5.internal
+ * java.security.jgss/sun.security.krb5.internal.ccache
+ * java.security.jgss/sun.security.krb5.internal.crypto
+ * java.security.jgss/sun.security.krb5.internal.ktab
+ * @compile -XDignore.symbol.file Renew.java
+ * @run main/othervm Renew 1
+ * @run main/othervm Renew 2
+ * @run main/othervm Renew 3
+ */
+
+import sun.security.krb5.Config;
+
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.Date;
+import javax.security.auth.kerberos.KerberosTicket;
+
+public class Renew {
+
+ public static void main(String[] args) throws Exception {
+
+ // Three test cases:
+ // 1. renewTGT=false
+ // 2. renewTGT=true with a short life time, renew will happen
+ // 3. renewTGT=true with a long life time, renew won't happen
+ int test = Integer.parseInt(args[0]);
+
+ OneKDC k = new OneKDC(null);
+ KDC.saveConfig(OneKDC.KRB5_CONF, k,
+ "renew_lifetime = 1d",
+ "ticket_lifetime = " + (test == 2? "10s": "8h"));
+ Config.refresh();
+ k.writeJAASConf();
+
+ // KDC would save ccache in a file
+ System.setProperty("test.kdc.save.ccache", "cache.here");
+
+ Files.write(Paths.get(OneKDC.JAAS_CONF), Arrays.asList(
+ "first {",
+ " com.sun.security.auth.module.Krb5LoginModule required;",
+ "};",
+ "second {",
+ " com.sun.security.auth.module.Krb5LoginModule required",
+ " doNotPrompt=true",
+ " renewTGT=" + (test != 1),
+ " useTicketCache=true",
+ " ticketCache=cache.here;",
+ "};"
+ ));
+
+ Context c;
+
+ // The first login uses username and password
+ c = Context.fromUserPass(OneKDC.USER, OneKDC.PASS, false);
+ Date d1 = c.s().getPrivateCredentials(KerberosTicket.class).iterator().next().getAuthTime();
+
+ // 6s is longer than half of 10s
+ Thread.sleep(6000);
+
+ // The second login uses the cache
+ c = Context.fromJAAS("second");
+ Date d2 = c.s().getPrivateCredentials(KerberosTicket.class).iterator().next().getAuthTime();
+
+ if (test == 2) {
+ if (d1.equals(d2)) {
+ throw new Exception("Ticket not renewed");
+ }
+ } else {
+ if (!d1.equals(d2)) {
+ throw new Exception("Ticket renewed");
+ }
+ }
+ }
+}
--- a/jdk/test/sun/security/tools/jarsigner/TsacertOptionTest.java Tue Jul 14 20:36:12 2015 +0300
+++ b/jdk/test/sun/security/tools/jarsigner/TsacertOptionTest.java Tue Jul 14 15:26:34 2015 -0700
@@ -120,6 +120,9 @@
// specify -tsadigestalg option because
// TSA server uses SHA-1 digest algorithm
OutputAnalyzer analyzer = ProcessTools.executeCommand(JARSIGNER,
+ "-J-Dhttp.proxyHost=",
+ "-J-Dhttp.proxyPort=",
+ "-J-Djava.net.useSystemProxies=",
"-verbose",
"-keystore", KEYSTORE,
"-storepass", PASSWORD,
--- a/langtools/.hgtags Tue Jul 14 20:36:12 2015 +0300
+++ b/langtools/.hgtags Tue Jul 14 15:26:34 2015 -0700
@@ -314,3 +314,4 @@
931ec7dd6cd9e4a92bde7b2cd26e9a9fb0ecdb56 jdk9-b69
d732d6dfa72743e3aa96375c6e33f1388dbaa5c6 jdk9-b70
dc35e315436d21eab68ef44909922fb3424917f3 jdk9-b71
+832e51533706b633d37a77282ae94d016b95e649 jdk9-b72
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Tue Jul 14 20:36:12 2015 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Tue Jul 14 15:26:34 2015 -0700
@@ -4140,12 +4140,7 @@
public void visitAnnotatedType(JCAnnotatedType tree) {
attribAnnotationTypes(tree.annotations, env);
- JCExpression underlyingTypeTree = tree.getUnderlyingType();
- Type underlyingType = attribTree(underlyingTypeTree, env,
- new ResultInfo(KindSelector.TYP_PCK, Type.noType));
- if (!chk.checkAnnotableType(underlyingType, tree.annotations, underlyingTypeTree.pos())) {
- underlyingType = underlyingTypeTree.type = syms.errType;
- }
+ Type underlyingType = attribType(tree.underlyingType, env);
Type annotatedType = underlyingType.annotatedType(Annotations.TO_BE_SET);
if (!env.info.isNewClass)
@@ -4636,7 +4631,16 @@
}
} else if (enclTr.hasTag(ANNOTATED_TYPE)) {
JCAnnotatedType at = (JCTree.JCAnnotatedType) enclTr;
- if (!chk.checkAnnotableType(enclTy, at.getAnnotations(), at.underlyingType.pos())) {
+ if (enclTy == null || enclTy.hasTag(NONE)) {
+ if (at.getAnnotations().size() == 1) {
+ log.error(at.underlyingType.pos(), "cant.type.annotate.scoping.1", at.getAnnotations().head.attribute);
+ } else {
+ ListBuffer<Attribute.Compound> comps = new ListBuffer<>();
+ for (JCAnnotation an : at.getAnnotations()) {
+ comps.add(an.attribute);
+ }
+ log.error(at.underlyingType.pos(), "cant.type.annotate.scoping", comps.toList());
+ }
repeat = false;
}
enclTr = at.underlyingType;
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java Tue Jul 14 20:36:12 2015 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java Tue Jul 14 15:26:34 2015 -0700
@@ -63,8 +63,6 @@
import static com.sun.tools.javac.code.TypeTag.*;
import static com.sun.tools.javac.code.TypeTag.WILDCARD;
-import static com.sun.tools.javac.resources.CompilerProperties.Errors.CantTypeAnnotateScoping;
-import static com.sun.tools.javac.resources.CompilerProperties.Errors.CantTypeAnnotateScoping1;
import static com.sun.tools.javac.tree.JCTree.Tag.*;
/** Type checking helper class for the attribution phase.
@@ -2694,29 +2692,6 @@
* Check annotations
**************************************************************************/
- /** Verify that a component of a qualified type name being type annotated
- * can indeed be legally be annotated. For example, package names and type
- * names used to access static members cannot be annotated.
- *
- * @param typeComponent the component of the qualified name being annotated
- * @param annotations the annotations
- * @param pos diagnostic position
- * @return true if all is swell, false otherwise.
- */
- boolean checkAnnotableType(Type typeComponent, List<JCAnnotation> annotations, DiagnosticPosition pos) {
- if (typeComponent == null || typeComponent.hasTag(PACKAGE) || typeComponent.hasTag(NONE)) {
- ListBuffer<Symbol> lb = new ListBuffer<>();
- for (JCAnnotation annotation : annotations) {
- lb.append(annotation.annotationType.type.tsym);
- }
- List<Symbol> symbols = lb.toList();
- log.error(pos,
- symbols.size() > 1 ? CantTypeAnnotateScoping(symbols)
- : CantTypeAnnotateScoping1(symbols.get(0)));
- return false;
- }
- return true;
- }
/**
* Recursively validate annotations values
*/
--- a/langtools/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.java Tue Jul 14 20:36:12 2015 +0300
+++ b/langtools/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.java Tue Jul 14 15:26:34 2015 -0700
@@ -1,12 +1,12 @@
/*
* @test /nodynamiccopyright/
- * @bug 8026564 8074346
+ * @bug 8026564
* @summary The parts of a fully-qualified type can't be annotated.
* @author Werner Dietl
+ * @ignore 8057679 clarify error messages trying to annotate scoping
* @compile/fail/ref=CantAnnotatePackages.out -XDrawDiagnostics CantAnnotatePackages.java
*/
-
import java.lang.annotation.*;
import java.util.List;
@@ -21,8 +21,6 @@
java. @TA lang.Object of3;
List<java. @TA lang.Object> of4;
- List<@CantAnnotatePackages_TB java.lang.Object> of5; // test that we do reasonable things for missing types.
-
// TODO: also note the order of error messages.
}
--- a/langtools/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.out Tue Jul 14 20:36:12 2015 +0300
+++ b/langtools/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.out Tue Jul 14 15:26:34 2015 -0700
@@ -1,7 +1,5 @@
-CantAnnotatePackages.java:20:14: compiler.err.cant.type.annotate.scoping.1: TA
-CantAnnotatePackages.java:21:9: compiler.err.cant.type.annotate.scoping.1: TA
-CantAnnotatePackages.java:22:14: compiler.err.cant.type.annotate.scoping.1: TA
-CantAnnotatePackages.java:24:11: compiler.err.cant.resolve.location: kindname.class, CantAnnotatePackages_TB, , , (compiler.misc.location: kindname.class, CantAnnotatePackages, null)
-CantAnnotatePackages.java:24:35: compiler.err.cant.type.annotate.scoping.1: CantAnnotatePackages_TB
-CantAnnotatePackages.java:15:18: compiler.err.cant.type.annotate.scoping.1: @TA
-6 errors
+CantAnnotatePackages.java:14:13: compiler.err.cant.type.annotate.scoping.1: @TA
+CantAnnotatePackages.java:19:18: compiler.err.cant.type.annotate.scoping.1: @TA
+CantAnnotatePackages.java:20:19: compiler.err.cant.type.annotate.scoping.1: @TA
+CantAnnotatePackages.java:21:24: compiler.err.cant.type.annotate.scoping.1: @TA
+4 errors
--- a/langtools/test/tools/javac/annotations/typeAnnotations/failures/T8074346.java Tue Jul 14 20:36:12 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-/*
- * @test /nodynamiccopyright/
- * @bug 8074346
- * @author sadayapalam
- * @summary Test that type annotation on a qualified type doesn't cause spurious 'cannot find symbol' errors
- * @compile/fail/ref=T8074346.out -XDrawDiagnostics T8074346.java
-*/
-
-abstract class T8074346 implements
- @T8074346_TA @T8074346_TB java.util.Map<@T8074346_TA java.lang.String, java.lang.@T8074346_TA String>,
- java.util.@T8074346_TA List {
-}
-
-@java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE_USE)
-@interface T8074346_TA { }
-
-@java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE_USE)
-@interface T8074346_TB { }
\ No newline at end of file
--- a/langtools/test/tools/javac/annotations/typeAnnotations/failures/T8074346.out Tue Jul 14 20:36:12 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-T8074346.java:10:35: compiler.err.cant.type.annotate.scoping: T8074346_TA,T8074346_TB
-T8074346.java:10:62: compiler.err.cant.type.annotate.scoping.1: T8074346_TA
-2 errors
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/inference/8078024/T8078024.java Tue Jul 14 15:26:34 2015 -0700
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8078024
+ * @summary before the patch for JDK-8078024 this code wasn't accepted by the compiler. After the
+ * mentioned patch the second method is selected as applicable and the code is accepted.
+ * @compile T8078024.java
+ */
+
+import java.util.Arrays;
+import java.util.List;
+
+class T8078024 {
+ public static <A> List<List<A>> cartesianProduct(List<? extends A>... lists) {
+ return cartesianProduct(Arrays.asList(lists));
+ }
+
+ public static <B> List<List<B>> cartesianProduct(List<? extends List<? extends B>> lists) {
+ return null;
+ }
+}
--- a/make/CompileJavaModules.gmk Tue Jul 14 20:36:12 2015 +0300
+++ b/make/CompileJavaModules.gmk Tue Jul 14 15:26:34 2015 -0700
@@ -368,6 +368,10 @@
################################################################################
+jdk.internal.le_COPY := .properties
+
+################################################################################
+
jdk.jcmd_COPY := _options
################################################################################
--- a/make/Images.gmk Tue Jul 14 20:36:12 2015 +0300
+++ b/make/Images.gmk Tue Jul 14 15:26:34 2015 -0700
@@ -46,7 +46,7 @@
jdk.naming.dns jdk.naming.rmi jdk.scripting.nashorn jdk.zipfs
# tools
-TOOLS_MODULES += jdk.attach jdk.compiler jdk.dev jdk.javadoc jdk.jcmd jdk.jconsole \
+TOOLS_MODULES += jdk.attach jdk.compiler jdk.dev jdk.internal.le jdk.javadoc jdk.jcmd jdk.jconsole \
jdk.hotspot.agent jdk.hprof.agent jdk.jartool jdk.jdeps jdk.jdi jdk.jdwp.agent \
jdk.policytool jdk.rmic jdk.xml.bind jdk.xml.ws
--- a/modules.xml Tue Jul 14 20:36:12 2015 +0300
+++ b/modules.xml Tue Jul 14 15:26:34 2015 -0700
@@ -1625,6 +1625,26 @@
</export>
</module>
<module>
+ <name>jdk.internal.le</name>
+ <depend>java.base</depend>
+ <export>
+ <name>jdk.internal.jline</name>
+ <to>jdk.scripting.nashorn.shell</to>
+ </export>
+ <export>
+ <name>jdk.internal.jline.console</name>
+ <to>jdk.scripting.nashorn.shell</to>
+ </export>
+ <export>
+ <name>jdk.internal.jline.console.completer</name>
+ <to>jdk.scripting.nashorn.shell</to>
+ </export>
+ <export>
+ <name>jdk.internal.jline.console.history</name>
+ <to>jdk.scripting.nashorn.shell</to>
+ </export>
+ </module>
+ <module>
<name>jdk.jartool</name>
<depend>java.base</depend>
<export>
--- a/nashorn/.hgtags Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/.hgtags Tue Jul 14 15:26:34 2015 -0700
@@ -305,3 +305,4 @@
194b74467afcab3ca0096f04570def424977215d jdk9-b69
3379235149c0e14e59e05c4ab8df450f5777b552 jdk9-b70
7066af6e7b06f3c6ebf449c88fc1064d2181237a jdk9-b71
+d017877b3b8cd39337f1bdc00d958f821433c4c3 jdk9-b72
--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MemberInfo.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MemberInfo.java Tue Jul 14 15:26:34 2015 -0700
@@ -39,7 +39,7 @@
*/
public final class MemberInfo implements Cloneable {
// class loader of this class
- private static ClassLoader myLoader = MemberInfo.class.getClassLoader();
+ private static final ClassLoader MY_LOADER = MemberInfo.class.getClassLoader();
/**
* The different kinds of available class annotations
@@ -493,7 +493,7 @@
if (type.getSort() == Type.OBJECT) {
try {
- final Class<?> clazz = Class.forName(type.getClassName(), false, myLoader);
+ final Class<?> clazz = Class.forName(type.getClassName(), false, MY_LOADER);
return ScriptObject.class.isAssignableFrom(clazz);
} catch (final ClassNotFoundException cnfe) {
return false;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/beans/BeanLinker.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/beans/BeanLinker.java Tue Jul 14 15:26:34 2015 -0700
@@ -156,14 +156,14 @@
return null;
}
- private static MethodHandle GET_LIST_ELEMENT = Lookup.PUBLIC.findVirtual(List.class, "get",
+ private static final MethodHandle GET_LIST_ELEMENT = Lookup.PUBLIC.findVirtual(List.class, "get",
MethodType.methodType(Object.class, int.class));
- private static MethodHandle GET_MAP_ELEMENT = Lookup.PUBLIC.findVirtual(Map.class, "get",
+ private static final MethodHandle GET_MAP_ELEMENT = Lookup.PUBLIC.findVirtual(Map.class, "get",
MethodType.methodType(Object.class, Object.class));
- private static MethodHandle LIST_GUARD = Guards.getInstanceOfGuard(List.class);
- private static MethodHandle MAP_GUARD = Guards.getInstanceOfGuard(Map.class);
+ private static final MethodHandle LIST_GUARD = Guards.getInstanceOfGuard(List.class);
+ private static final MethodHandle MAP_GUARD = Guards.getInstanceOfGuard(Map.class);
private enum CollectionType {
ARRAY, LIST, MAP
@@ -287,7 +287,7 @@
if(intIndex != doubleValue && !Double.isInfinite(doubleValue)) { // let infinites trigger IOOBE
return null; // not an exact integer
}
- return Integer.valueOf(intIndex);
+ return intIndex;
} catch(Exception|Error e) {
throw e;
} catch(final Throwable t) {
@@ -343,9 +343,9 @@
}
}
- private static MethodHandle RANGE_CHECK_ARRAY = findRangeCheck(Object.class);
- private static MethodHandle RANGE_CHECK_LIST = findRangeCheck(List.class);
- private static MethodHandle CONTAINS_MAP = Lookup.PUBLIC.findVirtual(Map.class, "containsKey",
+ private static final MethodHandle RANGE_CHECK_ARRAY = findRangeCheck(Object.class);
+ private static final MethodHandle RANGE_CHECK_LIST = findRangeCheck(List.class);
+ private static final MethodHandle CONTAINS_MAP = Lookup.PUBLIC.findVirtual(Map.class, "containsKey",
MethodType.methodType(boolean.class, Object.class));
private static MethodHandle findRangeCheck(final Class<?> collectionType) {
@@ -353,7 +353,7 @@
}
@SuppressWarnings("unused")
- private static final boolean rangeCheck(final Object array, final Object index) {
+ private static boolean rangeCheck(final Object array, final Object index) {
if(!(index instanceof Number)) {
return false;
}
@@ -370,7 +370,7 @@
}
@SuppressWarnings("unused")
- private static final boolean rangeCheck(final List<?> list, final Object index) {
+ private static boolean rangeCheck(final List<?> list, final Object index) {
if(!(index instanceof Number)) {
return false;
}
@@ -386,10 +386,10 @@
throw new IndexOutOfBoundsException("Index: " + n + ", Size: " + list.size());
}
- private static MethodHandle SET_LIST_ELEMENT = Lookup.PUBLIC.findVirtual(List.class, "set",
+ private static final MethodHandle SET_LIST_ELEMENT = Lookup.PUBLIC.findVirtual(List.class, "set",
MethodType.methodType(Object.class, int.class, Object.class));
- private static MethodHandle PUT_MAP_ELEMENT = Lookup.PUBLIC.findVirtual(Map.class, "put",
+ private static final MethodHandle PUT_MAP_ELEMENT = Lookup.PUBLIC.findVirtual(Map.class, "put",
MethodType.methodType(Object.class, Object.class, Object.class));
private GuardedInvocationComponent getElementSetter(final CallSiteDescriptor callSiteDescriptor,
@@ -471,16 +471,16 @@
gic.getValidatorClass(), gic.getValidationType());
}
- private static MethodHandle GET_ARRAY_LENGTH = Lookup.PUBLIC.findStatic(Array.class, "getLength",
+ private static final MethodHandle GET_ARRAY_LENGTH = Lookup.PUBLIC.findStatic(Array.class, "getLength",
MethodType.methodType(int.class, Object.class));
- private static MethodHandle GET_COLLECTION_LENGTH = Lookup.PUBLIC.findVirtual(Collection.class, "size",
+ private static final MethodHandle GET_COLLECTION_LENGTH = Lookup.PUBLIC.findVirtual(Collection.class, "size",
MethodType.methodType(int.class));
- private static MethodHandle GET_MAP_LENGTH = Lookup.PUBLIC.findVirtual(Map.class, "size",
+ private static final MethodHandle GET_MAP_LENGTH = Lookup.PUBLIC.findVirtual(Map.class, "size",
MethodType.methodType(int.class));
- private static MethodHandle COLLECTION_GUARD = Guards.getInstanceOfGuard(Collection.class);
+ private static final MethodHandle COLLECTION_GUARD = Guards.getInstanceOfGuard(Collection.class);
private GuardedInvocationComponent getLengthGetter(final CallSiteDescriptor callSiteDescriptor) {
assertParameterCount(callSiteDescriptor, 1);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/support/NameCodec.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/support/NameCodec.java Tue Jul 14 15:26:34 2015 -0700
@@ -164,7 +164,7 @@
}
}
if(b == null) {
- return name.toString();
+ return name;
}
assert lastEscape != -1;
b.append(name, lastEscape + 1, l);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/support/TypeConverterFactory.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/support/TypeConverterFactory.java Tue Jul 14 15:26:34 2015 -0700
@@ -166,7 +166,7 @@
}
};
- private static final ClassLoader getClassLoader(final Class<?> clazz) {
+ private static ClassLoader getClassLoader(final Class<?> clazz) {
return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
@Override
public ClassLoader run() {
@@ -298,7 +298,7 @@
* @return true if there can be a conversion, false if there can not.
*/
public boolean canConvert(final Class<?> from, final Class<?> to) {
- return canAutoConvert(from, to) || canConvert.get(from).get(to).booleanValue();
+ return canAutoConvert(from, to) || canConvert.get(from).get(to);
}
/**
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/Formatter.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/Formatter.java Tue Jul 14 15:26:34 2015 -0700
@@ -170,7 +170,7 @@
* @return true if '<' is in the string, else false
*/
private static boolean isPreviousArgument(final String s) {
- return (s != null && s.indexOf('<') >= 0) ? true : false;
+ return (s != null && s.indexOf('<') >= 0);
}
// %[argument_index$][flags][width][.precision][t]conversion
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ClassEmitter.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ClassEmitter.java Tue Jul 14 15:26:34 2015 -0700
@@ -705,7 +705,7 @@
/** private access */
PRIVATE(ACC_PRIVATE);
- private int value;
+ private final int value;
private Flag(final int value) {
this.value = value;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java Tue Jul 14 15:26:34 2015 -0700
@@ -213,7 +213,7 @@
private static final Type ITERATOR_TYPE = Type.typeFor(ITERATOR_CLASS);
private static final Type EXCEPTION_TYPE = Type.typeFor(CompilerConstants.EXCEPTION_PREFIX.type());
- private static final Integer INT_ZERO = Integer.valueOf(0);
+ private static final Integer INT_ZERO = 0;
/** Constant data & installation. The only reason the compiler keeps this is because it is assigned
* by reflection in class installation */
@@ -742,7 +742,7 @@
method.convert(Type.NUMBER);
}
- private static final Type undefinedToNumber(final Type type) {
+ private static Type undefinedToNumber(final Type type) {
return type == Type.UNDEFINED ? Type.NUMBER : type;
}
@@ -4877,7 +4877,7 @@
if(propertyValue instanceof String || propertyValue == null) {
method.load((String)propertyValue);
} else if(propertyValue instanceof Integer) {
- method.load(((Integer)propertyValue).intValue());
+ method.load(((Integer)propertyValue));
method.convert(Type.OBJECT);
} else {
throw new AssertionError();
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CompileUnit.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CompileUnit.java Tue Jul 14 15:26:34 2015 -0700
@@ -56,7 +56,7 @@
private transient Class<?> clazz;
- private transient Map<FunctionNode, RecompilableScriptFunctionData> functions = new IdentityHashMap<>();
+ private final transient Map<FunctionNode, RecompilableScriptFunctionData> functions = new IdentityHashMap<>();
private transient boolean isUsed;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Compiler.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Compiler.java Tue Jul 14 15:26:34 2015 -0700
@@ -437,7 +437,7 @@
baseName = baseName.replace('.', '_').replace('-', '_');
if (!env._loader_per_compile) {
- baseName = baseName + installer.getUniqueScriptId();
+ baseName += installer.getUniqueScriptId();
}
// ASM's bytecode verifier does not allow JVM allowed safe escapes using '\' as escape char.
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ConstantData.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ConstantData.java Tue Jul 14 15:26:34 2015 -0700
@@ -162,7 +162,7 @@
final Integer value = stringMap.get(string);
if (value != null) {
- return value.intValue();
+ return value;
}
constants.add(string);
@@ -191,7 +191,7 @@
final Integer value = objectMap.get(entry);
if (value != null) {
- return value.intValue();
+ return value;
}
constants.add(object);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/DumpBytecode.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/DumpBytecode.java Tue Jul 14 15:26:34 2015 -0700
@@ -51,7 +51,7 @@
if (env._print_code) {
final StringBuilder sb = new StringBuilder();
- sb.append("class: " + className).
+ sb.append("class: ").append(className).
append('\n').
append(ClassEmitter.disassemble(bytecode)).
append("=====");
@@ -88,7 +88,7 @@
}
- // should code be dumped to disk - only valid in compile_only mode?
+ // should code be dumped to disk
if (env._dest_dir != null) {
final String fileName = className.replace('.', File.separatorChar) + ".class";
final int index = fileName.lastIndexOf(File.separatorChar);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/FindScopeDepths.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/FindScopeDepths.java Tue Jul 14 15:26:34 2015 -0700
@@ -121,11 +121,9 @@
private static boolean definedInBlock(final Block block, final Symbol symbol) {
if (symbol.isGlobal()) {
- if (block.isGlobalScope()) {
- return true;
- }
//globals cannot be defined anywhere else
- return false;
+
+ return block.isGlobalScope();
}
return block.getExistingSymbol(symbol.getName()) == symbol;
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/LocalVariableTypesCalculator.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/LocalVariableTypesCalculator.java Tue Jul 14 15:26:34 2015 -0700
@@ -272,12 +272,12 @@
}
private static class SymbolConversions {
- private static byte I2L = 1 << 0;
- private static byte I2D = 1 << 1;
- private static byte I2O = 1 << 2;
- private static byte L2D = 1 << 3;
- private static byte L2O = 1 << 4;
- private static byte D2O = 1 << 5;
+ private static final byte I2L = 1 << 0;
+ private static final byte I2D = 1 << 1;
+ private static final byte I2O = 1 << 2;
+ private static final byte L2D = 1 << 3;
+ private static final byte L2O = 1 << 4;
+ private static final byte D2O = 1 << 5;
private byte conversions;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Lower.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Lower.java Tue Jul 14 15:26:34 2015 -0700
@@ -101,7 +101,7 @@
// Conservative pattern to test if element names consist of characters valid for identifiers.
// This matches any non-zero length alphanumeric string including _ and $ and not starting with a digit.
- private static Pattern SAFE_PROPERTY_NAME = Pattern.compile("[a-zA-Z_$][\\w$]*");
+ private static final Pattern SAFE_PROPERTY_NAME = Pattern.compile("[a-zA-Z_$][\\w$]*");
/**
* Constructor.
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ObjectClassGenerator.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ObjectClassGenerator.java Tue Jul 14 15:26:34 2015 -0700
@@ -69,7 +69,6 @@
import jdk.nashorn.internal.runtime.logging.DebugLogger;
import jdk.nashorn.internal.runtime.logging.Loggable;
import jdk.nashorn.internal.runtime.logging.Logger;
-import jdk.nashorn.internal.runtime.options.Options;
/**
* Generates the ScriptObject subclass structure with fields for a user objects.
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/types/IntType.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/types/IntType.java Tue Jul 14 15:26:34 2015 -0700
@@ -89,7 +89,7 @@
public Type ldc(final MethodVisitor method, final Object c) {
assert c instanceof Integer;
- final int value = ((Integer) c).intValue();
+ final int value = ((Integer) c);
switch (value) {
case -1:
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/NashornClassReader.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/NashornClassReader.java Tue Jul 14 15:26:34 2015 -0700
@@ -88,7 +88,7 @@
c = bytecode[i++];
switch (st) {
case 0:
- c = c & 0xFF;
+ c &= 0xFF;
if (c < 0x80) { // 0xxxxxxx
buf[strLen++] = (char) c;
} else if (c < 0xE0 && c > 0xBF) { // 110x xxxx 10xx xxxx
@@ -457,7 +457,7 @@
@SuppressWarnings("unused")
final String getType() {
- String str = type[tag];
+ String str = TYPE[tag];
while (str.length() < 16) {
str += " ";
}
@@ -507,7 +507,7 @@
}
}
- private static String type[] = {
+ private static final String[] TYPE = {
//0
"<error>",
//1
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/NashornTextifier.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/NashornTextifier.java Tue Jul 14 15:26:34 2015 -0700
@@ -535,7 +535,7 @@
addText(sb);
}
- private static final boolean noFallThru(final int opcode) {
+ private static boolean noFallThru(final int opcode) {
switch (opcode) {
case Opcodes.GOTO:
case Opcodes.ATHROW:
@@ -901,7 +901,7 @@
appendDescriptor(sb, INTERNAL_NAME, desc);
}
} else if (o[i] instanceof Integer) {
- switch (((Integer)o[i]).intValue()) {
+ switch (((Integer)o[i])) {
case 0:
appendDescriptor(sb, FIELD_DESCRIPTOR, "T");
break;
@@ -1090,7 +1090,7 @@
public String toString() {
final StringBuilder sb = new StringBuilder();
- sb.append("digraph " + dottyFriendly(name) + " {");
+ sb.append("digraph ").append(dottyFriendly(name)).append(" {");
sb.append("\n");
sb.append("\tgraph [fontname=courier]\n");
sb.append("\tnode [style=filled,color="+COLOR_DEFAULT+",fontname=courier]\n");
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/ObjectSizeCalculator.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/ObjectSizeCalculator.java Tue Jul 14 15:26:34 2015 -0700
@@ -450,7 +450,7 @@
for (final Object mp : memoryPoolMXBeans) {
final Object usage = getUsage.invoke(mp);
final Object max = getMax.invoke(usage);
- maxMemory += ((Long)max).longValue();
+ maxMemory += ((Long)max);
}
} catch (IllegalAccessException |
IllegalArgumentException |
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java Tue Jul 14 15:26:34 2015 -0700
@@ -88,14 +88,14 @@
*/
@ScriptClass("Global")
public final class Global extends Scope {
- // Placeholder value used in place of a location property (__FILE__, __DIR__, __LINE__)
- private static final Object LOCATION_PROPERTY_PLACEHOLDER = new Object();
+ // This special value is used to flag a lazily initialized global property.
+ // This also serves as placeholder value used in place of a location property
+ // (__FILE__, __DIR__, __LINE__)
+ private static final Object LAZY_SENTINEL = new Object();
+
private final InvokeByName TO_STRING = new InvokeByName("toString", ScriptObject.class);
private final InvokeByName VALUE_OF = new InvokeByName("valueOf", ScriptObject.class);
- // placeholder value for lazily initialized global objects
- private static final Object LAZY_SENTINEL = new Object();
-
/**
* Optimistic builtin names that require switchpoint invalidation
* upon assignment. Overly conservative, but works for now, to avoid
@@ -182,15 +182,15 @@
/** Value property NaN of the Global Object - ECMA 15.1.1.1 NaN */
@Property(attributes = Attribute.NON_ENUMERABLE_CONSTANT)
- public final double NaN = Double.NaN;
+ public static final double NaN = Double.NaN;
/** Value property Infinity of the Global Object - ECMA 15.1.1.2 Infinity */
@Property(attributes = Attribute.NON_ENUMERABLE_CONSTANT)
- public final double Infinity = Double.POSITIVE_INFINITY;
+ public static final double Infinity = Double.POSITIVE_INFINITY;
/** Value property Undefined of the Global Object - ECMA 15.1.1.3 Undefined */
@Property(attributes = Attribute.NON_ENUMERABLE_CONSTANT)
- public final Object undefined = UNDEFINED;
+ public static final Object undefined = UNDEFINED;
/** ECMA 15.1.2.1 eval(x) */
@Property(attributes = Attribute.NOT_ENUMERABLE)
@@ -830,15 +830,15 @@
/** Nashorn extension: current script's file name */
@Property(name = "__FILE__", attributes = Attribute.NON_ENUMERABLE_CONSTANT)
- public final Object __FILE__ = LOCATION_PROPERTY_PLACEHOLDER;
+ public static final Object __FILE__ = LAZY_SENTINEL;
/** Nashorn extension: current script's directory */
@Property(name = "__DIR__", attributes = Attribute.NON_ENUMERABLE_CONSTANT)
- public final Object __DIR__ = LOCATION_PROPERTY_PLACEHOLDER;
+ public static final Object __DIR__ = LAZY_SENTINEL;
/** Nashorn extension: current source line number being executed */
@Property(name = "__LINE__", attributes = Attribute.NON_ENUMERABLE_CONSTANT)
- public final Object __LINE__ = LOCATION_PROPERTY_PLACEHOLDER;
+ public static final Object __LINE__ = LAZY_SENTINEL;
private volatile NativeDate DEFAULT_DATE;
@@ -1768,38 +1768,10 @@
return ScriptFunction.getPrototype(getBuiltinFloat64Array());
}
- private ScriptFunction getBuiltinArray() {
- return builtinArray;
- }
-
ScriptFunction getTypeErrorThrower() {
return typeErrorThrower;
}
- /**
- * Called from compiled script code to test if builtin has been overridden
- *
- * @return true if builtin array has not been overridden
- */
- public static boolean isBuiltinArray() {
- final Global instance = Global.instance();
- return instance.array == instance.getBuiltinArray();
- }
-
- private ScriptFunction getBuiltinBoolean() {
- return builtinBoolean;
- }
-
- /**
- * Called from compiled script code to test if builtin has been overridden
- *
- * @return true if builtin boolean has not been overridden
- */
- public static boolean isBuiltinBoolean() {
- final Global instance = Global.instance();
- return instance._boolean == instance.getBuiltinBoolean();
- }
-
private synchronized ScriptFunction getBuiltinDate() {
if (this.builtinDate == null) {
this.builtinDate = initConstructorAndSwitchPoint("Date", ScriptFunction.class);
@@ -1810,30 +1782,6 @@
return this.builtinDate;
}
- /**
- * Called from compiled script code to test if builtin has been overridden
- *
- * @return true if builtin date has not been overridden
- */
- public static boolean isBuiltinDate() {
- final Global instance = Global.instance();
- return instance.date == LAZY_SENTINEL || instance.date == instance.getBuiltinDate();
- }
-
- private ScriptFunction getBuiltinError() {
- return builtinError;
- }
-
- /**
- * Called from compiled script code to test if builtin has been overridden
- *
- * @return true if builtin error has not been overridden
- */
- public static boolean isBuiltinError() {
- final Global instance = Global.instance();
- return instance.error == instance.getBuiltinError();
- }
-
private synchronized ScriptFunction getBuiltinEvalError() {
if (this.builtinEvalError == null) {
this.builtinEvalError = initErrorSubtype("EvalError", getErrorPrototype());
@@ -1841,31 +1789,11 @@
return this.builtinEvalError;
}
- /**
- * Called from compiled script code to test if builtin has been overridden
- *
- * @return true if builtin eval error has not been overridden
- */
- public static boolean isBuiltinEvalError() {
- final Global instance = Global.instance();
- return instance.evalError == LAZY_SENTINEL || instance.evalError == instance.getBuiltinEvalError();
- }
-
private ScriptFunction getBuiltinFunction() {
return builtinFunction;
}
/**
- * Called from compiled script code to test if builtin has been overridden
- *
- * @return true if builtin function has not been overridden
- */
- public static boolean isBuiltinFunction() {
- final Global instance = Global.instance();
- return instance.function == instance.getBuiltinFunction();
- }
-
- /**
* Get the switchpoint used to check property changes for Function.prototype.apply
* @return the switchpoint guarding apply (same as guarding call, and everything else in function)
*/
@@ -1906,16 +1834,6 @@
return builtinJSAdapter;
}
- /**
- * Called from compiled script code to test if builtin has been overridden
- *
- * @return true if builtin JSAdapter has not been overridden
- */
- public static boolean isBuiltinJSAdapter() {
- final Global instance = Global.instance();
- return instance.jsadapter == LAZY_SENTINEL || instance.jsadapter == instance.getBuiltinJSAdapter();
- }
-
private synchronized ScriptObject getBuiltinJSON() {
if (this.builtinJSON == null) {
this.builtinJSON = initConstructorAndSwitchPoint("JSON", ScriptObject.class);
@@ -1923,44 +1841,6 @@
return this.builtinJSON;
}
- /**
- * Called from compiled script code to test if builtin has been overridden
- *
- * @return true if builtin JSON has has not been overridden
- */
- public static boolean isBuiltinJSON() {
- final Global instance = Global.instance();
- return instance.json == LAZY_SENTINEL || instance.json == instance.getBuiltinJSON();
- }
-
- private ScriptObject getBuiltinJava() {
- return builtinJava;
- }
-
- /**
- * Called from compiled script code to test if builtin has been overridden
- *
- * @return true if builtin Java has not been overridden
- */
- public static boolean isBuiltinJava() {
- final Global instance = Global.instance();
- return instance.java == instance.getBuiltinJava();
- }
-
- private ScriptObject getBuiltinJavax() {
- return builtinJavax;
- }
-
- /**
- * Called from compiled script code to test if builtin has been overridden
- *
- * @return true if builtin Javax has not been overridden
- */
- public static boolean isBuiltinJavax() {
- final Global instance = Global.instance();
- return instance.javax == instance.getBuiltinJavax();
- }
-
private synchronized ScriptFunction getBuiltinJavaImporter() {
if (this.builtinJavaImporter == null) {
this.builtinJavaImporter = initConstructor("JavaImporter", ScriptFunction.class);
@@ -1975,68 +1855,6 @@
return this.builtinJavaApi;
}
- /**
- * Called from compiled script code to test if builtin has been overridden
- *
- * @return true if builtin Java importer has not been overridden
- */
- public static boolean isBuiltinJavaImporter() {
- final Global instance = Global.instance();
- return instance.javaImporter == LAZY_SENTINEL || instance.javaImporter == instance.getBuiltinJavaImporter();
- }
-
- /**
- * Called from compiled script code to test if builtin has been overridden
- *
- * @return true if builtin math has not been overridden
- */
- public static boolean isBuiltinMath() {
- final Global instance = Global.instance();
- return instance.math == instance.builtinMath;
- }
-
- private ScriptFunction getBuiltinNumber() {
- return builtinNumber;
- }
-
- /**
- * Called from compiled script code to test if builtin has been overridden
- *
- * @return true if builtin number has not been overridden
- */
- public static boolean isBuiltinNumber() {
- final Global instance = Global.instance();
- return instance.number == instance.getBuiltinNumber();
- }
-
- private ScriptFunction getBuiltinObject() {
- return builtinObject;
- }
-
- /**
- * Called from compiled script code to test if builtin has been overridden
- *
- * @return true if builtin object has not been overridden
- */
- public static boolean isBuiltinObject() {
- final Global instance = Global.instance();
- return instance.object == instance.getBuiltinObject();
- }
-
- private ScriptObject getBuiltinPackages() {
- return builtinPackages;
- }
-
- /**
- * Called from compiled script code to test if builtin has been overridden
- *
- * @return true if builtin package has not been overridden
- */
- public static boolean isBuiltinPackages() {
- final Global instance = Global.instance();
- return instance.packages == instance.getBuiltinPackages();
- }
-
private synchronized ScriptFunction getBuiltinRangeError() {
if (this.builtinRangeError == null) {
this.builtinRangeError = initErrorSubtype("RangeError", getErrorPrototype());
@@ -2044,30 +1862,6 @@
return builtinRangeError;
}
- /**
- * Called from compiled script code to test if builtin has been overridden
- *
- * @return true if builtin range error has not been overridden
- */
- public static boolean isBuiltinRangeError() {
- final Global instance = Global.instance();
- return instance.rangeError == LAZY_SENTINEL || instance.rangeError == instance.getBuiltinRangeError();
- }
-
- private synchronized ScriptFunction getBuiltinReferenceError() {
- return builtinReferenceError;
- }
-
- /**
- * Called from compiled script code to test if builtin has been overridden
- *
- * @return true if builtin reference error has not been overridden
- */
- public static boolean isBuiltinReferenceError() {
- final Global instance = Global.instance();
- return instance.referenceError == instance.getBuiltinReferenceError();
- }
-
private synchronized ScriptFunction getBuiltinRegExp() {
if (this.builtinRegExp == null) {
this.builtinRegExp = initConstructorAndSwitchPoint("RegExp", ScriptFunction.class);
@@ -2081,58 +1875,6 @@
return builtinRegExp;
}
- /**
- * Called from compiled script code to test if builtin has been overridden
- *
- * @return true if builtin regexp has not been overridden
- */
- public static boolean isBuiltinRegExp() {
- final Global instance = Global.instance();
- return instance.regexp == LAZY_SENTINEL || instance.regexp == instance.getBuiltinRegExp();
- }
-
- private ScriptFunction getBuiltinString() {
- return builtinString;
- }
-
- /**
- * Called from compiled script code to test if builtin has been overridden
- *
- * @return true if builtin Java has not been overridden
- */
- public static boolean isBuiltinString() {
- final Global instance = Global.instance();
- return instance.string == instance.getBuiltinString();
- }
-
- private ScriptFunction getBuiltinSyntaxError() {
- return builtinSyntaxError;
- }
-
- /**
- * Called from compiled script code to test if builtin has been overridden
- *
- * @return true if builtin syntax error has not been overridden
- */
- public static boolean isBuiltinSyntaxError() {
- final Global instance = Global.instance();
- return instance.syntaxError == instance.getBuiltinSyntaxError();
- }
-
- private ScriptFunction getBuiltinTypeError() {
- return builtinTypeError;
- }
-
- /**
- * Called from compiled script code to test if builtin has been overridden
- *
- * @return true if builtin type error has not been overridden
- */
- public static boolean isBuiltinTypeError() {
- final Global instance = Global.instance();
- return instance.typeError == instance.getBuiltinTypeError();
- }
-
private synchronized ScriptFunction getBuiltinURIError() {
if (this.builtinURIError == null) {
this.builtinURIError = initErrorSubtype("URIError", getErrorPrototype());
@@ -2140,16 +1882,6 @@
return this.builtinURIError;
}
- /**
- * Called from compiled script code to test if builtin has been overridden
- *
- * @return true if builtin URI error has not been overridden
- */
- public static boolean isBuiltinURIError() {
- final Global instance = Global.instance();
- return instance.uriError == LAZY_SENTINEL || instance.uriError == instance.getBuiltinURIError();
- }
-
@Override
public String getClassName() {
return "global";
@@ -2288,7 +2020,7 @@
* @return true if the value is a placeholder, false otherwise.
*/
public static boolean isLocationPropertyPlaceholder(final Object placeholder) {
- return placeholder == LOCATION_PROPERTY_PLACEHOLDER;
+ return placeholder == LAZY_SENTINEL;
}
/**
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeArray.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeArray.java Tue Jul 14 15:26:34 2015 -0700
@@ -1874,7 +1874,7 @@
//TODO - fold these into the Link logics, but I'll do that as a later step, as I want to do a checkin
//where everything works first
- private static final <T> ContinuousArrayData getContinuousNonEmptyArrayDataCCE(final Object self, final Class<T> clazz) {
+ private static <T> ContinuousArrayData getContinuousNonEmptyArrayDataCCE(final Object self, final Class<T> clazz) {
try {
@SuppressWarnings("unchecked")
final ContinuousArrayData data = (ContinuousArrayData)(T)((NativeArray)self).getArray();
@@ -1887,7 +1887,7 @@
throw new ClassCastException();
}
- private static final ContinuousArrayData getContinuousArrayDataCCE(final Object self) {
+ private static ContinuousArrayData getContinuousArrayDataCCE(final Object self) {
try {
return (ContinuousArrayData)((NativeArray)self).getArray();
} catch (final NullPointerException e) {
@@ -1895,7 +1895,7 @@
}
}
- private static final ContinuousArrayData getContinuousArrayDataCCE(final Object self, final Class<?> elementType) {
+ private static ContinuousArrayData getContinuousArrayDataCCE(final Object self, final Class<?> elementType) {
try {
return (ContinuousArrayData)((NativeArray)self).getArray(elementType); //ensure element type can fit "elementType"
} catch (final NullPointerException e) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeDate.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeDate.java Tue Jul 14 15:26:34 2015 -0700
@@ -218,7 +218,7 @@
@Override
public String toString() {
- return isValidDate() ? toString(this).toString() : INVALID_DATE;
+ return isValidDate() ? toString(this) : INVALID_DATE;
}
/**
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeRegExp.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeRegExp.java Tue Jul 14 15:26:34 2015 -0700
@@ -803,7 +803,7 @@
private static final Object REPLACE_VALUE = new Object();
- private static final MethodHandle getReplaceValueInvoker() {
+ private static MethodHandle getReplaceValueInvoker() {
return Global.instance().getDynamicInvoker(REPLACE_VALUE,
new Callable<MethodHandle>() {
@Override
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Lexer.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Lexer.java Tue Jul 14 15:26:34 2015 -0700
@@ -1044,9 +1044,9 @@
try {
final long value = Long.parseLong(valueString, radix);
if(value >= MIN_INT_L && value <= MAX_INT_L) {
- return Integer.valueOf((int)value);
+ return (int)value;
}
- return Long.valueOf(value);
+ return value;
} catch (final NumberFormatException e) {
if (radix == 10) {
return Double.valueOf(valueString);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/CompiledFunction.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/CompiledFunction.java Tue Jul 14 15:26:34 2015 -0700
@@ -907,7 +907,7 @@
OptimismInfo(final RecompilableScriptFunctionData data, final Map<Integer, Type> invalidatedProgramPoints) {
this.data = data;
this.log = data.getLogger();
- this.invalidatedProgramPoints = invalidatedProgramPoints == null ? new TreeMap<Integer, Type>() : invalidatedProgramPoints;
+ this.invalidatedProgramPoints = invalidatedProgramPoints == null ? new TreeMap<>() : invalidatedProgramPoints;
newOptimisticAssumptions();
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSType.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSType.java Tue Jul 14 15:26:34 2015 -0700
@@ -994,7 +994,7 @@
* @return a long
*/
public static long toLong(final Object obj) {
- return obj instanceof Long ? ((Long)obj).longValue() : toLong(toNumber(obj));
+ return obj instanceof Long ? ((Long)obj) : toLong(toNumber(obj));
}
/**
@@ -1056,7 +1056,7 @@
*/
public static int toInt32Optimistic(final Object obj, final int programPoint) {
if (obj != null && obj.getClass() == Integer.class) {
- return ((Integer)obj).intValue();
+ return ((Integer)obj);
}
throw new UnwarrantedOptimismException(obj, programPoint);
}
@@ -1954,11 +1954,11 @@
public static MethodHandle unboxConstant(final Object o) {
if (o != null) {
if (o.getClass() == Integer.class) {
- return MH.constant(int.class, ((Integer)o).intValue());
+ return MH.constant(int.class, ((Integer)o));
} else if (o.getClass() == Long.class) {
- return MH.constant(long.class, ((Long)o).longValue());
+ return MH.constant(long.class, ((Long)o));
} else if (o.getClass() == Double.class) {
- return MH.constant(double.class, ((Double)o).doubleValue());
+ return MH.constant(double.class, ((Double)o));
}
}
return MH.constant(Object.class, o);
@@ -1983,7 +1983,7 @@
}
}
- private static final List<MethodHandle> toUnmodifiableList(final MethodHandle... methodHandles) {
+ private static List<MethodHandle> toUnmodifiableList(final MethodHandle... methodHandles) {
return Collections.unmodifiableList(Arrays.asList(methodHandles));
}
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/NashornLoader.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/NashornLoader.java Tue Jul 14 15:26:34 2015 -0700
@@ -156,7 +156,7 @@
}
// If the file does not exist, then assume that it's a directory
if (!file.isFile()) {
- name = name + "/";
+ name += "/";
}
try {
return new URL("file", "", name);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/OptimisticReturnFilters.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/OptimisticReturnFilters.java Tue Jul 14 15:26:34 2015 -0700
@@ -260,7 +260,7 @@
final Class<?> c = arg.getClass();
if (c == Long.class) {
// Must check for Long separately, as Long.doubleValue() isn't precise.
- return ((Long)arg).longValue();
+ return ((Long)arg);
} else if (c == Integer.class || c == Double.class || c == Float.class || c == Short.class ||
c == Byte.class) {
return ensureLong(((Number)arg).doubleValue(), programPoint);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Property.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Property.java Tue Jul 14 15:26:34 2015 -0700
@@ -562,8 +562,8 @@
@Override
public int hashCode() {
- final Class<?> type = getLocalType();
- return Objects.hashCode(this.key) ^ flags ^ getSlot() ^ (type == null ? 0 : type.hashCode());
+ final Class<?> t = getLocalType();
+ return Objects.hashCode(this.key) ^ flags ^ getSlot() ^ (t == null ? 0 : t.hashCode());
}
@Override
@@ -588,7 +588,7 @@
getKey().equals(otherProperty.getKey());
}
- private static final String type(final Class<?> type) {
+ private static String type(final Class<?> type) {
if (type == null) {
return "undef";
} else if (type == int.class) {
@@ -608,8 +608,8 @@
*/
public final String toStringShort() {
final StringBuilder sb = new StringBuilder();
- final Class<?> type = getLocalType();
- sb.append(getKey()).append(" (").append(type(type)).append(')');
+ final Class<?> t = getLocalType();
+ sb.append(getKey()).append(" (").append(type(t)).append(')');
return sb.toString();
}
@@ -625,7 +625,7 @@
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
- final Class<?> type = getLocalType();
+ final Class<?> t = getLocalType();
sb.append(indent(getKey(), 20)).
append(" id=").
@@ -635,7 +635,7 @@
append(") ").
append(getClass().getSimpleName()).
append(" {").
- append(indent(type(type), 5)).
+ append(indent(type(t), 5)).
append('}');
if (slot != -1) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PropertyMap.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PropertyMap.java Tue Jul 14 15:26:34 2015 -0700
@@ -999,10 +999,10 @@
for (final Property p : map0.getProperties()) {
final Property p2 = map1.findProperty(p.getKey());
if (p2 == null) {
- sb.append("FIRST ONLY : [" + p + "]");
+ sb.append("FIRST ONLY : [").append(p).append("]");
found = true;
} else if (p2 != p) {
- sb.append("DIFFERENT : [" + p + "] != [" + p2 + "]");
+ sb.append("DIFFERENT : [").append(p).append("] != [").append(p2).append("]");
found = true;
}
}
@@ -1010,7 +1010,7 @@
for (final Property p2 : map1.getProperties()) {
final Property p1 = map0.findProperty(p2.getKey());
if (p1 == null) {
- sb.append("SECOND ONLY: [" + p2 + "]");
+ sb.append("SECOND ONLY: [").append(p2).append("]");
found = true;
}
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/RewriteException.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/RewriteException.java Tue Jul 14 15:26:34 2015 -0700
@@ -359,9 +359,9 @@
if (returnValue instanceof String) {
str = '\'' + str + '\'';
} else if (returnValue instanceof Double) {
- str = str + 'd';
+ str += 'd';
} else if (returnValue instanceof Long) {
- str = str + 'l';
+ str += 'l';
}
return str;
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptRuntime.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptRuntime.java Tue Jul 14 15:26:34 2015 -0700
@@ -611,7 +611,7 @@
obj = ((ScriptObject)obj).get(property);
if(Global.isLocationPropertyPlaceholder(obj)) {
if(CompilerConstants.__LINE__.name().equals(property)) {
- obj = Integer.valueOf(0);
+ obj = 0;
} else {
obj = "";
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Source.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Source.java Tue Jul 14 15:26:34 2015 -0700
@@ -995,7 +995,7 @@
return initLogger(Context.getContextTrusted());
}
- private File dumpFile(final String dir) {
+ private File dumpFile(final File dirFile) {
final URL u = getURL();
final StringBuilder buf = new StringBuilder();
// make it unique by prefixing current date & time
@@ -1010,11 +1010,17 @@
buf.append(getName());
}
- return new File(dir, buf.toString());
+ return new File(dirFile, buf.toString());
}
void dump(final String dir) {
- final File file = dumpFile(dir);
+ final File dirFile = new File(dir);
+ final File file = dumpFile(dirFile);
+ if (!dirFile.exists() && !dirFile.mkdirs()) {
+ debug("Skipping source dump for " + name);
+ return;
+ }
+
try (final FileOutputStream fos = new FileOutputStream(file)) {
final PrintWriter pw = new PrintWriter(fos);
pw.print(data.toString());
@@ -1025,7 +1031,7 @@
": " +
ECMAErrors.getMessage(
"io.error.cant.write",
- dir.toString() +
+ dir +
" : " + ioExp.toString()));
}
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/ContinuousArrayData.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/ContinuousArrayData.java Tue Jul 14 15:26:34 2015 -0700
@@ -215,11 +215,8 @@
int.class);
@SuppressWarnings("unused")
- private static final boolean guard(final Class<? extends ContinuousArrayData> clazz, final ScriptObject sobj) {
- if (sobj != null && sobj.getArray().getClass() == clazz) {
- return true;
- }
- return false;
+ private static boolean guard(final Class<? extends ContinuousArrayData> clazz, final ScriptObject sobj) {
+ return sobj != null && sobj.getArray().getClass() == clazz;
}
/**
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/IntArrayData.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/IntArrayData.java Tue Jul 14 15:26:34 2015 -0700
@@ -138,7 +138,7 @@
final Object[] oarray = new Object[trim ? len : array.length];
for (int index = 0; index < len; index++) {
- oarray[index] = Integer.valueOf(array[index]);
+ oarray[index] = array[index];
}
return oarray;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/LongArrayData.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/LongArrayData.java Tue Jul 14 15:26:34 2015 -0700
@@ -91,7 +91,7 @@
final Object[] oarray = new Object[trim ? len : array.length];
for (int index = 0; index < len; index++) {
- oarray[index] = Long.valueOf(array[index]);
+ oarray[index] = array[index];
}
return oarray;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/NumberArrayData.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/NumberArrayData.java Tue Jul 14 15:26:34 2015 -0700
@@ -91,7 +91,7 @@
final Object[] oarray = new Object[trim ? len : array.length];
for (int index = 0; index < len; index++) {
- oarray[index] = Double.valueOf(array[index]);
+ oarray[index] = array[index];
}
return oarray;
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/SparseArrayData.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/SparseArrayData.java Tue Jul 14 15:26:34 2015 -0700
@@ -95,11 +95,11 @@
final TreeMap<Long, Object> newSparseMap = new TreeMap<>();
for (final Map.Entry<Long, Object> entry : sparseMap.entrySet()) {
- final long newIndex = entry.getKey().longValue() - by;
+ final long newIndex = entry.getKey() - by;
if (newIndex < maxDenseLength) {
underlying = underlying.set((int) newIndex, entry.getValue(), false);
} else if (newIndex >= 0) {
- newSparseMap.put(Long.valueOf(newIndex), entry.getValue());
+ newSparseMap.put(newIndex, entry.getValue());
}
}
@@ -114,7 +114,7 @@
if (len + by > maxDenseLength) {
for (long i = maxDenseLength - by; i < len; i++) {
if (underlying.has((int) i)) {
- newSparseMap.put(Long.valueOf(i + by), underlying.getObject((int) i));
+ newSparseMap.put(i + by, underlying.getObject((int) i));
}
}
underlying = underlying.shrink((int) (maxDenseLength - by));
@@ -123,8 +123,8 @@
underlying.shiftRight(by);
for (final Map.Entry<Long, Object> entry : sparseMap.entrySet()) {
- final long newIndex = entry.getKey().longValue() + by;
- newSparseMap.put(Long.valueOf(newIndex), entry.getValue());
+ final long newIndex = entry.getKey() + by;
+ newSparseMap.put(newIndex, entry.getValue());
}
sparseMap = newSparseMap;
@@ -158,7 +158,7 @@
setLength(newLength);
}
- sparseMap.subMap(Long.valueOf(newLength), Long.MAX_VALUE).clear();
+ sparseMap.subMap(newLength, Long.MAX_VALUE).clear();
setLength(newLength);
return this;
}
@@ -333,7 +333,7 @@
}
private static Long indexToKey(final int index) {
- return Long.valueOf(ArrayIndex.toLongIndex(index));
+ return ArrayIndex.toLongIndex(index);
}
@Override
@@ -355,7 +355,7 @@
return result;
}
setLength(len - 1);
- final Long key = Long.valueOf(len - 1);
+ final Long key = len - 1;
return sparseMap.containsKey(key) ? sparseMap.remove(key) : ScriptRuntime.UNDEFINED;
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/Bootstrap.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/Bootstrap.java Tue Jul 14 15:26:34 2015 -0700
@@ -47,7 +47,6 @@
import jdk.internal.dynalink.support.TypeUtilities;
import jdk.nashorn.api.scripting.JSObject;
import jdk.nashorn.internal.codegen.CompilerConstants.Call;
-import jdk.nashorn.internal.codegen.ObjectClassGenerator;
import jdk.nashorn.internal.lookup.MethodHandleFactory;
import jdk.nashorn.internal.lookup.MethodHandleFunctionality;
import jdk.nashorn.internal.objects.ScriptFunctionImpl;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaArgumentConverters.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaArgumentConverters.java Tue Jul 14 15:26:34 2015 -0700
@@ -107,7 +107,7 @@
if (o instanceof Number) {
final int ival = ((Number)o).intValue();
if (ival >= Character.MIN_VALUE && ival <= Character.MAX_VALUE) {
- return Character.valueOf((char) ival);
+ return (char) ival;
}
throw typeError("cant.convert.number.to.char");
@@ -196,13 +196,13 @@
return ((Integer)obj).longValue();
} else if (obj instanceof Double) {
final Double d = (Double)obj;
- if(Double.isInfinite(d.doubleValue())) {
+ if(Double.isInfinite(d)) {
return 0L;
}
return d.longValue();
} else if (obj instanceof Float) {
final Float f = (Float)obj;
- if(Float.isInfinite(f.floatValue())) {
+ if(Float.isInfinite(f)) {
return 0L;
}
return f.longValue();
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/BitSet.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/BitSet.java Tue Jul 14 15:26:34 2015 -0700
@@ -101,9 +101,7 @@
}
public void copy(final BitSet other) {
- for (int i=0; i<BITSET_SIZE; i++) {
- bits[i] = other.bits[i];
- }
+ System.arraycopy(other.bits, 0, bits, 0, BITSET_SIZE);
}
public int numOn() {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/Region.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/Region.java Tue Jul 14 15:26:34 2015 -0700
@@ -38,7 +38,7 @@
final StringBuilder sb = new StringBuilder();
sb.append("Region: \n");
for (int i=0; i<beg.length; i++) {
- sb.append(" " + i + ": (" + beg[i] + "-" + end[i] + ")");
+ sb.append(" ").append(i).append(": (").append(beg[i]).append("-").append(end[i]).append(")");
}
return sb.toString();
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/ast/AnchorNode.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/ast/AnchorNode.java Tue Jul 14 15:26:34 2015 -0700
@@ -60,8 +60,8 @@
@Override
public String toString(final int level) {
final StringBuilder value = new StringBuilder();
- value.append("\n type: " + typeToString());
- value.append("\n target: " + pad(target, level + 1));
+ value.append("\n type: ").append(typeToString());
+ value.append("\n target: ").append(pad(target, level + 1));
return value.toString();
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/ast/CClassNode.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/ast/CClassNode.java Tue Jul 14 15:26:34 2015 -0700
@@ -124,9 +124,9 @@
@Override
public String toString(final int level) {
final StringBuilder value = new StringBuilder();
- value.append("\n flags: " + flagsToString());
- value.append("\n bs: " + pad(bs, level + 1));
- value.append("\n mbuf: " + pad(mbuf, level + 1));
+ value.append("\n flags: ").append(flagsToString());
+ value.append("\n bs: ").append(pad(bs, level + 1));
+ value.append("\n mbuf: ").append(pad(mbuf, level + 1));
return value.toString();
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/ast/ConsAltNode.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/ast/ConsAltNode.java Tue Jul 14 15:26:34 2015 -0700
@@ -148,8 +148,8 @@
@Override
public String toString(final int level) {
final StringBuilder value = new StringBuilder();
- value.append("\n car: " + pad(car, level + 1));
- value.append("\n cdr: " + (cdr == null ? "NULL" : cdr.toString()));
+ value.append("\n car: ").append(pad(car, level + 1));
+ value.append("\n cdr: ").append(cdr == null ? "NULL" : cdr.toString());
return value.toString();
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/ast/EncloseNode.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/ast/EncloseNode.java Tue Jul 14 15:26:34 2015 -0700
@@ -80,15 +80,15 @@
@Override
public String toString(final int level) {
final StringBuilder value = new StringBuilder(super.toString(level));
- value.append("\n type: " + typeToString());
- value.append("\n regNum: " + regNum);
- value.append("\n option: " + Option.toString(option));
- value.append("\n target: " + pad(target, level + 1));
- value.append("\n callAddr: " + callAddr);
- value.append("\n minLength: " + minLength);
- value.append("\n maxLength: " + maxLength);
- value.append("\n charLength: " + charLength);
- value.append("\n optCount: " + optCount);
+ value.append("\n type: ").append(typeToString());
+ value.append("\n regNum: ").append(regNum);
+ value.append("\n option: ").append(Option.toString(option));
+ value.append("\n target: ").append(pad(target, level + 1));
+ value.append("\n callAddr: ").append(callAddr);
+ value.append("\n minLength: ").append(minLength);
+ value.append("\n maxLength: ").append(maxLength);
+ value.append("\n charLength: ").append(charLength);
+ value.append("\n optCount: ").append(optCount);
return value.toString();
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/ast/Node.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/ast/Node.java Tue Jul 14 15:26:34 2015 -0700
@@ -85,7 +85,7 @@
@Override
public final String toString() {
final StringBuilder s = new StringBuilder();
- s.append("<" + getAddressName() + " (" + (parent == null ? "NULL" : parent.getAddressName()) + ")>");
+ s.append("<").append(getAddressName()).append(" (").append(parent == null ? "NULL" : parent.getAddressName()).append(")>");
return s + toString(0);
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/ast/QuantifierNode.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/ast/QuantifierNode.java Tue Jul 14 15:26:34 2015 -0700
@@ -118,14 +118,14 @@
@Override
public String toString(final int level) {
final StringBuilder value = new StringBuilder(super.toString(level));
- value.append("\n target: " + pad(target, level + 1));
- value.append("\n lower: " + lower);
- value.append("\n upper: " + upper);
- value.append("\n greedy: " + greedy);
- value.append("\n targetEmptyInfo: " + targetEmptyInfo);
- value.append("\n headExact: " + pad(headExact, level + 1));
- value.append("\n nextHeadExact: " + pad(nextHeadExact, level + 1));
- value.append("\n isRefered: " + isRefered);
+ value.append("\n target: ").append(pad(target, level + 1));
+ value.append("\n lower: ").append(lower);
+ value.append("\n upper: ").append(upper);
+ value.append("\n greedy: ").append(greedy);
+ value.append("\n targetEmptyInfo: ").append(targetEmptyInfo);
+ value.append("\n headExact: ").append(pad(headExact, level + 1));
+ value.append("\n nextHeadExact: ").append(pad(nextHeadExact, level + 1));
+ value.append("\n isRefered: ").append(isRefered);
return value.toString();
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/ast/StringNode.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/ast/StringNode.java Tue Jul 14 15:26:34 2015 -0700
@@ -71,7 +71,7 @@
final char[] tmp = new char[len + NODE_STR_MARGIN];
System.arraycopy(chars, p, tmp, 0, end - p);
chars = tmp;
- end = end - p;
+ end -= p;
p = 0;
clearShared();
} else {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/Shell.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/Shell.java Tue Jul 14 15:26:34 2015 -0700
@@ -54,7 +54,6 @@
import jdk.nashorn.internal.runtime.ScriptEnvironment;
import jdk.nashorn.internal.runtime.ScriptFunction;
import jdk.nashorn.internal.runtime.ScriptRuntime;
-import jdk.nashorn.internal.runtime.Source;
import jdk.nashorn.internal.runtime.options.Options;
/**
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/ShellFunctions.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/ShellFunctions.java Tue Jul 14 15:26:34 2015 -0700
@@ -29,10 +29,8 @@
import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED;
import java.io.BufferedReader;
-import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import jdk.nashorn.internal.runtime.JSType;
--- a/nashorn/test/src/jdk/nashorn/api/javaaccess/test/SharedObject.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/test/src/jdk/nashorn/api/javaaccess/test/SharedObject.java Tue Jul 14 15:26:34 2015 -0700
@@ -176,7 +176,7 @@
}
public Boolean booleanBoxingMethod(final Boolean arg) {
- return !arg.booleanValue();
+ return !arg;
}
public boolean[] booleanArrayMethod(final boolean arg[]) {
--- a/nashorn/test/src/jdk/nashorn/api/scripting/test/ScriptEngineTest.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/test/src/jdk/nashorn/api/scripting/test/ScriptEngineTest.java Tue Jul 14 15:26:34 2015 -0700
@@ -573,7 +573,7 @@
}
// properties that can be read by any code
- private static String[] propNames = {
+ private static final String[] PROP_NAMES = {
"java.version",
"java.vendor",
"java.vendor.url",
@@ -601,7 +601,7 @@
final ScriptEngineManager m = new ScriptEngineManager();
final ScriptEngine e = m.getEngineByName("nashorn");
- for (final String name : propNames) {
+ for (final String name : PROP_NAMES) {
checkProperty(e, name);
}
}
--- a/nashorn/test/src/jdk/nashorn/api/scripting/test/ScriptObjectMirrorTest.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/test/src/jdk/nashorn/api/scripting/test/ScriptObjectMirrorTest.java Tue Jul 14 15:26:34 2015 -0700
@@ -278,7 +278,7 @@
ScriptObjectMirror obj = (ScriptObjectMirror)e.eval(
"({ valueOf: function() { return 42 } })");
- assertEquals(Double.valueOf(42.0), obj.to(Double.class));
+ assertEquals(42.0, obj.to(Double.class));
obj = (ScriptObjectMirror)e.eval(
"({ toString: function() { return 'foo' } })");
--- a/nashorn/test/src/jdk/nashorn/api/tree/test/ParseAPITest.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/test/src/jdk/nashorn/api/tree/test/ParseAPITest.java Tue Jul 14 15:26:34 2015 -0700
@@ -67,7 +67,7 @@
parseTestSet(TEST262_SUITE_DIR, new TestFilter() {
@Override
public boolean exclude(final File file, final String content) {
- return content.indexOf("@negative") != -1;
+ return content.contains("@negative");
}
});
}
--- a/nashorn/test/src/jdk/nashorn/internal/performance/OctaneTest.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/test/src/jdk/nashorn/internal/performance/OctaneTest.java Tue Jul 14 15:26:34 2015 -0700
@@ -272,10 +272,10 @@
Double nashornToRhino = null;
Double nashornToV8 = null;
if (rhino != null && rhino != 0) {
- nashornToRhino = nashorn.doubleValue() / rhino.doubleValue();
+ nashornToRhino = nashorn / rhino;
}
if (v8 != null && rhino != 0) {
- nashornToV8 = nashorn.doubleValue() / v8.doubleValue();
+ nashornToV8 = nashorn / v8;
}
final String normalizedBenchmark=benchmark.replace("-", "");
System.out.println("benchmark-" + normalizedBenchmark + "-nashorn=" + nashorn);
@@ -300,20 +300,12 @@
boolean checkRhinoPresence() {
final String rhinojar = System.getProperty("rhino.jar");
- if (rhinojar != null) {
- // System.out.println("Rhino jar found; performing comparison testing");
- return true;
- }
- return false;
+ return rhinojar != null;
}
boolean checkV8Presence() {
final String v8shell = System.getProperty("v8.shell.full.path");
- if (v8shell != null) {
- // System.out.println("d8 found; performing comparison testing");
- return true;
- }
- return false;
+ return v8shell != null;
}
}
--- a/nashorn/test/src/jdk/nashorn/internal/runtime/test/ExceptionsNotSerializable.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/test/src/jdk/nashorn/internal/runtime/test/ExceptionsNotSerializable.java Tue Jul 14 15:26:34 2015 -0700
@@ -62,7 +62,7 @@
@Test
public void unwarrantedOptimismExceptionNotSerializable() {
- tryToSerialize(new UnwarrantedOptimismException(new Double(1.0), 128));
+ tryToSerialize(new UnwarrantedOptimismException(1.0, 128));
}
private static void tryToSerialize(final Object obj) {
--- a/nashorn/test/src/jdk/nashorn/internal/test/framework/AbstractScriptRunnable.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/test/src/jdk/nashorn/internal/test/framework/AbstractScriptRunnable.java Tue Jul 14 15:26:34 2015 -0700
@@ -159,7 +159,7 @@
forkJVMOptions = (vmOptions != null)? vmOptions.split(" ") : new String[0];
}
- private static ThreadLocal<ScriptEvaluator> evaluators = new ThreadLocal<>();
+ private static final ThreadLocal<ScriptEvaluator> EVALUATORS = new ThreadLocal<>();
/**
* Create a script evaluator or return from cache
@@ -167,7 +167,7 @@
*/
protected ScriptEvaluator getEvaluator() {
synchronized (AbstractScriptRunnable.class) {
- ScriptEvaluator evaluator = evaluators.get();
+ ScriptEvaluator evaluator = EVALUATORS.get();
if (evaluator == null) {
if (sharedContext) {
final String[] args;
@@ -177,10 +177,10 @@
args = new String[] { framework };
}
evaluator = new SharedContextEvaluator(args);
- evaluators.set(evaluator);
+ EVALUATORS.set(evaluator);
} else {
evaluator = new SeparateContextEvaluator();
- evaluators.set(evaluator);
+ EVALUATORS.set(evaluator);
}
}
return evaluator;
--- a/nashorn/test/src/jdk/nashorn/internal/test/framework/TestFinder.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/test/src/jdk/nashorn/internal/test/framework/TestFinder.java Tue Jul 14 15:26:34 2015 -0700
@@ -378,7 +378,7 @@
* @return true if optimistic type override has been set by test suite
*/
public static boolean hasOptimisticOverride() {
- return Boolean.valueOf(OPTIMISTIC_OVERRIDE).toString().equals(System.getProperty("optimistic.override"));
+ return Boolean.toString(OPTIMISTIC_OVERRIDE).equals(System.getProperty("optimistic.override"));
}
/**
@@ -391,8 +391,8 @@
public static String[] addExplicitOptimisticTypes(final String[] args) {
if (hasOptimisticOverride()) {
final List<String> newList = new ArrayList<>(Arrays.asList(args));
- newList.add("--optimistic-types=" + Boolean.valueOf(OPTIMISTIC_OVERRIDE));
- return newList.toArray(new String[0]);
+ newList.add("--optimistic-types=" + OPTIMISTIC_OVERRIDE);
+ return newList.toArray(new String[newList.size()]);
}
return args;
}
@@ -405,7 +405,7 @@
*/
public static void addExplicitOptimisticTypes(final List<String> args) {
if (hasOptimisticOverride()) {
- args.add("--optimistic-types=" + Boolean.valueOf(OPTIMISTIC_OVERRIDE));
+ args.add("--optimistic-types=" + OPTIMISTIC_OVERRIDE);
}
}
--- a/nashorn/test/src/jdk/nashorn/test/models/JDK_8081015_TestModel.java Tue Jul 14 20:36:12 2015 +0300
+++ b/nashorn/test/src/jdk/nashorn/test/models/JDK_8081015_TestModel.java Tue Jul 14 15:26:34 2015 -0700
@@ -64,9 +64,9 @@
private static void walkCollection(final Collection<Object> c) {
final Iterator<Object> it = c.iterator();
- assertEquals(it.next(), Integer.valueOf(1));
- assertEquals(it.next(), Integer.valueOf(2));
- assertEquals(it.next(), Double.valueOf(3.3));
+ assertEquals(it.next(), 1);
+ assertEquals(it.next(), 2);
+ assertEquals(it.next(), 3.3);
assertEquals(it.next(), "foo");
assertFalse(it.hasNext());
}