# HG changeset patch # User ddehaven # Date 1436912794 25200 # Node ID d1a49c6faa1f9419f3f3013d3ade5d11de423019 # Parent a0b91dedca5cef9bc39d04c364134b0a06dea0f0# Parent 8bf435fd8c16e91f8023f7984737db973ef7b11a Merge diff -r a0b91dedca5c -r d1a49c6faa1f .hgtags --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f .hgtags-top-repo --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f corba/.hgtags --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/.hgtags --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/cpu/aarch64/vm/aarch64.ad --- 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)" %} diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/cpu/aarch64/vm/assembler_aarch64.hpp --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/cpu/aarch64/vm/vm_version_aarch64.cpp --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/cpu/sparc/vm/assembler_sparc.hpp --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/cpu/sparc/vm/macroAssembler_sparc.cpp --- 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); +} diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/cpu/sparc/vm/macroAssembler_sparc.hpp --- 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 }; diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp --- 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(); + } } diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/cpu/sparc/vm/stubRoutines_sparc.hpp --- 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 { diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp --- 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(); } diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/cpu/x86/vm/vm_version_x86.cpp --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/share/vm/ci/ciField.cpp --- 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; } diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/share/vm/ci/ciInstanceKlass.cpp --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/share/vm/ci/ciInstanceKlass.hpp --- 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); diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/share/vm/classfile/vmSymbols.hpp --- 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") \ \ diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/share/vm/opto/escape.cpp --- 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 || diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/share/vm/opto/library_call.cpp --- 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(): diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/share/vm/opto/runtime.cpp --- 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) diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/share/vm/opto/runtime.hpp --- 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(); diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/share/vm/opto/superword.cpp --- 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); diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/share/vm/runtime/arguments.cpp --- 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); } diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/share/vm/runtime/compilationPolicy.cpp --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/share/vm/runtime/globals.hpp --- 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") \ \ diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/share/vm/runtime/rframe.cpp --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/share/vm/runtime/rframe.hpp --- 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(); diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/share/vm/runtime/stubRoutines.cpp --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/share/vm/runtime/stubRoutines.hpp --- 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; } diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/src/share/vm/runtime/vmStructs.cpp --- 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) \ diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/test/TEST.groups --- 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 = \ diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/test/compiler/codecache/jmx/CodeCacheUtils.java --- 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) diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/test/compiler/codecache/jmx/GetUsageTest.java --- 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(), diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/test/compiler/codecache/jmx/PeakUsageTest.java --- 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()); diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/test/compiler/codecache/jmx/PoolsIndependenceTest.java --- 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()). diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/test/compiler/codecache/jmx/ThresholdNotificationsTest.java --- 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()). diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/test/compiler/codecache/jmx/UsageThresholdExceededTest.java --- 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()); } } diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/test/compiler/codecache/jmx/UsageThresholdIncreasedTest.java --- 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(), diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/test/compiler/codecache/jmx/UsageThresholdNotExceededTest.java --- 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()); } } diff -r a0b91dedca5c -r d1a49c6faa1f hotspot/test/compiler/intrinsics/crc32c/TestCRC32C.java --- /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]); + } + } + } + } +} diff -r a0b91dedca5c -r d1a49c6faa1f jaxp/.hgtags --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/cmdline/Compile.java --- 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); - } - } - -} diff -r a0b91dedca5c -r d1a49c6faa1f jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/cmdline/Transform.java --- 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"); - } - } - 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(); - } - } -} diff -r a0b91dedca5c -r d1a49c6faa1f jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/cmdline/getopt/GetOpt.java --- 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 ' it will throw a MissingOptArgException if the -* option argument '' 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 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', if current option parsed is 'd' then - * getOptionArg() would return ''. - * @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 ] ...', 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 diff -r a0b91dedca5c -r d1a49c6faa1f jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/cmdline/getopt/GetOptsException.java --- 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); - } -} diff -r a0b91dedca5c -r d1a49c6faa1f jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/cmdline/getopt/IllegalArgumentException.java --- 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); - } -} diff -r a0b91dedca5c -r d1a49c6faa1f jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/cmdline/getopt/MissingOptArgException.java --- 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); - } -} diff -r a0b91dedca5c -r d1a49c6faa1f jaxp/src/java.xml/share/classes/javax/xml/stream/XMLEventReader.java --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f jaxp/src/java.xml/share/classes/javax/xml/stream/events/XMLEvent.java --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f jaxws/.hgtags --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f jdk/.hgtags --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f jdk/make/non-build-utils/sharing/README.txt --- 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 ...//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 diff -r a0b91dedca5c -r d1a49c6faa1f jdk/make/non-build-utils/sharing/tests/GHello.java --- 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(); - } -} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/make/non-build-utils/sharing/tests/Hello.java --- 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!"); - } -} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/make/non-build-utils/sharing/tests/JHello.java --- 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(); - } -} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/make/non-build-utils/src/build/tools/makeclasslist/MakeClasslist.java --- 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 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 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 seenClasses, - JarFile jar, - String packageName) { - int len = packageName.length(); - Enumeration 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); - } - } - } - } -} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/make/non-build-utils/src/build/tools/makeclasslist/makeClasslist.js --- /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= 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]); +} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/net/ContentHandler.java --- 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. *

- * 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 java.content.handler.pkgs + * to search through by defining the {@value java.net.URLConnection#contentPathProp} * property. The class name must be of the form: *

* {package-prefix}.{major}.{minor} - *

+ *

* where {major}.{minor} 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; } - } diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/net/ContentHandlerFactory.java --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/net/URLConnection.java --- 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 @@ *

  • {@code getContentType} *
  • {@code getDate} *
  • {@code getExpiration} - *
  • {@code getLastModifed} + *
  • {@code getLastModified} * *

    * 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. + *

    This is done as follows: *

      *
    1. 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. - *
    2. 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 + *
    3. 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. + *
    4. 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 null + * @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> 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 handlers = new Hashtable<>(); + private static final Hashtable 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: *
            *     {package-prefix}.{major}.{minor}
      @@ -1281,11 +1298,10 @@
            *     YoyoDyne.experimental.text.plain
            * 
      */ - 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 sl = + ServiceLoader.load(ContentHandlerFactory.class, cl); + + Iterator 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(); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/security/AccessControlContext.java --- 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; } diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/security/CodeSource.java --- 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); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/security/Permissions.java --- 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) { diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/security/SecureRandom.java --- 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 @@ * *
        *      SecureRandom random = new SecureRandom();
      - *      byte bytes[] = new byte[20];
      + *      byte[] bytes = new byte[20];
        *      random.nextBytes(bytes);
        * 
      * @@ -77,7 +77,7 @@ * to generate a given number of seed bytes (to seed other random number * generators, for example): *
      - *      byte seed[] = random.generateSeed(20);
      + *      byte[] seed = random.generateSeed(20);
        * 
      * * 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); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/security/UnresolvedPermission.java --- 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) { diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/security/spec/RSAMultiPrimePrivateCrtKeySpec.java --- 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} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/util/ArrayList.java --- 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 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 { diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/util/Arrays.java --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/util/Vector.java --- 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 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); } diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/util/concurrent/CopyOnWriteArrayList.java --- 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); } diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/util/stream/AbstractPipeline.java --- 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 void copyIntoWithCancel(Sink wrappedSink, Spliterator spliterator) { + final boolean copyIntoWithCancel(Sink wrappedSink, Spliterator 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 spliterator, Sink sink); + abstract boolean forEachWithCancel(Spliterator spliterator, Sink sink); /** * Make a node builder compatible with this stream shape. diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/util/stream/DoublePipeline.java --- 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 spliterator, Sink sink) { + final boolean forEachWithCancel(Spliterator spliterator, Sink 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); } diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/util/stream/DoubleStream.java --- 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. + * + *

      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. + * + *

      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). + * + *

      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). + * + *

      This is a short-circuiting + * stateful intermediate operation. + * + * @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 non-interfering, + * stateless + * 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. + * + *

      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. + * + *

      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). + * + *

      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). + * + *

      This is a stateful + * intermediate operation. + * + * @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 non-interfering, + * stateless + * 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. * *

      This is a terminal diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/util/stream/IntPipeline.java --- 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 spliterator, Sink sink) { + final boolean forEachWithCancel(Spliterator spliterator, Sink 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); } diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/util/stream/IntStream.java --- 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. + * + *

      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. + * + *

      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). + * + *

      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). + * + *

      This is a short-circuiting + * stateful intermediate operation. + * + * @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 non-interfering, + * stateless + * 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. + * + *

      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. + * + *

      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). + * + *

      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). + * + *

      This is a stateful + * intermediate operation. + * + * @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 non-interfering, + * stateless + * 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. * *

      This is a terminal diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/util/stream/LongPipeline.java --- 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 spliterator, Sink sink) { + final boolean forEachWithCancel(Spliterator spliterator, Sink 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); } diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/util/stream/LongStream.java --- 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. + * + *

      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. + * + *

      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). + * + *

      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). + * + *

      This is a short-circuiting + * stateful intermediate operation. + * + * @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 non-interfering, + * stateless + * 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. + * + *

      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. + * + *

      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). + * + *

      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). + * + *

      This is a stateful + * intermediate operation. + * + * @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 non-interfering, + * stateless + * 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. * *

      This is a terminal diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/util/stream/Node.java --- 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 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(); } diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/util/stream/Nodes.java --- 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 IntFunction castingArray() { + return size -> (T[]) new Object[size]; + } + // General shape-based node creation methods /** diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/util/stream/PipelineHelper.java --- 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 void copyIntoWithCancel(Sink wrappedSink, Spliterator spliterator); + abstract boolean copyIntoWithCancel(Sink wrappedSink, Spliterator spliterator); /** * Takes a {@code Sink} that accepts elements of the output type of the diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/util/stream/ReferencePipeline.java --- 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 spliterator, Sink sink) { - do { } while (!sink.cancellationRequested() && spliterator.tryAdvance(sink)); + final boolean forEachWithCancel(Spliterator spliterator, Sink 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 takeWhile(Predicate predicate) { + return WhileOps.makeTakeWhileRef(this, predicate); + } + + @Override + public final Stream dropWhile(Predicate predicate) { + return WhileOps.makeDropWhileRef(this, predicate); + } + // Terminal operations from Stream @Override diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/util/stream/SliceOps.java --- 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 IntFunction 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(); } } diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/util/stream/Stream.java --- 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 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. + * + *

      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. + * + *

      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). + * + *

      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). + * + *

      This is a short-circuiting + * stateful intermediate operation. + * + * @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 non-interfering, + * stateless + * predicate to apply to elements to determine the longest + * prefix of elements. + * @return the new stream + */ + default Stream takeWhile(Predicate 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. + * + *

      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. + * + *

      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). + * + *

      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). + * + *

      This is a stateful + * intermediate operation. + * + * @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 non-interfering, + * stateless + * predicate to apply to elements to determine the longest + * prefix of elements. + * @return the new stream + */ + default Stream dropWhile(Predicate 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. * *

      This is a terminal diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/java/util/stream/WhileOps.java --- /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 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 Stream makeTakeWhileRef(AbstractPipeline upstream, + Predicate predicate) { + Objects.requireNonNull(predicate); + return new ReferencePipeline.StatefulOp(upstream, StreamShape.REFERENCE, TAKE_FLAGS) { + @Override + Spliterator opEvaluateParallelLazy(PipelineHelper helper, + Spliterator 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 + Node opEvaluateParallel(PipelineHelper helper, + Spliterator spliterator, + IntFunction generator) { + return new TakeWhileTask<>(this, helper, spliterator, generator) + .invoke(); + } + + @Override + Sink opWrapSink(int flags, Sink sink) { + return new Sink.ChainedReference(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 upstream, + IntPredicate predicate) { + Objects.requireNonNull(predicate); + return new IntPipeline.StatefulOp(upstream, StreamShape.INT_VALUE, TAKE_FLAGS) { + @Override + Spliterator opEvaluateParallelLazy(PipelineHelper helper, + Spliterator 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 + Node opEvaluateParallel(PipelineHelper helper, + Spliterator spliterator, + IntFunction generator) { + return new TakeWhileTask<>(this, helper, spliterator, generator) + .invoke(); + } + + @Override + Sink opWrapSink(int flags, Sink sink) { + return new Sink.ChainedInt(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 upstream, + LongPredicate predicate) { + Objects.requireNonNull(predicate); + return new LongPipeline.StatefulOp(upstream, StreamShape.LONG_VALUE, TAKE_FLAGS) { + @Override + Spliterator opEvaluateParallelLazy(PipelineHelper helper, + Spliterator 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 + Node opEvaluateParallel(PipelineHelper helper, + Spliterator spliterator, + IntFunction generator) { + return new TakeWhileTask<>(this, helper, spliterator, generator) + .invoke(); + } + + @Override + Sink opWrapSink(int flags, Sink sink) { + return new Sink.ChainedLong(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 upstream, + DoublePredicate predicate) { + Objects.requireNonNull(predicate); + return new DoublePipeline.StatefulOp(upstream, StreamShape.DOUBLE_VALUE, TAKE_FLAGS) { + @Override + Spliterator opEvaluateParallelLazy(PipelineHelper helper, + Spliterator 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 + Node opEvaluateParallel(PipelineHelper helper, + Spliterator spliterator, + IntFunction generator) { + return new TakeWhileTask<>(this, helper, spliterator, generator) + .invoke(); + } + + @Override + Sink opWrapSink(int flags, Sink sink) { + return new Sink.ChainedDouble(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. + *

      + * 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 the type of both input and output elements + */ + interface DropWhileOp { + /** + * 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 opWrapSink(Sink sink, boolean retainAndCountDroppedElements); + } + + /** + * A specialization for a dropWhile sink. + * + * @param the type of both input and output elements + */ + interface DropWhileSink extends Sink { + /** + * @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 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 Stream makeDropWhileRef(AbstractPipeline upstream, + Predicate predicate) { + Objects.requireNonNull(predicate); + + class Op extends ReferencePipeline.StatefulOp implements DropWhileOp { + public Op(AbstractPipeline upstream, StreamShape inputShape, int opFlags) { + super(upstream, inputShape, opFlags); + } + + @Override + Spliterator opEvaluateParallelLazy(PipelineHelper helper, + Spliterator 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 + Node opEvaluateParallel(PipelineHelper helper, + Spliterator spliterator, + IntFunction generator) { + return new DropWhileTask<>(this, helper, spliterator, generator) + .invoke(); + } + + @Override + Sink opWrapSink(int flags, Sink sink) { + return opWrapSink(sink, false); + } + + public DropWhileSink opWrapSink(Sink sink, boolean retainAndCountDroppedElements) { + class OpSink extends Sink.ChainedReference implements DropWhileSink { + 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 upstream, + IntPredicate predicate) { + Objects.requireNonNull(predicate); + class Op extends IntPipeline.StatefulOp implements DropWhileOp { + public Op(AbstractPipeline upstream, StreamShape inputShape, int opFlags) { + super(upstream, inputShape, opFlags); + } + + @Override + Spliterator opEvaluateParallelLazy(PipelineHelper helper, + Spliterator 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 + Node opEvaluateParallel(PipelineHelper helper, + Spliterator spliterator, + IntFunction generator) { + return new DropWhileTask<>(this, helper, spliterator, generator) + .invoke(); + } + + @Override + Sink opWrapSink(int flags, Sink sink) { + return opWrapSink(sink, false); + } + + public DropWhileSink opWrapSink(Sink sink, boolean retainAndCountDroppedElements) { + class OpSink extends Sink.ChainedInt implements DropWhileSink { + 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 upstream, + LongPredicate predicate) { + Objects.requireNonNull(predicate); + class Op extends LongPipeline.StatefulOp implements DropWhileOp { + public Op(AbstractPipeline upstream, StreamShape inputShape, int opFlags) { + super(upstream, inputShape, opFlags); + } + + @Override + Spliterator opEvaluateParallelLazy(PipelineHelper helper, + Spliterator 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 + Node opEvaluateParallel(PipelineHelper helper, + Spliterator spliterator, + IntFunction generator) { + return new DropWhileTask<>(this, helper, spliterator, generator) + .invoke(); + } + + @Override + Sink opWrapSink(int flags, Sink sink) { + return opWrapSink(sink, false); + } + + public DropWhileSink opWrapSink(Sink sink, boolean retainAndCountDroppedElements) { + class OpSink extends Sink.ChainedLong implements DropWhileSink { + 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 upstream, + DoublePredicate predicate) { + Objects.requireNonNull(predicate); + class Op extends DoublePipeline.StatefulOp implements DropWhileOp { + public Op(AbstractPipeline upstream, StreamShape inputShape, int opFlags) { + super(upstream, inputShape, opFlags); + } + + @Override + Spliterator opEvaluateParallelLazy(PipelineHelper helper, + Spliterator 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 + Node opEvaluateParallel(PipelineHelper helper, + Spliterator spliterator, + IntFunction generator) { + return new DropWhileTask<>(this, helper, spliterator, generator) + .invoke(); + } + + @Override + Sink opWrapSink(int flags, Sink sink) { + return opWrapSink(sink, false); + } + + public DropWhileSink opWrapSink(Sink sink, boolean retainAndCountDroppedElements) { + class OpSink extends Sink.ChainedDouble implements DropWhileSink { + 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. + *

      + * Concrete subclasses of this spliterator support reference and primitive + * types for takeWhile and dropWhile. + *

      + * 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. + *

      + * 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 the type of elements returned by this spliterator + * @param the type of the spliterator + */ + static abstract class UnorderedWhileSpliterator> implements Spliterator { + // 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 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 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 extends UnorderedWhileSpliterator> implements Consumer { + final Predicate p; + T t; + + OfRef(Spliterator s, boolean noSplitting, Predicate p) { + super(s, noSplitting); + this.p = p; + } + + OfRef(Spliterator s, OfRef 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 extends OfRef { + Taking(Spliterator s, boolean noSplitting, Predicate p) { + super(s, noSplitting, p); + } + + Taking(Spliterator s, Taking parent) { + super(s, parent); + } + + @Override + public boolean tryAdvance(Consumer 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 trySplit() { + // Do not split if all operations are cancelled + return cancel.get() ? null : super.trySplit(); + } + + @Override + Spliterator makeSpliterator(Spliterator s) { + return new Taking<>(s, this); + } + } + + static final class Dropping extends OfRef { + Dropping(Spliterator s, boolean noSplitting, Predicate p) { + super(s, noSplitting, p); + } + + Dropping(Spliterator s, Dropping parent) { + super(s, parent); + } + + @Override + public boolean tryAdvance(Consumer 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 makeSpliterator(Spliterator s) { + return new Dropping<>(s, this); + } + } + } + + static abstract class OfInt extends UnorderedWhileSpliterator 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 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 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. + *

      + * 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. + *

      + * 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 Input element type to the stream pipeline + * @param Output element type from the stream pipeline + */ + @SuppressWarnings("serial") + private static final class TakeWhileTask + extends AbstractShortCircuitTask, TakeWhileTask> { + private final AbstractPipeline op; + private final IntFunction 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 op, + PipelineHelper helper, + Spliterator spliterator, + IntFunction generator) { + super(helper, spliterator); + this.op = op; + this.generator = generator; + this.isOrdered = StreamOpFlag.ORDERED.isKnown(helper.getStreamAndOpFlags()); + } + + TakeWhileTask(TakeWhileTask parent, Spliterator spliterator) { + super(parent, spliterator); + this.op = parent.op; + this.generator = parent.generator; + this.isOrdered = parent.isOrdered; + } + + @Override + protected TakeWhileTask makeChild(Spliterator spliterator) { + return new TakeWhileTask<>(this, spliterator); + } + + @Override + protected final Node getEmptyResult() { + return Nodes.emptyNode(op.getOutputShape()); + } + + @Override + protected final Node doLeaf() { + Node.Builder builder = helper.makeNodeBuilder(-1, generator); + Sink 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 node = builder.build(); + thisNodeSize = node.count(); + return node; + } + + @Override + public final void onCompletion(CountedCompleter caller) { + if (!isLeaf()) { + Node 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 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. + *

      + * 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. + *

      + * 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 Input element type to the stream pipeline + * @param Output element type from the stream pipeline + */ + @SuppressWarnings("serial") + private static final class DropWhileTask + extends AbstractTask, DropWhileTask> { + private final AbstractPipeline op; + private final IntFunction 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 op, + PipelineHelper helper, + Spliterator spliterator, + IntFunction generator) { + super(helper, spliterator); + assert op instanceof DropWhileOp; + this.op = op; + this.generator = generator; + this.isOrdered = StreamOpFlag.ORDERED.isKnown(helper.getStreamAndOpFlags()); + } + + DropWhileTask(DropWhileTask parent, Spliterator spliterator) { + super(parent, spliterator); + this.op = parent.op; + this.generator = parent.generator; + this.isOrdered = parent.isOrdered; + } + + @Override + protected DropWhileTask makeChild(Spliterator spliterator) { + return new DropWhileTask<>(this, spliterator); + } + + @Override + protected final Node 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 builder = helper.makeNodeBuilder(sizeIfKnown, generator); + @SuppressWarnings("unchecked") + DropWhileOp dropOp = (DropWhileOp) op; + // If this leaf is the root then there is no merging on completion + // and there is no need to retain dropped elements + DropWhileSink s = dropOp.opWrapSink(builder, isOrdered && isChild); + helper.wrapAndCopyInto(s, spliterator); + + Node 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 result = merge(); + setLocalResult(isRoot() ? doTruncate(result) : result); + } + + super.onCompletion(caller); + } + + private Node 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 doTruncate(Node input) { + return isOrdered + ? input.truncate(index, input.count(), generator) + : input; + } + } +} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/javax/net/ssl/SSLEngineResult.java --- 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. + *

      + * 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; diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/pkcs/PKCS7.java --- 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]; diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/pkcs/PKCS8Key.java --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/pkcs12/PKCS12KeyStore.java --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/provider/AuthPolicyFile.java --- 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 && diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/provider/DSAParameterGenerator.java --- 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); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/provider/JavaKeyStore.java --- 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]) { diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/provider/PolicyFile.java --- 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) { diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/provider/PolicyParser.java --- 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); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/provider/SecureRandom.java --- 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); } diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/ssl/ByteBufferInputStream.java --- 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"); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/ssl/ClientHandshaker.java --- 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) { diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/ssl/DHClientKeyExchange.java --- 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); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/ssl/HandshakeInStream.java --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/ssl/HandshakeMessage.java --- 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 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 signAlgs, ProtocolVersion protocolVersion) throws IOException { @@ -2063,7 +2063,7 @@ if (protocolVersion.useTLS10PlusSpec()) { // TLS 1.0+ try { - byte [] seed; + byte[] seed; String prfAlg; PRF prf; diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/ssl/HandshakeOutStream.java --- 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 { diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/ssl/MAC.java --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/ssl/RandomCookie.java --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/ssl/ServerHandshaker.java --- 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 localSignAlgs = null; if (protocolVersion.useTLS12PlusSpec()) { diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/ssl/SessionId.java --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/ssl/X509TrustManagerImpl.java --- 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); } diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/util/ManifestDigester.java --- 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 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(); + } } diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/util/ManifestEntryVerifier.java --- 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++) { diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/util/ObjectIdentifier.java --- 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]); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/util/SignatureFileVerifier.java --- 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 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 { diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/x509/AVA.java --- 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++) { diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/x509/AlgIdDSA.java --- 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), diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/x509/AlgorithmId.java --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/x509/NetscapeCertTypeExtension.java --- 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. diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/x509/OIDMap.java --- 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) */ diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/x509/PKIXExtensions.java --- 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}; /** diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/x509/X500Name.java --- 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 }; diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.base/share/classes/sun/security/x509/X509CRLImpl.java --- 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(); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.desktop/share/classes/META-INF/services/java.net.ContentHandlerFactory --- /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 diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.desktop/share/classes/sun/awt/util/IdentityArrayList.java --- 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 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); } diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.desktop/share/classes/sun/awt/www/content/MultimediaContentHandlers.java --- /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; + } + } +} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.desktop/share/classes/sun/awt/www/content/audio/aiff.java --- /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); + } +} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.desktop/share/classes/sun/awt/www/content/audio/basic.java --- /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); + } +} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.desktop/share/classes/sun/awt/www/content/audio/wav.java --- /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); + } +} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.desktop/share/classes/sun/awt/www/content/audio/x_aiff.java --- /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); + } +} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.desktop/share/classes/sun/awt/www/content/audio/x_wav.java --- /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); + } +} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.desktop/share/classes/sun/awt/www/content/image/gif.java --- /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; + } +} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.desktop/share/classes/sun/awt/www/content/image/jpeg.java --- /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; + } +} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.desktop/share/classes/sun/awt/www/content/image/png.java --- /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; + } +} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.desktop/share/classes/sun/awt/www/content/image/x_xbitmap.java --- /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; + } +} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.desktop/share/classes/sun/awt/www/content/image/x_xpixmap.java --- /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; + } +} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.desktop/share/classes/sun/net/www/content/audio/aiff.java --- 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); - } -} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.desktop/share/classes/sun/net/www/content/audio/basic.java --- 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); - } -} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.desktop/share/classes/sun/net/www/content/audio/wav.java --- 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); - } -} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.desktop/share/classes/sun/net/www/content/audio/x_aiff.java --- 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); - } -} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.desktop/share/classes/sun/net/www/content/audio/x_wav.java --- 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); - } -} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.desktop/share/classes/sun/net/www/content/image/gif.java --- 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; - } -} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.desktop/share/classes/sun/net/www/content/image/jpeg.java --- 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; - } -} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.desktop/share/classes/sun/net/www/content/image/png.java --- 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; - } -} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.desktop/share/classes/sun/net/www/content/image/x_xbitmap.java --- 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; - } -} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.desktop/share/classes/sun/net/www/content/image/x_xpixmap.java --- 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; - } -} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.jgss/share/classes/javax/security/auth/kerberos/ServicePermission.java --- 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_ = diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.jgss/share/classes/sun/security/jgss/GSSCredentialImpl.java --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.jgss/share/classes/sun/security/jgss/GSSManagerImpl.java --- 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)); } diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.jgss/share/classes/sun/security/jgss/krb5/Krb5Context.java --- 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"); } diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.jgss/share/classes/sun/security/jgss/spi/GSSContextSpi.java --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.jgss/share/classes/sun/security/jgss/wrapper/NativeGSSContext.java --- 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 { diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.jgss/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java --- 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"); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.jgss/share/classes/sun/security/krb5/PrincipalName.java --- 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(); } diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/Authenticator.java --- 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); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/AuthorizationData.java --- 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()); } diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/EncAPRepPart.java --- 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); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/EncKrbCredPart.java --- 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]); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/HostAddresses.java --- 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]); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/KDCReqBody.java --- 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); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/KrbCredInfo.java --- 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); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/NetClient.java --- 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); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/Ticket.java --- 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()); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/ccache/CCacheInputStream.java --- 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 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); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/crc32.java --- 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); } diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/ssl/KerberosPreMasterSecret.java --- 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. diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/ClientFactoryImpl.java --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/CramMD5Server.java --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/ServerFactoryImpl.java --- 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 }; diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/digest/DigestMD5Base.java --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/digest/FactoryImpl.java --- 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}; /** diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/ntlm/FactoryImpl.java --- 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 }; diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/KeyStore.java --- 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) { diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Cipher.java --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11KeyStore.java --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/wrapper/CK_AES_CTR_PARAMS.java --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/UcryptoException.java --- 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", diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/jdk.security.auth/share/classes/com/sun/security/auth/module/Crypt.java --- 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 *

      {@code renewTGT}:
      - *
      Set this to true, if you want to renew - * the TGT. If this is set, {@code useTicketCache} must also be + *
      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.
      *
      {@code doNotPrompt}:
      *
      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; diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/jdk.security.auth/share/classes/com/sun/security/auth/module/NTLoginModule.java --- 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]); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/jdk.security.auth/share/classes/com/sun/security/auth/module/NTSystem.java --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f jdk/src/jdk.security.jgss/share/classes/com/sun/security/sasl/gsskerb/FactoryImpl.java --- 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 }; diff -r a0b91dedca5c -r d1a49c6faa1f jdk/test/ProblemList.txt --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f jdk/test/java/lang/ProcessHandle/InfoTest.java --- 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 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 */ diff -r a0b91dedca5c -r d1a49c6faa1f jdk/test/java/lang/ProcessHandle/JavaChild.java --- 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()); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/test/java/lang/ProcessHandle/OnExitTest.java --- 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 processes = new ConcurrentHashMap<>(); List 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 completions = new ArrayBlockingQueue<>(expected + 1); + ConcurrentHashMap> 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 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 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); + } } } diff -r a0b91dedca5c -r d1a49c6faa1f jdk/test/java/lang/ProcessHandle/TreeTest.java --- 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 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 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 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 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 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 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 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 subprocesses = p1.allChildren() - .filter(ProcessUtil::isNotWindowsConsole) - .collect(Collectors.toList()); + List 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()); } } diff -r a0b91dedca5c -r d1a49c6faa1f jdk/test/java/net/URLConnection/ContentHandlers/ContentHandlersTest.java --- /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 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 lines = processTemplate(packageName, factorySimpleName, + r.lines()).collect(Collectors.toList()); + + Iterator it = lines.iterator(); + if (it.hasNext()) + w.write(it.next()); + while (it.hasNext()) { + w.newLine(); + w.write(it.next()); + } + } + return result; + } + + private static Stream processTemplate(String packageName, + String factorySimpleName, + Stream lines) { + Function pckg; + + if (packageName.isEmpty()) { + pckg = s -> s.contains("$package") ? "" : s; + } else { + pckg = s -> s.replaceAll("\\$package", packageName); + } + + Function 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 commands = new ArrayList<>(); + commands.addAll(asList(javac, "-d", compilationOutput.toString())); + List 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 properties, + Collection classpath, + String classname, String... args) { + + String java = getJDKTool("java"); + + List 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; + } + } +} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/test/java/net/URLConnection/ContentHandlers/broken_constructor_factory.template --- /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."); + } +} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/test/java/net/URLConnection/ContentHandlers/broken_factory.template --- /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."); + } +} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/test/java/net/URLConnection/ContentHandlers/plain.template --- /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; + } +} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/test/java/net/URLConnection/ContentHandlers/test.template --- /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 c = + (Class) 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"; } + }; + } +} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/test/java/util/Collection/MOAT.java --- 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()); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/test/java/util/logging/LoggingDeadlock2.java --- 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(); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/test/java/util/regex/RegExTest.java --- 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 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 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 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 the type of the stream elements + * @return the delegating stream + */ + public static Stream delegateTo(Stream 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 the type of the stream elements + */ + static final class DefaultMethodRefStream implements Stream { + final Stream s; + + DefaultMethodRefStream(Stream s) { + this.s = s; + } + + + // Delegating non-default methods + + @Override + public Stream filter(Predicate predicate) { + return s.filter(predicate); + } + + @Override + public Stream map(Function mapper) { + return s.map(mapper); + } + + @Override + public IntStream mapToInt(ToIntFunction mapper) { + return s.mapToInt(mapper); + } + + @Override + public LongStream mapToLong(ToLongFunction mapper) { + return s.mapToLong(mapper); + } + + @Override + public DoubleStream mapToDouble(ToDoubleFunction mapper) { + return s.mapToDouble(mapper); + } + + @Override + public Stream flatMap(Function> mapper) { + return s.flatMap(mapper); + } + + @Override + public IntStream flatMapToInt(Function mapper) { + return s.flatMapToInt(mapper); + } + + @Override + public LongStream flatMapToLong(Function mapper) { + return s.flatMapToLong(mapper); + } + + @Override + public DoubleStream flatMapToDouble(Function mapper) { + return s.flatMapToDouble(mapper); + } + + @Override + public Stream distinct() { + return s.distinct(); + } + + @Override + public Stream sorted() { + return s.sorted(); + } + + @Override + public Stream sorted(Comparator comparator) { + return s.sorted(comparator); + } + + @Override + public Stream peek(Consumer action) { + return s.peek(action); + } + + @Override + public Stream limit(long maxSize) { + return s.limit(maxSize); + } + + @Override + public Stream skip(long n) { + return s.skip(n); + } + + @Override + public void forEach(Consumer action) { + s.forEach(action); + } + + @Override + public void forEachOrdered(Consumer action) { + s.forEachOrdered(action); + } + + @Override + public Object[] toArray() { + return s.toArray(); + } + + @Override + public A[] toArray(IntFunction generator) { + return s.toArray(generator); + } + + @Override + public T reduce(T identity, BinaryOperator accumulator) { + return s.reduce(identity, accumulator); + } + + @Override + public Optional reduce(BinaryOperator accumulator) { + return s.reduce(accumulator); + } + + @Override + public U reduce(U identity, BiFunction accumulator, BinaryOperator combiner) { + return s.reduce(identity, accumulator, combiner); + } + + @Override + public R collect(Supplier supplier, BiConsumer accumulator, BiConsumer combiner) { + return s.collect(supplier, accumulator, combiner); + } + + @Override + public R collect(Collector collector) { + return s.collect(collector); + } + + @Override + public Optional min(Comparator comparator) { + return s.min(comparator); + } + + @Override + public Optional max(Comparator comparator) { + return s.max(comparator); + } + + @Override + public long count() { + return s.count(); + } + + @Override + public boolean anyMatch(Predicate predicate) { + return s.anyMatch(predicate); + } + + @Override + public boolean allMatch(Predicate predicate) { + return s.allMatch(predicate); + } + + @Override + public boolean noneMatch(Predicate predicate) { + return s.noneMatch(predicate); + } + + @Override + public Optional findFirst() { + return s.findFirst(); + } + + @Override + public Optional findAny() { + return s.findAny(); + } + + @Override + public Iterator iterator() { + return s.iterator(); + } + + @Override + public Spliterator spliterator() { + return s.spliterator(); + } + + @Override + public boolean isParallel() { + return s.isParallel(); + } + + @Override + public Stream sequential() { + return s.sequential(); + } + + @Override + public Stream parallel() { + return s.parallel(); + } + + @Override + public Stream unordered() { + return s.unordered(); + } + + @Override + public Stream 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 Stream mapToObj(IntFunction 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 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 collect(Supplier supplier, ObjIntConsumer accumulator, BiConsumer 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 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 Stream mapToObj(LongFunction 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 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 collect(Supplier supplier, ObjLongConsumer accumulator, BiConsumer 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 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 Stream mapToObj(DoubleFunction 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 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 collect(Supplier supplier, ObjDoubleConsumer accumulator, BiConsumer 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 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 diff -r a0b91dedca5c -r d1a49c6faa1f jdk/test/java/util/stream/bootlib/java/util/stream/StreamTestDataProvider.java --- 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 list = new ArrayList<>(); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/WhileOpStatefulTest.java --- /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> mRef, + Consumer mInt, + Consumer mLong, + Consumer mDouble) { + Map>> 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> mRef, + Consumer mInt, + Consumer mLong, + Consumer mDouble) { + Map>> 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>> sources, + Consumer> mRef, + Consumer mInt, + Consumer mLong, + Consumer mDouble) { + Map, Stream>> 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>> 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>> s : sources.entrySet()) { + setContext("source", s.getKey()); + + for (Map.Entry, Stream>> t : transforms.entrySet()) { + setContext("transform", t.getKey()); + + for (Map.Entry>> a : actions.entrySet()) { + setContext("shape", a.getKey()); + + Stream 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; + } +} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/WhileOpTest.java --- /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", dataProviderClass = StreamTestDataProvider.class) + public void testTakeWhileOps(String name, TestData.OfRef 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", dataProviderClass = StreamTestDataProvider.class) + public void testDropWhileOps(String name, TestData.OfRef 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", dataProviderClass = StreamTestDataProvider.class) + public void testDropTakeWhileOps(String name, TestData.OfRef 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. + *

      + * 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. + *

      + * 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.) + *

      + * 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): + *

        + *
      1. The set of output elements is a subset of the set of matching + * input elements
      2. + *
      3. The set of output elements and the set of non-matching input + * element are disjoint
      4. + *
      + * For a dropWhile operation the following assertions can be made: + *
        + *
      1. The set of non-matching input elements is a subset of the set of + * output elements
      2. + *
      3. The set of matching output elements is a subset of the set of + * matching input elements
      4. + *
      + * + * @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 the type of elements + * @return a result asserter + */ + private ResultAsserter> whileResultAsserter(Iterable inputData, + WhileOp op, + Predicate p) { + return (act, exp, ord, par) -> { + if (par & !ord) { + List input = new ArrayList<>(); + inputData.forEach(input::add); + + List output = new ArrayList<>(); + act.forEach(output::add); + + if (op == WhileOp.Take) { + List matchingInput = new ArrayList<>(); + List 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 matchingInput = new ArrayList<>(); + List 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 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 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 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 sizes(int s) { + Set 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 data, + ResultAsserter> ra, + Function, Stream> mRef, + Function mInt, + Function mLong, + Function mDouble) { + Map, Stream>> 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 data, + ResultAsserter> ra, + Map, Stream>> ms) { + for (Map.Entry, Stream>> e : ms.entrySet()) { + setContext("shape", e.getKey()); + + withData(data) + .stream(e.getValue()) + .resultAsserter(ra) + .exercise(); + } + } + + @Test + public void testRefDefaultClose() { + AtomicBoolean isClosed = new AtomicBoolean(); + Stream s = Stream.of(1, 2, 3).onClose(() -> isClosed.set(true)); + try (Stream 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()); + } +} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/test/javax/net/ssl/DTLS/DTLSOverDatagram.java --- 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. diff -r a0b91dedca5c -r d1a49c6faa1f jdk/test/sun/security/krb5/auto/BadKdc1.java --- 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 ); } } diff -r a0b91dedca5c -r d1a49c6faa1f jdk/test/sun/security/krb5/auto/KDC.java --- 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 ); diff -r a0b91dedca5c -r d1a49c6faa1f jdk/test/sun/security/krb5/auto/Renew.java --- /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"); + } + } + } +} diff -r a0b91dedca5c -r d1a49c6faa1f jdk/test/sun/security/tools/jarsigner/TsacertOptionTest.java --- 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, diff -r a0b91dedca5c -r d1a49c6faa1f langtools/.hgtags --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java --- 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 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; diff -r a0b91dedca5c -r d1a49c6faa1f langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java --- 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 annotations, DiagnosticPosition pos) { - if (typeComponent == null || typeComponent.hasTag(PACKAGE) || typeComponent.hasTag(NONE)) { - ListBuffer lb = new ListBuffer<>(); - for (JCAnnotation annotation : annotations) { - lb.append(annotation.annotationType.type.tsym); - } - List symbols = lb.toList(); - log.error(pos, - symbols.size() > 1 ? CantTypeAnnotateScoping(symbols) - : CantTypeAnnotateScoping1(symbols.get(0))); - return false; - } - return true; - } /** * Recursively validate annotations values */ diff -r a0b91dedca5c -r d1a49c6faa1f langtools/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.java --- 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 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. } diff -r a0b91dedca5c -r d1a49c6faa1f langtools/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.out --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f langtools/test/tools/javac/annotations/typeAnnotations/failures/T8074346.java --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f langtools/test/tools/javac/annotations/typeAnnotations/failures/T8074346.out --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f langtools/test/tools/javac/generics/inference/8078024/T8078024.java --- /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
      List> cartesianProduct(List... lists) { + return cartesianProduct(Arrays.asList(lists)); + } + + public static List> cartesianProduct(List> lists) { + return null; + } +} diff -r a0b91dedca5c -r d1a49c6faa1f make/CompileJavaModules.gmk --- 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 ################################################################################ diff -r a0b91dedca5c -r d1a49c6faa1f make/Images.gmk --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f modules.xml --- 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 @@ + jdk.internal.le + java.base + + jdk.internal.jline + jdk.scripting.nashorn.shell + + + jdk.internal.jline.console + jdk.scripting.nashorn.shell + + + jdk.internal.jline.console.completer + jdk.scripting.nashorn.shell + + + jdk.internal.jline.console.history + jdk.scripting.nashorn.shell + + + jdk.jartool java.base diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/.hgtags --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MemberInfo.java --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/beans/BeanLinker.java --- 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); diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/support/NameCodec.java --- 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); diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/support/TypeConverterFactory.java --- 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() { @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); } /** diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/Formatter.java --- 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 diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ClassEmitter.java --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java --- 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(); diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CompileUnit.java --- 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 functions = new IdentityHashMap<>(); + private final transient Map functions = new IdentityHashMap<>(); private transient boolean isUsed; diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Compiler.java --- 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. diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ConstantData.java --- 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); diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/DumpBytecode.java --- 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); diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/FindScopeDepths.java --- 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; } diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/LocalVariableTypesCalculator.java --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Lower.java --- 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. diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ObjectClassGenerator.java --- 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. diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/types/IntType.java --- 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: diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/NashornClassReader.java --- 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 "", //1 diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/NashornTextifier.java --- 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"); diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/ObjectSizeCalculator.java --- 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 | diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java --- 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; } /** diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeArray.java --- 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 ContinuousArrayData getContinuousNonEmptyArrayDataCCE(final Object self, final Class clazz) { + private static ContinuousArrayData getContinuousNonEmptyArrayDataCCE(final Object self, final Class 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) { diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeDate.java --- 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; } /** diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeRegExp.java --- 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() { @Override diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Lexer.java --- 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); diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/CompiledFunction.java --- 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 invalidatedProgramPoints) { this.data = data; this.log = data.getLogger(); - this.invalidatedProgramPoints = invalidatedProgramPoints == null ? new TreeMap() : invalidatedProgramPoints; + this.invalidatedProgramPoints = invalidatedProgramPoints == null ? new TreeMap<>() : invalidatedProgramPoints; newOptimisticAssumptions(); } diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSType.java --- 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 toUnmodifiableList(final MethodHandle... methodHandles) { + private static List toUnmodifiableList(final MethodHandle... methodHandles) { return Collections.unmodifiableList(Arrays.asList(methodHandles)); } } diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/NashornLoader.java --- 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); diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/OptimisticReturnFilters.java --- 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); diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Property.java --- 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) { diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PropertyMap.java --- 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; } } diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/RewriteException.java --- 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; } diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptRuntime.java --- 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 = ""; } diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Source.java --- 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())); } } diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/ContinuousArrayData.java --- 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 clazz, final ScriptObject sobj) { - if (sobj != null && sobj.getArray().getClass() == clazz) { - return true; - } - return false; + private static boolean guard(final Class clazz, final ScriptObject sobj) { + return sobj != null && sobj.getArray().getClass() == clazz; } /** diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/IntArrayData.java --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/LongArrayData.java --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/NumberArrayData.java --- 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; } diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/SparseArrayData.java --- 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 newSparseMap = new TreeMap<>(); for (final Map.Entry 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 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; } diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/Bootstrap.java --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaArgumentConverters.java --- 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(); diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/BitSet.java --- 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"); + s.append("<").append(getAddressName()).append(" (").append(parent == null ? "NULL" : parent.getAddressName()).append(")>"); return s + toString(0); } diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/ast/QuantifierNode.java --- 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(); } diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/ast/StringNode.java --- 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 { diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/Shell.java --- 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; /** diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/ShellFunctions.java --- 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; diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/test/src/jdk/nashorn/api/javaaccess/test/SharedObject.java --- 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[]) { diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/test/src/jdk/nashorn/api/scripting/test/ScriptEngineTest.java --- 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); } } diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/test/src/jdk/nashorn/api/scripting/test/ScriptObjectMirrorTest.java --- 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' } })"); diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/test/src/jdk/nashorn/api/tree/test/ParseAPITest.java --- 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"); } }); } diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/test/src/jdk/nashorn/internal/performance/OctaneTest.java --- 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; } } diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/test/src/jdk/nashorn/internal/runtime/test/ExceptionsNotSerializable.java --- 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) { diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/test/src/jdk/nashorn/internal/test/framework/AbstractScriptRunnable.java --- 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 evaluators = new ThreadLocal<>(); + private static final ThreadLocal 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; diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/test/src/jdk/nashorn/internal/test/framework/TestFinder.java --- 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 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 args) { if (hasOptimisticOverride()) { - args.add("--optimistic-types=" + Boolean.valueOf(OPTIMISTIC_OVERRIDE)); + args.add("--optimistic-types=" + OPTIMISTIC_OVERRIDE); } } diff -r a0b91dedca5c -r d1a49c6faa1f nashorn/test/src/jdk/nashorn/test/models/JDK_8081015_TestModel.java --- 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 c) { final Iterator 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()); }