--- a/.hgtags Tue Sep 22 14:24:31 2015 -0400
+++ b/.hgtags Mon Sep 21 17:49:57 2015 +0200
@@ -323,3 +323,4 @@
c8753d0be1778944dc512ec86a459941ea1ad2c3 jdk9-b78
3966bd3b8167419aa05c6718a4af1cf54b1e3c58 jdk9-b79
3c9f5bd909ae7187f24622ee4b69f8a5756a9271 jdk9-b80
+2050b3a0aadcb0e024bf798197421d58e54ec8bf jdk9-b81
--- a/.hgtags-top-repo Tue Sep 22 14:24:31 2015 -0400
+++ b/.hgtags-top-repo Mon Sep 21 17:49:57 2015 +0200
@@ -323,3 +323,4 @@
8c40d4143ee13bdf8170c68cc384c36ab1e9fadb jdk9-b78
ba08a9f79b9849716bae1f39f71333d47f604012 jdk9-b79
f7c5ae2933c0b8510a420d1713a955e4ffc7ad0b jdk9-b80
+b8afcf91331d78626a583ec1b63164468d6f4181 jdk9-b81
--- a/common/autoconf/generated-configure.sh Tue Sep 22 14:24:31 2015 -0400
+++ b/common/autoconf/generated-configure.sh Mon Sep 21 17:49:57 2015 +0200
@@ -4364,7 +4364,7 @@
#CUSTOM_AUTOCONF_INCLUDE
# Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1435822080
+DATE_WHEN_GENERATED=1441958217
###############################################################################
#
@@ -38307,6 +38307,48 @@
fi
fi
+ if test "x$OPENJDK_BUILD_OS" = xsolaris; then
+ # objcopy prior to 2.21.1 on solaris is broken and is not usable.
+ # Rewrite objcopy version output to VALID_VERSION or BAD_VERSION.
+ # - version number is last blank separate word on first line
+ # - version number formats that have been seen:
+ # - <major>.<minor>
+ # - <major>.<minor>.<micro>
+ OBJCOPY_VERSION=`$OBJCOPY --version | $HEAD -n 1`
+ # The outer [ ] is to prevent m4 from eating the [] in the sed expression.
+ OBJCOPY_VERSION_CHECK=`$ECHO $OBJCOPY_VERSION | $SED -n \
+ -e 's/.* //' \
+ -e '/^[01]\./b bad' \
+ -e '/^2\./{' \
+ -e ' s/^2\.//' \
+ -e ' /^[0-9]$/b bad' \
+ -e ' /^[0-9]\./b bad' \
+ -e ' /^1[0-9]$/b bad' \
+ -e ' /^1[0-9]\./b bad' \
+ -e ' /^20\./b bad' \
+ -e ' /^21\.0$/b bad' \
+ -e ' /^21\.0\./b bad' \
+ -e '}' \
+ -e ':good' \
+ -e 's/.*/VALID_VERSION/p' \
+ -e 'q' \
+ -e ':bad' \
+ -e 's/.*/BAD_VERSION/p' \
+ -e 'q'`
+ if test "x$OBJCOPY_VERSION_CHECK" = xBAD_VERSION; then
+ OBJCOPY=
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring found objcopy since it is broken (prior to 2.21.1). No debug symbols will be generated." >&5
+$as_echo "$as_me: WARNING: Ignoring found objcopy since it is broken (prior to 2.21.1). No debug symbols will be generated." >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: objcopy reports version $OBJCOPY_VERSION" >&5
+$as_echo "$as_me: objcopy reports version $OBJCOPY_VERSION" >&6;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Note: patch 149063-01 or newer contains the correct Solaris 10 SPARC version" >&5
+$as_echo "$as_me: Note: patch 149063-01 or newer contains the correct Solaris 10 SPARC version" >&6;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Note: patch 149064-01 or newer contains the correct Solaris 10 X86 version" >&5
+$as_echo "$as_me: Note: patch 149064-01 or newer contains the correct Solaris 10 X86 version" >&6;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Note: Solaris 11 Update 1 contains the correct version" >&5
+$as_echo "$as_me: Note: Solaris 11 Update 1 contains the correct version" >&6;}
+ fi
+ fi
fi
fi
--- a/common/autoconf/spec.gmk.in Tue Sep 22 14:24:31 2015 -0400
+++ b/common/autoconf/spec.gmk.in Mon Sep 21 17:49:57 2015 +0200
@@ -30,25 +30,6 @@
# (called @OPENJDK_BUILD_AUTOCONF_NAME@ by autoconf)
# using 'configure @CONFIGURE_COMMAND_LINE@'
-# When calling macros, the spaces between arguments are
-# often semantically important! Sometimes we need to subst
-# spaces and commas, therefore we need the following macros.
-X:=
-SPACE:=$(X) $(X)
-COMMA:=,
-DOLLAR:=$$
-HASH:=\#
-LEFT_PAREN:=(
-RIGHT_PAREN:=)
-SQUOTE:='
-#'
-DQUOTE:="
-#"
-define NEWLINE
-
-
-endef
-
# The command line given to configure.
CONFIGURE_COMMAND_LINE:=@CONFIGURE_COMMAND_LINE@
--- a/common/autoconf/toolchain.m4 Tue Sep 22 14:24:31 2015 -0400
+++ b/common/autoconf/toolchain.m4 Mon Sep 21 17:49:57 2015 +0200
@@ -586,6 +586,43 @@
# Only call fixup if objcopy was found.
if test -n "$OBJCOPY"; then
BASIC_FIXUP_EXECUTABLE(OBJCOPY)
+ if test "x$OPENJDK_BUILD_OS" = xsolaris; then
+ # objcopy prior to 2.21.1 on solaris is broken and is not usable.
+ # Rewrite objcopy version output to VALID_VERSION or BAD_VERSION.
+ # - version number is last blank separate word on first line
+ # - version number formats that have been seen:
+ # - <major>.<minor>
+ # - <major>.<minor>.<micro>
+ OBJCOPY_VERSION=`$OBJCOPY --version | $HEAD -n 1`
+ # The outer [ ] is to prevent m4 from eating the [] in the sed expression.
+ [ OBJCOPY_VERSION_CHECK=`$ECHO $OBJCOPY_VERSION | $SED -n \
+ -e 's/.* //' \
+ -e '/^[01]\./b bad' \
+ -e '/^2\./{' \
+ -e ' s/^2\.//' \
+ -e ' /^[0-9]$/b bad' \
+ -e ' /^[0-9]\./b bad' \
+ -e ' /^1[0-9]$/b bad' \
+ -e ' /^1[0-9]\./b bad' \
+ -e ' /^20\./b bad' \
+ -e ' /^21\.0$/b bad' \
+ -e ' /^21\.0\./b bad' \
+ -e '}' \
+ -e ':good' \
+ -e 's/.*/VALID_VERSION/p' \
+ -e 'q' \
+ -e ':bad' \
+ -e 's/.*/BAD_VERSION/p' \
+ -e 'q'` ]
+ if test "x$OBJCOPY_VERSION_CHECK" = xBAD_VERSION; then
+ OBJCOPY=
+ AC_MSG_WARN([Ignoring found objcopy since it is broken (prior to 2.21.1). No debug symbols will be generated.])
+ AC_MSG_NOTICE([objcopy reports version $OBJCOPY_VERSION])
+ AC_MSG_NOTICE([Note: patch 149063-01 or newer contains the correct Solaris 10 SPARC version])
+ AC_MSG_NOTICE([Note: patch 149064-01 or newer contains the correct Solaris 10 X86 version])
+ AC_MSG_NOTICE([Note: Solaris 11 Update 1 contains the correct version])
+ fi
+ fi
fi
fi
--- a/corba/.hgtags Tue Sep 22 14:24:31 2015 -0400
+++ b/corba/.hgtags Mon Sep 21 17:49:57 2015 +0200
@@ -323,3 +323,4 @@
182bb7accc5253bcfefd8edc1d4997ec8f9f8694 jdk9-b78
4ab250b8fac66ef8cd15ee78c40f0c651c96e16a jdk9-b79
821a0373ef2d1642a9824facb938b901ad010413 jdk9-b80
+45c35b7f5b40d5af0085e4a7b3a4d6e3e0347c35 jdk9-b81
--- a/hotspot/.hgtags Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/.hgtags Mon Sep 21 17:49:57 2015 +0200
@@ -483,3 +483,4 @@
20dc06b04fe5ec373879414d60ef82ac70faef98 jdk9-b78
e9e63d93bbfe2c6c23447e2c1f5cc71c98671cba jdk9-b79
8e8377739c06b99b9011c003c77e0bef84c91e09 jdk9-b80
+4142c190cd5ca4fb70ec367b4f97ef936272d8ef jdk9-b81
--- a/hotspot/src/cpu/aarch64/vm/aarch64.ad Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/cpu/aarch64/vm/aarch64.ad Mon Sep 21 17:49:57 2015 +0200
@@ -3803,81 +3803,37 @@
enc_class aarch64_enc_cmpxchg(memory mem, iRegLNoSp oldval, iRegLNoSp newval) %{
MacroAssembler _masm(&cbuf);
- Register old_reg = as_Register($oldval$$reg);
- Register new_reg = as_Register($newval$$reg);
- Register base = as_Register($mem$$base);
- Register addr_reg;
- int index = $mem$$index;
- int scale = $mem$$scale;
- int disp = $mem$$disp;
- if (index == -1) {
- if (disp != 0) {
- __ lea(rscratch2, Address(base, disp));
- addr_reg = rscratch2;
- } else {
- // TODO
- // should we ever get anything other than this case?
- addr_reg = base;
- }
- } else {
- Register index_reg = as_Register(index);
- if (disp == 0) {
- __ lea(rscratch2, Address(base, index_reg, Address::lsl(scale)));
- addr_reg = rscratch2;
- } else {
- __ lea(rscratch2, Address(base, disp));
- __ lea(rscratch2, Address(rscratch2, index_reg, Address::lsl(scale)));
- addr_reg = rscratch2;
- }
- }
- Label retry_load, done;
- __ bind(retry_load);
- __ ldxr(rscratch1, addr_reg);
- __ cmp(rscratch1, old_reg);
- __ br(Assembler::NE, done);
- __ stlxr(rscratch1, new_reg, addr_reg);
- __ cbnzw(rscratch1, retry_load);
- __ bind(done);
+ guarantee($mem$$index == -1 && $mem$$disp == 0, "impossible encoding");
+ __ cmpxchg($mem$$base$$Register, $oldval$$Register, $newval$$Register,
+ &Assembler::ldxr, &MacroAssembler::cmp, &Assembler::stlxr);
%}
enc_class aarch64_enc_cmpxchgw(memory mem, iRegINoSp oldval, iRegINoSp newval) %{
MacroAssembler _masm(&cbuf);
- Register old_reg = as_Register($oldval$$reg);
- Register new_reg = as_Register($newval$$reg);
- Register base = as_Register($mem$$base);
- Register addr_reg;
- int index = $mem$$index;
- int scale = $mem$$scale;
- int disp = $mem$$disp;
- if (index == -1) {
- if (disp != 0) {
- __ lea(rscratch2, Address(base, disp));
- addr_reg = rscratch2;
- } else {
- // TODO
- // should we ever get anything other than this case?
- addr_reg = base;
- }
- } else {
- Register index_reg = as_Register(index);
- if (disp == 0) {
- __ lea(rscratch2, Address(base, index_reg, Address::lsl(scale)));
- addr_reg = rscratch2;
- } else {
- __ lea(rscratch2, Address(base, disp));
- __ lea(rscratch2, Address(rscratch2, index_reg, Address::lsl(scale)));
- addr_reg = rscratch2;
- }
- }
- Label retry_load, done;
- __ bind(retry_load);
- __ ldxrw(rscratch1, addr_reg);
- __ cmpw(rscratch1, old_reg);
- __ br(Assembler::NE, done);
- __ stlxrw(rscratch1, new_reg, addr_reg);
- __ cbnzw(rscratch1, retry_load);
- __ bind(done);
- %}
+ guarantee($mem$$index == -1 && $mem$$disp == 0, "impossible encoding");
+ __ cmpxchg($mem$$base$$Register, $oldval$$Register, $newval$$Register,
+ &Assembler::ldxrw, &MacroAssembler::cmpw, &Assembler::stlxrw);
+ %}
+
+
+ // The only difference between aarch64_enc_cmpxchg and
+ // aarch64_enc_cmpxchg_acq is that we use load-acquire in the
+ // CompareAndSwap sequence to serve as a barrier on acquiring a
+ // lock.
+ enc_class aarch64_enc_cmpxchg_acq(memory mem, iRegLNoSp oldval, iRegLNoSp newval) %{
+ MacroAssembler _masm(&cbuf);
+ guarantee($mem$$index == -1 && $mem$$disp == 0, "impossible encoding");
+ __ cmpxchg($mem$$base$$Register, $oldval$$Register, $newval$$Register,
+ &Assembler::ldaxr, &MacroAssembler::cmp, &Assembler::stlxr);
+ %}
+
+ enc_class aarch64_enc_cmpxchgw_acq(memory mem, iRegINoSp oldval, iRegINoSp newval) %{
+ MacroAssembler _masm(&cbuf);
+ guarantee($mem$$index == -1 && $mem$$disp == 0, "impossible encoding");
+ __ cmpxchg($mem$$base$$Register, $oldval$$Register, $newval$$Register,
+ &Assembler::ldaxrw, &MacroAssembler::cmpw, &Assembler::stlxrw);
+ %}
+
// auxiliary used for CompareAndSwapX to set result register
enc_class aarch64_enc_cset_eq(iRegINoSp res) %{
@@ -4398,13 +4354,10 @@
// Compare object markOop with mark and if equal exchange scratch1
// with object markOop.
- // Note that this is simply a CAS: it does not generate any
- // barriers. These are separately generated by
- // membar_acquire_lock().
{
Label retry_load;
__ bind(retry_load);
- __ ldxr(tmp, oop);
+ __ ldaxr(tmp, oop);
__ cmp(tmp, disp_hdr);
__ br(Assembler::NE, cas_failed);
// use stlxr to ensure update is immediately visible
@@ -4454,7 +4407,7 @@
{
Label retry_load, fail;
__ bind(retry_load);
- __ ldxr(rscratch1, tmp);
+ __ ldaxr(rscratch1, tmp);
__ cmp(disp_hdr, rscratch1);
__ br(Assembler::NE, fail);
// use stlxr to ensure update is immediately visible
@@ -8017,10 +7970,10 @@
match(MemBarAcquireLock);
ins_cost(VOLATILE_REF_COST);
- format %{ "membar_acquire_lock" %}
-
- ins_encode %{
- __ membar(Assembler::LoadLoad|Assembler::LoadStore);
+ format %{ "membar_acquire_lock (elided)" %}
+
+ ins_encode %{
+ __ block_comment("membar_acquire_lock (elided)");
%}
ins_pipe(pipe_serial);
@@ -8080,10 +8033,10 @@
match(MemBarReleaseLock);
ins_cost(VOLATILE_REF_COST);
- format %{ "membar_release_lock" %}
-
- ins_encode %{
- __ membar(Assembler::LoadStore|Assembler::StoreStore);
+ format %{ "membar_release_lock (elided)" %}
+
+ ins_encode %{
+ __ block_comment("membar_release_lock (elided)");
%}
ins_pipe(pipe_serial);
@@ -8369,7 +8322,11 @@
ins_pipe(pipe_serial);
%}
-// this has to be implemented as a CAS
+
+// storeLConditional is used by PhaseMacroExpand::expand_lock_node
+// when attempting to rebias a lock towards the current thread. We
+// must use the acquire form of cmpxchg in order to guarantee acquire
+// semantics in this case.
instruct storeLConditional(indirect mem, iRegLNoSp oldval, iRegLNoSp newval, rFlagsReg cr)
%{
match(Set cr (StoreLConditional mem (Binary oldval newval)));
@@ -8381,12 +8338,14 @@
"cmpw rscratch1, zr\t# EQ on successful write"
%}
- ins_encode(aarch64_enc_cmpxchg(mem, oldval, newval));
+ ins_encode(aarch64_enc_cmpxchg_acq(mem, oldval, newval));
ins_pipe(pipe_slow);
%}
-// this has to be implemented as a CAS
+// storeIConditional also has acquire semantics, for no better reason
+// than matching storeLConditional. At the time of writing this
+// comment storeIConditional was not used anywhere by AArch64.
instruct storeIConditional(indirect mem, iRegINoSp oldval, iRegINoSp newval, rFlagsReg cr)
%{
match(Set cr (StoreIConditional mem (Binary oldval newval)));
@@ -8398,7 +8357,7 @@
"cmpw rscratch1, zr\t# EQ on successful write"
%}
- ins_encode(aarch64_enc_cmpxchgw(mem, oldval, newval));
+ ins_encode(aarch64_enc_cmpxchgw_acq(mem, oldval, newval));
ins_pipe(pipe_slow);
%}
--- a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp Mon Sep 21 17:49:57 2015 +0200
@@ -917,6 +917,8 @@
void cmpptr(Register src1, Address src2);
+ // Various forms of CAS
+
void cmpxchgptr(Register oldv, Register newv, Register addr, Register tmp,
Label &suceed, Label *fail);
@@ -938,6 +940,23 @@
str(rscratch2, adr);
}
+ // A generic CAS; success or failure is in the EQ flag.
+ template <typename T1, typename T2>
+ void cmpxchg(Register addr, Register expected, Register new_val,
+ T1 load_insn,
+ void (MacroAssembler::*cmp_insn)(Register, Register),
+ T2 store_insn,
+ Register tmp = rscratch1) {
+ Label retry_load, done;
+ bind(retry_load);
+ (this->*load_insn)(tmp, addr);
+ (this->*cmp_insn)(tmp, expected);
+ br(Assembler::NE, done);
+ (this->*store_insn)(tmp, new_val, addr);
+ cbnzw(tmp, retry_load);
+ bind(done);
+ }
+
// Calls
address trampoline_call(Address entry, CodeBuffer *cbuf = NULL);
--- a/hotspot/src/cpu/x86/vm/assembler_x86.cpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/cpu/x86/vm/assembler_x86.cpp Mon Sep 21 17:49:57 2015 +0200
@@ -394,25 +394,25 @@
int mod_idx = 0;
// We will test if the displacement fits the compressed format and if so
// apply the compression to the displacment iff the result is8bit.
- if (VM_Version::supports_evex() && is_evex_instruction) {
- switch (tuple_type) {
+ if (VM_Version::supports_evex() && _is_evex_instruction) {
+ switch (_tuple_type) {
case EVEX_FV:
- if ((evex_encoding & VEX_W) == VEX_W) {
- mod_idx += 2 + ((evex_encoding & EVEX_Rb) == EVEX_Rb) ? 1 : 0;
+ if ((_evex_encoding & VEX_W) == VEX_W) {
+ mod_idx += 2 + ((_evex_encoding & EVEX_Rb) == EVEX_Rb) ? 1 : 0;
} else {
- mod_idx = ((evex_encoding & EVEX_Rb) == EVEX_Rb) ? 1 : 0;
+ mod_idx = ((_evex_encoding & EVEX_Rb) == EVEX_Rb) ? 1 : 0;
}
break;
case EVEX_HV:
- mod_idx = ((evex_encoding & EVEX_Rb) == EVEX_Rb) ? 1 : 0;
+ mod_idx = ((_evex_encoding & EVEX_Rb) == EVEX_Rb) ? 1 : 0;
break;
case EVEX_FVM:
break;
case EVEX_T1S:
- switch (input_size_in_bits) {
+ switch (_input_size_in_bits) {
case EVEX_8bit:
break;
@@ -433,7 +433,7 @@
case EVEX_T1F:
case EVEX_T2:
case EVEX_T4:
- mod_idx = (input_size_in_bits == EVEX_64bit) ? 1 : 0;
+ mod_idx = (_input_size_in_bits == EVEX_64bit) ? 1 : 0;
break;
case EVEX_T8:
@@ -459,8 +459,8 @@
break;
}
- if (avx_vector_len >= AVX_128bit && avx_vector_len <= AVX_512bit) {
- int disp_factor = tuple_table[tuple_type + mod_idx][avx_vector_len];
+ if (_avx_vector_len >= AVX_128bit && _avx_vector_len <= AVX_512bit) {
+ int disp_factor = tuple_table[_tuple_type + mod_idx][_avx_vector_len];
if ((disp % disp_factor) == 0) {
int new_disp = disp / disp_factor;
if (is8bit(new_disp)) {
@@ -591,7 +591,7 @@
emit_data(disp, rspec, disp32_operand);
}
}
- is_evex_instruction = false;
+ _is_evex_instruction = false;
}
void Assembler::emit_operand(XMMRegister reg, Register base, Register index,
@@ -1229,8 +1229,8 @@
void Assembler::addsd(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_64bit;
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_64bit;
emit_simd_arith_q(0x58, dst, src, VEX_SIMD_F2);
} else {
emit_simd_arith(0x58, dst, src, VEX_SIMD_F2);
@@ -1245,8 +1245,8 @@
void Assembler::addss(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_32bit;
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_32bit;
}
emit_simd_arith(0x58, dst, src, VEX_SIMD_F3);
}
@@ -1254,16 +1254,16 @@
void Assembler::aesdec(XMMRegister dst, Address src) {
assert(VM_Version::supports_aes(), "");
InstructionMark im(this);
- simd_prefix(dst, dst, src, VEX_SIMD_66, false,
- VEX_OPCODE_0F_38, false, AVX_128bit, true);
+ simd_prefix(dst, dst, src, VEX_SIMD_66, /* no_mask_reg */ false,
+ VEX_OPCODE_0F_38, /* rex_w */ false, AVX_128bit, /* legacy_mode */ true);
emit_int8((unsigned char)0xDE);
emit_operand(dst, src);
}
void Assembler::aesdec(XMMRegister dst, XMMRegister src) {
assert(VM_Version::supports_aes(), "");
- int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, false,
- VEX_OPCODE_0F_38, false, AVX_128bit, true);
+ int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, /* no_mask_reg */ false,
+ VEX_OPCODE_0F_38, /* rex_w */ false, AVX_128bit, /* legacy_mode */ true);
emit_int8((unsigned char)0xDE);
emit_int8(0xC0 | encode);
}
@@ -1271,16 +1271,16 @@
void Assembler::aesdeclast(XMMRegister dst, Address src) {
assert(VM_Version::supports_aes(), "");
InstructionMark im(this);
- simd_prefix(dst, dst, src, VEX_SIMD_66, false,
- VEX_OPCODE_0F_38, false, AVX_128bit, true);
+ simd_prefix(dst, dst, src, VEX_SIMD_66, /* no_mask_reg */ false,
+ VEX_OPCODE_0F_38, /* rex_w */ false, AVX_128bit, /* legacy_mode */ true);
emit_int8((unsigned char)0xDF);
emit_operand(dst, src);
}
void Assembler::aesdeclast(XMMRegister dst, XMMRegister src) {
assert(VM_Version::supports_aes(), "");
- int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, false,
- VEX_OPCODE_0F_38, false, AVX_128bit, true);
+ int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, /* no_mask_reg */ false,
+ VEX_OPCODE_0F_38, /* rex_w */ false, AVX_128bit, /* legacy_mode */ true);
emit_int8((unsigned char)0xDF);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -1288,16 +1288,16 @@
void Assembler::aesenc(XMMRegister dst, Address src) {
assert(VM_Version::supports_aes(), "");
InstructionMark im(this);
- simd_prefix(dst, dst, src, VEX_SIMD_66, false,
- VEX_OPCODE_0F_38, false, AVX_128bit, true);
+ simd_prefix(dst, dst, src, VEX_SIMD_66, /* no_mask_reg */ false,
+ VEX_OPCODE_0F_38, /* rex_w */ false, AVX_128bit, /* legacy_mode */ true);
emit_int8((unsigned char)0xDC);
emit_operand(dst, src);
}
void Assembler::aesenc(XMMRegister dst, XMMRegister src) {
assert(VM_Version::supports_aes(), "");
- int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, false,
- VEX_OPCODE_0F_38, false, AVX_128bit, true);
+ int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, /* no_mask_reg */ false,
+ VEX_OPCODE_0F_38, /* rex_w */ false, AVX_128bit, /* legacy_mode */ true);
emit_int8((unsigned char)0xDC);
emit_int8(0xC0 | encode);
}
@@ -1305,21 +1305,20 @@
void Assembler::aesenclast(XMMRegister dst, Address src) {
assert(VM_Version::supports_aes(), "");
InstructionMark im(this);
- simd_prefix(dst, dst, src, VEX_SIMD_66, false,
- VEX_OPCODE_0F_38, false, AVX_128bit, true);
+ simd_prefix(dst, dst, src, VEX_SIMD_66, /* no_mask_reg */ false,
+ VEX_OPCODE_0F_38, /* rex_w */ false, AVX_128bit, /* legacy_mode */ true);
emit_int8((unsigned char)0xDD);
emit_operand(dst, src);
}
void Assembler::aesenclast(XMMRegister dst, XMMRegister src) {
assert(VM_Version::supports_aes(), "");
- int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, false,
- VEX_OPCODE_0F_38, false, AVX_128bit, true);
+ int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, /* no_mask_reg */ false,
+ VEX_OPCODE_0F_38, /* rex_w */ false, AVX_128bit, /* legacy_mode */ true);
emit_int8((unsigned char)0xDD);
emit_int8((unsigned char)(0xC0 | encode));
}
-
void Assembler::andl(Address dst, int32_t imm32) {
InstructionMark im(this);
prefix(dst);
@@ -1347,7 +1346,7 @@
void Assembler::andnl(Register dst, Register src1, Register src2) {
assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");
- int encode = vex_prefix_0F38_and_encode_legacy(dst, src1, src2, false);
+ int encode = vex_prefix_0F38_and_encode_legacy(dst, src1, src2);
emit_int8((unsigned char)0xF2);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -1355,7 +1354,7 @@
void Assembler::andnl(Register dst, Register src1, Address src2) {
InstructionMark im(this);
assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");
- vex_prefix_0F38_legacy(dst, src1, src2, false);
+ vex_prefix_0F38_legacy(dst, src1, src2);
emit_int8((unsigned char)0xF2);
emit_operand(dst, src2);
}
@@ -1382,7 +1381,7 @@
void Assembler::blsil(Register dst, Register src) {
assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");
- int encode = vex_prefix_0F38_and_encode_legacy(rbx, dst, src, false);
+ int encode = vex_prefix_0F38_and_encode_legacy(rbx, dst, src);
emit_int8((unsigned char)0xF3);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -1390,14 +1389,14 @@
void Assembler::blsil(Register dst, Address src) {
InstructionMark im(this);
assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");
- vex_prefix_0F38_legacy(rbx, dst, src, false);
+ vex_prefix_0F38_legacy(rbx, dst, src);
emit_int8((unsigned char)0xF3);
emit_operand(rbx, src);
}
void Assembler::blsmskl(Register dst, Register src) {
assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");
- int encode = vex_prefix_0F38_and_encode_legacy(rdx, dst, src, false);
+ int encode = vex_prefix_0F38_and_encode_legacy(rdx, dst, src);
emit_int8((unsigned char)0xF3);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -1405,14 +1404,14 @@
void Assembler::blsmskl(Register dst, Address src) {
InstructionMark im(this);
assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");
- vex_prefix_0F38(rdx, dst, src, false);
+ vex_prefix_0F38_legacy(rdx, dst, src);
emit_int8((unsigned char)0xF3);
emit_operand(rdx, src);
}
void Assembler::blsrl(Register dst, Register src) {
assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");
- int encode = vex_prefix_0F38_and_encode_legacy(rcx, dst, src, false);
+ int encode = vex_prefix_0F38_and_encode_legacy(rcx, dst, src);
emit_int8((unsigned char)0xF3);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -1420,7 +1419,7 @@
void Assembler::blsrl(Register dst, Address src) {
InstructionMark im(this);
assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");
- vex_prefix_0F38_legacy(rcx, dst, src, false);
+ vex_prefix_0F38_legacy(rcx, dst, src);
emit_int8((unsigned char)0xF3);
emit_operand(rcx, src);
}
@@ -1569,9 +1568,9 @@
// 0x66 is there. Strangly ucomisd comes out correct
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_64bit;
- emit_simd_arith_nonds_q(0x2F, dst, src, VEX_SIMD_66, true);
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_64bit;
+ emit_simd_arith_nonds_q(0x2F, dst, src, VEX_SIMD_66, /* no_mask_reg */ true);
} else {
emit_simd_arith_nonds(0x2F, dst, src, VEX_SIMD_66);
}
@@ -1580,7 +1579,7 @@
void Assembler::comisd(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
- emit_simd_arith_nonds_q(0x2F, dst, src, VEX_SIMD_66, true);
+ emit_simd_arith_nonds_q(0x2F, dst, src, VEX_SIMD_66, /* no_mask_reg */ true);
} else {
emit_simd_arith_nonds(0x2F, dst, src, VEX_SIMD_66);
}
@@ -1588,16 +1587,16 @@
void Assembler::comiss(XMMRegister dst, Address src) {
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_32bit;
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_32bit;
}
NOT_LP64(assert(VM_Version::supports_sse(), ""));
- emit_simd_arith_nonds(0x2F, dst, src, VEX_SIMD_NONE, true);
+ emit_simd_arith_nonds(0x2F, dst, src, VEX_SIMD_NONE, /* no_mask_reg */ true);
}
void Assembler::comiss(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse(), ""));
- emit_simd_arith_nonds(0x2F, dst, src, VEX_SIMD_NONE, true);
+ emit_simd_arith_nonds(0x2F, dst, src, VEX_SIMD_NONE, /* no_mask_reg */ true);
}
void Assembler::cpuid() {
@@ -1607,12 +1606,12 @@
void Assembler::cvtdq2pd(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- emit_simd_arith_nonds(0xE6, dst, src, VEX_SIMD_F3);
+ emit_simd_arith_nonds(0xE6, dst, src, VEX_SIMD_F3, /* no_mask_reg */ false, /* legacy_mode */ true);
}
void Assembler::cvtdq2ps(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- emit_simd_arith_nonds(0x5B, dst, src, VEX_SIMD_NONE);
+ emit_simd_arith_nonds(0x5B, dst, src, VEX_SIMD_NONE, /* no_mask_reg */ false, /* legacy_mode */ true);
}
void Assembler::cvtsd2ss(XMMRegister dst, XMMRegister src) {
@@ -1627,8 +1626,8 @@
void Assembler::cvtsd2ss(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1F;
- input_size_in_bits = EVEX_64bit;
+ _tuple_type = EVEX_T1F;
+ _input_size_in_bits = EVEX_64bit;
emit_simd_arith_q(0x5A, dst, src, VEX_SIMD_F2);
} else {
emit_simd_arith(0x5A, dst, src, VEX_SIMD_F2);
@@ -1637,12 +1636,7 @@
void Assembler::cvtsi2sdl(XMMRegister dst, Register src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- int encode = 0;
- if (VM_Version::supports_evex()) {
- encode = simd_prefix_and_encode_q(dst, dst, src, VEX_SIMD_F2, true);
- } else {
- encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F2, false);
- }
+ int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F2, VM_Version::supports_evex());
emit_int8(0x2A);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -1650,9 +1644,9 @@
void Assembler::cvtsi2sdl(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_32bit;
- emit_simd_arith_q(0x2A, dst, src, VEX_SIMD_F2, true);
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_32bit;
+ emit_simd_arith(0x2A, dst, src, VEX_SIMD_F2, /* no_mask_reg */ true);
} else {
emit_simd_arith(0x2A, dst, src, VEX_SIMD_F2);
}
@@ -1660,23 +1654,23 @@
void Assembler::cvtsi2ssl(XMMRegister dst, Register src) {
NOT_LP64(assert(VM_Version::supports_sse(), ""));
- int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F3, true);
+ int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F3, /* no_mask_reg */ true);
emit_int8(0x2A);
emit_int8((unsigned char)(0xC0 | encode));
}
void Assembler::cvtsi2ssl(XMMRegister dst, Address src) {
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_32bit;
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_32bit;
}
NOT_LP64(assert(VM_Version::supports_sse(), ""));
- emit_simd_arith(0x2A, dst, src, VEX_SIMD_F3, true);
+ emit_simd_arith(0x2A, dst, src, VEX_SIMD_F3, /* no_mask_reg */ true);
}
void Assembler::cvtsi2ssq(XMMRegister dst, Register src) {
NOT_LP64(assert(VM_Version::supports_sse(), ""));
- int encode = simd_prefix_and_encode_q(dst, dst, src, VEX_SIMD_F3, true);
+ int encode = simd_prefix_and_encode_q(dst, dst, src, VEX_SIMD_F3, /* no_mask_reg */ true);
emit_int8(0x2A);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -1688,8 +1682,8 @@
void Assembler::cvtss2sd(XMMRegister dst, Address src) {
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_32bit;
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_32bit;
}
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
emit_simd_arith(0x5A, dst, src, VEX_SIMD_F3);
@@ -1698,14 +1692,14 @@
void Assembler::cvttsd2sil(Register dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- int encode = simd_prefix_and_encode(dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, true);
+ int encode = simd_prefix_and_encode(dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, /* no_mask_reg */ true);
emit_int8(0x2C);
emit_int8((unsigned char)(0xC0 | encode));
}
void Assembler::cvttss2sil(Register dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse(), ""));
- int encode = simd_prefix_and_encode(dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, true);
+ int encode = simd_prefix_and_encode(dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, /* no_mask_reg */ true);
emit_int8(0x2C);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -1721,8 +1715,8 @@
void Assembler::divsd(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_64bit;
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_64bit;
emit_simd_arith_q(0x5E, dst, src, VEX_SIMD_F2);
} else {
emit_simd_arith(0x5E, dst, src, VEX_SIMD_F2);
@@ -1740,8 +1734,8 @@
void Assembler::divss(XMMRegister dst, Address src) {
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_32bit;
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_32bit;
}
NOT_LP64(assert(VM_Version::supports_sse(), ""));
emit_simd_arith(0x5E, dst, src, VEX_SIMD_F3);
@@ -1995,8 +1989,16 @@
void Assembler::movapd(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- if (VM_Version::supports_evex()) {
- emit_simd_arith_nonds_q(0x28, dst, src, VEX_SIMD_66, true);
+ if (VM_Version::supports_avx512novl()) {
+ int vector_len = AVX_512bit;
+ int dst_enc = dst->encoding();
+ int src_enc = src->encoding();
+ int encode = vex_prefix_and_encode(dst_enc, 0, src_enc, VEX_SIMD_66, VEX_OPCODE_0F,
+ /* vex_w */ true, vector_len, /* legacy_mode */ false, /* no_mask_reg */ false);
+ emit_int8(0x28);
+ emit_int8((unsigned char)(0xC0 | encode));
+ } else if (VM_Version::supports_evex()) {
+ emit_simd_arith_nonds_q(0x28, dst, src, VEX_SIMD_66);
} else {
emit_simd_arith_nonds(0x28, dst, src, VEX_SIMD_66);
}
@@ -2004,13 +2006,19 @@
void Assembler::movaps(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse(), ""));
- emit_simd_arith_nonds(0x28, dst, src, VEX_SIMD_NONE);
+ if (VM_Version::supports_avx512novl()) {
+ int vector_len = AVX_512bit;
+ int encode = vex_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_NONE, vector_len);
+ emit_int8(0x28);
+ emit_int8((unsigned char)(0xC0 | encode));
+ } else {
+ emit_simd_arith_nonds(0x28, dst, src, VEX_SIMD_NONE);
+ }
}
void Assembler::movlhps(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse(), ""));
- int encode = simd_prefix_and_encode(dst, src, src, VEX_SIMD_NONE, true, VEX_OPCODE_0F,
- false, AVX_128bit);
+ int encode = simd_prefix_and_encode(dst, src, src, VEX_SIMD_NONE, /* no_mask_reg */ true);
emit_int8(0x16);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -2023,48 +2031,54 @@
emit_operand(dst, src);
}
-void Assembler::kmovq(KRegister dst, KRegister src) {
+void Assembler::kmovql(KRegister dst, KRegister src) {
NOT_LP64(assert(VM_Version::supports_evex(), ""));
int encode = kreg_prefix_and_encode(dst, knoreg, src, VEX_SIMD_NONE,
- true, VEX_OPCODE_0F, true);
+ /* no_mask_reg */ true, VEX_OPCODE_0F, /* rex_w */ true);
emit_int8((unsigned char)0x90);
emit_int8((unsigned char)(0xC0 | encode));
}
-void Assembler::kmovq(KRegister dst, Address src) {
+void Assembler::kmovql(KRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_evex(), ""));
int dst_enc = dst->encoding();
int nds_enc = 0;
vex_prefix(src, nds_enc, dst_enc, VEX_SIMD_NONE,
- VEX_OPCODE_0F, true, AVX_128bit, true, true);
+ VEX_OPCODE_0F, /* vex_w */ true, AVX_128bit, /* legacy_mode */ true, /* no_reg_mask */ true);
emit_int8((unsigned char)0x90);
emit_operand((Register)dst, src);
}
-void Assembler::kmovq(Address dst, KRegister src) {
+void Assembler::kmovql(Address dst, KRegister src) {
NOT_LP64(assert(VM_Version::supports_evex(), ""));
int src_enc = src->encoding();
int nds_enc = 0;
vex_prefix(dst, nds_enc, src_enc, VEX_SIMD_NONE,
- VEX_OPCODE_0F, true, AVX_128bit, true, true);
+ VEX_OPCODE_0F, /* vex_w */ true, AVX_128bit, /* legacy_mode */ true, /* no_reg_mask */ true);
emit_int8((unsigned char)0x90);
emit_operand((Register)src, dst);
}
void Assembler::kmovql(KRegister dst, Register src) {
NOT_LP64(assert(VM_Version::supports_evex(), ""));
- bool supports_bw = VM_Version::supports_avx512bw();
- VexSimdPrefix pre = supports_bw ? VEX_SIMD_F2 : VEX_SIMD_NONE;
- int encode = kreg_prefix_and_encode(dst, knoreg, src, pre, true,
- VEX_OPCODE_0F, supports_bw);
+ VexSimdPrefix pre = !_legacy_mode_bw ? VEX_SIMD_F2 : VEX_SIMD_NONE;
+ int encode = kreg_prefix_and_encode(dst, knoreg, src, pre, /* no_mask_reg */ true,
+ VEX_OPCODE_0F, /* legacy_mode */ !_legacy_mode_bw);
emit_int8((unsigned char)0x92);
emit_int8((unsigned char)(0xC0 | encode));
}
void Assembler::kmovdl(KRegister dst, Register src) {
NOT_LP64(assert(VM_Version::supports_evex(), ""));
- VexSimdPrefix pre = VM_Version::supports_avx512bw() ? VEX_SIMD_F2 : VEX_SIMD_NONE;
- int encode = kreg_prefix_and_encode(dst, knoreg, src, pre, true, VEX_OPCODE_0F, false);
+ VexSimdPrefix pre = !_legacy_mode_bw ? VEX_SIMD_F2 : VEX_SIMD_NONE;
+ int encode = kreg_prefix_and_encode(dst, knoreg, src, pre, /* no_mask_reg */ true);
+ emit_int8((unsigned char)0x92);
+ emit_int8((unsigned char)(0xC0 | encode));
+}
+
+void Assembler::kmovwl(KRegister dst, Register src) {
+ NOT_LP64(assert(VM_Version::supports_evex(), ""));
+ int encode = kreg_prefix_and_encode(dst, knoreg, src, VEX_SIMD_NONE, /* no_mask_reg */ true);
emit_int8((unsigned char)0x92);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -2088,7 +2102,7 @@
void Assembler::movdl(XMMRegister dst, Register src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- int encode = simd_prefix_and_encode(dst, src, VEX_SIMD_66, true);
+ int encode = simd_prefix_and_encode(dst, src, VEX_SIMD_66, /* no_mask_reg */ true);
emit_int8(0x6E);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -2096,7 +2110,7 @@
void Assembler::movdl(Register dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
// swap src/dst to get correct prefix
- int encode = simd_prefix_and_encode(src, dst, VEX_SIMD_66, true);
+ int encode = simd_prefix_and_encode(src, dst, VEX_SIMD_66, /* no_mask_reg */ true);
emit_int8(0x7E);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -2104,11 +2118,11 @@
void Assembler::movdl(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_32bit;
- }
- InstructionMark im(this);
- simd_prefix(dst, src, VEX_SIMD_66, true, VEX_OPCODE_0F);
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_32bit;
+ }
+ InstructionMark im(this);
+ simd_prefix(dst, src, VEX_SIMD_66, /* no_reg_mask */ true);
emit_int8(0x6E);
emit_operand(dst, src);
}
@@ -2116,58 +2130,61 @@
void Assembler::movdl(Address dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_32bit;
- }
- InstructionMark im(this);
- simd_prefix(dst, src, VEX_SIMD_66, true);
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_32bit;
+ }
+ InstructionMark im(this);
+ simd_prefix(dst, src, VEX_SIMD_66, /* no_reg_mask */ true);
emit_int8(0x7E);
emit_operand(src, dst);
}
void Assembler::movdqa(XMMRegister dst, XMMRegister src) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
emit_simd_arith_nonds(0x6F, dst, src, VEX_SIMD_66);
}
void Assembler::movdqa(XMMRegister dst, Address src) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FVM;
+ _tuple_type = EVEX_FVM;
}
emit_simd_arith_nonds(0x6F, dst, src, VEX_SIMD_66);
}
void Assembler::movdqu(XMMRegister dst, Address src) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FVM;
+ _tuple_type = EVEX_FVM;
}
emit_simd_arith_nonds(0x6F, dst, src, VEX_SIMD_F3);
}
void Assembler::movdqu(XMMRegister dst, XMMRegister src) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
emit_simd_arith_nonds(0x6F, dst, src, VEX_SIMD_F3);
}
void Assembler::movdqu(Address dst, XMMRegister src) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FVM;
- }
- InstructionMark im(this);
- simd_prefix(dst, src, VEX_SIMD_F3, false);
+ _tuple_type = EVEX_FVM;
+ }
+ InstructionMark im(this);
+ simd_prefix(dst, src, VEX_SIMD_F3, /* no_mask_reg */ false);
emit_int8(0x7F);
emit_operand(src, dst);
}
// Move Unaligned 256bit Vector
void Assembler::vmovdqu(XMMRegister dst, XMMRegister src) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "");
- if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FVM;
- }
int vector_len = AVX_256bit;
int encode = vex_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_F3, vector_len);
emit_int8(0x6F);
@@ -2175,67 +2192,100 @@
}
void Assembler::vmovdqu(XMMRegister dst, Address src) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FVM;
+ _tuple_type = EVEX_FVM;
}
InstructionMark im(this);
int vector_len = AVX_256bit;
- vex_prefix(dst, xnoreg, src, VEX_SIMD_F3, vector_len, false);
+ vex_prefix(dst, xnoreg, src, VEX_SIMD_F3, vector_len);
emit_int8(0x6F);
emit_operand(dst, src);
}
void Assembler::vmovdqu(Address dst, XMMRegister src) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FVM;
+ _tuple_type = EVEX_FVM;
}
InstructionMark im(this);
int vector_len = AVX_256bit;
// swap src<->dst for encoding
assert(src != xnoreg, "sanity");
- vex_prefix(src, xnoreg, dst, VEX_SIMD_F3, vector_len, false);
+ vex_prefix(src, xnoreg, dst, VEX_SIMD_F3, vector_len);
emit_int8(0x7F);
emit_operand(src, dst);
}
// Move Unaligned EVEX enabled Vector (programmable : 8,16,32,64)
-void Assembler::evmovdqu(XMMRegister dst, XMMRegister src, int vector_len) {
+void Assembler::evmovdqul(XMMRegister dst, XMMRegister src, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "");
int src_enc = src->encoding();
int dst_enc = dst->encoding();
int encode = vex_prefix_and_encode(dst_enc, 0, src_enc, VEX_SIMD_F3, VEX_OPCODE_0F,
- true, vector_len, false, false);
+ /* vex_w */ false, vector_len, /* legacy_mode */ false, /* no_mask_reg */ false);
emit_int8(0x6F);
emit_int8((unsigned char)(0xC0 | encode));
}
-void Assembler::evmovdqu(XMMRegister dst, Address src, int vector_len) {
+void Assembler::evmovdqul(XMMRegister dst, Address src, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "");
InstructionMark im(this);
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FVM;
- vex_prefix_q(dst, xnoreg, src, VEX_SIMD_F3, vector_len, false);
- } else {
- vex_prefix(dst, xnoreg, src, VEX_SIMD_F3, vector_len, false);
- }
+ _tuple_type = EVEX_FVM;
+ }
+ vex_prefix(dst, xnoreg, src, VEX_SIMD_F3, vector_len);
emit_int8(0x6F);
emit_operand(dst, src);
}
-void Assembler::evmovdqu(Address dst, XMMRegister src, int vector_len) {
+void Assembler::evmovdqul(Address dst, XMMRegister src, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "");
InstructionMark im(this);
assert(src != xnoreg, "sanity");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FVM;
- // swap src<->dst for encoding
- vex_prefix_q(src, xnoreg, dst, VEX_SIMD_F3, vector_len, false);
- } else {
- // swap src<->dst for encoding
- vex_prefix(src, xnoreg, dst, VEX_SIMD_F3, vector_len, false);
- }
+ _tuple_type = EVEX_FVM;
+ }
+ // swap src<->dst for encoding
+ vex_prefix(src, xnoreg, dst, VEX_SIMD_F3, vector_len);
+ emit_int8(0x7F);
+ emit_operand(src, dst);
+}
+
+void Assembler::evmovdquq(XMMRegister dst, XMMRegister src, int vector_len) {
+ _instruction_uses_vl = true;
+ assert(UseAVX > 0, "");
+ int src_enc = src->encoding();
+ int dst_enc = dst->encoding();
+ int encode = vex_prefix_and_encode(dst_enc, 0, src_enc, VEX_SIMD_F3, VEX_OPCODE_0F,
+ /* vex_w */ true, vector_len, /* legacy_mode */ false, /* no_mask_reg */ false);
+ emit_int8(0x6F);
+ emit_int8((unsigned char)(0xC0 | encode));
+}
+
+void Assembler::evmovdquq(XMMRegister dst, Address src, int vector_len) {
+ _instruction_uses_vl = true;
+ assert(UseAVX > 2, "");
+ InstructionMark im(this);
+ _tuple_type = EVEX_FVM;
+ vex_prefix_q(dst, xnoreg, src, VEX_SIMD_F3, vector_len);
+ emit_int8(0x6F);
+ emit_operand(dst, src);
+}
+
+void Assembler::evmovdquq(Address dst, XMMRegister src, int vector_len) {
+ _instruction_uses_vl = true;
+ assert(UseAVX > 2, "");
+ InstructionMark im(this);
+ assert(src != xnoreg, "sanity");
+ _tuple_type = EVEX_FVM;
+ // swap src<->dst for encoding
+ vex_prefix_q(src, xnoreg, dst, VEX_SIMD_F3, vector_len);
emit_int8(0x7F);
emit_operand(src, dst);
}
@@ -2282,10 +2332,12 @@
void Assembler::movlpd(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_32bit;
- }
- emit_simd_arith(0x12, dst, src, VEX_SIMD_66, true);
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_32bit;
+ emit_simd_arith_q(0x12, dst, src, VEX_SIMD_66, /* no_mask_reg */ true);
+ } else {
+ emit_simd_arith(0x12, dst, src, VEX_SIMD_66, /* no_mask_reg */ true);
+ }
}
void Assembler::movq( MMXRegister dst, Address src ) {
@@ -2312,11 +2364,11 @@
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
InstructionMark im(this);
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_64bit;
- simd_prefix_q(dst, xnoreg, src, VEX_SIMD_F3, true);
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_64bit;
+ simd_prefix_q(dst, xnoreg, src, VEX_SIMD_F3, /* no_mask_reg */ true);
} else {
- simd_prefix(dst, src, VEX_SIMD_F3, true, VEX_OPCODE_0F);
+ simd_prefix(dst, src, VEX_SIMD_F3, /* no_mask_reg */ true);
}
emit_int8(0x7E);
emit_operand(dst, src);
@@ -2326,12 +2378,12 @@
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
InstructionMark im(this);
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_64bit;
- simd_prefix(src, xnoreg, dst, VEX_SIMD_66, true,
- VEX_OPCODE_0F, true, AVX_128bit);
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_64bit;
+ simd_prefix(src, xnoreg, dst, VEX_SIMD_66, /* no_mask_reg */ true,
+ VEX_OPCODE_0F, /* rex_w */ true);
} else {
- simd_prefix(dst, src, VEX_SIMD_66, true);
+ simd_prefix(dst, src, VEX_SIMD_66, /* no_mask_reg */ true);
}
emit_int8((unsigned char)0xD6);
emit_operand(src, dst);
@@ -2356,7 +2408,7 @@
void Assembler::movsd(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
- emit_simd_arith_q(0x10, dst, src, VEX_SIMD_F2, true);
+ emit_simd_arith_q(0x10, dst, src, VEX_SIMD_F2, /* no_mask_reg */ true);
} else {
emit_simd_arith(0x10, dst, src, VEX_SIMD_F2);
}
@@ -2365,9 +2417,9 @@
void Assembler::movsd(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_64bit;
- emit_simd_arith_nonds_q(0x10, dst, src, VEX_SIMD_F2, true);
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_64bit;
+ emit_simd_arith_nonds_q(0x10, dst, src, VEX_SIMD_F2, /* no_mask_reg */ true);
} else {
emit_simd_arith_nonds(0x10, dst, src, VEX_SIMD_F2);
}
@@ -2377,11 +2429,11 @@
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
InstructionMark im(this);
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_64bit;
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_64bit;
simd_prefix_q(src, xnoreg, dst, VEX_SIMD_F2);
} else {
- simd_prefix(src, xnoreg, dst, VEX_SIMD_F2, false);
+ simd_prefix(src, xnoreg, dst, VEX_SIMD_F2, /* no_mask_reg */ false);
}
emit_int8(0x11);
emit_operand(src, dst);
@@ -2389,26 +2441,26 @@
void Assembler::movss(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse(), ""));
- emit_simd_arith(0x10, dst, src, VEX_SIMD_F3, true);
+ emit_simd_arith(0x10, dst, src, VEX_SIMD_F3, /* no_mask_reg */ true);
}
void Assembler::movss(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_32bit;
- }
- emit_simd_arith_nonds(0x10, dst, src, VEX_SIMD_F3, true);
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_32bit;
+ }
+ emit_simd_arith_nonds(0x10, dst, src, VEX_SIMD_F3, /* no_mask_reg */ true);
}
void Assembler::movss(Address dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_32bit;
- }
- InstructionMark im(this);
- simd_prefix(dst, src, VEX_SIMD_F3, false);
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_32bit;
+ }
+ InstructionMark im(this);
+ simd_prefix(dst, src, VEX_SIMD_F3, /* no_mask_reg */ false);
emit_int8(0x11);
emit_operand(src, dst);
}
@@ -2501,8 +2553,8 @@
void Assembler::mulsd(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_64bit;
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_64bit;
emit_simd_arith_q(0x59, dst, src, VEX_SIMD_F2);
} else {
emit_simd_arith(0x59, dst, src, VEX_SIMD_F2);
@@ -2521,8 +2573,8 @@
void Assembler::mulss(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_32bit;
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_32bit;
}
emit_simd_arith(0x59, dst, src, VEX_SIMD_F3);
}
@@ -2831,29 +2883,27 @@
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_32bit;
- }
- emit_simd_arith(0x67, dst, src, VEX_SIMD_66,
- false, (VM_Version::supports_avx512dq() == false));
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_32bit;
+ }
+ emit_simd_arith(0x67, dst, src, VEX_SIMD_66, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
}
void Assembler::packuswb(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- emit_simd_arith(0x67, dst, src, VEX_SIMD_66,
- false, (VM_Version::supports_avx512dq() == false));
+ emit_simd_arith(0x67, dst, src, VEX_SIMD_66, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
}
void Assembler::vpackuswb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
assert(UseAVX > 0, "some form of AVX must be enabled");
- emit_vex_arith(0x67, dst, nds, src, VEX_SIMD_66, vector_len,
- false, (VM_Version::supports_avx512dq() == false));
+ emit_vex_arith(0x67, dst, nds, src, VEX_SIMD_66, vector_len, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
}
void Assembler::vpermq(XMMRegister dst, XMMRegister src, int imm8, int vector_len) {
+ _instruction_uses_vl = true;
assert(VM_Version::supports_avx2(), "");
- int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, false,
- VEX_OPCODE_0F_3A, true, vector_len);
+ int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, /* no_mask_reg */ false,
+ VEX_OPCODE_0F_3A, /* rex_w */ true, vector_len);
emit_int8(0x00);
emit_int8(0xC0 | encode);
emit_int8(imm8);
@@ -2867,8 +2917,8 @@
void Assembler::pcmpestri(XMMRegister dst, Address src, int imm8) {
assert(VM_Version::supports_sse4_2(), "");
InstructionMark im(this);
- simd_prefix(dst, xnoreg, src, VEX_SIMD_66, false, VEX_OPCODE_0F_3A,
- false, AVX_128bit, true);
+ simd_prefix(dst, xnoreg, src, VEX_SIMD_66, /* no_mask_reg */ false, VEX_OPCODE_0F_3A,
+ /* rex_w */ false, AVX_128bit, /* legacy_mode */ true);
emit_int8(0x61);
emit_operand(dst, src);
emit_int8(imm8);
@@ -2876,8 +2926,8 @@
void Assembler::pcmpestri(XMMRegister dst, XMMRegister src, int imm8) {
assert(VM_Version::supports_sse4_2(), "");
- int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, false,
- VEX_OPCODE_0F_3A, false, AVX_128bit, true);
+ int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, /* no_mask_reg */ false,
+ VEX_OPCODE_0F_3A, /* rex_w */ false, AVX_128bit, /* legacy_mode */ true);
emit_int8(0x61);
emit_int8((unsigned char)(0xC0 | encode));
emit_int8(imm8);
@@ -2885,8 +2935,8 @@
void Assembler::pextrd(Register dst, XMMRegister src, int imm8) {
assert(VM_Version::supports_sse4_1(), "");
- int encode = simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, VEX_SIMD_66, true, VEX_OPCODE_0F_3A,
- false, AVX_128bit, (VM_Version::supports_avx512dq() == false));
+ int encode = simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, VEX_SIMD_66, /* no_mask_reg */ true,
+ VEX_OPCODE_0F_3A, /* rex_w */ false, AVX_128bit, /* legacy_mode */ _legacy_mode_dq);
emit_int8(0x16);
emit_int8((unsigned char)(0xC0 | encode));
emit_int8(imm8);
@@ -2894,8 +2944,8 @@
void Assembler::pextrq(Register dst, XMMRegister src, int imm8) {
assert(VM_Version::supports_sse4_1(), "");
- int encode = simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, VEX_SIMD_66, true, VEX_OPCODE_0F_3A,
- false, AVX_128bit, (VM_Version::supports_avx512dq() == false));
+ int encode = simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, VEX_SIMD_66, /* no_mask_reg */ true,
+ VEX_OPCODE_0F_3A, /* rex_w */ true, AVX_128bit, /* legacy_mode */ _legacy_mode_dq);
emit_int8(0x16);
emit_int8((unsigned char)(0xC0 | encode));
emit_int8(imm8);
@@ -2903,8 +2953,8 @@
void Assembler::pinsrd(XMMRegister dst, Register src, int imm8) {
assert(VM_Version::supports_sse4_1(), "");
- int encode = simd_prefix_and_encode(dst, dst, as_XMMRegister(src->encoding()), VEX_SIMD_66, true, VEX_OPCODE_0F_3A,
- false, AVX_128bit, (VM_Version::supports_avx512dq() == false));
+ int encode = simd_prefix_and_encode(dst, dst, as_XMMRegister(src->encoding()), VEX_SIMD_66, /* no_mask_reg */ true,
+ VEX_OPCODE_0F_3A, /* rex_w */ false, AVX_128bit, /* legacy_mode */ _legacy_mode_dq);
emit_int8(0x22);
emit_int8((unsigned char)(0xC0 | encode));
emit_int8(imm8);
@@ -2912,8 +2962,8 @@
void Assembler::pinsrq(XMMRegister dst, Register src, int imm8) {
assert(VM_Version::supports_sse4_1(), "");
- int encode = simd_prefix_and_encode(dst, dst, as_XMMRegister(src->encoding()), VEX_SIMD_66, true, VEX_OPCODE_0F_3A,
- false, AVX_128bit, (VM_Version::supports_avx512dq() == false));
+ int encode = simd_prefix_and_encode(dst, dst, as_XMMRegister(src->encoding()), VEX_SIMD_66, /* no_mask_reg */ true,
+ VEX_OPCODE_0F_3A, /* rex_w */ true, AVX_128bit, /* legacy_mode */ _legacy_mode_dq);
emit_int8(0x22);
emit_int8((unsigned char)(0xC0 | encode));
emit_int8(imm8);
@@ -2922,17 +2972,17 @@
void Assembler::pmovzxbw(XMMRegister dst, Address src) {
assert(VM_Version::supports_sse4_1(), "");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_HVM;
- }
- InstructionMark im(this);
- simd_prefix(dst, src, VEX_SIMD_66, false, VEX_OPCODE_0F_38);
+ _tuple_type = EVEX_HVM;
+ }
+ InstructionMark im(this);
+ simd_prefix(dst, src, VEX_SIMD_66, /* no_mask_reg */ false, VEX_OPCODE_0F_38);
emit_int8(0x30);
emit_operand(dst, src);
}
void Assembler::pmovzxbw(XMMRegister dst, XMMRegister src) {
assert(VM_Version::supports_sse4_1(), "");
- int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, false, VEX_OPCODE_0F_38);
+ int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, /* no_mask_reg */ false, VEX_OPCODE_0F_38);
emit_int8(0x30);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -3035,8 +3085,8 @@
void Assembler::pshufb(XMMRegister dst, XMMRegister src) {
assert(VM_Version::supports_ssse3(), "");
- int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, false, VEX_OPCODE_0F_38,
- false, AVX_128bit, (VM_Version::supports_avx512bw() == false));
+ int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, /* no_mask_reg */ false,
+ VEX_OPCODE_0F_38, /* rex_w */ false, AVX_128bit, /* legacy_mode */ _legacy_mode_bw);
emit_int8(0x00);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -3044,33 +3094,34 @@
void Assembler::pshufb(XMMRegister dst, Address src) {
assert(VM_Version::supports_ssse3(), "");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FVM;
- }
- InstructionMark im(this);
- simd_prefix(dst, dst, src, VEX_SIMD_66, false, VEX_OPCODE_0F_38,
- false, AVX_128bit, (VM_Version::supports_avx512bw() == false));
+ _tuple_type = EVEX_FVM;
+ }
+ InstructionMark im(this);
+ simd_prefix(dst, dst, src, VEX_SIMD_66, /* no_mask_reg */ false,
+ VEX_OPCODE_0F_38, /* rex_w */ false, AVX_128bit, /* legacy_mode */ _legacy_mode_bw);
emit_int8(0x00);
emit_operand(dst, src);
}
void Assembler::pshufd(XMMRegister dst, XMMRegister src, int mode) {
+ _instruction_uses_vl = true;
assert(isByte(mode), "invalid value");
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
emit_simd_arith_nonds(0x70, dst, src, VEX_SIMD_66);
emit_int8(mode & 0xFF);
-
}
void Assembler::pshufd(XMMRegister dst, Address src, int mode) {
+ _instruction_uses_vl = true;
assert(isByte(mode), "invalid value");
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_32bit;
- }
- InstructionMark im(this);
- simd_prefix(dst, src, VEX_SIMD_66, false);
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_32bit;
+ }
+ InstructionMark im(this);
+ simd_prefix(dst, src, VEX_SIMD_66, /* no_mask_reg */ false);
emit_int8(0x70);
emit_operand(dst, src);
emit_int8(mode & 0xFF);
@@ -3079,8 +3130,7 @@
void Assembler::pshuflw(XMMRegister dst, XMMRegister src, int mode) {
assert(isByte(mode), "invalid value");
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- emit_simd_arith_nonds(0x70, dst, src, VEX_SIMD_F2, false,
- (VM_Version::supports_avx512bw() == false));
+ emit_simd_arith_nonds(0x70, dst, src, VEX_SIMD_F2, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
emit_int8(mode & 0xFF);
}
@@ -3089,29 +3139,33 @@
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FVM;
- }
- InstructionMark im(this);
- simd_prefix(dst, xnoreg, src, VEX_SIMD_F2, false, VEX_OPCODE_0F,
- false, AVX_128bit, (VM_Version::supports_avx512bw() == false));
+ _tuple_type = EVEX_FVM;
+ }
+ InstructionMark im(this);
+ simd_prefix(dst, xnoreg, src, VEX_SIMD_F2, /* no_mask_reg */ false,
+ VEX_OPCODE_0F, /* rex_w */ false, AVX_128bit, /* legacy_mode */ _legacy_mode_bw);
emit_int8(0x70);
emit_operand(dst, src);
emit_int8(mode & 0xFF);
}
void Assembler::psrldq(XMMRegister dst, int shift) {
- // Shift 128 bit value in xmm register by number of bytes.
+ // Shift left 128 bit value in dst XMMRegister by shift number of bytes.
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- int encode = simd_prefix_and_encode(xmm3, dst, dst, VEX_SIMD_66, true, VEX_OPCODE_0F, false, AVX_128bit, (VM_Version::supports_avx512bw() == false));
+ // XMM3 is for /3 encoding: 66 0F 73 /3 ib
+ int encode = simd_prefix_and_encode(xmm3, dst, dst, VEX_SIMD_66, /* no_mask_reg */ true,
+ VEX_OPCODE_0F, /* rex_w */ false, AVX_128bit, /* legacy_mode */ _legacy_mode_bw);
emit_int8(0x73);
emit_int8((unsigned char)(0xC0 | encode));
emit_int8(shift);
}
void Assembler::pslldq(XMMRegister dst, int shift) {
- // Shift left 128 bit value in xmm register by number of bytes.
+ // Shift left 128 bit value in dst XMMRegister by shift number of bytes.
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- int encode = simd_prefix_and_encode(xmm7, dst, dst, VEX_SIMD_66, true, VEX_OPCODE_0F, false, AVX_128bit, (VM_Version::supports_avx512bw() == false));
+ // XMM7 is for /7 encoding: 66 0F 73 /7 ib
+ int encode = simd_prefix_and_encode(xmm7, dst, dst, VEX_SIMD_66, /* no_mask_reg */ true,
+ VEX_OPCODE_0F, /* rex_w */ false, AVX_128bit, /* legacy_mode */ _legacy_mode_bw);
emit_int8(0x73);
emit_int8((unsigned char)(0xC0 | encode));
emit_int8(shift);
@@ -3121,16 +3175,16 @@
assert(VM_Version::supports_sse4_1(), "");
assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");
InstructionMark im(this);
- simd_prefix(dst, xnoreg, src, VEX_SIMD_66, false,
- VEX_OPCODE_0F_38, false, AVX_128bit, true);
+ simd_prefix(dst, xnoreg, src, VEX_SIMD_66, /* no_mask_reg */ false,
+ VEX_OPCODE_0F_38, /* rex_w */ false, AVX_128bit, /* legacy_mode */ true);
emit_int8(0x17);
emit_operand(dst, src);
}
void Assembler::ptest(XMMRegister dst, XMMRegister src) {
assert(VM_Version::supports_sse4_1(), "");
- int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, false,
- VEX_OPCODE_0F_38, false, AVX_128bit, true);
+ int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, /* no_mask_reg */ false,
+ VEX_OPCODE_0F_38, /* rex_w */ false, AVX_128bit, /* legacy_mode */ true);
emit_int8(0x17);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -3142,7 +3196,8 @@
assert(dst != xnoreg, "sanity");
int dst_enc = dst->encoding();
// swap src<->dst for encoding
- vex_prefix(src, 0, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_38, false, vector_len, true, false);
+ vex_prefix(src, 0, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_38, /* rex_w */ false,
+ vector_len, /* legacy_mode */ true, /* no_mask_reg */ false);
emit_int8(0x17);
emit_operand(dst, src);
}
@@ -3150,8 +3205,7 @@
void Assembler::vptest(XMMRegister dst, XMMRegister src) {
assert(VM_Version::supports_avx(), "");
int vector_len = AVX_256bit;
- int encode = vex_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66,
- vector_len, VEX_OPCODE_0F_38, true, false);
+ int encode = vex_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, vector_len, VEX_OPCODE_0F_38, /* legacy_mode */ true);
emit_int8(0x17);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -3160,34 +3214,41 @@
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FVM;
- }
- emit_simd_arith(0x60, dst, src, VEX_SIMD_66, false, (VM_Version::supports_avx512vlbw() == false));
+ _tuple_type = EVEX_FVM;
+ }
+ emit_simd_arith(0x60, dst, src, VEX_SIMD_66, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_vlbw);
}
void Assembler::punpcklbw(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- emit_simd_arith(0x60, dst, src, VEX_SIMD_66, false, (VM_Version::supports_avx512vlbw() == false));
+ emit_simd_arith(0x60, dst, src, VEX_SIMD_66, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_vlbw);
}
void Assembler::punpckldq(XMMRegister dst, Address src) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_32bit;
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_32bit;
}
emit_simd_arith(0x62, dst, src, VEX_SIMD_66);
}
void Assembler::punpckldq(XMMRegister dst, XMMRegister src) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
emit_simd_arith(0x62, dst, src, VEX_SIMD_66);
}
void Assembler::punpcklqdq(XMMRegister dst, XMMRegister src) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- emit_simd_arith(0x6C, dst, src, VEX_SIMD_66);
+ if (VM_Version::supports_evex()) {
+ emit_simd_arith_q(0x6C, dst, src, VEX_SIMD_66);
+ } else {
+ emit_simd_arith(0x6C, dst, src, VEX_SIMD_66);
+ }
}
void Assembler::push(int32_t imm32) {
@@ -3396,8 +3457,8 @@
void Assembler::sqrtsd(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_64bit;
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_64bit;
emit_simd_arith_q(0x51, dst, src, VEX_SIMD_F2);
} else {
emit_simd_arith(0x51, dst, src, VEX_SIMD_F2);
@@ -3416,8 +3477,8 @@
void Assembler::sqrtss(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_32bit;
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_32bit;
}
emit_simd_arith(0x51, dst, src, VEX_SIMD_F3);
}
@@ -3479,10 +3540,14 @@
void Assembler::subsd(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_64bit;
- }
- emit_simd_arith_q(0x5C, dst, src, VEX_SIMD_F2);
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_64bit;
+ }
+ if (VM_Version::supports_evex()) {
+ emit_simd_arith_q(0x5C, dst, src, VEX_SIMD_F2);
+ } else {
+ emit_simd_arith(0x5C, dst, src, VEX_SIMD_F2);
+ }
}
void Assembler::subss(XMMRegister dst, XMMRegister src) {
@@ -3493,8 +3558,8 @@
void Assembler::subss(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_32bit;
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_32bit;
}
emit_simd_arith(0x5C, dst, src, VEX_SIMD_F3);
}
@@ -3553,9 +3618,9 @@
void Assembler::ucomisd(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_64bit;
- emit_simd_arith_nonds_q(0x2E, dst, src, VEX_SIMD_66, true);
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_64bit;
+ emit_simd_arith_nonds_q(0x2E, dst, src, VEX_SIMD_66, /* no_mask_reg */ true);
} else {
emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_66);
}
@@ -3564,7 +3629,7 @@
void Assembler::ucomisd(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
- emit_simd_arith_nonds_q(0x2E, dst, src, VEX_SIMD_66, true);
+ emit_simd_arith_nonds_q(0x2E, dst, src, VEX_SIMD_66, /* no_mask_reg */ true);
} else {
emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_66);
}
@@ -3573,15 +3638,15 @@
void Assembler::ucomiss(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_32bit;
- }
- emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_NONE, true);
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_32bit;
+ }
+ emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_NONE, /* no_mask_reg */ true);
}
void Assembler::ucomiss(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse(), ""));
- emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_NONE, true);
+ emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_NONE, /* no_mask_reg */ true);
}
void Assembler::xabort(int8_t imm8) {
@@ -3664,8 +3729,8 @@
void Assembler::vaddsd(XMMRegister dst, XMMRegister nds, Address src) {
assert(VM_Version::supports_avx(), "");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_64bit;
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_64bit;
emit_vex_arith_q(0x58, dst, nds, src, VEX_SIMD_F2, AVX_128bit);
} else {
emit_vex_arith(0x58, dst, nds, src, VEX_SIMD_F2, AVX_128bit);
@@ -3684,8 +3749,8 @@
void Assembler::vaddss(XMMRegister dst, XMMRegister nds, Address src) {
assert(VM_Version::supports_avx(), "");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_32bit;
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_32bit;
}
emit_vex_arith(0x58, dst, nds, src, VEX_SIMD_F3, AVX_128bit);
}
@@ -3698,8 +3763,8 @@
void Assembler::vdivsd(XMMRegister dst, XMMRegister nds, Address src) {
assert(VM_Version::supports_avx(), "");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_64bit;
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_64bit;
emit_vex_arith_q(0x5E, dst, nds, src, VEX_SIMD_F2, AVX_128bit);
} else {
emit_vex_arith(0x5E, dst, nds, src, VEX_SIMD_F2, AVX_128bit);
@@ -3718,8 +3783,8 @@
void Assembler::vdivss(XMMRegister dst, XMMRegister nds, Address src) {
assert(VM_Version::supports_avx(), "");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_32bit;
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_32bit;
}
emit_vex_arith(0x5E, dst, nds, src, VEX_SIMD_F3, AVX_128bit);
}
@@ -3732,8 +3797,8 @@
void Assembler::vmulsd(XMMRegister dst, XMMRegister nds, Address src) {
assert(VM_Version::supports_avx(), "");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_64bit;
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_64bit;
emit_vex_arith_q(0x59, dst, nds, src, VEX_SIMD_F2, AVX_128bit);
} else {
emit_vex_arith(0x59, dst, nds, src, VEX_SIMD_F2, AVX_128bit);
@@ -3752,8 +3817,8 @@
void Assembler::vmulss(XMMRegister dst, XMMRegister nds, Address src) {
assert(VM_Version::supports_avx(), "");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_32bit;
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_32bit;
}
emit_vex_arith(0x59, dst, nds, src, VEX_SIMD_F3, AVX_128bit);
}
@@ -3766,8 +3831,8 @@
void Assembler::vsubsd(XMMRegister dst, XMMRegister nds, Address src) {
assert(VM_Version::supports_avx(), "");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_64bit;
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_64bit;
emit_vex_arith_q(0x5C, dst, nds, src, VEX_SIMD_F2, AVX_128bit);
} else {
emit_vex_arith(0x5C, dst, nds, src, VEX_SIMD_F2, AVX_128bit);
@@ -3786,8 +3851,8 @@
void Assembler::vsubss(XMMRegister dst, XMMRegister nds, Address src) {
assert(VM_Version::supports_avx(), "");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_32bit;
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_32bit;
}
emit_vex_arith(0x5C, dst, nds, src, VEX_SIMD_F3, AVX_128bit);
}
@@ -3802,6 +3867,7 @@
// Float-point vector arithmetic
void Assembler::addpd(XMMRegister dst, XMMRegister src) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
emit_simd_arith_q(0x58, dst, src, VEX_SIMD_66);
@@ -3811,11 +3877,13 @@
}
void Assembler::addps(XMMRegister dst, XMMRegister src) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
emit_simd_arith(0x58, dst, src, VEX_SIMD_NONE);
}
void Assembler::vaddpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
+ _instruction_uses_vl = true;
assert(VM_Version::supports_avx(), "");
if (VM_Version::supports_evex()) {
emit_vex_arith_q(0x58, dst, nds, src, VEX_SIMD_66, vector_len);
@@ -3825,15 +3893,17 @@
}
void Assembler::vaddps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
+ _instruction_uses_vl = true;
assert(VM_Version::supports_avx(), "");
emit_vex_arith(0x58, dst, nds, src, VEX_SIMD_NONE, vector_len);
}
void Assembler::vaddpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
+ _instruction_uses_vl = true;
assert(VM_Version::supports_avx(), "");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_64bit;
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_64bit;
emit_vex_arith_q(0x58, dst, nds, src, VEX_SIMD_66, vector_len);
} else {
emit_vex_arith(0x58, dst, nds, src, VEX_SIMD_66, vector_len);
@@ -3841,15 +3911,17 @@
}
void Assembler::vaddps(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
+ _instruction_uses_vl = true;
assert(VM_Version::supports_avx(), "");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_32bit;
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_32bit;
}
emit_vex_arith(0x58, dst, nds, src, VEX_SIMD_NONE, vector_len);
}
void Assembler::subpd(XMMRegister dst, XMMRegister src) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
emit_simd_arith_q(0x5C, dst, src, VEX_SIMD_66);
@@ -3859,11 +3931,13 @@
}
void Assembler::subps(XMMRegister dst, XMMRegister src) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
emit_simd_arith(0x5C, dst, src, VEX_SIMD_NONE);
}
void Assembler::vsubpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
+ _instruction_uses_vl = true;
assert(VM_Version::supports_avx(), "");
if (VM_Version::supports_evex()) {
emit_vex_arith_q(0x5C, dst, nds, src, VEX_SIMD_66, vector_len);
@@ -3873,15 +3947,17 @@
}
void Assembler::vsubps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
+ _instruction_uses_vl = true;
assert(VM_Version::supports_avx(), "");
emit_vex_arith(0x5C, dst, nds, src, VEX_SIMD_NONE, vector_len);
}
void Assembler::vsubpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
+ _instruction_uses_vl = true;
assert(VM_Version::supports_avx(), "");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_64bit;
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_64bit;
emit_vex_arith_q(0x5C, dst, nds, src, VEX_SIMD_66, vector_len);
} else {
emit_vex_arith(0x5C, dst, nds, src, VEX_SIMD_66, vector_len);
@@ -3889,15 +3965,17 @@
}
void Assembler::vsubps(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
+ _instruction_uses_vl = true;
assert(VM_Version::supports_avx(), "");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_32bit;
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_32bit;
}
emit_vex_arith(0x5C, dst, nds, src, VEX_SIMD_NONE, vector_len);
}
void Assembler::mulpd(XMMRegister dst, XMMRegister src) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
emit_simd_arith_q(0x59, dst, src, VEX_SIMD_66);
@@ -3907,11 +3985,13 @@
}
void Assembler::mulps(XMMRegister dst, XMMRegister src) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
emit_simd_arith(0x59, dst, src, VEX_SIMD_NONE);
}
void Assembler::vmulpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
+ _instruction_uses_vl = true;
assert(VM_Version::supports_avx(), "");
if (VM_Version::supports_evex()) {
emit_vex_arith_q(0x59, dst, nds, src, VEX_SIMD_66, vector_len);
@@ -3921,15 +4001,17 @@
}
void Assembler::vmulps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
+ _instruction_uses_vl = true;
assert(VM_Version::supports_avx(), "");
emit_vex_arith(0x59, dst, nds, src, VEX_SIMD_NONE, vector_len);
}
void Assembler::vmulpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
+ _instruction_uses_vl = true;
assert(VM_Version::supports_avx(), "");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_64bit;
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_64bit;
emit_vex_arith_q(0x59, dst, nds, src, VEX_SIMD_66, vector_len);
} else {
emit_vex_arith(0x59, dst, nds, src, VEX_SIMD_66, vector_len);
@@ -3937,15 +4019,17 @@
}
void Assembler::vmulps(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
+ _instruction_uses_vl = true;
assert(VM_Version::supports_avx(), "");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_32bit;
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_32bit;
}
emit_vex_arith(0x59, dst, nds, src, VEX_SIMD_NONE, vector_len);
}
void Assembler::divpd(XMMRegister dst, XMMRegister src) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
emit_simd_arith_q(0x5E, dst, src, VEX_SIMD_66);
@@ -3955,11 +4039,13 @@
}
void Assembler::divps(XMMRegister dst, XMMRegister src) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
emit_simd_arith(0x5E, dst, src, VEX_SIMD_NONE);
}
void Assembler::vdivpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
+ _instruction_uses_vl = true;
assert(VM_Version::supports_avx(), "");
if (VM_Version::supports_evex()) {
emit_vex_arith_q(0x5E, dst, nds, src, VEX_SIMD_66, vector_len);
@@ -3969,15 +4055,17 @@
}
void Assembler::vdivps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
+ _instruction_uses_vl = true;
assert(VM_Version::supports_avx(), "");
emit_vex_arith(0x5E, dst, nds, src, VEX_SIMD_NONE, vector_len);
}
void Assembler::vdivpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
+ _instruction_uses_vl = true;
assert(VM_Version::supports_avx(), "");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_64bit;
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_64bit;
emit_vex_arith_q(0x5E, dst, nds, src, VEX_SIMD_66, vector_len);
} else {
emit_vex_arith(0x5E, dst, nds, src, VEX_SIMD_66, vector_len);
@@ -3985,164 +4073,178 @@
}
void Assembler::vdivps(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
+ _instruction_uses_vl = true;
+ assert(VM_Version::supports_avx(), "");
+ if (VM_Version::supports_evex()) {
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_32bit;
+ }
+ emit_vex_arith(0x5E, dst, nds, src, VEX_SIMD_NONE, vector_len);
+}
+
+void Assembler::vsqrtpd(XMMRegister dst, XMMRegister src, int vector_len) {
+ _instruction_uses_vl = true;
assert(VM_Version::supports_avx(), "");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_32bit;
- }
- emit_vex_arith(0x5E, dst, nds, src, VEX_SIMD_NONE, vector_len);
+ emit_vex_arith_q(0x51, dst, xnoreg, src, VEX_SIMD_66, vector_len);
+ } else {
+ emit_vex_arith(0x51, dst, xnoreg, src, VEX_SIMD_66, vector_len);
+ }
+}
+
+void Assembler::vsqrtpd(XMMRegister dst, Address src, int vector_len) {
+ _instruction_uses_vl = true;
+ assert(VM_Version::supports_avx(), "");
+ if (VM_Version::supports_evex()) {
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_64bit;
+ emit_vex_arith_q(0x51, dst, xnoreg, src, VEX_SIMD_66, vector_len);
+ } else {
+ emit_vex_arith(0x51, dst, xnoreg, src, VEX_SIMD_66, vector_len);
+ }
}
void Assembler::andpd(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- if (VM_Version::supports_evex() && VM_Version::supports_avx512dq()) {
+ if (VM_Version::supports_avx512dq()) {
emit_simd_arith_q(0x54, dst, src, VEX_SIMD_66);
} else {
- emit_simd_arith(0x54, dst, src, VEX_SIMD_66, false, true);
+ emit_simd_arith(0x54, dst, src, VEX_SIMD_66, /* no_mask_reg */ false, /* legacy_mode */ true);
}
}
void Assembler::andps(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse(), ""));
- emit_simd_arith(0x54, dst, src, VEX_SIMD_NONE, false,
- (VM_Version::supports_avx512dq() == false));
+ emit_simd_arith(0x54, dst, src, VEX_SIMD_NONE, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_dq);
}
void Assembler::andps(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_32bit;
- }
- emit_simd_arith(0x54, dst, src, VEX_SIMD_NONE,
- false, (VM_Version::supports_avx512dq() == false));
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_32bit;
+ }
+ emit_simd_arith(0x54, dst, src, VEX_SIMD_NONE, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_dq);
}
void Assembler::andpd(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- if (VM_Version::supports_evex() && VM_Version::supports_avx512dq()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_64bit;
+ if (VM_Version::supports_avx512dq()) {
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_64bit;
emit_simd_arith_q(0x54, dst, src, VEX_SIMD_66);
} else {
- emit_simd_arith(0x54, dst, src, VEX_SIMD_66, false, true);
+ emit_simd_arith(0x54, dst, src, VEX_SIMD_66, /* no_mask_reg */ false, /* legacy_mode */ true);
}
}
void Assembler::vandpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
assert(VM_Version::supports_avx(), "");
- if (VM_Version::supports_evex() && VM_Version::supports_avx512dq()) {
+ if (VM_Version::supports_avx512dq()) {
emit_vex_arith_q(0x54, dst, nds, src, VEX_SIMD_66, vector_len);
} else {
- emit_vex_arith(0x54, dst, nds, src, VEX_SIMD_66, vector_len, true);
+ emit_vex_arith(0x54, dst, nds, src, VEX_SIMD_66, vector_len, /* no_mask_reg */ false, /* legacy_mode */ true);
}
}
void Assembler::vandps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
assert(VM_Version::supports_avx(), "");
- bool legacy_mode = (VM_Version::supports_avx512dq() == false);
- emit_vex_arith(0x54, dst, nds, src, VEX_SIMD_NONE, vector_len, legacy_mode);
+ emit_vex_arith(0x54, dst, nds, src, VEX_SIMD_NONE, vector_len, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_dq);
}
void Assembler::vandpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
assert(VM_Version::supports_avx(), "");
- if (VM_Version::supports_evex() && VM_Version::supports_avx512dq()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_64bit;
+ if (VM_Version::supports_avx512dq()) {
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_64bit;
emit_vex_arith_q(0x54, dst, nds, src, VEX_SIMD_66, vector_len);
} else {
- emit_vex_arith(0x54, dst, nds, src, VEX_SIMD_66, vector_len, true);
+ emit_vex_arith(0x54, dst, nds, src, VEX_SIMD_66, vector_len, /* no_mask_reg */ false, /* legacy_mode */ true);
}
}
void Assembler::vandps(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
assert(VM_Version::supports_avx(), "");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_32bit;
- }
- emit_vex_arith(0x54, dst, nds, src, VEX_SIMD_NONE, vector_len,
- (VM_Version::supports_avx512dq() == false));
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_32bit;
+ }
+ emit_vex_arith(0x54, dst, nds, src, VEX_SIMD_NONE, vector_len, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_dq);
}
void Assembler::xorpd(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- if (VM_Version::supports_evex() && VM_Version::supports_avx512dq()) {
+ if (VM_Version::supports_avx512dq()) {
emit_simd_arith_q(0x57, dst, src, VEX_SIMD_66);
} else {
- emit_simd_arith(0x57, dst, src, VEX_SIMD_66, false, true);
+ emit_simd_arith(0x57, dst, src, VEX_SIMD_66, /* no_mask_reg */ false, /* legacy_mode */ true);
}
}
void Assembler::xorps(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse(), ""));
- emit_simd_arith(0x57, dst, src, VEX_SIMD_NONE,
- false, (VM_Version::supports_avx512dq() == false));
+ emit_simd_arith(0x57, dst, src, VEX_SIMD_NONE, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_dq);
}
void Assembler::xorpd(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- if (VM_Version::supports_evex() && VM_Version::supports_avx512dq()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_64bit;
+ if (VM_Version::supports_avx512dq()) {
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_64bit;
emit_simd_arith_q(0x57, dst, src, VEX_SIMD_66);
} else {
- emit_simd_arith(0x57, dst, src, VEX_SIMD_66, false, true);
+ emit_simd_arith(0x57, dst, src, VEX_SIMD_66, /* no_mask_reg */ false, /* legacy_mode */ true);
}
}
void Assembler::xorps(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_32bit;
- }
- emit_simd_arith(0x57, dst, src, VEX_SIMD_NONE, false,
- (VM_Version::supports_avx512dq() == false));
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_32bit;
+ }
+ emit_simd_arith(0x57, dst, src, VEX_SIMD_NONE, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_dq);
}
void Assembler::vxorpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
assert(VM_Version::supports_avx(), "");
- if (VM_Version::supports_evex() && VM_Version::supports_avx512dq()) {
+ if (VM_Version::supports_avx512dq()) {
emit_vex_arith_q(0x57, dst, nds, src, VEX_SIMD_66, vector_len);
} else {
- emit_vex_arith(0x57, dst, nds, src, VEX_SIMD_66, vector_len, true);
+ emit_vex_arith(0x57, dst, nds, src, VEX_SIMD_66, vector_len, /* no_mask_reg */ false, /* legacy_mode */ true);
}
}
void Assembler::vxorps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
assert(VM_Version::supports_avx(), "");
- emit_vex_arith(0x57, dst, nds, src, VEX_SIMD_NONE, vector_len,
- (VM_Version::supports_avx512dq() == false));
+ emit_vex_arith(0x57, dst, nds, src, VEX_SIMD_NONE, vector_len, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_dq);
}
void Assembler::vxorpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
assert(VM_Version::supports_avx(), "");
- if (VM_Version::supports_evex() && VM_Version::supports_avx512dq()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_64bit;
+ if (VM_Version::supports_avx512dq()) {
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_64bit;
emit_vex_arith_q(0x57, dst, nds, src, VEX_SIMD_66, vector_len);
} else {
- emit_vex_arith(0x57, dst, nds, src, VEX_SIMD_66, vector_len, true);
+ emit_vex_arith(0x57, dst, nds, src, VEX_SIMD_66, vector_len, /* no_mask_reg */ false, /* legacy_mode */ true);
}
}
void Assembler::vxorps(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
assert(VM_Version::supports_avx(), "");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_32bit;
- }
- emit_vex_arith(0x57, dst, nds, src, VEX_SIMD_NONE, vector_len,
- (VM_Version::supports_avx512dq() == false));
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_32bit;
+ }
+ emit_vex_arith(0x57, dst, nds, src, VEX_SIMD_NONE, vector_len, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_dq);
}
// Integer vector arithmetic
void Assembler::vphaddw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
assert(VM_Version::supports_avx() && (vector_len == 0) ||
VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");
- int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector_len,
- VEX_OPCODE_0F_38, true, false);
+ int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector_len, VEX_OPCODE_0F_38, /* legacy_mode */ true);
emit_int8(0x01);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -4150,28 +4252,29 @@
void Assembler::vphaddd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
assert(VM_Version::supports_avx() && (vector_len == 0) ||
VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");
- int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector_len,
- VEX_OPCODE_0F_38, true, false);
+ int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector_len, VEX_OPCODE_0F_38, /* legacy_mode */ true);
emit_int8(0x02);
emit_int8((unsigned char)(0xC0 | encode));
}
void Assembler::paddb(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- emit_simd_arith(0xFC, dst, src, VEX_SIMD_66);
+ emit_simd_arith(0xFC, dst, src, VEX_SIMD_66, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
}
void Assembler::paddw(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- emit_simd_arith(0xFD, dst, src, VEX_SIMD_66);
+ emit_simd_arith(0xFD, dst, src, VEX_SIMD_66, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
}
void Assembler::paddd(XMMRegister dst, XMMRegister src) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
emit_simd_arith(0xFE, dst, src, VEX_SIMD_66);
}
void Assembler::paddq(XMMRegister dst, XMMRegister src) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
emit_simd_arith_q(0xD4, dst, src, VEX_SIMD_66);
@@ -4182,38 +4285,38 @@
void Assembler::phaddw(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse3(), ""));
- int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, false,
- VEX_OPCODE_0F_38, false, AVX_128bit, true);
+ int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, /* no_mask_reg */ false,
+ VEX_OPCODE_0F_38, /* rex_w */ false, AVX_128bit, /* legacy_mode */ true);
emit_int8(0x01);
emit_int8((unsigned char)(0xC0 | encode));
}
void Assembler::phaddd(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse3(), ""));
- int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, false,
- VEX_OPCODE_0F_38, false, AVX_128bit, true);
+ int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, /* no_mask_reg */ false,
+ VEX_OPCODE_0F_38, /* rex_w */ false, AVX_128bit, /* legacy_mode */ true);
emit_int8(0x02);
emit_int8((unsigned char)(0xC0 | encode));
}
void Assembler::vpaddb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
assert(UseAVX > 0, "requires some form of AVX");
- emit_vex_arith(0xFC, dst, nds, src, VEX_SIMD_66, vector_len,
- (VM_Version::supports_avx512bw() == false));
+ emit_vex_arith(0xFC, dst, nds, src, VEX_SIMD_66, vector_len, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
}
void Assembler::vpaddw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
assert(UseAVX > 0, "requires some form of AVX");
- emit_vex_arith(0xFD, dst, nds, src, VEX_SIMD_66, vector_len,
- (VM_Version::supports_avx512bw() == false));
+ emit_vex_arith(0xFD, dst, nds, src, VEX_SIMD_66, vector_len, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
}
void Assembler::vpaddd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
emit_vex_arith(0xFE, dst, nds, src, VEX_SIMD_66, vector_len);
}
void Assembler::vpaddq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
if (VM_Version::supports_evex()) {
emit_vex_arith_q(0xD4, dst, nds, src, VEX_SIMD_66, vector_len);
@@ -4225,33 +4328,35 @@
void Assembler::vpaddb(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
assert(UseAVX > 0, "requires some form of AVX");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FVM;
- }
- emit_vex_arith(0xFC, dst, nds, src, VEX_SIMD_66, vector_len);
+ _tuple_type = EVEX_FVM;
+ }
+ emit_vex_arith(0xFC, dst, nds, src, VEX_SIMD_66, vector_len, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
}
void Assembler::vpaddw(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
assert(UseAVX > 0, "requires some form of AVX");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FVM;
- }
- emit_vex_arith(0xFD, dst, nds, src, VEX_SIMD_66, vector_len);
+ _tuple_type = EVEX_FVM;
+ }
+ emit_vex_arith(0xFD, dst, nds, src, VEX_SIMD_66, vector_len, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
}
void Assembler::vpaddd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_32bit;
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_32bit;
}
emit_vex_arith(0xFE, dst, nds, src, VEX_SIMD_66, vector_len);
}
void Assembler::vpaddq(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_64bit;
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_64bit;
emit_vex_arith_q(0xD4, dst, nds, src, VEX_SIMD_66, vector_len);
} else {
emit_vex_arith(0xD4, dst, nds, src, VEX_SIMD_66, vector_len);
@@ -4260,20 +4365,22 @@
void Assembler::psubb(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- emit_simd_arith(0xF8, dst, src, VEX_SIMD_66);
+ emit_simd_arith(0xF8, dst, src, VEX_SIMD_66, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
}
void Assembler::psubw(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- emit_simd_arith(0xF9, dst, src, VEX_SIMD_66);
+ emit_simd_arith(0xF9, dst, src, VEX_SIMD_66, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
}
void Assembler::psubd(XMMRegister dst, XMMRegister src) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
emit_simd_arith(0xFA, dst, src, VEX_SIMD_66);
}
void Assembler::psubq(XMMRegister dst, XMMRegister src) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
emit_simd_arith_q(0xFB, dst, src, VEX_SIMD_66);
@@ -4284,22 +4391,22 @@
void Assembler::vpsubb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
assert(UseAVX > 0, "requires some form of AVX");
- emit_vex_arith(0xF8, dst, nds, src, VEX_SIMD_66, vector_len,
- (VM_Version::supports_avx512bw() == false));
+ emit_vex_arith(0xF8, dst, nds, src, VEX_SIMD_66, vector_len, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
}
void Assembler::vpsubw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
assert(UseAVX > 0, "requires some form of AVX");
- emit_vex_arith(0xF9, dst, nds, src, VEX_SIMD_66, vector_len,
- (VM_Version::supports_avx512bw() == false));
+ emit_vex_arith(0xF9, dst, nds, src, VEX_SIMD_66, vector_len, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
}
void Assembler::vpsubd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
emit_vex_arith(0xFA, dst, nds, src, VEX_SIMD_66, vector_len);
}
void Assembler::vpsubq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
if (VM_Version::supports_evex()) {
emit_vex_arith_q(0xFB, dst, nds, src, VEX_SIMD_66, vector_len);
@@ -4311,35 +4418,35 @@
void Assembler::vpsubb(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
assert(UseAVX > 0, "requires some form of AVX");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FVM;
- }
- emit_vex_arith(0xF8, dst, nds, src, VEX_SIMD_66, vector_len,
- (VM_Version::supports_avx512bw() == false));
+ _tuple_type = EVEX_FVM;
+ }
+ emit_vex_arith(0xF8, dst, nds, src, VEX_SIMD_66, vector_len, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
}
void Assembler::vpsubw(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
assert(UseAVX > 0, "requires some form of AVX");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FVM;
- }
- emit_vex_arith(0xF9, dst, nds, src, VEX_SIMD_66, vector_len,
- (VM_Version::supports_avx512bw() == false));
+ _tuple_type = EVEX_FVM;
+ }
+ emit_vex_arith(0xF9, dst, nds, src, VEX_SIMD_66, vector_len, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
}
void Assembler::vpsubd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_32bit;
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_32bit;
}
emit_vex_arith(0xFA, dst, nds, src, VEX_SIMD_66, vector_len);
}
void Assembler::vpsubq(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_64bit;
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_64bit;
emit_vex_arith_q(0xFB, dst, nds, src, VEX_SIMD_66, vector_len);
} else {
emit_vex_arith(0xFB, dst, nds, src, VEX_SIMD_66, vector_len);
@@ -4348,28 +4455,27 @@
void Assembler::pmullw(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- emit_simd_arith(0xD5, dst, src, VEX_SIMD_66,
- (VM_Version::supports_avx512bw() == false));
+ emit_simd_arith(0xD5, dst, src, VEX_SIMD_66, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
}
void Assembler::pmulld(XMMRegister dst, XMMRegister src) {
+ _instruction_uses_vl = true;
assert(VM_Version::supports_sse4_1(), "");
int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66,
- false, VEX_OPCODE_0F_38);
+ /* no_mask_reg */ false, VEX_OPCODE_0F_38);
emit_int8(0x40);
emit_int8((unsigned char)(0xC0 | encode));
}
void Assembler::vpmullw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
assert(UseAVX > 0, "requires some form of AVX");
- emit_vex_arith(0xD5, dst, nds, src, VEX_SIMD_66, vector_len,
- (VM_Version::supports_avx512bw() == false));
+ emit_vex_arith(0xD5, dst, nds, src, VEX_SIMD_66, vector_len, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
}
void Assembler::vpmulld(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
- int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66,
- vector_len, VEX_OPCODE_0F_38);
+ int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector_len, VEX_OPCODE_0F_38);
emit_int8(0x40);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -4379,8 +4485,8 @@
int src_enc = src->encoding();
int dst_enc = dst->encoding();
int nds_enc = nds->is_valid() ? nds->encoding() : 0;
- int encode = vex_prefix_and_encode(dst_enc, nds_enc, src_enc, VEX_SIMD_66,
- VEX_OPCODE_0F_38, true, vector_len, false, false);
+ int encode = vex_prefix_and_encode(dst_enc, nds_enc, src_enc, VEX_SIMD_66, VEX_OPCODE_0F_38,
+ /* vex_w */ true, vector_len, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ false);
emit_int8(0x40);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -4388,22 +4494,23 @@
void Assembler::vpmullw(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
assert(UseAVX > 0, "requires some form of AVX");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FVM;
- }
- emit_vex_arith(0xD5, dst, nds, src, VEX_SIMD_66, vector_len);
+ _tuple_type = EVEX_FVM;
+ }
+ emit_vex_arith(0xD5, dst, nds, src, VEX_SIMD_66, vector_len, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
}
void Assembler::vpmulld(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_32bit;
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_32bit;
}
InstructionMark im(this);
int dst_enc = dst->encoding();
int nds_enc = nds->is_valid() ? nds->encoding() : 0;
vex_prefix(src, nds_enc, dst_enc, VEX_SIMD_66,
- VEX_OPCODE_0F_38, false, vector_len);
+ VEX_OPCODE_0F_38, /* vex_w */ false, vector_len);
emit_int8(0x40);
emit_operand(dst, src);
}
@@ -4411,13 +4518,14 @@
void Assembler::vpmullq(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
assert(UseAVX > 0, "requires some form of AVX");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_64bit;
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_64bit;
}
InstructionMark im(this);
int dst_enc = dst->encoding();
int nds_enc = nds->is_valid() ? nds->encoding() : 0;
- vex_prefix(src, nds_enc, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_38, true, vector_len);
+ vex_prefix(src, nds_enc, dst_enc, VEX_SIMD_66,
+ VEX_OPCODE_0F_38, /* vex_w */ true, vector_len, /* legacy_mode */ _legacy_mode_dq);
emit_int8(0x40);
emit_operand(dst, src);
}
@@ -4426,26 +4534,28 @@
void Assembler::psllw(XMMRegister dst, int shift) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
// XMM6 is for /6 encoding: 66 0F 71 /6 ib
- int encode = simd_prefix_and_encode(xmm6, dst, dst, VEX_SIMD_66, false, VEX_OPCODE_0F,
- false, AVX_128bit, (VM_Version::supports_avx512bw() == false));
+ int encode = simd_prefix_and_encode(xmm6, dst, dst, VEX_SIMD_66, /* no_mask_reg */ false, VEX_OPCODE_0F,
+ /* rex_w */ false, AVX_128bit, /* legacy_mode */ _legacy_mode_bw);
emit_int8(0x71);
emit_int8((unsigned char)(0xC0 | encode));
emit_int8(shift & 0xFF);
}
void Assembler::pslld(XMMRegister dst, int shift) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
// XMM6 is for /6 encoding: 66 0F 72 /6 ib
- int encode = simd_prefix_and_encode(xmm6, dst, dst, VEX_SIMD_66, false);
+ int encode = simd_prefix_and_encode(xmm6, dst, dst, VEX_SIMD_66, /* no_mask_reg */ false);
emit_int8(0x72);
emit_int8((unsigned char)(0xC0 | encode));
emit_int8(shift & 0xFF);
}
void Assembler::psllq(XMMRegister dst, int shift) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
// XMM6 is for /6 encoding: 66 0F 73 /6 ib
- int encode = simd_prefix_and_encode(xmm6, dst, dst, VEX_SIMD_66, false, VEX_OPCODE_0F, true);
+ int encode = simd_prefix_and_encode(xmm6, dst, dst, VEX_SIMD_66, /* no_mask_reg */ false, VEX_OPCODE_0F, /* rex_w */ true);
emit_int8(0x73);
emit_int8((unsigned char)(0xC0 | encode));
emit_int8(shift & 0xFF);
@@ -4453,16 +4563,17 @@
void Assembler::psllw(XMMRegister dst, XMMRegister shift) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- emit_simd_arith(0xF1, dst, shift, VEX_SIMD_66, false,
- (VM_Version::supports_avx512bw() == false));
+ emit_simd_arith(0xF1, dst, shift, VEX_SIMD_66, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
}
void Assembler::pslld(XMMRegister dst, XMMRegister shift) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
emit_simd_arith(0xF2, dst, shift, VEX_SIMD_66);
}
void Assembler::psllq(XMMRegister dst, XMMRegister shift) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
emit_simd_arith_q(0xF3, dst, shift, VEX_SIMD_66);
@@ -4474,12 +4585,12 @@
void Assembler::vpsllw(XMMRegister dst, XMMRegister src, int shift, int vector_len) {
assert(UseAVX > 0, "requires some form of AVX");
// XMM6 is for /6 encoding: 66 0F 71 /6 ib
- emit_vex_arith(0x71, xmm6, dst, src, VEX_SIMD_66, vector_len,
- (VM_Version::supports_avx512bw() == false));
+ emit_vex_arith(0x71, xmm6, dst, src, VEX_SIMD_66, vector_len, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
emit_int8(shift & 0xFF);
}
void Assembler::vpslld(XMMRegister dst, XMMRegister src, int shift, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
// XMM6 is for /6 encoding: 66 0F 72 /6 ib
emit_vex_arith(0x72, xmm6, dst, src, VEX_SIMD_66, vector_len);
@@ -4487,6 +4598,7 @@
}
void Assembler::vpsllq(XMMRegister dst, XMMRegister src, int shift, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
// XMM6 is for /6 encoding: 66 0F 73 /6 ib
if (VM_Version::supports_evex()) {
@@ -4499,16 +4611,17 @@
void Assembler::vpsllw(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {
assert(UseAVX > 0, "requires some form of AVX");
- emit_vex_arith(0xF1, dst, src, shift, VEX_SIMD_66, vector_len,
- (VM_Version::supports_avx512bw() == false));
+ emit_vex_arith(0xF1, dst, src, shift, VEX_SIMD_66, vector_len, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
}
void Assembler::vpslld(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
emit_vex_arith(0xF2, dst, src, shift, VEX_SIMD_66, vector_len);
}
void Assembler::vpsllq(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
if (VM_Version::supports_evex()) {
emit_vex_arith_q(0xF3, dst, src, shift, VEX_SIMD_66, vector_len);
@@ -4521,33 +4634,31 @@
void Assembler::psrlw(XMMRegister dst, int shift) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
// XMM2 is for /2 encoding: 66 0F 71 /2 ib
- int encode = simd_prefix_and_encode(xmm2, dst, dst, VEX_SIMD_66, false, VEX_OPCODE_0F,
- (VM_Version::supports_avx512bw() == false));
+ int encode = simd_prefix_and_encode(xmm2, dst, dst, VEX_SIMD_66, /* no_mask_reg */ false,
+ VEX_OPCODE_0F, /* rex_w */ false, AVX_128bit, /* legacy_mode */ _legacy_mode_bw);
emit_int8(0x71);
emit_int8((unsigned char)(0xC0 | encode));
emit_int8(shift & 0xFF);
}
void Assembler::psrld(XMMRegister dst, int shift) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
// XMM2 is for /2 encoding: 66 0F 72 /2 ib
- int encode = simd_prefix_and_encode(xmm2, dst, dst, VEX_SIMD_66, false);
+ int encode = simd_prefix_and_encode(xmm2, dst, dst, VEX_SIMD_66, /* no_mask_reg */ false);
emit_int8(0x72);
emit_int8((unsigned char)(0xC0 | encode));
emit_int8(shift & 0xFF);
}
void Assembler::psrlq(XMMRegister dst, int shift) {
+ _instruction_uses_vl = true;
// Do not confuse it with psrldq SSE2 instruction which
// shifts 128 bit value in xmm register by number of bytes.
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
// XMM2 is for /2 encoding: 66 0F 73 /2 ib
- int encode = 0;
- if (VM_Version::supports_evex() && VM_Version::supports_avx512bw()) {
- encode = simd_prefix_and_encode(xmm2, dst, dst, VEX_SIMD_66, true, VEX_OPCODE_0F, false);
- } else {
- encode = simd_prefix_and_encode(xmm2, dst, dst, VEX_SIMD_66, false, VEX_OPCODE_0F, true);
- }
+ int encode = simd_prefix_and_encode(xmm2, dst, dst, VEX_SIMD_66, /* no_mask_reg */ false,
+ VEX_OPCODE_0F, /* rex_w */ VM_Version::supports_evex());
emit_int8(0x73);
emit_int8((unsigned char)(0xC0 | encode));
emit_int8(shift & 0xFF);
@@ -4555,16 +4666,17 @@
void Assembler::psrlw(XMMRegister dst, XMMRegister shift) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- emit_simd_arith(0xD1, dst, shift, VEX_SIMD_66, false,
- (VM_Version::supports_avx512bw() == false));
+ emit_simd_arith(0xD1, dst, shift, VEX_SIMD_66, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
}
void Assembler::psrld(XMMRegister dst, XMMRegister shift) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
emit_simd_arith(0xD2, dst, shift, VEX_SIMD_66);
}
void Assembler::psrlq(XMMRegister dst, XMMRegister shift) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
emit_simd_arith_q(0xD3, dst, shift, VEX_SIMD_66);
@@ -4575,20 +4687,21 @@
void Assembler::vpsrlw(XMMRegister dst, XMMRegister src, int shift, int vector_len) {
assert(UseAVX > 0, "requires some form of AVX");
- // XMM2 is for /2 encoding: 66 0F 73 /2 ib
- emit_vex_arith(0x71, xmm2, dst, src, VEX_SIMD_66, vector_len,
- (VM_Version::supports_avx512bw() == false));
+ // XMM2 is for /2 encoding: 66 0F 71 /2 ib
+ emit_vex_arith(0x71, xmm2, dst, src, VEX_SIMD_66, vector_len, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
emit_int8(shift & 0xFF);
}
void Assembler::vpsrld(XMMRegister dst, XMMRegister src, int shift, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
- // XMM2 is for /2 encoding: 66 0F 73 /2 ib
+ // XMM2 is for /2 encoding: 66 0F 72 /2 ib
emit_vex_arith(0x72, xmm2, dst, src, VEX_SIMD_66, vector_len);
emit_int8(shift & 0xFF);
}
void Assembler::vpsrlq(XMMRegister dst, XMMRegister src, int shift, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
// XMM2 is for /2 encoding: 66 0F 73 /2 ib
if (VM_Version::supports_evex()) {
@@ -4601,16 +4714,17 @@
void Assembler::vpsrlw(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {
assert(UseAVX > 0, "requires some form of AVX");
- emit_vex_arith(0xD1, dst, src, shift, VEX_SIMD_66, vector_len,
- (VM_Version::supports_avx512bw() == false));
+ emit_vex_arith(0xD1, dst, src, shift, VEX_SIMD_66, vector_len, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
}
void Assembler::vpsrld(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
emit_vex_arith(0xD2, dst, src, shift, VEX_SIMD_66, vector_len);
}
void Assembler::vpsrlq(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
if (VM_Version::supports_evex()) {
emit_vex_arith_q(0xD3, dst, src, shift, VEX_SIMD_66, vector_len);
@@ -4623,17 +4737,18 @@
void Assembler::psraw(XMMRegister dst, int shift) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
// XMM4 is for /4 encoding: 66 0F 71 /4 ib
- int encode = simd_prefix_and_encode(xmm4, dst, dst, VEX_SIMD_66, false, VEX_OPCODE_0F,
- (VM_Version::supports_avx512bw() == false));
+ int encode = simd_prefix_and_encode(xmm4, dst, dst, VEX_SIMD_66, /* no_mask_reg */ false,
+ VEX_OPCODE_0F, /* rex_w */ false, AVX_128bit, /* legacy_mode */ _legacy_mode_bw);
emit_int8(0x71);
emit_int8((unsigned char)(0xC0 | encode));
emit_int8(shift & 0xFF);
}
void Assembler::psrad(XMMRegister dst, int shift) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
// XMM4 is for /4 encoding: 66 0F 72 /4 ib
- int encode = simd_prefix_and_encode(xmm4, dst, dst, VEX_SIMD_66, false);
+ int encode = simd_prefix_and_encode(xmm4, dst, dst, VEX_SIMD_66, /* no_mask_reg */ false);
emit_int8(0x72);
emit_int8((unsigned char)(0xC0 | encode));
emit_int8(shift & 0xFF);
@@ -4641,11 +4756,11 @@
void Assembler::psraw(XMMRegister dst, XMMRegister shift) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- emit_simd_arith(0xE1, dst, shift, VEX_SIMD_66,
- (VM_Version::supports_avx512bw() == false));
+ emit_simd_arith(0xE1, dst, shift, VEX_SIMD_66, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
}
void Assembler::psrad(XMMRegister dst, XMMRegister shift) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
emit_simd_arith(0xE2, dst, shift, VEX_SIMD_66);
}
@@ -4653,12 +4768,12 @@
void Assembler::vpsraw(XMMRegister dst, XMMRegister src, int shift, int vector_len) {
assert(UseAVX > 0, "requires some form of AVX");
// XMM4 is for /4 encoding: 66 0F 71 /4 ib
- emit_vex_arith(0x71, xmm4, dst, src, VEX_SIMD_66, vector_len,
- (VM_Version::supports_avx512bw() == false));
+ emit_vex_arith(0x71, xmm4, dst, src, VEX_SIMD_66, vector_len, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
emit_int8(shift & 0xFF);
}
void Assembler::vpsrad(XMMRegister dst, XMMRegister src, int shift, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
// XMM4 is for /4 encoding: 66 0F 71 /4 ib
emit_vex_arith(0x72, xmm4, dst, src, VEX_SIMD_66, vector_len);
@@ -4667,11 +4782,11 @@
void Assembler::vpsraw(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {
assert(UseAVX > 0, "requires some form of AVX");
- emit_vex_arith(0xE1, dst, src, shift, VEX_SIMD_66, vector_len,
- (VM_Version::supports_avx512bw() == false));
+ emit_vex_arith(0xE1, dst, src, shift, VEX_SIMD_66, vector_len, /* no_mask_reg */ false, /* legacy_mode */ _legacy_mode_bw);
}
void Assembler::vpsrad(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
emit_vex_arith(0xE2, dst, src, shift, VEX_SIMD_66, vector_len);
}
@@ -4684,53 +4799,61 @@
}
void Assembler::vpand(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
emit_vex_arith(0xDB, dst, nds, src, VEX_SIMD_66, vector_len);
}
void Assembler::vpand(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_32bit;
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_32bit;
}
emit_vex_arith(0xDB, dst, nds, src, VEX_SIMD_66, vector_len);
}
void Assembler::por(XMMRegister dst, XMMRegister src) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
emit_simd_arith(0xEB, dst, src, VEX_SIMD_66);
}
void Assembler::vpor(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
emit_vex_arith(0xEB, dst, nds, src, VEX_SIMD_66, vector_len);
}
void Assembler::vpor(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_32bit;
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_32bit;
}
emit_vex_arith(0xEB, dst, nds, src, VEX_SIMD_66, vector_len);
}
void Assembler::pxor(XMMRegister dst, XMMRegister src) {
+ _instruction_uses_vl = true;
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
emit_simd_arith(0xEF, dst, src, VEX_SIMD_66);
}
void Assembler::vpxor(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
emit_vex_arith(0xEF, dst, nds, src, VEX_SIMD_66, vector_len);
}
void Assembler::vpxor(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
+ _instruction_uses_vl = true;
assert(UseAVX > 0, "requires some form of AVX");
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_FV;
- input_size_in_bits = EVEX_32bit;
+ _tuple_type = EVEX_FV;
+ _input_size_in_bits = EVEX_32bit;
}
emit_vex_arith(0xEF, dst, nds, src, VEX_SIMD_66, vector_len);
}
@@ -4739,6 +4862,9 @@
void Assembler::vinsertf128h(XMMRegister dst, XMMRegister nds, XMMRegister src) {
assert(VM_Version::supports_avx(), "");
int vector_len = AVX_256bit;
+ if (VM_Version::supports_evex()) {
+ vector_len = AVX_512bit;
+ }
int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector_len, VEX_OPCODE_0F_3A);
emit_int8(0x18);
emit_int8((unsigned char)(0xC0 | encode));
@@ -4753,8 +4879,8 @@
int src_enc = src->encoding();
int dst_enc = dst->encoding();
int nds_enc = nds->is_valid() ? nds->encoding() : 0;
- int encode = vex_prefix_and_encode(dst_enc, nds_enc, src_enc, VEX_SIMD_66,
- VEX_OPCODE_0F_3A, true, vector_len, false, false);
+ int encode = vex_prefix_and_encode(dst_enc, nds_enc, src_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A,
+ /* vex_w */ true, vector_len, /* legacy_mode */ false, /* no_mask_reg */ false);
emit_int8(0x1A);
emit_int8((unsigned char)(0xC0 | encode));
// 0x00 - insert into lower 256 bits
@@ -4763,35 +4889,70 @@
}
void Assembler::vinsertf64x4h(XMMRegister dst, Address src) {
- assert(VM_Version::supports_avx(), "");
- if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T4;
- input_size_in_bits = EVEX_64bit;
- }
+ assert(VM_Version::supports_evex(), "");
+ _tuple_type = EVEX_T4;
+ _input_size_in_bits = EVEX_64bit;
InstructionMark im(this);
int vector_len = AVX_512bit;
assert(dst != xnoreg, "sanity");
int dst_enc = dst->encoding();
// swap src<->dst for encoding
- vex_prefix(src, dst_enc, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, true, vector_len);
+ vex_prefix(src, dst_enc, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, /* vex_w */ true, vector_len);
emit_int8(0x1A);
emit_operand(dst, src);
// 0x01 - insert into upper 128 bits
emit_int8(0x01);
}
+void Assembler::vinsertf32x4h(XMMRegister dst, XMMRegister nds, XMMRegister src, int value) {
+ assert(VM_Version::supports_evex(), "");
+ int vector_len = AVX_512bit;
+ int src_enc = src->encoding();
+ int dst_enc = dst->encoding();
+ int nds_enc = nds->is_valid() ? nds->encoding() : 0;
+ int encode = vex_prefix_and_encode(dst_enc, nds_enc, src_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A,
+ /* vex_w */ false, vector_len, /* legacy_mode */ false, /* no_mask_reg */ false);
+ emit_int8(0x18);
+ emit_int8((unsigned char)(0xC0 | encode));
+ // 0x00 - insert into q0 128 bits (0..127)
+ // 0x01 - insert into q1 128 bits (128..255)
+ // 0x02 - insert into q2 128 bits (256..383)
+ // 0x03 - insert into q3 128 bits (384..511)
+ emit_int8(value & 0x3);
+}
+
+void Assembler::vinsertf32x4h(XMMRegister dst, Address src, int value) {
+ assert(VM_Version::supports_evex(), "");
+ _tuple_type = EVEX_T4;
+ _input_size_in_bits = EVEX_32bit;
+ InstructionMark im(this);
+ int vector_len = AVX_512bit;
+ assert(dst != xnoreg, "sanity");
+ int dst_enc = dst->encoding();
+ // swap src<->dst for encoding
+ vex_prefix(src, dst_enc, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, /* vex_w */ false, vector_len);
+ emit_int8(0x18);
+ emit_operand(dst, src);
+ // 0x00 - insert into q0 128 bits (0..127)
+ // 0x01 - insert into q1 128 bits (128..255)
+ // 0x02 - insert into q2 128 bits (256..383)
+ // 0x03 - insert into q3 128 bits (384..511)
+ emit_int8(value & 0x3);
+}
+
void Assembler::vinsertf128h(XMMRegister dst, Address src) {
assert(VM_Version::supports_avx(), "");
+ int vector_len = AVX_256bit;
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T4;
- input_size_in_bits = EVEX_32bit;
- }
- InstructionMark im(this);
- int vector_len = AVX_256bit;
+ _tuple_type = EVEX_T4;
+ _input_size_in_bits = EVEX_32bit;
+ vector_len = AVX_512bit;
+ }
+ InstructionMark im(this);
assert(dst != xnoreg, "sanity");
int dst_enc = dst->encoding();
// swap src<->dst for encoding
- vex_prefix(src, dst_enc, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, false, vector_len);
+ vex_prefix(src, dst_enc, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, /* vex_w */ false, vector_len);
emit_int8(0x18);
emit_operand(dst, src);
// 0x01 - insert into upper 128 bits
@@ -4801,6 +4962,9 @@
void Assembler::vextractf128h(XMMRegister dst, XMMRegister src) {
assert(VM_Version::supports_avx(), "");
int vector_len = AVX_256bit;
+ if (VM_Version::supports_evex()) {
+ vector_len = AVX_512bit;
+ }
int encode = vex_prefix_and_encode(src, xnoreg, dst, VEX_SIMD_66, vector_len, VEX_OPCODE_0F_3A);
emit_int8(0x19);
emit_int8((unsigned char)(0xC0 | encode));
@@ -4811,15 +4975,16 @@
void Assembler::vextractf128h(Address dst, XMMRegister src) {
assert(VM_Version::supports_avx(), "");
+ int vector_len = AVX_256bit;
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T4;
- input_size_in_bits = EVEX_32bit;
- }
- InstructionMark im(this);
- int vector_len = AVX_256bit;
+ _tuple_type = EVEX_T4;
+ _input_size_in_bits = EVEX_32bit;
+ vector_len = AVX_512bit;
+ }
+ InstructionMark im(this);
assert(src != xnoreg, "sanity");
int src_enc = src->encoding();
- vex_prefix(dst, 0, src_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, false, vector_len);
+ vex_prefix(dst, 0, src_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, /* vex_w */ false, vector_len);
emit_int8(0x19);
emit_operand(src, dst);
// 0x01 - extract from upper 128 bits
@@ -4829,6 +4994,9 @@
void Assembler::vinserti128h(XMMRegister dst, XMMRegister nds, XMMRegister src) {
assert(VM_Version::supports_avx2(), "");
int vector_len = AVX_256bit;
+ if (VM_Version::supports_evex()) {
+ vector_len = AVX_512bit;
+ }
int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector_len, VEX_OPCODE_0F_3A);
emit_int8(0x38);
emit_int8((unsigned char)(0xC0 | encode));
@@ -4844,7 +5012,7 @@
int dst_enc = dst->encoding();
int nds_enc = nds->is_valid() ? nds->encoding() : 0;
int encode = vex_prefix_and_encode(dst_enc, nds_enc, src_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A,
- VM_Version::supports_avx512dq(), vector_len, false, false);
+ /* vex_w */ true, vector_len, /* legacy_mode */ false, /* no_reg_mask */ false);
emit_int8(0x38);
emit_int8((unsigned char)(0xC0 | encode));
// 0x00 - insert into lower 256 bits
@@ -4854,16 +5022,17 @@
void Assembler::vinserti128h(XMMRegister dst, Address src) {
assert(VM_Version::supports_avx2(), "");
+ int vector_len = AVX_256bit;
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T4;
- input_size_in_bits = EVEX_32bit;
- }
- InstructionMark im(this);
- int vector_len = AVX_256bit;
+ _tuple_type = EVEX_T4;
+ _input_size_in_bits = EVEX_32bit;
+ vector_len = AVX_512bit;
+ }
+ InstructionMark im(this);
assert(dst != xnoreg, "sanity");
int dst_enc = dst->encoding();
// swap src<->dst for encoding
- vex_prefix(src, dst_enc, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, false, vector_len);
+ vex_prefix(src, dst_enc, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, /* vex_w */ false, vector_len);
emit_int8(0x38);
emit_operand(dst, src);
// 0x01 - insert into upper 128 bits
@@ -4873,6 +5042,9 @@
void Assembler::vextracti128h(XMMRegister dst, XMMRegister src) {
assert(VM_Version::supports_avx(), "");
int vector_len = AVX_256bit;
+ if (VM_Version::supports_evex()) {
+ vector_len = AVX_512bit;
+ }
int encode = vex_prefix_and_encode(src, xnoreg, dst, VEX_SIMD_66, vector_len, VEX_OPCODE_0F_3A);
emit_int8(0x39);
emit_int8((unsigned char)(0xC0 | encode));
@@ -4883,15 +5055,16 @@
void Assembler::vextracti128h(Address dst, XMMRegister src) {
assert(VM_Version::supports_avx2(), "");
+ int vector_len = AVX_256bit;
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T4;
- input_size_in_bits = EVEX_32bit;
- }
- InstructionMark im(this);
- int vector_len = AVX_256bit;
+ _tuple_type = EVEX_T4;
+ _input_size_in_bits = EVEX_32bit;
+ vector_len = AVX_512bit;
+ }
+ InstructionMark im(this);
assert(src != xnoreg, "sanity");
int src_enc = src->encoding();
- vex_prefix(dst, 0, src_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, false, vector_len);
+ vex_prefix(dst, 0, src_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, /* vex_w */ false, vector_len);
emit_int8(0x39);
emit_operand(src, dst);
// 0x01 - extract from upper 128 bits
@@ -4904,7 +5077,7 @@
int src_enc = src->encoding();
int dst_enc = dst->encoding();
int encode = vex_prefix_and_encode(src_enc, 0, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A,
- true, vector_len, false, false);
+ /* vex_w */ true, vector_len, /* legacy_mode */ false, /* no_mask_reg */ false);
emit_int8(0x3B);
emit_int8((unsigned char)(0xC0 | encode));
// 0x01 - extract from upper 256 bits
@@ -4916,8 +5089,14 @@
int vector_len = AVX_512bit;
int src_enc = src->encoding();
int dst_enc = dst->encoding();
- int encode = vex_prefix_and_encode(src_enc, 0, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A,
- VM_Version::supports_avx512dq(), vector_len, false, false);
+ int encode;
+ if (VM_Version::supports_avx512dq()) {
+ encode = vex_prefix_and_encode(src_enc, 0, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A,
+ /* vex_w */ true, vector_len, /* legacy_mode */ false, /* no_mask_reg */ false);
+ } else {
+ encode = vex_prefix_and_encode(src_enc, 0, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A,
+ /* vex_w */ false, vector_len, /* legacy_mode */ true, /* no_mask_reg */ false);
+ }
emit_int8(0x39);
emit_int8((unsigned char)(0xC0 | encode));
// 0x01 - extract from bits 255:128
@@ -4932,7 +5111,7 @@
int src_enc = src->encoding();
int dst_enc = dst->encoding();
int encode = vex_prefix_and_encode(src_enc, 0, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A,
- VM_Version::supports_avx512dq(), vector_len, false, false);
+ /* vex_w */ true, vector_len, /* legacy_mode */ false, /* no_mask_reg */ false);
emit_int8(0x1B);
emit_int8((unsigned char)(0xC0 | encode));
// 0x01 - extract from upper 256 bits
@@ -4940,18 +5119,18 @@
}
void Assembler::vextractf64x4h(Address dst, XMMRegister src) {
- assert(VM_Version::supports_avx2(), "");
- tuple_type = EVEX_T4;
- input_size_in_bits = EVEX_64bit;
+ assert(VM_Version::supports_evex(), "");
+ _tuple_type = EVEX_T4;
+ _input_size_in_bits = EVEX_64bit;
InstructionMark im(this);
int vector_len = AVX_512bit;
assert(src != xnoreg, "sanity");
int src_enc = src->encoding();
vex_prefix(dst, 0, src_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A,
- VM_Version::supports_avx512dq(), vector_len);
+ /* vex_w */ true, vector_len);
emit_int8(0x1B);
emit_operand(src, dst);
- // 0x01 - extract from upper 128 bits
+ // 0x01 - extract from upper 256 bits
emit_int8(0x01);
}
@@ -4960,10 +5139,29 @@
int vector_len = AVX_512bit;
int src_enc = src->encoding();
int dst_enc = dst->encoding();
- int encode = vex_prefix_and_encode(src_enc, 0, dst_enc, VEX_SIMD_66,
- VEX_OPCODE_0F_3A, false, vector_len, false, false);
+ int encode = vex_prefix_and_encode(src_enc, 0, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A,
+ /* vex_w */ false, vector_len, /* legacy_mode */ false, /* no_mask_reg */ false);
emit_int8(0x19);
emit_int8((unsigned char)(0xC0 | encode));
+ // 0x00 - extract from bits 127:0
+ // 0x01 - extract from bits 255:128
+ // 0x02 - extract from bits 383:256
+ // 0x03 - extract from bits 511:384
+ emit_int8(value & 0x3);
+}
+
+void Assembler::vextractf32x4h(Address dst, XMMRegister src, int value) {
+ assert(VM_Version::supports_evex(), "");
+ _tuple_type = EVEX_T4;
+ _input_size_in_bits = EVEX_32bit;
+ InstructionMark im(this);
+ int vector_len = AVX_512bit;
+ assert(src != xnoreg, "sanity");
+ int src_enc = src->encoding();
+ vex_prefix(dst, 0, src_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, /* vex_w */ false, vector_len);
+ emit_int8(0x19);
+ emit_operand(src, dst);
+ // 0x00 - extract from bits 127:0
// 0x01 - extract from bits 255:128
// 0x02 - extract from bits 383:256
// 0x03 - extract from bits 511:384
@@ -4976,7 +5174,7 @@
int src_enc = src->encoding();
int dst_enc = dst->encoding();
int encode = vex_prefix_and_encode(src_enc, 0, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A,
- VM_Version::supports_avx512dq(), vector_len, false, false);
+ /* vex_w */ !_legacy_mode_dq, vector_len, /* legacy_mode */ false, /* no_mask_reg */ false);
emit_int8(0x19);
emit_int8((unsigned char)(0xC0 | encode));
// 0x01 - extract from bits 255:128
@@ -4987,178 +5185,190 @@
// duplicate 4-bytes integer data from src into 8 locations in dest
void Assembler::vpbroadcastd(XMMRegister dst, XMMRegister src) {
- assert(VM_Version::supports_avx2(), "");
+ _instruction_uses_vl = true;
+ assert(UseAVX > 1, "");
int vector_len = AVX_256bit;
- int encode = vex_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66,
- vector_len, VEX_OPCODE_0F_38, false);
+ int encode = vex_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, vector_len, VEX_OPCODE_0F_38);
emit_int8(0x58);
emit_int8((unsigned char)(0xC0 | encode));
}
// duplicate 1-byte integer data from src into 16||32|64 locations in dest : requires AVX512BW and AVX512VL
void Assembler::evpbroadcastb(XMMRegister dst, XMMRegister src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
- int encode = vex_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66,
- vector_len, VEX_OPCODE_0F_38, false);
+ _instruction_uses_vl = true;
+ assert(UseAVX > 1, "");
+ int encode = vex_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, vector_len, VEX_OPCODE_0F_38);
emit_int8(0x78);
emit_int8((unsigned char)(0xC0 | encode));
}
void Assembler::evpbroadcastb(XMMRegister dst, Address src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_8bit;
+ _instruction_uses_vl = true;
+ assert(UseAVX > 1, "");
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_8bit;
InstructionMark im(this);
assert(dst != xnoreg, "sanity");
int dst_enc = dst->encoding();
// swap src<->dst for encoding
- vex_prefix(src, dst_enc, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_38, false, vector_len);
+ vex_prefix(src, dst_enc, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_38, /* vex_w */ false, vector_len);
emit_int8(0x78);
emit_operand(dst, src);
}
// duplicate 2-byte integer data from src into 8|16||32 locations in dest : requires AVX512BW and AVX512VL
void Assembler::evpbroadcastw(XMMRegister dst, XMMRegister src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
- int encode = vex_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66,
- vector_len, VEX_OPCODE_0F_38, false);
+ _instruction_uses_vl = true;
+ assert(UseAVX > 1, "");
+ int encode = vex_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, vector_len, VEX_OPCODE_0F_38);
emit_int8(0x79);
emit_int8((unsigned char)(0xC0 | encode));
}
void Assembler::evpbroadcastw(XMMRegister dst, Address src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_16bit;
+ _instruction_uses_vl = true;
+ assert(UseAVX > 1, "");
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_16bit;
InstructionMark im(this);
assert(dst != xnoreg, "sanity");
int dst_enc = dst->encoding();
// swap src<->dst for encoding
- vex_prefix(src, dst_enc, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_38, false, vector_len);
+ vex_prefix(src, dst_enc, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_38, /* vex_w */ false, vector_len);
emit_int8(0x79);
emit_operand(dst, src);
}
// duplicate 4-byte integer data from src into 4|8|16 locations in dest : requires AVX512VL
void Assembler::evpbroadcastd(XMMRegister dst, XMMRegister src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
- int encode = vex_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66,
- vector_len, VEX_OPCODE_0F_38, false);
+ _instruction_uses_vl = true;
+ assert(UseAVX > 1, "");
+ int encode = vex_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, vector_len, VEX_OPCODE_0F_38);
emit_int8(0x58);
emit_int8((unsigned char)(0xC0 | encode));
}
void Assembler::evpbroadcastd(XMMRegister dst, Address src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_32bit;
+ _instruction_uses_vl = true;
+ assert(UseAVX > 1, "");
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_32bit;
InstructionMark im(this);
assert(dst != xnoreg, "sanity");
int dst_enc = dst->encoding();
// swap src<->dst for encoding
- vex_prefix(src, dst_enc, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_38, false, vector_len);
+ vex_prefix(src, dst_enc, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_38, /* vex_w */ false, vector_len);
emit_int8(0x58);
emit_operand(dst, src);
}
// duplicate 8-byte integer data from src into 4|8|16 locations in dest : requires AVX512VL
void Assembler::evpbroadcastq(XMMRegister dst, XMMRegister src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
- int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66,
- VEX_OPCODE_0F_38, true, vector_len, false, false);
+ _instruction_uses_vl = true;
+ assert(UseAVX > 1, "");
+ int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38,
+ /* vex_w */ true, vector_len, /* legacy_mode */ false, /* no_mask_reg */ false);
emit_int8(0x59);
emit_int8((unsigned char)(0xC0 | encode));
}
void Assembler::evpbroadcastq(XMMRegister dst, Address src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_64bit;
+ _instruction_uses_vl = true;
+ assert(UseAVX > 1, "");
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_64bit;
InstructionMark im(this);
assert(dst != xnoreg, "sanity");
int dst_enc = dst->encoding();
// swap src<->dst for encoding
- vex_prefix(src, dst_enc, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_38, true, vector_len);
+ vex_prefix(src, dst_enc, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_38, /* vex_w */ true, vector_len);
emit_int8(0x59);
emit_operand(dst, src);
}
// duplicate single precision fp from src into 4|8|16 locations in dest : requires AVX512VL
void Assembler::evpbroadcastss(XMMRegister dst, XMMRegister src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
- int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66,
- VEX_OPCODE_0F_38, false, vector_len, false, false);
+ _instruction_uses_vl = true;
+ assert(UseAVX > 1, "");
+ int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38,
+ /* vex_w */ false, vector_len, /* legacy_mode */ false, /*no_mask_reg */ false);
emit_int8(0x18);
emit_int8((unsigned char)(0xC0 | encode));
}
void Assembler::evpbroadcastss(XMMRegister dst, Address src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_32bit;
+ assert(UseAVX > 1, "");
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_32bit;
InstructionMark im(this);
assert(dst != xnoreg, "sanity");
int dst_enc = dst->encoding();
// swap src<->dst for encoding
- vex_prefix(src, 0, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_38, false, vector_len);
+ vex_prefix(src, 0, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_38, /* vex_w */ false, vector_len);
emit_int8(0x18);
emit_operand(dst, src);
}
// duplicate double precision fp from src into 2|4|8 locations in dest : requires AVX512VL
void Assembler::evpbroadcastsd(XMMRegister dst, XMMRegister src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
- int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66,
- VEX_OPCODE_0F_38, true, vector_len, false, false);
+ _instruction_uses_vl = true;
+ assert(UseAVX > 1, "");
+ int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38,
+ /*vex_w */ true, vector_len, /* legacy_mode */ false, /*no_mask_reg */ false);
emit_int8(0x19);
emit_int8((unsigned char)(0xC0 | encode));
}
void Assembler::evpbroadcastsd(XMMRegister dst, Address src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_64bit;
+ _instruction_uses_vl = true;
+ assert(UseAVX > 1, "");
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_64bit;
InstructionMark im(this);
assert(dst != xnoreg, "sanity");
int dst_enc = dst->encoding();
// swap src<->dst for encoding
- vex_prefix(src, 0, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_38, true, vector_len);
+ vex_prefix(src, 0, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_38, /* vex_w */ true, vector_len);
emit_int8(0x19);
emit_operand(dst, src);
}
// duplicate 1-byte integer data from src into 16||32|64 locations in dest : requires AVX512BW and AVX512VL
void Assembler::evpbroadcastb(XMMRegister dst, Register src, int vector_len) {
+ _instruction_uses_vl = true;
assert(VM_Version::supports_evex(), "");
- int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66,
- VEX_OPCODE_0F_38, false, vector_len, false, false);
+ int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38,
+ /*vex_w */ false, vector_len, /* legacy_mode */ false, /*no_mask_reg */ false);
emit_int8(0x7A);
emit_int8((unsigned char)(0xC0 | encode));
}
// duplicate 2-byte integer data from src into 8|16||32 locations in dest : requires AVX512BW and AVX512VL
void Assembler::evpbroadcastw(XMMRegister dst, Register src, int vector_len) {
+ _instruction_uses_vl = true;
assert(VM_Version::supports_evex(), "");
- int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66,
- VEX_OPCODE_0F_38, false, vector_len, false, false);
+ int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38,
+ /* vex_w */ false, vector_len, /* legacy_mode */ false, /*no_mask_reg */ false);
emit_int8(0x7B);
emit_int8((unsigned char)(0xC0 | encode));
}
// duplicate 4-byte integer data from src into 4|8|16 locations in dest : requires AVX512VL
void Assembler::evpbroadcastd(XMMRegister dst, Register src, int vector_len) {
+ _instruction_uses_vl = true;
assert(VM_Version::supports_evex(), "");
- int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66,
- VEX_OPCODE_0F_38, false, vector_len, false, false);
+ int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38,
+ /* vex_w */ false, vector_len, /* legacy_mode */ false, /*no_mask_reg */ false);
emit_int8(0x7C);
emit_int8((unsigned char)(0xC0 | encode));
}
// duplicate 8-byte integer data from src into 4|8|16 locations in dest : requires AVX512VL
void Assembler::evpbroadcastq(XMMRegister dst, Register src, int vector_len) {
+ _instruction_uses_vl = true;
assert(VM_Version::supports_evex(), "");
- int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66,
- VEX_OPCODE_0F_38, true, vector_len, false, false);
+ int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38,
+ /* vex_w */ true, vector_len, /* legacy_mode */ false, /*no_mask_reg */ false);
emit_int8(0x7C);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -5166,8 +5376,8 @@
// Carry-Less Multiplication Quadword
void Assembler::pclmulqdq(XMMRegister dst, XMMRegister src, int mask) {
assert(VM_Version::supports_clmul(), "");
- int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, false,
- VEX_OPCODE_0F_3A, false, AVX_128bit, true);
+ int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, /* no_mask_reg */ false,
+ VEX_OPCODE_0F_3A, /* rex_w */ false, AVX_128bit, /* legacy_mode */ true);
emit_int8(0x44);
emit_int8((unsigned char)(0xC0 | encode));
emit_int8((unsigned char)mask);
@@ -5177,8 +5387,7 @@
void Assembler::vpclmulqdq(XMMRegister dst, XMMRegister nds, XMMRegister src, int mask) {
assert(VM_Version::supports_avx() && VM_Version::supports_clmul(), "");
int vector_len = AVX_128bit;
- int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66,
- vector_len, VEX_OPCODE_0F_3A, true);
+ int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector_len, VEX_OPCODE_0F_3A, /* legacy_mode */ true);
emit_int8(0x44);
emit_int8((unsigned char)(0xC0 | encode));
emit_int8((unsigned char)mask);
@@ -5737,7 +5946,7 @@
int vector_len, bool no_mask_reg ){
// EVEX 0x62 prefix
prefix(EVEX_4bytes);
- evex_encoding = (vex_w ? VEX_W : 0) | (evex_r ? EVEX_Rb : 0);
+ _evex_encoding = (vex_w ? VEX_W : 0) | (evex_r ? EVEX_Rb : 0);
// P0: byte 2, initialized to RXBR`00mm
// instead of not'd
@@ -5776,10 +5985,10 @@
bool vex_r = ((xreg_enc & 8) == 8) ? 1 : 0;
bool vex_b = adr.base_needs_rex();
bool vex_x = adr.index_needs_rex();
- avx_vector_len = vector_len;
-
- // if vector length is turned off, revert to AVX for vectors smaller than AVX_512bit
- if (VM_Version::supports_avx512vl() == false) {
+ _avx_vector_len = vector_len;
+
+ // if vector length is turned off, revert to AVX for vectors smaller than 512-bit
+ if (_legacy_mode_vl && _instruction_uses_vl) {
switch (vector_len) {
case AVX_128bit:
case AVX_256bit:
@@ -5792,11 +6001,12 @@
{
bool evex_r = (xreg_enc >= 16);
bool evex_v = (nds_enc >= 16);
- is_evex_instruction = true;
+ _is_evex_instruction = true;
evex_prefix(vex_r, vex_b, vex_x, vex_w, evex_r, evex_v, nds_enc, pre, opc, false, false, vector_len, no_mask_reg);
} else {
vex_prefix(vex_r, vex_b, vex_x, vex_w, nds_enc, pre, opc, vector_len);
}
+ _instruction_uses_vl = false;
}
int Assembler::vex_prefix_and_encode(int dst_enc, int nds_enc, int src_enc, VexSimdPrefix pre, VexOpcode opc,
@@ -5804,10 +6014,10 @@
bool vex_r = ((dst_enc & 8) == 8) ? 1 : 0;
bool vex_b = ((src_enc & 8) == 8) ? 1 : 0;
bool vex_x = false;
- avx_vector_len = vector_len;
-
- // if vector length is turned off, revert to AVX for vectors smaller than AVX_512bit
- if (VM_Version::supports_avx512vl() == false) {
+ _avx_vector_len = vector_len;
+
+ // if vector length is turned off, revert to AVX for vectors smaller than 512-bit
+ if (_legacy_mode_vl && _instruction_uses_vl) {
switch (vector_len) {
case AVX_128bit:
case AVX_256bit:
@@ -5827,6 +6037,8 @@
vex_prefix(vex_r, vex_b, vex_x, vex_w, nds_enc, pre, opc, vector_len);
}
+ _instruction_uses_vl = false;
+
// return modrm byte components for operands
return (((dst_enc & 7) << 3) | (src_enc & 7));
}
@@ -5915,13 +6127,13 @@
}
void Assembler::emit_simd_arith_nonds(int opcode, XMMRegister dst, XMMRegister src, VexSimdPrefix pre, bool no_mask_reg, bool legacy_mode) {
- int encode = simd_prefix_and_encode(dst, xnoreg, src, pre, no_mask_reg, VEX_OPCODE_0F, legacy_mode, AVX_128bit);
+ int encode = simd_prefix_and_encode(dst, xnoreg, src, pre, no_mask_reg, VEX_OPCODE_0F, false, AVX_128bit, legacy_mode);
emit_int8(opcode);
emit_int8((unsigned char)(0xC0 | encode));
}
void Assembler::emit_simd_arith_nonds_q(int opcode, XMMRegister dst, XMMRegister src, VexSimdPrefix pre, bool no_mask_reg) {
- int encode = simd_prefix_and_encode(dst, xnoreg, src, pre, no_mask_reg, VEX_OPCODE_0F, true, AVX_128bit);
+ int encode = simd_prefix_and_encode(dst, xnoreg, src, pre, no_mask_reg, VEX_OPCODE_0F, true);
emit_int8(opcode);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -5945,7 +6157,7 @@
void Assembler::emit_vex_arith(int opcode, XMMRegister dst, XMMRegister nds, XMMRegister src,
VexSimdPrefix pre, int vector_len, bool no_mask_reg, bool legacy_mode) {
- int encode = vex_prefix_and_encode(dst, nds, src, pre, vector_len, VEX_OPCODE_0F, false, no_mask_reg);
+ int encode = vex_prefix_and_encode(dst, nds, src, pre, vector_len, VEX_OPCODE_0F, legacy_mode, no_mask_reg);
emit_int8(opcode);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -6594,7 +6806,7 @@
void Assembler::cvtsi2sdq(XMMRegister dst, Register src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- int encode = simd_prefix_and_encode_q(dst, dst, src, VEX_SIMD_F2, true);
+ int encode = simd_prefix_and_encode_q(dst, dst, src, VEX_SIMD_F2, /* no_mask_reg */ true);
emit_int8(0x2A);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -6602,11 +6814,11 @@
void Assembler::cvtsi2sdq(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_32bit;
- }
- InstructionMark im(this);
- simd_prefix_q(dst, dst, src, VEX_SIMD_F2, true);
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_32bit;
+ }
+ InstructionMark im(this);
+ simd_prefix_q(dst, dst, src, VEX_SIMD_F2, /* no_mask_reg */ true);
emit_int8(0x2A);
emit_operand(dst, src);
}
@@ -6614,25 +6826,25 @@
void Assembler::cvtsi2ssq(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse(), ""));
if (VM_Version::supports_evex()) {
- tuple_type = EVEX_T1S;
- input_size_in_bits = EVEX_32bit;
- }
- InstructionMark im(this);
- simd_prefix_q(dst, dst, src, VEX_SIMD_F3, true);
+ _tuple_type = EVEX_T1S;
+ _input_size_in_bits = EVEX_32bit;
+ }
+ InstructionMark im(this);
+ simd_prefix_q(dst, dst, src, VEX_SIMD_F3, /* no_mask_reg */ true);
emit_int8(0x2A);
emit_operand(dst, src);
}
void Assembler::cvttsd2siq(Register dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- int encode = simd_prefix_and_encode_q(dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, true);
+ int encode = simd_prefix_and_encode_q(dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, /* no_mask_reg */ true);
emit_int8(0x2C);
emit_int8((unsigned char)(0xC0 | encode));
}
void Assembler::cvttss2siq(Register dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse(), ""));
- int encode = simd_prefix_and_encode_q(dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, true);
+ int encode = simd_prefix_and_encode_q(dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, /* no_mask_reg */ true);
emit_int8(0x2C);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -6668,6 +6880,13 @@
emit_operand(as_Register(1), src);
}
+void Assembler::xrstor(Address src) {
+ prefixq(src);
+ emit_int8(0x0F);
+ emit_int8((unsigned char)0xAE);
+ emit_operand(as_Register(5), src);
+}
+
void Assembler::fxsave(Address dst) {
prefixq(dst);
emit_int8(0x0F);
@@ -6675,6 +6894,13 @@
emit_operand(as_Register(0), dst);
}
+void Assembler::xsave(Address dst) {
+ prefixq(dst);
+ emit_int8(0x0F);
+ emit_int8((unsigned char)0xAE);
+ emit_operand(as_Register(4), dst);
+}
+
void Assembler::idivq(Register src) {
int encode = prefixq_and_encode(src->encoding());
emit_int8((unsigned char)0xF7);
@@ -6801,7 +7027,7 @@
void Assembler::movdq(XMMRegister dst, Register src) {
// table D-1 says MMX/SSE2
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- int encode = simd_prefix_and_encode_q(dst, src, VEX_SIMD_66, true);
+ int encode = simd_prefix_and_encode_q(dst, src, VEX_SIMD_66, /* no_mask_reg */ true);
emit_int8(0x6E);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -6810,7 +7036,7 @@
// table D-1 says MMX/SSE2
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
// swap src/dst to get correct prefix
- int encode = simd_prefix_and_encode_q(src, dst, VEX_SIMD_66, true);
+ int encode = simd_prefix_and_encode_q(src, dst, VEX_SIMD_66, /* no_mask_reg */ true);
emit_int8(0x7E);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -6943,8 +7169,8 @@
void Assembler::mulxq(Register dst1, Register dst2, Register src) {
assert(VM_Version::supports_bmi2(), "bit manipulation instructions not supported");
- int encode = vex_prefix_and_encode(dst1->encoding(), dst2->encoding(), src->encoding(),
- VEX_SIMD_F2, VEX_OPCODE_0F_38, true, AVX_128bit, true, false);
+ int encode = vex_prefix_and_encode(dst1->encoding(), dst2->encoding(), src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F_38,
+ /* vex_w */ true, AVX_128bit, /* legacy_mode */ true, /* no_mask_reg */ false);
emit_int8((unsigned char)0xF6);
emit_int8((unsigned char)(0xC0 | encode));
}
@@ -7106,8 +7332,8 @@
void Assembler::rorxq(Register dst, Register src, int imm8) {
assert(VM_Version::supports_bmi2(), "bit manipulation instructions not supported");
- int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_F2,
- VEX_OPCODE_0F_3A, true, AVX_128bit, true, false);
+ int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F_3A,
+ /* vex_w */ true, AVX_128bit, /* legacy_mode */ true, /* no_mask_reg */ false);
emit_int8((unsigned char)0xF0);
emit_int8((unsigned char)(0xC0 | encode));
emit_int8(imm8);
--- a/hotspot/src/cpu/x86/vm/assembler_x86.hpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/cpu/x86/vm/assembler_x86.hpp Mon Sep 21 17:49:57 2015 +0200
@@ -438,7 +438,9 @@
};
-const int FPUStateSizeInWords = NOT_LP64(27) LP64_ONLY( 512*2 / wordSize);
+// 64-bit refect the fxsave size which is 512 bytes and the new xsave area on EVEX which is another 2176 bytes
+// See fxsave and xsave(EVEX enabled) documentation for layout
+const int FPUStateSizeInWords = NOT_LP64(27) LP64_ONLY(2688 / wordSize);
// The Intel x86/Amd64 Assembler: Pure assembler doing NO optimizations on the instruction
// level (e.g. mov rax, 0 is not translated into xor rax, rax!); i.e., what you write
@@ -594,11 +596,16 @@
private:
- int evex_encoding;
- int input_size_in_bits;
- int avx_vector_len;
- int tuple_type;
- bool is_evex_instruction;
+ int _evex_encoding;
+ int _input_size_in_bits;
+ int _avx_vector_len;
+ int _tuple_type;
+ bool _is_evex_instruction;
+ bool _legacy_mode_bw;
+ bool _legacy_mode_dq;
+ bool _legacy_mode_vl;
+ bool _legacy_mode_vlbw;
+ bool _instruction_uses_vl;
// 64bit prefixes
int prefix_and_encode(int reg_enc, bool byteinst = false);
@@ -972,11 +979,16 @@
// belong in macro assembler but there is no need for both varieties to exist
void init_attributes(void) {
- evex_encoding = 0;
- input_size_in_bits = 0;
- avx_vector_len = AVX_NoVec;
- tuple_type = EVEX_ETUP;
- is_evex_instruction = false;
+ _evex_encoding = 0;
+ _input_size_in_bits = 0;
+ _avx_vector_len = AVX_NoVec;
+ _tuple_type = EVEX_ETUP;
+ _is_evex_instruction = false;
+ _legacy_mode_bw = (VM_Version::supports_avx512bw() == false);
+ _legacy_mode_dq = (VM_Version::supports_avx512dq() == false);
+ _legacy_mode_vl = (VM_Version::supports_avx512vl() == false);
+ _legacy_mode_vlbw = (VM_Version::supports_avx512vlbw() == false);
+ _instruction_uses_vl = false;
}
void lea(Register dst, Address src);
@@ -1344,8 +1356,10 @@
void fxch(int i = 1);
void fxrstor(Address src);
+ void xrstor(Address src);
void fxsave(Address dst);
+ void xsave(Address dst);
void fyl2x();
void frndint();
@@ -1479,11 +1493,12 @@
void movb(Address dst, int imm8);
void movb(Register dst, Address src);
- void kmovq(KRegister dst, KRegister src);
+ void kmovql(KRegister dst, KRegister src);
void kmovql(KRegister dst, Register src);
void kmovdl(KRegister dst, Register src);
- void kmovq(Address dst, KRegister src);
- void kmovq(KRegister dst, Address src);
+ void kmovwl(KRegister dst, Register src);
+ void kmovql(Address dst, KRegister src);
+ void kmovql(KRegister dst, Address src);
void movdl(XMMRegister dst, Register src);
void movdl(Register dst, XMMRegister src);
@@ -1509,9 +1524,12 @@
void vmovdqu(XMMRegister dst, XMMRegister src);
// Move Unaligned 512bit Vector
- void evmovdqu(Address dst, XMMRegister src, int vector_len);
- void evmovdqu(XMMRegister dst, Address src, int vector_len);
- void evmovdqu(XMMRegister dst, XMMRegister src, int vector_len);
+ void evmovdqul(Address dst, XMMRegister src, int vector_len);
+ void evmovdqul(XMMRegister dst, Address src, int vector_len);
+ void evmovdqul(XMMRegister dst, XMMRegister src, int vector_len);
+ void evmovdquq(Address dst, XMMRegister src, int vector_len);
+ void evmovdquq(XMMRegister dst, Address src, int vector_len);
+ void evmovdquq(XMMRegister dst, XMMRegister src, int vector_len);
// Move lower 64bit to high 64bit in 128bit register
void movlhps(XMMRegister dst, XMMRegister src);
@@ -1643,6 +1661,7 @@
// Pemutation of 64bit words
void vpermq(XMMRegister dst, XMMRegister src, int imm8, int vector_len);
+ void vpermq(XMMRegister dst, XMMRegister src, int imm8);
void pause();
@@ -1920,6 +1939,10 @@
void vdivpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
void vdivps(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
+ // Sqrt Packed Floating-Point Values - Double precision only
+ void vsqrtpd(XMMRegister dst, XMMRegister src, int vector_len);
+ void vsqrtpd(XMMRegister dst, Address src, int vector_len);
+
// Bitwise Logical AND of Packed Floating-Point Values
void andpd(XMMRegister dst, XMMRegister src);
void andps(XMMRegister dst, XMMRegister src);
@@ -2057,6 +2080,9 @@
void vextracti64x2h(XMMRegister dst, XMMRegister src, int value);
void vextractf64x2h(XMMRegister dst, XMMRegister src, int value);
void vextractf32x4h(XMMRegister dst, XMMRegister src, int value);
+ void vextractf32x4h(Address dst, XMMRegister src, int value);
+ void vinsertf32x4h(XMMRegister dst, XMMRegister nds, XMMRegister src, int value);
+ void vinsertf32x4h(XMMRegister dst, Address src, int value);
// duplicate 4-bytes integer data from src into 8 locations in dest
void vpbroadcastd(XMMRegister dst, XMMRegister src);
--- a/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Mon Sep 21 17:49:57 2015 +0200
@@ -3798,16 +3798,24 @@
if (left->as_xmm_float_reg() != dest->as_xmm_float_reg()) {
__ movflt(dest->as_xmm_float_reg(), left->as_xmm_float_reg());
}
- __ xorps(dest->as_xmm_float_reg(),
- ExternalAddress((address)float_signflip_pool));
-
+ if (UseAVX > 1) {
+ __ vnegatess(dest->as_xmm_float_reg(), dest->as_xmm_float_reg(),
+ ExternalAddress((address)float_signflip_pool));
+ } else {
+ __ xorps(dest->as_xmm_float_reg(),
+ ExternalAddress((address)float_signflip_pool));
+ }
} else if (dest->is_double_xmm()) {
if (left->as_xmm_double_reg() != dest->as_xmm_double_reg()) {
__ movdbl(dest->as_xmm_double_reg(), left->as_xmm_double_reg());
}
- __ xorpd(dest->as_xmm_double_reg(),
- ExternalAddress((address)double_signflip_pool));
-
+ if (UseAVX > 1) {
+ __ vnegatesd(dest->as_xmm_double_reg(), dest->as_xmm_double_reg(),
+ ExternalAddress((address)double_signflip_pool));
+ } else {
+ __ xorpd(dest->as_xmm_double_reg(),
+ ExternalAddress((address)double_signflip_pool));
+ }
} else if (left->is_single_fpu() || left->is_double_fpu()) {
assert(left->fpu() == 0, "arg must be on TOS");
assert(dest->fpu() == 0, "dest must be TOS");
--- a/hotspot/src/cpu/x86/vm/c1_Runtime1_x86.cpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/cpu/x86/vm/c1_Runtime1_x86.cpp Mon Sep 21 17:49:57 2015 +0200
@@ -401,11 +401,9 @@
} else if (UseSSE == 1) {
int xmm_off = xmm_regs_as_doubles_off;
- for (int n = 0; n < FrameMap::nof_xmm_regs; n++) {
- if (n < xmm_bypass_limit) {
- VMReg xmm_name_0 = as_XMMRegister(n)->as_VMReg();
- map->set_callee_saved(VMRegImpl::stack2reg(xmm_off + num_rt_args), xmm_name_0);
- }
+ for (int n = 0; n < FrameMap::nof_fpu_regs; n++) {
+ VMReg xmm_name_0 = as_XMMRegister(n)->as_VMReg();
+ map->set_callee_saved(VMRegImpl::stack2reg(xmm_off + num_rt_args), xmm_name_0);
xmm_off += 2;
}
assert(xmm_off == float_regs_as_doubles_off, "incorrect number of xmm registers");
@@ -452,14 +450,11 @@
__ frstor(Address(rsp, fpu_state_off * VMRegImpl::stack_slot_size));
// Save the FPU registers in de-opt-able form
- __ fstp_d(Address(rsp, float_regs_as_doubles_off * VMRegImpl::stack_slot_size + 0));
- __ fstp_d(Address(rsp, float_regs_as_doubles_off * VMRegImpl::stack_slot_size + 8));
- __ fstp_d(Address(rsp, float_regs_as_doubles_off * VMRegImpl::stack_slot_size + 16));
- __ fstp_d(Address(rsp, float_regs_as_doubles_off * VMRegImpl::stack_slot_size + 24));
- __ fstp_d(Address(rsp, float_regs_as_doubles_off * VMRegImpl::stack_slot_size + 32));
- __ fstp_d(Address(rsp, float_regs_as_doubles_off * VMRegImpl::stack_slot_size + 40));
- __ fstp_d(Address(rsp, float_regs_as_doubles_off * VMRegImpl::stack_slot_size + 48));
- __ fstp_d(Address(rsp, float_regs_as_doubles_off * VMRegImpl::stack_slot_size + 56));
+ int offset = 0;
+ for (int n = 0; n < FrameMap::nof_fpu_regs; n++) {
+ __ fstp_d(Address(rsp, float_regs_as_doubles_off * VMRegImpl::stack_slot_size + offset));
+ offset += 8;
+ }
}
if (UseSSE >= 2) {
@@ -468,52 +463,26 @@
// so always save them as doubles.
// note that float values are _not_ converted automatically, so for float values
// the second word contains only garbage data.
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 0), xmm0);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 8), xmm1);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 16), xmm2);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 24), xmm3);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 32), xmm4);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 40), xmm5);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 48), xmm6);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 56), xmm7);
+ int xmm_bypass_limit = FrameMap::nof_xmm_regs;
+ int offset = 0;
#ifdef _LP64
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 64), xmm8);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 72), xmm9);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 80), xmm10);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 88), xmm11);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 96), xmm12);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 104), xmm13);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 112), xmm14);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 120), xmm15);
- if (UseAVX > 2) {
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 128), xmm16);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 136), xmm17);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 144), xmm18);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 152), xmm19);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 160), xmm20);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 168), xmm21);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 176), xmm22);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 184), xmm23);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 192), xmm24);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 200), xmm25);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 208), xmm26);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 216), xmm27);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 224), xmm28);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 232), xmm29);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 240), xmm30);
- __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 248), xmm31);
+ if (UseAVX < 3) {
+ xmm_bypass_limit = xmm_bypass_limit / 2;
+ }
+#endif
+ for (int n = 0; n < xmm_bypass_limit; n++) {
+ XMMRegister xmm_name = as_XMMRegister(n);
+ __ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + offset), xmm_name);
+ offset += 8;
}
-#endif // _LP64
} else if (UseSSE == 1) {
- // save XMM registers as float because double not supported without SSE2
- __ movflt(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 0), xmm0);
- __ movflt(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 8), xmm1);
- __ movflt(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 16), xmm2);
- __ movflt(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 24), xmm3);
- __ movflt(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 32), xmm4);
- __ movflt(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 40), xmm5);
- __ movflt(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 48), xmm6);
- __ movflt(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 56), xmm7);
+ // save XMM registers as float because double not supported without SSE2(num MMX == num fpu)
+ int offset = 0;
+ for (int n = 0; n < FrameMap::nof_fpu_regs; n++) {
+ XMMRegister xmm_name = as_XMMRegister(n);
+ __ movflt(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + offset), xmm_name);
+ offset += 8;
+ }
}
}
@@ -528,52 +497,26 @@
if (restore_fpu_registers) {
if (UseSSE >= 2) {
// restore XMM registers
- __ movdbl(xmm0, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 0));
- __ movdbl(xmm1, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 8));
- __ movdbl(xmm2, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 16));
- __ movdbl(xmm3, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 24));
- __ movdbl(xmm4, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 32));
- __ movdbl(xmm5, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 40));
- __ movdbl(xmm6, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 48));
- __ movdbl(xmm7, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 56));
+ int xmm_bypass_limit = FrameMap::nof_xmm_regs;
#ifdef _LP64
- __ movdbl(xmm8, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 64));
- __ movdbl(xmm9, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 72));
- __ movdbl(xmm10, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 80));
- __ movdbl(xmm11, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 88));
- __ movdbl(xmm12, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 96));
- __ movdbl(xmm13, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 104));
- __ movdbl(xmm14, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 112));
- __ movdbl(xmm15, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 120));
- if (UseAVX > 2) {
- __ movdbl(xmm16, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 128));
- __ movdbl(xmm17, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 136));
- __ movdbl(xmm18, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 144));
- __ movdbl(xmm19, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 152));
- __ movdbl(xmm20, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 160));
- __ movdbl(xmm21, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 168));
- __ movdbl(xmm22, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 176));
- __ movdbl(xmm23, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 184));
- __ movdbl(xmm24, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 192));
- __ movdbl(xmm25, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 200));
- __ movdbl(xmm26, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 208));
- __ movdbl(xmm27, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 216));
- __ movdbl(xmm28, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 224));
- __ movdbl(xmm29, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 232));
- __ movdbl(xmm30, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 240));
- __ movdbl(xmm31, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 248));
+ if (UseAVX < 3) {
+ xmm_bypass_limit = xmm_bypass_limit / 2;
}
-#endif // _LP64
+#endif
+ int offset = 0;
+ for (int n = 0; n < xmm_bypass_limit; n++) {
+ XMMRegister xmm_name = as_XMMRegister(n);
+ __ movdbl(xmm_name, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + offset));
+ offset += 8;
+ }
} else if (UseSSE == 1) {
- // restore XMM registers
- __ movflt(xmm0, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 0));
- __ movflt(xmm1, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 8));
- __ movflt(xmm2, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 16));
- __ movflt(xmm3, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 24));
- __ movflt(xmm4, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 32));
- __ movflt(xmm5, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 40));
- __ movflt(xmm6, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 48));
- __ movflt(xmm7, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + 56));
+ // restore XMM registers(num MMX == num fpu)
+ int offset = 0;
+ for (int n = 0; n < FrameMap::nof_fpu_regs; n++) {
+ XMMRegister xmm_name = as_XMMRegister(n);
+ __ movflt(xmm_name, Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + offset));
+ offset += 8;
+ }
}
if (UseSSE < 2) {
--- a/hotspot/src/cpu/x86/vm/macroAssembler_x86.cpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/cpu/x86/vm/macroAssembler_x86.cpp Mon Sep 21 17:49:57 2015 +0200
@@ -3751,8 +3751,31 @@
}
void MacroAssembler::pop_FPU_state() {
- NOT_LP64(frstor(Address(rsp, 0));)
- LP64_ONLY(fxrstor(Address(rsp, 0));)
+#ifndef _LP64
+ frstor(Address(rsp, 0));
+#else
+ // AVX will continue to use the fxsave area.
+ // EVEX needs to utilize the xsave area, which is under different
+ // management.
+ if(VM_Version::supports_evex()) {
+ // EDX:EAX describe the XSAVE header and
+ // are obtained while fetching info for XCR0 via cpuid.
+ // These two registers make up 64-bits in the header for which bits
+ // 62:10 are currently reserved for future implementations and unused. Bit 63
+ // is unused for our implementation as we do not utilize
+ // compressed XSAVE areas. Bits 9..8 are currently ignored as we do not use
+ // the functionality for PKRU state and MSR tracing.
+ // Ergo we are primarily concerned with bits 7..0, which define
+ // which ISA extensions and features are enabled for a given machine and are
+ // defined in XemXcr0Eax and is used to map the XSAVE area
+ // for restoring registers as described via XCR0.
+ movl(rdx,VM_Version::get_xsave_header_upper_segment());
+ movl(rax,VM_Version::get_xsave_header_lower_segment());
+ xrstor(Address(rsp, 0));
+ } else {
+ fxrstor(Address(rsp, 0));
+ }
+#endif
addptr(rsp, FPUStateSizeInWords * wordSize);
}
@@ -3769,13 +3792,49 @@
push_FPU_state();
}
+#ifdef _LP64
+#define XSTATE_BV 0x200
+#endif
+
void MacroAssembler::push_FPU_state() {
subptr(rsp, FPUStateSizeInWords * wordSize);
#ifndef _LP64
fnsave(Address(rsp, 0));
fwait();
#else
- fxsave(Address(rsp, 0));
+ // AVX will continue to use the fxsave area.
+ // EVEX needs to utilize the xsave area, which is under different
+ // management.
+ if(VM_Version::supports_evex()) {
+ // Save a copy of EAX and EDX
+ push(rax);
+ push(rdx);
+ // EDX:EAX describe the XSAVE header and
+ // are obtained while fetching info for XCR0 via cpuid.
+ // These two registers make up 64-bits in the header for which bits
+ // 62:10 are currently reserved for future implementations and unused. Bit 63
+ // is unused for our implementation as we do not utilize
+ // compressed XSAVE areas. Bits 9..8 are currently ignored as we do not use
+ // the functionality for PKRU state and MSR tracing.
+ // Ergo we are primarily concerned with bits 7..0, which define
+ // which ISA extensions and features are enabled for a given machine and are
+ // defined in XemXcr0Eax and is used to program XSAVE area
+ // for saving the required registers as defined in XCR0.
+ int xcr0_edx = VM_Version::get_xsave_header_upper_segment();
+ int xcr0_eax = VM_Version::get_xsave_header_lower_segment();
+ movl(rdx,xcr0_edx);
+ movl(rax,xcr0_eax);
+ xsave(Address(rsp, wordSize*2));
+ // now Apply control bits and clear bytes 8..23 in the header
+ pop(rdx);
+ pop(rax);
+ movl(Address(rsp, XSTATE_BV), xcr0_eax);
+ movl(Address(rsp, XSTATE_BV+4), xcr0_edx);
+ andq(Address(rsp, XSTATE_BV+8), 0);
+ andq(Address(rsp, XSTATE_BV+16), 0);
+ } else {
+ fxsave(Address(rsp, 0));
+ }
#endif // LP64
}
@@ -4082,6 +4141,84 @@
}
}
+void MacroAssembler::vnegatess(XMMRegister dst, XMMRegister nds, AddressLiteral src) {
+ int nds_enc = nds->encoding();
+ int dst_enc = dst->encoding();
+ bool dst_upper_bank = (dst_enc > 15);
+ bool nds_upper_bank = (nds_enc > 15);
+ if (VM_Version::supports_avx512novl() &&
+ (nds_upper_bank || dst_upper_bank)) {
+ if (dst_upper_bank) {
+ subptr(rsp, 64);
+ evmovdqul(Address(rsp, 0), xmm0, Assembler::AVX_512bit);
+ movflt(xmm0, nds);
+ if (reachable(src)) {
+ vxorps(xmm0, xmm0, as_Address(src), Assembler::AVX_128bit);
+ } else {
+ lea(rscratch1, src);
+ vxorps(xmm0, xmm0, Address(rscratch1, 0), Assembler::AVX_128bit);
+ }
+ movflt(dst, xmm0);
+ evmovdqul(xmm0, Address(rsp, 0), Assembler::AVX_512bit);
+ addptr(rsp, 64);
+ } else {
+ movflt(dst, nds);
+ if (reachable(src)) {
+ vxorps(dst, dst, as_Address(src), Assembler::AVX_128bit);
+ } else {
+ lea(rscratch1, src);
+ vxorps(dst, dst, Address(rscratch1, 0), Assembler::AVX_128bit);
+ }
+ }
+ } else {
+ if (reachable(src)) {
+ vxorps(dst, nds, as_Address(src), Assembler::AVX_128bit);
+ } else {
+ lea(rscratch1, src);
+ vxorps(dst, nds, Address(rscratch1, 0), Assembler::AVX_128bit);
+ }
+ }
+}
+
+void MacroAssembler::vnegatesd(XMMRegister dst, XMMRegister nds, AddressLiteral src) {
+ int nds_enc = nds->encoding();
+ int dst_enc = dst->encoding();
+ bool dst_upper_bank = (dst_enc > 15);
+ bool nds_upper_bank = (nds_enc > 15);
+ if (VM_Version::supports_avx512novl() &&
+ (nds_upper_bank || dst_upper_bank)) {
+ if (dst_upper_bank) {
+ subptr(rsp, 64);
+ evmovdqul(Address(rsp, 0), xmm0, Assembler::AVX_512bit);
+ movdbl(xmm0, nds);
+ if (reachable(src)) {
+ vxorps(xmm0, xmm0, as_Address(src), Assembler::AVX_128bit);
+ } else {
+ lea(rscratch1, src);
+ vxorps(xmm0, xmm0, Address(rscratch1, 0), Assembler::AVX_128bit);
+ }
+ movdbl(dst, xmm0);
+ evmovdqul(xmm0, Address(rsp, 0), Assembler::AVX_512bit);
+ addptr(rsp, 64);
+ } else {
+ movdbl(dst, nds);
+ if (reachable(src)) {
+ vxorps(dst, dst, as_Address(src), Assembler::AVX_128bit);
+ } else {
+ lea(rscratch1, src);
+ vxorps(dst, dst, Address(rscratch1, 0), Assembler::AVX_128bit);
+ }
+ }
+ } else {
+ if (reachable(src)) {
+ vxorpd(dst, nds, as_Address(src), Assembler::AVX_128bit);
+ } else {
+ lea(rscratch1, src);
+ vxorpd(dst, nds, Address(rscratch1, 0), Assembler::AVX_128bit);
+ }
+ }
+}
+
void MacroAssembler::vxorpd(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len) {
if (reachable(src)) {
vxorpd(dst, nds, as_Address(src), vector_len);
@@ -4318,7 +4455,6 @@
void MacroAssembler::store_check(Register obj) {
// Does a store check for the oop in register obj. The content of
// register obj is destroyed afterwards.
-
BarrierSet* bs = Universe::heap()->barrier_set();
assert(bs->kind() == BarrierSet::CardTableForRS ||
bs->kind() == BarrierSet::CardTableExtension,
@@ -4572,69 +4708,58 @@
// if we are coming from c1, xmm registers may be live
int off = 0;
+ int num_xmm_regs = LP64_ONLY(16) NOT_LP64(8);
+ if (UseAVX > 2) {
+ num_xmm_regs = LP64_ONLY(32) NOT_LP64(8);
+ }
+
if (UseSSE == 1) {
subptr(rsp, sizeof(jdouble)*8);
- movflt(Address(rsp,off++*sizeof(jdouble)),xmm0);
- movflt(Address(rsp,off++*sizeof(jdouble)),xmm1);
- movflt(Address(rsp,off++*sizeof(jdouble)),xmm2);
- movflt(Address(rsp,off++*sizeof(jdouble)),xmm3);
- movflt(Address(rsp,off++*sizeof(jdouble)),xmm4);
- movflt(Address(rsp,off++*sizeof(jdouble)),xmm5);
- movflt(Address(rsp,off++*sizeof(jdouble)),xmm6);
- movflt(Address(rsp,off++*sizeof(jdouble)),xmm7);
+ for (int n = 0; n < 8; n++) {
+ movflt(Address(rsp, off++*sizeof(jdouble)), as_XMMRegister(n));
+ }
} else if (UseSSE >= 2) {
if (UseAVX > 2) {
+ push(rbx);
movl(rbx, 0xffff);
-#ifdef _LP64
- kmovql(k1, rbx);
-#else
- kmovdl(k1, rbx);
-#endif
+ kmovwl(k1, rbx);
+ pop(rbx);
}
#ifdef COMPILER2
if (MaxVectorSize > 16) {
- assert(UseAVX > 0, "256bit vectors are supported only with AVX");
+ if(UseAVX > 2) {
+ // Save upper half of ZMM registes
+ subptr(rsp, 32*num_xmm_regs);
+ for (int n = 0; n < num_xmm_regs; n++) {
+ vextractf64x4h(Address(rsp, off++*32), as_XMMRegister(n));
+ }
+ off = 0;
+ }
+ assert(UseAVX > 0, "256 bit vectors are supported only with AVX");
// Save upper half of YMM registes
- subptr(rsp, 16 * LP64_ONLY(16) NOT_LP64(8));
- vextractf128h(Address(rsp, 0),xmm0);
- vextractf128h(Address(rsp, 16),xmm1);
- vextractf128h(Address(rsp, 32),xmm2);
- vextractf128h(Address(rsp, 48),xmm3);
- vextractf128h(Address(rsp, 64),xmm4);
- vextractf128h(Address(rsp, 80),xmm5);
- vextractf128h(Address(rsp, 96),xmm6);
- vextractf128h(Address(rsp,112),xmm7);
-#ifdef _LP64
- vextractf128h(Address(rsp,128),xmm8);
- vextractf128h(Address(rsp,144),xmm9);
- vextractf128h(Address(rsp,160),xmm10);
- vextractf128h(Address(rsp,176),xmm11);
- vextractf128h(Address(rsp,192),xmm12);
- vextractf128h(Address(rsp,208),xmm13);
- vextractf128h(Address(rsp,224),xmm14);
- vextractf128h(Address(rsp,240),xmm15);
-#endif
+ subptr(rsp, 16*num_xmm_regs);
+ for (int n = 0; n < num_xmm_regs; n++) {
+ vextractf128h(Address(rsp, off++*16), as_XMMRegister(n));
+ }
}
#endif
- // Save whole 128bit (16 bytes) XMM regiters
- subptr(rsp, 16 * LP64_ONLY(16) NOT_LP64(8));
- movdqu(Address(rsp,off++*16),xmm0);
- movdqu(Address(rsp,off++*16),xmm1);
- movdqu(Address(rsp,off++*16),xmm2);
- movdqu(Address(rsp,off++*16),xmm3);
- movdqu(Address(rsp,off++*16),xmm4);
- movdqu(Address(rsp,off++*16),xmm5);
- movdqu(Address(rsp,off++*16),xmm6);
- movdqu(Address(rsp,off++*16),xmm7);
+ // Save whole 128bit (16 bytes) XMM registers
+ subptr(rsp, 16*num_xmm_regs);
+ off = 0;
#ifdef _LP64
- movdqu(Address(rsp,off++*16),xmm8);
- movdqu(Address(rsp,off++*16),xmm9);
- movdqu(Address(rsp,off++*16),xmm10);
- movdqu(Address(rsp,off++*16),xmm11);
- movdqu(Address(rsp,off++*16),xmm12);
- movdqu(Address(rsp,off++*16),xmm13);
- movdqu(Address(rsp,off++*16),xmm14);
- movdqu(Address(rsp,off++*16),xmm15);
+ if (VM_Version::supports_avx512novl()) {
+ for (int n = 0; n < num_xmm_regs; n++) {
+ vextractf32x4h(Address(rsp, off++*16), as_XMMRegister(n), 0);
+ }
+ } else {
+ for (int n = 0; n < num_xmm_regs; n++) {
+ movdqu(Address(rsp, off++*16), as_XMMRegister(n));
+ }
+ }
+#else
+ for (int n = 0; n < num_xmm_regs; n++) {
+ movdqu(Address(rsp, off++*16), as_XMMRegister(n));
+ }
#endif
}
@@ -4689,7 +4814,7 @@
movsd(Address(rsp, 0), xmm0);
fld_d(Address(rsp, 0));
#endif // _LP64
- addptr(rsp, sizeof(jdouble) * nb_args);
+ addptr(rsp, sizeof(jdouble)*nb_args);
if (num_fpu_regs_in_use > 1) {
// Must save return value to stack and then restore entire FPU
// stack except incoming arguments
@@ -4699,63 +4824,50 @@
addptr(rsp, sizeof(jdouble));
}
fld_d(Address(rsp, (nb_args-1)*sizeof(jdouble)));
- addptr(rsp, sizeof(jdouble) * nb_args);
+ addptr(rsp, sizeof(jdouble)*nb_args);
}
off = 0;
if (UseSSE == 1) {
- movflt(xmm0, Address(rsp,off++*sizeof(jdouble)));
- movflt(xmm1, Address(rsp,off++*sizeof(jdouble)));
- movflt(xmm2, Address(rsp,off++*sizeof(jdouble)));
- movflt(xmm3, Address(rsp,off++*sizeof(jdouble)));
- movflt(xmm4, Address(rsp,off++*sizeof(jdouble)));
- movflt(xmm5, Address(rsp,off++*sizeof(jdouble)));
- movflt(xmm6, Address(rsp,off++*sizeof(jdouble)));
- movflt(xmm7, Address(rsp,off++*sizeof(jdouble)));
+ for (int n = 0; n < 8; n++) {
+ movflt(as_XMMRegister(n), Address(rsp, off++*sizeof(jdouble)));
+ }
addptr(rsp, sizeof(jdouble)*8);
} else if (UseSSE >= 2) {
// Restore whole 128bit (16 bytes) XMM regiters
- movdqu(xmm0, Address(rsp,off++*16));
- movdqu(xmm1, Address(rsp,off++*16));
- movdqu(xmm2, Address(rsp,off++*16));
- movdqu(xmm3, Address(rsp,off++*16));
- movdqu(xmm4, Address(rsp,off++*16));
- movdqu(xmm5, Address(rsp,off++*16));
- movdqu(xmm6, Address(rsp,off++*16));
- movdqu(xmm7, Address(rsp,off++*16));
#ifdef _LP64
- movdqu(xmm8, Address(rsp,off++*16));
- movdqu(xmm9, Address(rsp,off++*16));
- movdqu(xmm10, Address(rsp,off++*16));
- movdqu(xmm11, Address(rsp,off++*16));
- movdqu(xmm12, Address(rsp,off++*16));
- movdqu(xmm13, Address(rsp,off++*16));
- movdqu(xmm14, Address(rsp,off++*16));
- movdqu(xmm15, Address(rsp,off++*16));
+ if (VM_Version::supports_avx512novl()) {
+ for (int n = 0; n < num_xmm_regs; n++) {
+ vinsertf32x4h(as_XMMRegister(n), Address(rsp, off++*16), 0);
+ }
+ }
+ else {
+ for (int n = 0; n < num_xmm_regs; n++) {
+ movdqu(as_XMMRegister(n), Address(rsp, off++*16));
+ }
+ }
+#else
+ for (int n = 0; n < num_xmm_regs; n++) {
+ movdqu(as_XMMRegister(n), Address(rsp, off++ * 16));
+ }
#endif
- addptr(rsp, 16 * LP64_ONLY(16) NOT_LP64(8));
+ addptr(rsp, 16*num_xmm_regs);
+
#ifdef COMPILER2
if (MaxVectorSize > 16) {
// Restore upper half of YMM registes.
- vinsertf128h(xmm0, Address(rsp, 0));
- vinsertf128h(xmm1, Address(rsp, 16));
- vinsertf128h(xmm2, Address(rsp, 32));
- vinsertf128h(xmm3, Address(rsp, 48));
- vinsertf128h(xmm4, Address(rsp, 64));
- vinsertf128h(xmm5, Address(rsp, 80));
- vinsertf128h(xmm6, Address(rsp, 96));
- vinsertf128h(xmm7, Address(rsp,112));
-#ifdef _LP64
- vinsertf128h(xmm8, Address(rsp,128));
- vinsertf128h(xmm9, Address(rsp,144));
- vinsertf128h(xmm10, Address(rsp,160));
- vinsertf128h(xmm11, Address(rsp,176));
- vinsertf128h(xmm12, Address(rsp,192));
- vinsertf128h(xmm13, Address(rsp,208));
- vinsertf128h(xmm14, Address(rsp,224));
- vinsertf128h(xmm15, Address(rsp,240));
-#endif
- addptr(rsp, 16 * LP64_ONLY(16) NOT_LP64(8));
+ off = 0;
+ for (int n = 0; n < num_xmm_regs; n++) {
+ vinsertf128h(as_XMMRegister(n), Address(rsp, off++*16));
+ }
+ addptr(rsp, 16*num_xmm_regs);
+ if(UseAVX > 2) {
+ off = 0;
+ for (int n = 0; n < num_xmm_regs; n++) {
+ vinsertf64x4h(as_XMMRegister(n), Address(rsp, off++*32));
+ }
+ addptr(rsp, 32*num_xmm_regs);
+ }
}
#endif
}
@@ -7095,11 +7207,7 @@
Label L_fill_32_bytes_loop, L_check_fill_8_bytes, L_fill_8_bytes_loop, L_fill_8_bytes;
if (UseAVX > 2) {
movl(rtmp, 0xffff);
-#ifdef _LP64
- kmovql(k1, rtmp);
-#else
- kmovdl(k1, rtmp);
-#endif
+ kmovwl(k1, rtmp);
}
movdl(xtmp, value);
if (UseAVX > 2 && UseUnalignedLoadStores) {
@@ -7112,7 +7220,7 @@
align(16);
BIND(L_fill_64_bytes_loop);
- evmovdqu(Address(to, 0), xtmp, Assembler::AVX_512bit);
+ evmovdqul(Address(to, 0), xtmp, Assembler::AVX_512bit);
addptr(to, 64);
subl(count, 16 << shift);
jcc(Assembler::greaterEqual, L_fill_64_bytes_loop);
@@ -7120,7 +7228,7 @@
BIND(L_check_fill_32_bytes);
addl(count, 8 << shift);
jccb(Assembler::less, L_check_fill_8_bytes);
- evmovdqu(Address(to, 0), xtmp, Assembler::AVX_256bit);
+ evmovdqul(Address(to, 0), xtmp, Assembler::AVX_256bit);
addptr(to, 32);
subl(count, 8 << shift);
@@ -8399,6 +8507,14 @@
Label L_tail, L_tail_restore, L_tail_loop, L_exit, L_align_loop, L_aligned;
Label L_fold_tail, L_fold_128b, L_fold_512b, L_fold_512b_loop, L_fold_tail_loop;
+ // For EVEX with VL and BW, provide a standard mask, VL = 128 will guide the merge
+ // context for the registers used, where all instructions below are using 128-bit mode
+ // On EVEX without VL and BW, these instructions will all be AVX.
+ if (VM_Version::supports_avx512vlbw()) {
+ movl(tmp, 0xffff);
+ kmovwl(k1, tmp);
+ }
+
lea(table, ExternalAddress(StubRoutines::crc_table_addr()));
notl(crc); // ~crc
cmpl(len, 16);
--- a/hotspot/src/cpu/x86/vm/macroAssembler_x86.hpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/cpu/x86/vm/macroAssembler_x86.hpp Mon Sep 21 17:49:57 2015 +0200
@@ -1069,6 +1069,9 @@
void vsubss(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vsubss(dst, nds, src); }
void vsubss(XMMRegister dst, XMMRegister nds, AddressLiteral src);
+ void vnegatess(XMMRegister dst, XMMRegister nds, AddressLiteral src);
+ void vnegatesd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
+
// AVX Vector instructions
void vxorpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) { Assembler::vxorpd(dst, nds, src, vector_len); }
--- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp Mon Sep 21 17:49:57 2015 +0200
@@ -115,6 +115,7 @@
OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_frame_words,
int* total_frame_words, bool verify_fpu, bool save_vectors) {
int vect_words = 0;
+ int num_xmm_regs = XMMRegisterImpl::number_of_registers;
#ifdef COMPILER2
if (save_vectors) {
assert(UseAVX > 0, "512bit vectors are supported only with EVEX");
@@ -173,59 +174,50 @@
__ fldcw(ExternalAddress(StubRoutines::addr_fpu_cntrl_wrd_std()));
}
+ int off = st0_off;
+ int delta = st1_off - off;
+
// Save the FPU registers in de-opt-able form
-
- __ fstp_d(Address(rsp, st0_off*wordSize)); // st(0)
- __ fstp_d(Address(rsp, st1_off*wordSize)); // st(1)
- __ fstp_d(Address(rsp, st2_off*wordSize)); // st(2)
- __ fstp_d(Address(rsp, st3_off*wordSize)); // st(3)
- __ fstp_d(Address(rsp, st4_off*wordSize)); // st(4)
- __ fstp_d(Address(rsp, st5_off*wordSize)); // st(5)
- __ fstp_d(Address(rsp, st6_off*wordSize)); // st(6)
- __ fstp_d(Address(rsp, st7_off*wordSize)); // st(7)
-
- if( UseSSE == 1 ) { // Save the XMM state
- __ movflt(Address(rsp,xmm0_off*wordSize),xmm0);
- __ movflt(Address(rsp,xmm1_off*wordSize),xmm1);
- __ movflt(Address(rsp,xmm2_off*wordSize),xmm2);
- __ movflt(Address(rsp,xmm3_off*wordSize),xmm3);
- __ movflt(Address(rsp,xmm4_off*wordSize),xmm4);
- __ movflt(Address(rsp,xmm5_off*wordSize),xmm5);
- __ movflt(Address(rsp,xmm6_off*wordSize),xmm6);
- __ movflt(Address(rsp,xmm7_off*wordSize),xmm7);
- } else if( UseSSE >= 2 ) {
+ for (int n = 0; n < FloatRegisterImpl::number_of_registers; n++) {
+ __ fstp_d(Address(rsp, off*wordSize));
+ off += delta;
+ }
+
+ off = xmm0_off;
+ delta = xmm1_off - off;
+ if(UseSSE == 1) { // Save the XMM state
+ for (int n = 0; n < num_xmm_regs; n++) {
+ __ movflt(Address(rsp, off*wordSize), as_XMMRegister(n));
+ off += delta;
+ }
+ } else if(UseSSE >= 2) {
// Save whole 128bit (16 bytes) XMM regiters
- __ movdqu(Address(rsp,xmm0_off*wordSize),xmm0);
- __ movdqu(Address(rsp,xmm1_off*wordSize),xmm1);
- __ movdqu(Address(rsp,xmm2_off*wordSize),xmm2);
- __ movdqu(Address(rsp,xmm3_off*wordSize),xmm3);
- __ movdqu(Address(rsp,xmm4_off*wordSize),xmm4);
- __ movdqu(Address(rsp,xmm5_off*wordSize),xmm5);
- __ movdqu(Address(rsp,xmm6_off*wordSize),xmm6);
- __ movdqu(Address(rsp,xmm7_off*wordSize),xmm7);
+ if (VM_Version::supports_avx512novl()) {
+ for (int n = 0; n < num_xmm_regs; n++) {
+ __ vextractf32x4h(Address(rsp, off*wordSize), as_XMMRegister(n), 0);
+ off += delta;
+ }
+ } else {
+ for (int n = 0; n < num_xmm_regs; n++) {
+ __ movdqu(Address(rsp, off*wordSize), as_XMMRegister(n));
+ off += delta;
+ }
+ }
}
if (vect_words > 0) {
assert(vect_words*wordSize == 128, "");
__ subptr(rsp, 128); // Save upper half of YMM registes
- __ vextractf128h(Address(rsp, 0),xmm0);
- __ vextractf128h(Address(rsp, 16),xmm1);
- __ vextractf128h(Address(rsp, 32),xmm2);
- __ vextractf128h(Address(rsp, 48),xmm3);
- __ vextractf128h(Address(rsp, 64),xmm4);
- __ vextractf128h(Address(rsp, 80),xmm5);
- __ vextractf128h(Address(rsp, 96),xmm6);
- __ vextractf128h(Address(rsp,112),xmm7);
+ off = 0;
+ for (int n = 0; n < num_xmm_regs; n++) {
+ __ vextractf128h(Address(rsp, off++*16), as_XMMRegister(n));
+ }
if (UseAVX > 2) {
__ subptr(rsp, 256); // Save upper half of ZMM registes
- __ vextractf64x4h(Address(rsp, 0), xmm0);
- __ vextractf64x4h(Address(rsp, 32), xmm1);
- __ vextractf64x4h(Address(rsp, 64), xmm2);
- __ vextractf64x4h(Address(rsp, 96), xmm3);
- __ vextractf64x4h(Address(rsp, 128), xmm4);
- __ vextractf64x4h(Address(rsp, 160), xmm5);
- __ vextractf64x4h(Address(rsp, 192), xmm6);
- __ vextractf64x4h(Address(rsp, 224), xmm7);
+ off = 0;
+ for (int n = 0; n < num_xmm_regs; n++) {
+ __ vextractf64x4h(Address(rsp, off++*32), as_XMMRegister(n));
+ }
}
}
@@ -238,58 +230,40 @@
OopMap* map = new OopMap( frame_words, 0 );
#define STACK_OFFSET(x) VMRegImpl::stack2reg((x) + additional_frame_words)
-
- map->set_callee_saved(STACK_OFFSET( rax_off), rax->as_VMReg());
- map->set_callee_saved(STACK_OFFSET( rcx_off), rcx->as_VMReg());
- map->set_callee_saved(STACK_OFFSET( rdx_off), rdx->as_VMReg());
- map->set_callee_saved(STACK_OFFSET( rbx_off), rbx->as_VMReg());
+#define NEXTREG(x) (x)->as_VMReg()->next()
+
+ map->set_callee_saved(STACK_OFFSET(rax_off), rax->as_VMReg());
+ map->set_callee_saved(STACK_OFFSET(rcx_off), rcx->as_VMReg());
+ map->set_callee_saved(STACK_OFFSET(rdx_off), rdx->as_VMReg());
+ map->set_callee_saved(STACK_OFFSET(rbx_off), rbx->as_VMReg());
// rbp, location is known implicitly, no oopMap
- map->set_callee_saved(STACK_OFFSET( rsi_off), rsi->as_VMReg());
- map->set_callee_saved(STACK_OFFSET( rdi_off), rdi->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(st0_off), as_FloatRegister(0)->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(st1_off), as_FloatRegister(1)->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(st2_off), as_FloatRegister(2)->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(st3_off), as_FloatRegister(3)->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(st4_off), as_FloatRegister(4)->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(st5_off), as_FloatRegister(5)->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(st6_off), as_FloatRegister(6)->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(st7_off), as_FloatRegister(7)->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm0_off), xmm0->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm1_off), xmm1->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm2_off), xmm2->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm3_off), xmm3->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm4_off), xmm4->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm5_off), xmm5->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm6_off), xmm6->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm7_off), xmm7->as_VMReg());
- // %%% This is really a waste but we'll keep things as they were for now
- if (true) {
-#define NEXTREG(x) (x)->as_VMReg()->next()
- map->set_callee_saved(STACK_OFFSET(st0H_off), NEXTREG(as_FloatRegister(0)));
- map->set_callee_saved(STACK_OFFSET(st1H_off), NEXTREG(as_FloatRegister(1)));
- map->set_callee_saved(STACK_OFFSET(st2H_off), NEXTREG(as_FloatRegister(2)));
- map->set_callee_saved(STACK_OFFSET(st3H_off), NEXTREG(as_FloatRegister(3)));
- map->set_callee_saved(STACK_OFFSET(st4H_off), NEXTREG(as_FloatRegister(4)));
- map->set_callee_saved(STACK_OFFSET(st5H_off), NEXTREG(as_FloatRegister(5)));
- map->set_callee_saved(STACK_OFFSET(st6H_off), NEXTREG(as_FloatRegister(6)));
- map->set_callee_saved(STACK_OFFSET(st7H_off), NEXTREG(as_FloatRegister(7)));
- map->set_callee_saved(STACK_OFFSET(xmm0H_off), NEXTREG(xmm0));
- map->set_callee_saved(STACK_OFFSET(xmm1H_off), NEXTREG(xmm1));
- map->set_callee_saved(STACK_OFFSET(xmm2H_off), NEXTREG(xmm2));
- map->set_callee_saved(STACK_OFFSET(xmm3H_off), NEXTREG(xmm3));
- map->set_callee_saved(STACK_OFFSET(xmm4H_off), NEXTREG(xmm4));
- map->set_callee_saved(STACK_OFFSET(xmm5H_off), NEXTREG(xmm5));
- map->set_callee_saved(STACK_OFFSET(xmm6H_off), NEXTREG(xmm6));
- map->set_callee_saved(STACK_OFFSET(xmm7H_off), NEXTREG(xmm7));
+ map->set_callee_saved(STACK_OFFSET(rsi_off), rsi->as_VMReg());
+ map->set_callee_saved(STACK_OFFSET(rdi_off), rdi->as_VMReg());
+ // %%% This is really a waste but we'll keep things as they were for now for the upper component
+ off = st0_off;
+ delta = st1_off - off;
+ for (int n = 0; n < FloatRegisterImpl::number_of_registers; n++) {
+ FloatRegister freg_name = as_FloatRegister(n);
+ map->set_callee_saved(STACK_OFFSET(off), freg_name->as_VMReg());
+ map->set_callee_saved(STACK_OFFSET(off+1), NEXTREG(freg_name));
+ off += delta;
+ }
+ off = xmm0_off;
+ delta = xmm1_off - off;
+ for (int n = 0; n < num_xmm_regs; n++) {
+ XMMRegister xmm_name = as_XMMRegister(n);
+ map->set_callee_saved(STACK_OFFSET(off), xmm_name->as_VMReg());
+ map->set_callee_saved(STACK_OFFSET(off+1), NEXTREG(xmm_name));
+ off += delta;
+ }
#undef NEXTREG
#undef STACK_OFFSET
- }
return map;
-
}
void RegisterSaver::restore_live_registers(MacroAssembler* masm, bool restore_vectors) {
+ int num_xmm_regs = XMMRegisterImpl::number_of_registers;
// Recover XMM & FPU state
int additional_frame_bytes = 0;
#ifdef COMPILER2
@@ -301,52 +275,43 @@
#else
assert(!restore_vectors, "vectors are generated only by C2");
#endif
+ int off = xmm0_off;
+ int delta = xmm1_off - off;
+
if (UseSSE == 1) {
assert(additional_frame_bytes == 0, "");
- __ movflt(xmm0,Address(rsp,xmm0_off*wordSize));
- __ movflt(xmm1,Address(rsp,xmm1_off*wordSize));
- __ movflt(xmm2,Address(rsp,xmm2_off*wordSize));
- __ movflt(xmm3,Address(rsp,xmm3_off*wordSize));
- __ movflt(xmm4,Address(rsp,xmm4_off*wordSize));
- __ movflt(xmm5,Address(rsp,xmm5_off*wordSize));
- __ movflt(xmm6,Address(rsp,xmm6_off*wordSize));
- __ movflt(xmm7,Address(rsp,xmm7_off*wordSize));
+ for (int n = 0; n < num_xmm_regs; n++) {
+ __ movflt(as_XMMRegister(n), Address(rsp, off*wordSize));
+ off += delta;
+ }
} else if (UseSSE >= 2) {
-#define STACK_ADDRESS(x) Address(rsp,(x)*wordSize + additional_frame_bytes)
- __ movdqu(xmm0,STACK_ADDRESS(xmm0_off));
- __ movdqu(xmm1,STACK_ADDRESS(xmm1_off));
- __ movdqu(xmm2,STACK_ADDRESS(xmm2_off));
- __ movdqu(xmm3,STACK_ADDRESS(xmm3_off));
- __ movdqu(xmm4,STACK_ADDRESS(xmm4_off));
- __ movdqu(xmm5,STACK_ADDRESS(xmm5_off));
- __ movdqu(xmm6,STACK_ADDRESS(xmm6_off));
- __ movdqu(xmm7,STACK_ADDRESS(xmm7_off));
-#undef STACK_ADDRESS
+ if (VM_Version::supports_avx512novl()) {
+ for (int n = 0; n < num_xmm_regs; n++) {
+ __ vinsertf32x4h(as_XMMRegister(n), Address(rsp, off*wordSize+additional_frame_bytes), 0);
+ off += delta;
+ }
+ } else {
+ for (int n = 0; n < num_xmm_regs; n++) {
+ __ movdqu(as_XMMRegister(n), Address(rsp, off*wordSize+additional_frame_bytes));
+ off += delta;
+ }
+ }
}
if (restore_vectors) {
+ if (UseAVX > 2) {
+ off = 0;
+ for (int n = 0; n < num_xmm_regs; n++) {
+ __ vinsertf64x4h(as_XMMRegister(n), Address(rsp, off++*32));
+ }
+ __ addptr(rsp, additional_frame_bytes*2); // Save upper half of ZMM registes
+ }
// Restore upper half of YMM registes.
assert(additional_frame_bytes == 128, "");
- __ vinsertf128h(xmm0, Address(rsp, 0));
- __ vinsertf128h(xmm1, Address(rsp, 16));
- __ vinsertf128h(xmm2, Address(rsp, 32));
- __ vinsertf128h(xmm3, Address(rsp, 48));
- __ vinsertf128h(xmm4, Address(rsp, 64));
- __ vinsertf128h(xmm5, Address(rsp, 80));
- __ vinsertf128h(xmm6, Address(rsp, 96));
- __ vinsertf128h(xmm7, Address(rsp,112));
- __ addptr(rsp, additional_frame_bytes);
- if (UseAVX > 2) {
- additional_frame_bytes = 256;
- __ vinsertf64x4h(xmm0, Address(rsp, 0));
- __ vinsertf64x4h(xmm1, Address(rsp, 32));
- __ vinsertf64x4h(xmm2, Address(rsp, 64));
- __ vinsertf64x4h(xmm3, Address(rsp, 96));
- __ vinsertf64x4h(xmm4, Address(rsp, 128));
- __ vinsertf64x4h(xmm5, Address(rsp, 160));
- __ vinsertf64x4h(xmm6, Address(rsp, 192));
- __ vinsertf64x4h(xmm7, Address(rsp, 224));
- __ addptr(rsp, additional_frame_bytes);
+ off = 0;
+ for (int n = 0; n < num_xmm_regs; n++) {
+ __ vinsertf128h(as_XMMRegister(n), Address(rsp, off++*16));
}
+ __ addptr(rsp, additional_frame_bytes); // Save upper half of YMM registes
}
__ pop_FPU_state();
__ addptr(rsp, FPU_regs_live*wordSize); // Pop FPU registers
--- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Mon Sep 21 17:49:57 2015 +0200
@@ -69,7 +69,9 @@
class RegisterSaver {
// Capture info about frame layout. Layout offsets are in jint
// units because compiler frame slots are jints.
+#define HALF_ZMM_BANK_WORDS 128
#define DEF_XMM_OFFS(regnum) xmm ## regnum ## _off = xmm_off + (regnum)*16/BytesPerInt, xmm ## regnum ## H_off
+#define DEF_ZMM_OFFS(regnum) zmm ## regnum ## _off = zmm_off + (regnum-16)*64/BytesPerInt, zmm ## regnum ## H_off
enum layout {
fpu_state_off = frame::arg_reg_save_area_bytes/BytesPerInt, // fxsave save area
xmm_off = fpu_state_off + 160/BytesPerInt, // offset in fxsave save area
@@ -89,23 +91,24 @@
DEF_XMM_OFFS(13),
DEF_XMM_OFFS(14),
DEF_XMM_OFFS(15),
- DEF_XMM_OFFS(16),
- DEF_XMM_OFFS(17),
- DEF_XMM_OFFS(18),
- DEF_XMM_OFFS(19),
- DEF_XMM_OFFS(20),
- DEF_XMM_OFFS(21),
- DEF_XMM_OFFS(22),
- DEF_XMM_OFFS(23),
- DEF_XMM_OFFS(24),
- DEF_XMM_OFFS(25),
- DEF_XMM_OFFS(26),
- DEF_XMM_OFFS(27),
- DEF_XMM_OFFS(28),
- DEF_XMM_OFFS(29),
- DEF_XMM_OFFS(30),
- DEF_XMM_OFFS(31),
- fpu_state_end = fpu_state_off + ((FPUStateSizeInWords - 1)*wordSize / BytesPerInt),
+ zmm_off = fpu_state_off + ((FPUStateSizeInWords - (HALF_ZMM_BANK_WORDS + 1))*wordSize / BytesPerInt),
+ DEF_ZMM_OFFS(16),
+ DEF_ZMM_OFFS(17),
+ DEF_ZMM_OFFS(18),
+ DEF_ZMM_OFFS(19),
+ DEF_ZMM_OFFS(20),
+ DEF_ZMM_OFFS(21),
+ DEF_ZMM_OFFS(22),
+ DEF_ZMM_OFFS(23),
+ DEF_ZMM_OFFS(24),
+ DEF_ZMM_OFFS(25),
+ DEF_ZMM_OFFS(26),
+ DEF_ZMM_OFFS(27),
+ DEF_ZMM_OFFS(28),
+ DEF_ZMM_OFFS(29),
+ DEF_ZMM_OFFS(30),
+ DEF_ZMM_OFFS(31),
+ fpu_state_end = fpu_state_off + ((FPUStateSizeInWords-1)*wordSize / BytesPerInt),
fpu_stateH_end,
r15_off, r15H_off,
r14_off, r14H_off,
@@ -155,9 +158,10 @@
OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_frame_words, int* total_frame_words, bool save_vectors) {
int vect_words = 0;
- int num_xmm_regs = 16;
- if (UseAVX > 2) {
- num_xmm_regs = 32;
+ int off = 0;
+ int num_xmm_regs = XMMRegisterImpl::number_of_registers;
+ if (UseAVX < 3) {
+ num_xmm_regs = num_xmm_regs/2;
}
#ifdef COMPILER2
if (save_vectors) {
@@ -165,9 +169,7 @@
assert(MaxVectorSize == 64, "only 512bit vectors are supported now");
// Save upper half of YMM registers
vect_words = 16 * num_xmm_regs / wordSize;
- additional_frame_words += vect_words;
- if (UseAVX > 2) {
- // Save upper half of ZMM registers as well
+ if (UseAVX < 3) {
additional_frame_words += vect_words;
}
}
@@ -195,77 +197,13 @@
__ enter(); // rsp becomes 16-byte aligned here
__ push_CPU_state(); // Push a multiple of 16 bytes
- if (vect_words > 0) {
+ // push cpu state handles this on EVEX enabled targets
+ if ((vect_words > 0) && (UseAVX < 3)) {
assert(vect_words*wordSize >= 256, "");
- __ subptr(rsp, 256); // Save upper half of YMM registes(0..15)
- __ vextractf128h(Address(rsp, 0), xmm0);
- __ vextractf128h(Address(rsp, 16), xmm1);
- __ vextractf128h(Address(rsp, 32), xmm2);
- __ vextractf128h(Address(rsp, 48), xmm3);
- __ vextractf128h(Address(rsp, 64), xmm4);
- __ vextractf128h(Address(rsp, 80), xmm5);
- __ vextractf128h(Address(rsp, 96), xmm6);
- __ vextractf128h(Address(rsp, 112), xmm7);
- __ vextractf128h(Address(rsp, 128), xmm8);
- __ vextractf128h(Address(rsp, 144), xmm9);
- __ vextractf128h(Address(rsp, 160), xmm10);
- __ vextractf128h(Address(rsp, 176), xmm11);
- __ vextractf128h(Address(rsp, 192), xmm12);
- __ vextractf128h(Address(rsp, 208), xmm13);
- __ vextractf128h(Address(rsp, 224), xmm14);
- __ vextractf128h(Address(rsp, 240), xmm15);
- if (UseAVX > 2) {
- __ subptr(rsp, 256); // Save upper half of YMM registes(16..31)
- __ vextractf128h(Address(rsp, 0), xmm16);
- __ vextractf128h(Address(rsp, 16), xmm17);
- __ vextractf128h(Address(rsp, 32), xmm18);
- __ vextractf128h(Address(rsp, 48), xmm19);
- __ vextractf128h(Address(rsp, 64), xmm20);
- __ vextractf128h(Address(rsp, 80), xmm21);
- __ vextractf128h(Address(rsp, 96), xmm22);
- __ vextractf128h(Address(rsp, 112), xmm23);
- __ vextractf128h(Address(rsp, 128), xmm24);
- __ vextractf128h(Address(rsp, 144), xmm25);
- __ vextractf128h(Address(rsp, 160), xmm26);
- __ vextractf128h(Address(rsp, 176), xmm27);
- __ vextractf128h(Address(rsp, 192), xmm28);
- __ vextractf128h(Address(rsp, 208), xmm29);
- __ vextractf128h(Address(rsp, 224), xmm30);
- __ vextractf128h(Address(rsp, 240), xmm31);
- // Now handle the ZMM registers (0..31)
- __ subptr(rsp, 1024); // Save upper half of ZMM registes
- __ vextractf64x4h(Address(rsp, 0), xmm0);
- __ vextractf64x4h(Address(rsp, 32), xmm1);
- __ vextractf64x4h(Address(rsp, 64), xmm2);
- __ vextractf64x4h(Address(rsp, 96), xmm3);
- __ vextractf64x4h(Address(rsp, 128), xmm4);
- __ vextractf64x4h(Address(rsp, 160), xmm5);
- __ vextractf64x4h(Address(rsp, 192), xmm6);
- __ vextractf64x4h(Address(rsp, 224), xmm7);
- __ vextractf64x4h(Address(rsp, 256), xmm8);
- __ vextractf64x4h(Address(rsp, 288), xmm9);
- __ vextractf64x4h(Address(rsp, 320), xmm10);
- __ vextractf64x4h(Address(rsp, 352), xmm11);
- __ vextractf64x4h(Address(rsp, 384), xmm12);
- __ vextractf64x4h(Address(rsp, 416), xmm13);
- __ vextractf64x4h(Address(rsp, 448), xmm14);
- __ vextractf64x4h(Address(rsp, 480), xmm15);
- __ vextractf64x4h(Address(rsp, 512), xmm16);
- __ vextractf64x4h(Address(rsp, 544), xmm17);
- __ vextractf64x4h(Address(rsp, 576), xmm18);
- __ vextractf64x4h(Address(rsp, 608), xmm19);
- __ vextractf64x4h(Address(rsp, 640), xmm20);
- __ vextractf64x4h(Address(rsp, 672), xmm21);
- __ vextractf64x4h(Address(rsp, 704), xmm22);
- __ vextractf64x4h(Address(rsp, 736), xmm23);
- __ vextractf64x4h(Address(rsp, 768), xmm24);
- __ vextractf64x4h(Address(rsp, 800), xmm25);
- __ vextractf64x4h(Address(rsp, 832), xmm26);
- __ vextractf64x4h(Address(rsp, 864), xmm27);
- __ vextractf64x4h(Address(rsp, 896), xmm28);
- __ vextractf64x4h(Address(rsp, 928), xmm29);
- __ vextractf64x4h(Address(rsp, 960), xmm30);
- __ vextractf64x4h(Address(rsp, 992), xmm31);
+ // Save upper half of YMM registes(0..num_xmm_regs)
+ __ subptr(rsp, num_xmm_regs*16);
+ for (int n = 0; n < num_xmm_regs; n++) {
+ __ vextractf128h(Address(rsp, off++*16), as_XMMRegister(n));
}
}
if (frame::arg_reg_save_area_bytes != 0) {
@@ -299,39 +237,24 @@
map->set_callee_saved(STACK_OFFSET( r13_off ), r13->as_VMReg());
map->set_callee_saved(STACK_OFFSET( r14_off ), r14->as_VMReg());
map->set_callee_saved(STACK_OFFSET( r15_off ), r15->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm0_off ), xmm0->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm1_off ), xmm1->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm2_off ), xmm2->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm3_off ), xmm3->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm4_off ), xmm4->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm5_off ), xmm5->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm6_off ), xmm6->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm7_off ), xmm7->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm8_off ), xmm8->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm9_off ), xmm9->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm10_off), xmm10->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm11_off), xmm11->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm12_off), xmm12->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm13_off), xmm13->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm14_off), xmm14->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm15_off), xmm15->as_VMReg());
- if (UseAVX > 2) {
- map->set_callee_saved(STACK_OFFSET(xmm16_off), xmm16->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm17_off), xmm17->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm18_off), xmm18->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm19_off), xmm19->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm20_off), xmm20->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm21_off), xmm21->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm22_off), xmm22->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm23_off), xmm23->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm24_off), xmm24->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm25_off), xmm25->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm26_off), xmm26->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm27_off), xmm27->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm28_off), xmm28->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm29_off), xmm29->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm30_off), xmm30->as_VMReg());
- map->set_callee_saved(STACK_OFFSET(xmm31_off), xmm31->as_VMReg());
+ // For both AVX and EVEX we will use the legacy FXSAVE area for xmm0..xmm15,
+ // on EVEX enabled targets, we get it included in the xsave area
+ off = xmm0_off;
+ int delta = xmm1_off - off;
+ for (int n = 0; n < 16; n++) {
+ XMMRegister xmm_name = as_XMMRegister(n);
+ map->set_callee_saved(STACK_OFFSET(off), xmm_name->as_VMReg());
+ off += delta;
+ }
+ if(UseAVX > 2) {
+ // Obtain xmm16..xmm31 from the XSAVE area on EVEX enabled targets
+ off = zmm16_off;
+ delta = zmm17_off - off;
+ for (int n = 16; n < num_xmm_regs; n++) {
+ XMMRegister xmm_name = as_XMMRegister(n);
+ map->set_callee_saved(STACK_OFFSET(off), xmm_name->as_VMReg());
+ off += delta;
+ }
}
// %%% These should all be a waste but we'll keep things as they were for now
@@ -351,39 +274,24 @@
map->set_callee_saved(STACK_OFFSET( r13H_off ), r13->as_VMReg()->next());
map->set_callee_saved(STACK_OFFSET( r14H_off ), r14->as_VMReg()->next());
map->set_callee_saved(STACK_OFFSET( r15H_off ), r15->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm0H_off ), xmm0->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm1H_off ), xmm1->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm2H_off ), xmm2->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm3H_off ), xmm3->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm4H_off ), xmm4->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm5H_off ), xmm5->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm6H_off ), xmm6->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm7H_off ), xmm7->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm8H_off ), xmm8->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm9H_off ), xmm9->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm10H_off), xmm10->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm11H_off), xmm11->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm12H_off), xmm12->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm13H_off), xmm13->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm14H_off), xmm14->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm15H_off), xmm15->as_VMReg()->next());
+ // For both AVX and EVEX we will use the legacy FXSAVE area for xmm0..xmm15,
+ // on EVEX enabled targets, we get it included in the xsave area
+ off = xmm0H_off;
+ delta = xmm1H_off - off;
+ for (int n = 0; n < 16; n++) {
+ XMMRegister xmm_name = as_XMMRegister(n);
+ map->set_callee_saved(STACK_OFFSET(off), xmm_name->as_VMReg()->next());
+ off += delta;
+ }
if (UseAVX > 2) {
- map->set_callee_saved(STACK_OFFSET(xmm16H_off), xmm16->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm17H_off), xmm17->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm18H_off), xmm18->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm19H_off), xmm19->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm20H_off), xmm20->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm21H_off), xmm21->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm22H_off), xmm22->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm23H_off), xmm23->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm24H_off), xmm24->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm25H_off), xmm25->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm26H_off), xmm26->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm27H_off), xmm27->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm28H_off), xmm28->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm29H_off), xmm29->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm30H_off), xmm30->as_VMReg()->next());
- map->set_callee_saved(STACK_OFFSET(xmm31H_off), xmm31->as_VMReg()->next());
+ // Obtain xmm16..xmm31 from the XSAVE area on EVEX enabled targets
+ off = zmm16H_off;
+ delta = zmm17H_off - off;
+ for (int n = 16; n < num_xmm_regs; n++) {
+ XMMRegister xmm_name = as_XMMRegister(n);
+ map->set_callee_saved(STACK_OFFSET(off), xmm_name->as_VMReg()->next());
+ off += delta;
+ }
}
}
@@ -391,86 +299,25 @@
}
void RegisterSaver::restore_live_registers(MacroAssembler* masm, bool restore_vectors) {
+ int num_xmm_regs = XMMRegisterImpl::number_of_registers;
+ if (UseAVX < 3) {
+ num_xmm_regs = num_xmm_regs/2;
+ }
if (frame::arg_reg_save_area_bytes != 0) {
// Pop arg register save area
__ addptr(rsp, frame::arg_reg_save_area_bytes);
}
#ifdef COMPILER2
- if (restore_vectors) {
- // Restore upper half of YMM registes (0..15)
- assert(UseAVX > 0, "512bit vectors are supported only with AVX");
- assert(MaxVectorSize == 64, "only 512bit vectors are supported now");
- __ vinsertf128h(xmm0, Address(rsp, 0));
- __ vinsertf128h(xmm1, Address(rsp, 16));
- __ vinsertf128h(xmm2, Address(rsp, 32));
- __ vinsertf128h(xmm3, Address(rsp, 48));
- __ vinsertf128h(xmm4, Address(rsp, 64));
- __ vinsertf128h(xmm5, Address(rsp, 80));
- __ vinsertf128h(xmm6, Address(rsp, 96));
- __ vinsertf128h(xmm7, Address(rsp,112));
- __ vinsertf128h(xmm8, Address(rsp,128));
- __ vinsertf128h(xmm9, Address(rsp,144));
- __ vinsertf128h(xmm10, Address(rsp,160));
- __ vinsertf128h(xmm11, Address(rsp,176));
- __ vinsertf128h(xmm12, Address(rsp,192));
- __ vinsertf128h(xmm13, Address(rsp,208));
- __ vinsertf128h(xmm14, Address(rsp,224));
- __ vinsertf128h(xmm15, Address(rsp,240));
- __ addptr(rsp, 256);
- if (UseAVX > 2) {
- // Restore upper half of YMM registes (16..31)
- __ vinsertf128h(xmm16, Address(rsp, 0));
- __ vinsertf128h(xmm17, Address(rsp, 16));
- __ vinsertf128h(xmm18, Address(rsp, 32));
- __ vinsertf128h(xmm19, Address(rsp, 48));
- __ vinsertf128h(xmm20, Address(rsp, 64));
- __ vinsertf128h(xmm21, Address(rsp, 80));
- __ vinsertf128h(xmm22, Address(rsp, 96));
- __ vinsertf128h(xmm23, Address(rsp,112));
- __ vinsertf128h(xmm24, Address(rsp,128));
- __ vinsertf128h(xmm25, Address(rsp,144));
- __ vinsertf128h(xmm26, Address(rsp,160));
- __ vinsertf128h(xmm27, Address(rsp,176));
- __ vinsertf128h(xmm28, Address(rsp,192));
- __ vinsertf128h(xmm29, Address(rsp,208));
- __ vinsertf128h(xmm30, Address(rsp,224));
- __ vinsertf128h(xmm31, Address(rsp,240));
- __ addptr(rsp, 256);
- // Restore upper half of ZMM registes.
- __ vinsertf64x4h(xmm0, Address(rsp, 0));
- __ vinsertf64x4h(xmm1, Address(rsp, 32));
- __ vinsertf64x4h(xmm2, Address(rsp, 64));
- __ vinsertf64x4h(xmm3, Address(rsp, 96));
- __ vinsertf64x4h(xmm4, Address(rsp, 128));
- __ vinsertf64x4h(xmm5, Address(rsp, 160));
- __ vinsertf64x4h(xmm6, Address(rsp, 192));
- __ vinsertf64x4h(xmm7, Address(rsp, 224));
- __ vinsertf64x4h(xmm8, Address(rsp, 256));
- __ vinsertf64x4h(xmm9, Address(rsp, 288));
- __ vinsertf64x4h(xmm10, Address(rsp, 320));
- __ vinsertf64x4h(xmm11, Address(rsp, 352));
- __ vinsertf64x4h(xmm12, Address(rsp, 384));
- __ vinsertf64x4h(xmm13, Address(rsp, 416));
- __ vinsertf64x4h(xmm14, Address(rsp, 448));
- __ vinsertf64x4h(xmm15, Address(rsp, 480));
- __ vinsertf64x4h(xmm16, Address(rsp, 512));
- __ vinsertf64x4h(xmm17, Address(rsp, 544));
- __ vinsertf64x4h(xmm18, Address(rsp, 576));
- __ vinsertf64x4h(xmm19, Address(rsp, 608));
- __ vinsertf64x4h(xmm20, Address(rsp, 640));
- __ vinsertf64x4h(xmm21, Address(rsp, 672));
- __ vinsertf64x4h(xmm22, Address(rsp, 704));
- __ vinsertf64x4h(xmm23, Address(rsp, 736));
- __ vinsertf64x4h(xmm24, Address(rsp, 768));
- __ vinsertf64x4h(xmm25, Address(rsp, 800));
- __ vinsertf64x4h(xmm26, Address(rsp, 832));
- __ vinsertf64x4h(xmm27, Address(rsp, 864));
- __ vinsertf64x4h(xmm28, Address(rsp, 896));
- __ vinsertf64x4h(xmm29, Address(rsp, 928));
- __ vinsertf64x4h(xmm30, Address(rsp, 960));
- __ vinsertf64x4h(xmm31, Address(rsp, 992));
- __ addptr(rsp, 1024);
+ // On EVEX enabled targets everything is handled in pop fpu state
+ if ((restore_vectors) && (UseAVX < 3)) {
+ assert(UseAVX > 0, "256/512-bit vectors are supported only with AVX");
+ assert(MaxVectorSize == 64, "up to 512bit vectors are supported now");
+ int off = 0;
+ // Restore upper half of YMM registes (0..num_xmm_regs)
+ for (int n = 0; n < num_xmm_regs; n++) {
+ __ vinsertf128h(as_XMMRegister(n), Address(rsp, off++*16));
}
+ __ addptr(rsp, num_xmm_regs*16);
}
#else
assert(!restore_vectors, "vectors are generated only by C2");
--- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp Mon Sep 21 17:49:57 2015 +0200
@@ -795,6 +795,12 @@
void xmm_copy_forward(Register from, Register to_from, Register qword_count) {
assert( UseSSE >= 2, "supported cpu only" );
Label L_copy_64_bytes_loop, L_copy_64_bytes, L_copy_8_bytes, L_exit;
+ if (UseAVX > 2) {
+ __ push(rbx);
+ __ movl(rbx, 0xffff);
+ __ kmovdl(k1, rbx);
+ __ pop(rbx);
+ }
// Copy 64-byte chunks
__ jmpb(L_copy_64_bytes);
__ align(OptoLoopAlignment);
@@ -802,8 +808,8 @@
if (UseUnalignedLoadStores) {
if (UseAVX > 2) {
- __ evmovdqu(xmm0, Address(from, 0), Assembler::AVX_512bit);
- __ evmovdqu(Address(from, to_from, Address::times_1, 0), xmm0, Assembler::AVX_512bit);
+ __ evmovdqul(xmm0, Address(from, 0), Assembler::AVX_512bit);
+ __ evmovdqul(Address(from, to_from, Address::times_1, 0), xmm0, Assembler::AVX_512bit);
} else if (UseAVX == 2) {
__ vmovdqu(xmm0, Address(from, 0));
__ vmovdqu(Address(from, to_from, Address::times_1, 0), xmm0);
@@ -2217,6 +2223,15 @@
const XMMRegister xmm_temp4 = xmm5;
__ enter(); // required for proper stackwalking of RuntimeStub frame
+
+ // For EVEX with VL and BW, provide a standard mask, VL = 128 will guide the merge
+ // context for the registers used, where all instructions below are using 128-bit mode
+ // On EVEX without VL and BW, these instructions will all be AVX.
+ if (VM_Version::supports_avx512vlbw()) {
+ __ movl(rdx, 0xffff);
+ __ kmovdl(k1, rdx);
+ }
+
__ movptr(from, from_param);
__ movptr(key, key_param);
@@ -2315,6 +2330,15 @@
const XMMRegister xmm_temp4 = xmm5;
__ enter(); // required for proper stackwalking of RuntimeStub frame
+
+ // For EVEX with VL and BW, provide a standard mask, VL = 128 will guide the merge
+ // context for the registers used, where all instructions below are using 128-bit mode
+ // On EVEX without VL and BW, these instructions will all be AVX.
+ if (VM_Version::supports_avx512vlbw()) {
+ __ movl(rdx, 0xffff);
+ __ kmovdl(k1, rdx);
+ }
+
__ movptr(from, from_param);
__ movptr(key, key_param);
@@ -2441,6 +2465,14 @@
__ enter(); // required for proper stackwalking of RuntimeStub frame
handleSOERegisters(true /*saving*/);
+ // For EVEX with VL and BW, provide a standard mask, VL = 128 will guide the merge
+ // context for the registers used, where all instructions below are using 128-bit mode
+ // On EVEX without VL and BW, these instructions will all be AVX.
+ if (VM_Version::supports_avx512vlbw()) {
+ __ movl(rdx, 0xffff);
+ __ kmovdl(k1, rdx);
+ }
+
// load registers from incoming parameters
const Address from_param(rbp, 8+0);
const Address to_param (rbp, 8+4);
@@ -2602,6 +2634,14 @@
__ enter(); // required for proper stackwalking of RuntimeStub frame
handleSOERegisters(true /*saving*/);
+ // For EVEX with VL and BW, provide a standard mask, VL = 128 will guide the merge
+ // context for the registers used, where all instructions below are using 128-bit mode
+ // On EVEX without VL and BW, these instructions will all be AVX.
+ if (VM_Version::supports_avx512vlbw()) {
+ __ movl(rdx, 0xffff);
+ __ kmovdl(k1, rdx);
+ }
+
// load registers from incoming parameters
const Address from_param(rbp, 8+0);
const Address to_param (rbp, 8+4);
@@ -2782,6 +2822,14 @@
__ enter();
handleSOERegisters(true); // Save registers
+ // For EVEX with VL and BW, provide a standard mask, VL = 128 will guide the merge
+ // context for the registers used, where all instructions below are using 128-bit mode
+ // On EVEX without VL and BW, these instructions will all be AVX.
+ if (VM_Version::supports_avx512vlbw()) {
+ __ movl(rdx, 0xffff);
+ __ kmovdl(k1, rdx);
+ }
+
__ movptr(state, state_param);
__ movptr(subkeyH, subkeyH_param);
__ movptr(data, data_param);
--- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp Mon Sep 21 17:49:57 2015 +0200
@@ -269,12 +269,16 @@
__ kmovql(k1, rbx);
}
#ifdef _WIN64
+ int last_reg = 15;
if (UseAVX > 2) {
- for (int i = 6; i <= 31; i++) {
- __ movdqu(xmm_save(i), as_XMMRegister(i));
+ last_reg = 31;
+ }
+ if (VM_Version::supports_avx512novl()) {
+ for (int i = xmm_save_first; i <= last_reg; i++) {
+ __ vextractf32x4h(xmm_save(i), as_XMMRegister(i), 0);
}
} else {
- for (int i = 6; i <= 15; i++) {
+ for (int i = xmm_save_first; i <= last_reg; i++) {
__ movdqu(xmm_save(i), as_XMMRegister(i));
}
}
@@ -386,13 +390,15 @@
// restore regs belonging to calling function
#ifdef _WIN64
- int xmm_ub = 15;
- if (UseAVX > 2) {
- xmm_ub = 31;
- }
// emit the restores for xmm regs
- for (int i = 6; i <= xmm_ub; i++) {
- __ movdqu(as_XMMRegister(i), xmm_save(i));
+ if (VM_Version::supports_avx512novl()) {
+ for (int i = xmm_save_first; i <= last_reg; i++) {
+ __ vinsertf32x4h(as_XMMRegister(i), xmm_save(i), 0);
+ }
+ } else {
+ for (int i = xmm_save_first; i <= last_reg; i++) {
+ __ movdqu(as_XMMRegister(i), xmm_save(i));
+ }
}
#endif
__ movptr(r15, r15_save);
@@ -1342,11 +1348,15 @@
__ align(OptoLoopAlignment);
if (UseUnalignedLoadStores) {
Label L_end;
+ if (UseAVX > 2) {
+ __ movl(to, 0xffff);
+ __ kmovql(k1, to);
+ }
// Copy 64-bytes per iteration
__ BIND(L_loop);
if (UseAVX > 2) {
- __ evmovdqu(xmm0, Address(end_from, qword_count, Address::times_8, -56), Assembler::AVX_512bit);
- __ evmovdqu(Address(end_to, qword_count, Address::times_8, -56), xmm0, Assembler::AVX_512bit);
+ __ evmovdqul(xmm0, Address(end_from, qword_count, Address::times_8, -56), Assembler::AVX_512bit);
+ __ evmovdqul(Address(end_to, qword_count, Address::times_8, -56), xmm0, Assembler::AVX_512bit);
} else if (UseAVX == 2) {
__ vmovdqu(xmm0, Address(end_from, qword_count, Address::times_8, -56));
__ vmovdqu(Address(end_to, qword_count, Address::times_8, -56), xmm0);
@@ -1422,11 +1432,15 @@
__ align(OptoLoopAlignment);
if (UseUnalignedLoadStores) {
Label L_end;
+ if (UseAVX > 2) {
+ __ movl(to, 0xffff);
+ __ kmovql(k1, to);
+ }
// Copy 64-bytes per iteration
__ BIND(L_loop);
if (UseAVX > 2) {
- __ evmovdqu(xmm0, Address(from, qword_count, Address::times_8, 32), Assembler::AVX_512bit);
- __ evmovdqu(Address(dest, qword_count, Address::times_8, 32), xmm0, Assembler::AVX_512bit);
+ __ evmovdqul(xmm0, Address(from, qword_count, Address::times_8, 32), Assembler::AVX_512bit);
+ __ evmovdqul(Address(dest, qword_count, Address::times_8, 32), xmm0, Assembler::AVX_512bit);
} else if (UseAVX == 2) {
__ vmovdqu(xmm0, Address(from, qword_count, Address::times_8, 32));
__ vmovdqu(Address(dest, qword_count, Address::times_8, 32), xmm0);
@@ -3106,6 +3120,14 @@
__ enter(); // required for proper stackwalking of RuntimeStub frame
+ // For EVEX with VL and BW, provide a standard mask, VL = 128 will guide the merge
+ // context for the registers used, where all instructions below are using 128-bit mode
+ // On EVEX without VL and BW, these instructions will all be AVX.
+ if (VM_Version::supports_avx512vlbw()) {
+ __ movl(rax, 0xffff);
+ __ kmovql(k1, rax);
+ }
+
// keylen could be only {11, 13, 15} * 4 = {44, 52, 60}
__ movl(keylen, Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT)));
@@ -3200,6 +3222,14 @@
__ enter(); // required for proper stackwalking of RuntimeStub frame
+ // For EVEX with VL and BW, provide a standard mask, VL = 128 will guide the merge
+ // context for the registers used, where all instructions below are using 128-bit mode
+ // On EVEX without VL and BW, these instructions will all be AVX.
+ if (VM_Version::supports_avx512vlbw()) {
+ __ movl(rax, 0xffff);
+ __ kmovql(k1, rax);
+ }
+
// keylen could be only {11, 13, 15} * 4 = {44, 52, 60}
__ movl(keylen, Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT)));
@@ -3312,6 +3342,14 @@
__ enter(); // required for proper stackwalking of RuntimeStub frame
+ // For EVEX with VL and BW, provide a standard mask, VL = 128 will guide the merge
+ // context for the registers used, where all instructions below are using 128-bit mode
+ // On EVEX without VL and BW, these instructions will all be AVX.
+ if (VM_Version::supports_avx512vlbw()) {
+ __ movl(rax, 0xffff);
+ __ kmovql(k1, rax);
+ }
+
#ifdef _WIN64
// on win64, fill len_reg from stack position
__ movl(len_reg, len_mem);
@@ -3508,6 +3546,14 @@
__ enter(); // required for proper stackwalking of RuntimeStub frame
+ // For EVEX with VL and BW, provide a standard mask, VL = 128 will guide the merge
+ // context for the registers used, where all instructions below are using 128-bit mode
+ // On EVEX without VL and BW, these instructions will all be AVX.
+ if (VM_Version::supports_avx512vlbw()) {
+ __ movl(rax, 0xffff);
+ __ kmovql(k1, rax);
+ }
+
#ifdef _WIN64
// on win64, fill len_reg from stack position
__ movl(len_reg, len_mem);
@@ -3746,6 +3792,14 @@
__ enter();
+ // For EVEX with VL and BW, provide a standard mask, VL = 128 will guide the merge
+ // context for the registers used, where all instructions below are using 128-bit mode
+ // On EVEX without VL and BW, these instructions will all be AVX.
+ if (VM_Version::supports_avx512vlbw()) {
+ __ movl(rax, 0xffff);
+ __ kmovql(k1, rax);
+ }
+
#ifdef _WIN64
// save the xmm registers which must be preserved 6-10
__ subptr(rsp, -rsp_after_call_off * wordSize);
--- a/hotspot/src/cpu/x86/vm/stubRoutines_x86_32.hpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/cpu/x86/vm/stubRoutines_x86_32.hpp Mon Sep 21 17:49:57 2015 +0200
@@ -31,7 +31,7 @@
enum platform_dependent_constants {
code_size1 = 9000, // simply increase if too small (assembler will crash if too small)
- code_size2 = 22000 // simply increase if too small (assembler will crash if too small)
+ code_size2 = 30000 // simply increase if too small (assembler will crash if too small)
};
class x86 {
--- a/hotspot/src/cpu/x86/vm/stubRoutines_x86_64.hpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/cpu/x86/vm/stubRoutines_x86_64.hpp Mon Sep 21 17:49:57 2015 +0200
@@ -33,7 +33,7 @@
enum platform_dependent_constants {
code_size1 = 19000, // 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)
+ code_size2 = 32000 // simply increase if too small (assembler will crash if too small)
};
class x86 {
--- a/hotspot/src/cpu/x86/vm/vm_version_x86.cpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/cpu/x86/vm/vm_version_x86.cpp Mon Sep 21 17:49:57 2015 +0200
@@ -367,16 +367,12 @@
__ movl(rcx, VM_Version::ymm_test_value());
__ movdl(xmm0, rcx);
__ movl(rcx, 0xffff);
+ __ kmovwl(k1, rcx);
+ __ evpbroadcastd(xmm0, xmm0, Assembler::AVX_512bit);
+ __ evmovdqul(xmm7, xmm0, Assembler::AVX_512bit);
#ifdef _LP64
- __ kmovql(k1, rcx);
-#else
- __ kmovdl(k1, rcx);
-#endif
- __ evpbroadcastd(xmm0, xmm0, Assembler::AVX_512bit);
- __ evmovdqu(xmm7, xmm0, Assembler::AVX_512bit);
-#ifdef _LP64
- __ evmovdqu(xmm8, xmm0, Assembler::AVX_512bit);
- __ evmovdqu(xmm31, xmm0, Assembler::AVX_512bit);
+ __ evmovdqul(xmm8, xmm0, Assembler::AVX_512bit);
+ __ evmovdqul(xmm31, xmm0, Assembler::AVX_512bit);
#endif
VM_Version::clean_cpuFeatures();
__ jmp(save_restore_except);
@@ -427,11 +423,11 @@
UseAVX = 3;
UseSSE = 2;
__ lea(rsi, Address(rbp, in_bytes(VM_Version::zmm_save_offset())));
- __ evmovdqu(Address(rsi, 0), xmm0, Assembler::AVX_512bit);
- __ evmovdqu(Address(rsi, 64), xmm7, Assembler::AVX_512bit);
+ __ evmovdqul(Address(rsi, 0), xmm0, Assembler::AVX_512bit);
+ __ evmovdqul(Address(rsi, 64), xmm7, Assembler::AVX_512bit);
#ifdef _LP64
- __ evmovdqu(Address(rsi, 128), xmm8, Assembler::AVX_512bit);
- __ evmovdqu(Address(rsi, 192), xmm31, Assembler::AVX_512bit);
+ __ evmovdqul(Address(rsi, 128), xmm8, Assembler::AVX_512bit);
+ __ evmovdqul(Address(rsi, 192), xmm31, Assembler::AVX_512bit);
#endif
VM_Version::clean_cpuFeatures();
UseAVX = saved_useavx;
--- a/hotspot/src/cpu/x86/vm/vm_version_x86.hpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/cpu/x86/vm/vm_version_x86.hpp Mon Sep 21 17:49:57 2015 +0200
@@ -227,14 +227,15 @@
union XemXcr0Eax {
uint32_t value;
struct {
- uint32_t x87 : 1,
- sse : 1,
- ymm : 1,
- : 2,
- opmask : 1,
- zmm512 : 1,
- zmm32 : 1,
- : 24;
+ uint32_t x87 : 1,
+ sse : 1,
+ ymm : 1,
+ bndregs : 1,
+ bndcsr : 1,
+ opmask : 1,
+ zmm512 : 1,
+ zmm32 : 1,
+ : 24;
} bits;
};
@@ -703,6 +704,7 @@
static bool supports_avx512bw() { return (_cpuFeatures & CPU_AVX512BW) != 0; }
static bool supports_avx512vl() { return (_cpuFeatures & CPU_AVX512VL) != 0; }
static bool supports_avx512vlbw() { return (supports_avx512bw() && supports_avx512vl()); }
+ static bool supports_avx512novl() { return (supports_evex() && !supports_avx512vl()); }
// Intel features
static bool is_intel_family_core() { return is_intel() &&
extended_cpu_family() == CPU_FAMILY_INTEL_CORE; }
@@ -817,6 +819,12 @@
intx count = PrefetchFieldsAhead;
return count >= 0 ? count : 1;
}
+ static uint32_t get_xsave_header_lower_segment() {
+ return _cpuid_info.xem_xcr0_eax.value;
+ }
+ static uint32_t get_xsave_header_upper_segment() {
+ return _cpuid_info.xem_xcr0_edx;
+ }
};
#endif // CPU_X86_VM_VM_VERSION_X86_HPP
--- a/hotspot/src/cpu/x86/vm/x86.ad Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/cpu/x86/vm/x86.ad Mon Sep 21 17:49:57 2015 +0200
@@ -1661,46 +1661,55 @@
if (!has_match_rule(opcode))
return false;
+ bool ret_value = true;
switch (opcode) {
case Op_PopCountI:
case Op_PopCountL:
if (!UsePopCountInstruction)
- return false;
- break;
+ ret_value = false;
+ break;
case Op_MulVI:
if ((UseSSE < 4) && (UseAVX < 1)) // only with SSE4_1 or AVX
- return false;
- break;
+ ret_value = false;
+ break;
case Op_MulVL:
case Op_MulReductionVL:
if (VM_Version::supports_avx512dq() == false)
- return false;
+ ret_value = false;
+ break;
case Op_AddReductionVL:
if (UseAVX < 3) // only EVEX : vector connectivity becomes an issue here
- return false;
+ ret_value = false;
+ break;
case Op_AddReductionVI:
if (UseSSE < 3) // requires at least SSE3
- return false;
+ ret_value = false;
+ break;
case Op_MulReductionVI:
if (UseSSE < 4) // requires at least SSE4
- return false;
+ ret_value = false;
+ break;
case Op_AddReductionVF:
case Op_AddReductionVD:
case Op_MulReductionVF:
case Op_MulReductionVD:
if (UseSSE < 1) // requires at least SSE
- return false;
- break;
+ ret_value = false;
+ break;
+ case Op_SqrtVD:
+ if (UseAVX < 1) // enabled for AVX only
+ ret_value = false;
+ break;
case Op_CompareAndSwapL:
#ifdef _LP64
case Op_CompareAndSwapP:
#endif
if (!VM_Version::supports_cx8())
- return false;
- break;
+ ret_value = false;
+ break;
}
- return true; // Per default match rules are supported.
+ return ret_value; // Per default match rules are supported.
}
// Max vector size in bytes. 0 if not supported.
@@ -1721,14 +1730,24 @@
case T_DOUBLE:
case T_LONG:
if (size < 16) return 0;
+ break;
case T_FLOAT:
case T_INT:
if (size < 8) return 0;
+ break;
case T_BOOLEAN:
+ if (size < 4) return 0;
+ break;
+ case T_CHAR:
+ if (size < 4) return 0;
+ break;
case T_BYTE:
- case T_CHAR:
+ if (size < 4) return 0;
+ if ((size > 32) && !VM_Version::supports_avx512bw()) return 0;
+ break;
case T_SHORT:
if (size < 4) return 0;
+ if ((size > 16) && !VM_Version::supports_avx512bw()) return 0;
break;
default:
ShouldNotReachHere();
@@ -1800,7 +1819,7 @@
__ vmovdqu(as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[src_lo]));
break;
case Op_VecZ:
- __ evmovdqu(as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[src_lo]), 2);
+ __ evmovdqul(as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[src_lo]), 2);
break;
default:
ShouldNotReachHere();
@@ -1855,7 +1874,7 @@
__ vmovdqu(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset));
break;
case Op_VecZ:
- __ evmovdqu(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset), 2);
+ __ evmovdqul(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset), 2);
break;
default:
ShouldNotReachHere();
@@ -1875,7 +1894,7 @@
__ vmovdqu(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]));
break;
case Op_VecZ:
- __ evmovdqu(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]), 2);
+ __ evmovdqul(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]), 2);
break;
default:
ShouldNotReachHere();
@@ -1929,9 +1948,40 @@
}
#endif
}
- int offset_size = (stack_offset == 0) ? 0 : ((stack_offset < 0x80) ? 1 : (UseAVX > 2) ? 6 : 4);
+ bool is_single_byte = false;
+ int vec_len = 0;
+ if ((UseAVX > 2) && (stack_offset != 0)) {
+ switch (ireg) {
+ case Op_VecS:
+ case Op_VecD:
+ case Op_VecX:
+ break;
+ case Op_VecY:
+ vec_len = 1;
+ break;
+ case Op_VecZ:
+ vec_len = 2;
+ break;
+ }
+ is_single_byte = Assembler::query_compressed_disp_byte(stack_offset, true, vec_len, Assembler::EVEX_FVM, Assembler::EVEX_32bit, 0);
+ }
+ int offset_size = 0;
+ int size = 5;
+ if (UseAVX > 2 ) {
+ if ((VM_Version::supports_avx512vl() == false) && (vec_len == 2)) {
+ offset_size = (stack_offset == 0) ? 0 : ((is_single_byte) ? 1 : 4);
+ size += 2; // Need an additional two bytes for EVEX encoding
+ } else if ((VM_Version::supports_avx512vl() == false) && (vec_len < 2)) {
+ offset_size = (stack_offset == 0) ? 0 : ((stack_offset <= 127) ? 1 : 4);
+ } else {
+ offset_size = (stack_offset == 0) ? 0 : ((is_single_byte) ? 1 : 4);
+ size += 2; // Need an additional two bytes for EVEX encodding
+ }
+ } else {
+ offset_size = (stack_offset == 0) ? 0 : ((stack_offset <= 127) ? 1 : 4);
+ }
// VEX_2bytes prefix is used if UseAVX > 0, so it takes the same 2 bytes as SIMD prefix.
- return 5+offset_size;
+ return size+offset_size;
}
static inline jfloat replicate4_imm(int con, int width) {
@@ -2675,11 +2725,10 @@
predicate(UseAVX > 0);
match(Set dst (NegF src));
ins_cost(150);
- format %{ "vxorps $dst, $src, [0x80000000]\t# neg float by sign flipping" %}
- ins_encode %{
- int vector_len = 0;
- __ vxorps($dst$$XMMRegister, $src$$XMMRegister,
- ExternalAddress(float_signflip()), vector_len);
+ format %{ "vnegatess $dst, $src, [0x80000000]\t# neg float by sign flipping" %}
+ ins_encode %{
+ __ vnegatess($dst$$XMMRegister, $src$$XMMRegister,
+ ExternalAddress(float_signflip()));
%}
ins_pipe(pipe_slow);
%}
@@ -2700,12 +2749,11 @@
predicate(UseAVX > 0);
match(Set dst (NegD src));
ins_cost(150);
- format %{ "vxorpd $dst, $src, [0x8000000000000000]\t"
+ format %{ "vnegatess $dst, $src, [0x8000000000000000]\t"
"# neg double by sign flipping" %}
ins_encode %{
- int vector_len = 0;
- __ vxorpd($dst$$XMMRegister, $src$$XMMRegister,
- ExternalAddress(double_signflip()), vector_len);
+ __ vnegatesd($dst$$XMMRegister, $src$$XMMRegister,
+ ExternalAddress(double_signflip()));
%}
ins_pipe(pipe_slow);
%}
@@ -2838,7 +2886,7 @@
format %{ "vmovdqu $dst k0,$mem\t! load vector (64 bytes)" %}
ins_encode %{
int vector_len = 2;
- __ evmovdqu($dst$$XMMRegister, $mem$$Address, vector_len);
+ __ evmovdqul($dst$$XMMRegister, $mem$$Address, vector_len);
%}
ins_pipe( pipe_slow );
%}
@@ -2895,7 +2943,7 @@
format %{ "vmovdqu $mem k0,$src\t! store vector (64 bytes)" %}
ins_encode %{
int vector_len = 2;
- __ evmovdqu($mem$$Address, $src$$XMMRegister, vector_len);
+ __ evmovdqul($mem$$Address, $src$$XMMRegister, vector_len);
%}
ins_pipe( pipe_slow );
%}
@@ -3315,6 +3363,37 @@
ins_pipe( pipe_slow );
%}
+instruct Repl2F_zero(vecD dst, immF0 zero) %{
+ predicate(n->as_Vector()->length() == 2 && UseAVX < 3);
+ match(Set dst (ReplicateF zero));
+ format %{ "xorps $dst,$dst\t! replicate2F zero" %}
+ ins_encode %{
+ __ xorps($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4F_zero(vecX dst, immF0 zero) %{
+ predicate(n->as_Vector()->length() == 4 && UseAVX < 3);
+ match(Set dst (ReplicateF zero));
+ format %{ "xorps $dst,$dst\t! replicate4F zero" %}
+ ins_encode %{
+ __ xorps($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl8F_zero(vecY dst, immF0 zero) %{
+ predicate(n->as_Vector()->length() == 8 && UseAVX < 3);
+ match(Set dst (ReplicateF zero));
+ format %{ "vxorps $dst,$dst,$dst\t! replicate8F zero" %}
+ ins_encode %{
+ int vector_len = 1;
+ __ vxorps($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
instruct Repl2D_mem(vecX dst, memory mem) %{
predicate(n->as_Vector()->length() == 2 && UseAVX > 0 && !VM_Version::supports_avx512vl());
match(Set dst (ReplicateD (LoadD mem)));
@@ -3349,6 +3428,28 @@
ins_pipe( pipe_slow );
%}
+// Replicate double (8 byte) scalar zero to be vector
+instruct Repl2D_zero(vecX dst, immD0 zero) %{
+ predicate(n->as_Vector()->length() == 2 && UseAVX < 3);
+ match(Set dst (ReplicateD zero));
+ format %{ "xorpd $dst,$dst\t! replicate2D zero" %}
+ ins_encode %{
+ __ xorpd($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4D_zero(vecY dst, immD0 zero) %{
+ predicate(n->as_Vector()->length() == 4 && UseAVX < 3);
+ match(Set dst (ReplicateD zero));
+ format %{ "vxorpd $dst,$dst,$dst,vect256\t! replicate4D zero" %}
+ ins_encode %{
+ int vector_len = 1;
+ __ vxorpd($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
// ====================GENERIC REPLICATE==========================================
// Replicate byte scalar to be vector
@@ -3680,38 +3781,6 @@
ins_pipe( pipe_slow );
%}
-// Replicate float (4 byte) scalar zero to be vector
-instruct Repl2F_zero(vecD dst, immF0 zero) %{
- predicate(n->as_Vector()->length() == 2);
- match(Set dst (ReplicateF zero));
- format %{ "xorps $dst,$dst\t! replicate2F zero" %}
- ins_encode %{
- __ xorps($dst$$XMMRegister, $dst$$XMMRegister);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-instruct Repl4F_zero(vecX dst, immF0 zero) %{
- predicate(n->as_Vector()->length() == 4);
- match(Set dst (ReplicateF zero));
- format %{ "xorps $dst,$dst\t! replicate4F zero" %}
- ins_encode %{
- __ xorps($dst$$XMMRegister, $dst$$XMMRegister);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-instruct Repl8F_zero(vecY dst, immF0 zero) %{
- predicate(n->as_Vector()->length() == 8);
- match(Set dst (ReplicateF zero));
- format %{ "vxorps $dst,$dst,$dst\t! replicate8F zero" %}
- ins_encode %{
- int vector_len = 1;
- __ vxorps($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector_len);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
// Replicate double (8 bytes) scalar to be vector
instruct Repl2D(vecX dst, regD src) %{
predicate(n->as_Vector()->length() == 2);
@@ -3723,28 +3792,6 @@
ins_pipe( pipe_slow );
%}
-// Replicate double (8 byte) scalar zero to be vector
-instruct Repl2D_zero(vecX dst, immD0 zero) %{
- predicate(n->as_Vector()->length() == 2);
- match(Set dst (ReplicateD zero));
- format %{ "xorpd $dst,$dst\t! replicate2D zero" %}
- ins_encode %{
- __ xorpd($dst$$XMMRegister, $dst$$XMMRegister);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-instruct Repl4D_zero(vecY dst, immD0 zero) %{
- predicate(n->as_Vector()->length() == 4);
- match(Set dst (ReplicateD zero));
- format %{ "vxorpd $dst,$dst,$dst,vect256\t! replicate4D zero" %}
- ins_encode %{
- int vector_len = 1;
- __ vxorpd($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector_len);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
// ====================EVEX REPLICATE=============================================
instruct Repl4B_mem_evex(vecS dst, memory mem) %{
@@ -3814,7 +3861,7 @@
%}
instruct Repl64B_evex(vecZ dst, rRegI src) %{
- predicate(n->as_Vector()->length() == 64 && UseAVX > 2);
+ predicate(n->as_Vector()->length() == 64 && VM_Version::supports_avx512bw());
match(Set dst (ReplicateB src));
format %{ "vpbroadcastb $dst,$src\t! upper replicate64B" %}
ins_encode %{
@@ -3825,7 +3872,7 @@
%}
instruct Repl64B_mem_evex(vecZ dst, memory mem) %{
- predicate(n->as_Vector()->length() == 64 && VM_Version::supports_avx512vlbw());
+ predicate(n->as_Vector()->length() == 64 && VM_Version::supports_avx512bw());
match(Set dst (ReplicateB (LoadB mem)));
format %{ "vpbroadcastb $dst,$mem\t! replicate64B" %}
ins_encode %{
@@ -3862,7 +3909,7 @@
%}
instruct Repl64B_imm_evex(vecZ dst, immI con) %{
- predicate(n->as_Vector()->length() == 64 && UseAVX > 2);
+ predicate(n->as_Vector()->length() == 64 && VM_Version::supports_avx512bw());
match(Set dst (ReplicateB con));
format %{ "movq $dst,[$constantaddress]\n\t"
"vpbroadcastb $dst,$dst\t! upper replicate64B" %}
@@ -3953,7 +4000,7 @@
%}
instruct Repl32S_evex(vecZ dst, rRegI src) %{
- predicate(n->as_Vector()->length() == 32 && UseAVX > 2);
+ predicate(n->as_Vector()->length() == 32 && VM_Version::supports_avx512bw());
match(Set dst (ReplicateS src));
format %{ "vpbroadcastw $dst,$src\t! replicate32S" %}
ins_encode %{
@@ -3964,7 +4011,7 @@
%}
instruct Repl32S_mem_evex(vecZ dst, memory mem) %{
- predicate(n->as_Vector()->length() == 32 && UseAVX > 2);
+ predicate(n->as_Vector()->length() == 32 && VM_Version::supports_avx512bw());
match(Set dst (ReplicateS (LoadS mem)));
format %{ "vpbroadcastw $dst,$mem\t! replicate32S" %}
ins_encode %{
@@ -4001,7 +4048,7 @@
%}
instruct Repl32S_imm_evex(vecZ dst, immI con) %{
- predicate(n->as_Vector()->length() == 32 && UseAVX > 2);
+ predicate(n->as_Vector()->length() == 32 && VM_Version::supports_avx512bw());
match(Set dst (ReplicateS con));
format %{ "movq $dst,[$constantaddress]\n\t"
"vpbroadcastw $dst,$dst\t! replicate32S" %}
@@ -4318,13 +4365,50 @@
ins_pipe( pipe_slow );
%}
+instruct Repl2F_zero_evex(vecD dst, immF0 zero) %{
+ predicate(n->as_Vector()->length() == 2 && UseAVX > 2);
+ match(Set dst (ReplicateF zero));
+ format %{ "vpxor $dst k0,$dst,$dst\t! replicate2F zero" %}
+ ins_encode %{
+ // Use vpxor in place of vxorps since EVEX has a constriant on dq for vxorps: this is a 512-bit operation
+ int vector_len = 2;
+ __ vpxor($dst$$XMMRegister,$dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4F_zero_evex(vecX dst, immF0 zero) %{
+ predicate(n->as_Vector()->length() == 4 && UseAVX > 2);
+ match(Set dst (ReplicateF zero));
+ format %{ "vpxor $dst k0,$dst,$dst\t! replicate4F zero" %}
+ ins_encode %{
+ // Use vpxor in place of vxorps since EVEX has a constriant on dq for vxorps: this is a 512-bit operation
+ int vector_len = 2;
+ __ vpxor($dst$$XMMRegister,$dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl8F_zero_evex(vecY dst, immF0 zero) %{
+ predicate(n->as_Vector()->length() == 8 && UseAVX > 2);
+ match(Set dst (ReplicateF zero));
+ format %{ "vpxor $dst k0,$dst,$dst\t! replicate8F zero" %}
+ ins_encode %{
+ // Use vpxor in place of vxorps since EVEX has a constriant on dq for vxorps: this is a 512-bit operation
+ int vector_len = 2;
+ __ vpxor($dst$$XMMRegister,$dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
instruct Repl16F_zero_evex(vecZ dst, immF0 zero) %{
predicate(n->as_Vector()->length() == 16 && UseAVX > 2);
match(Set dst (ReplicateF zero));
- format %{ "vxorps $dst k0,$dst,$dst\t! replicate16F zero" %}
- ins_encode %{
+ format %{ "vpxor $dst k0,$dst,$dst\t! replicate16F zero" %}
+ ins_encode %{
+ // Use vpxor in place of vxorps since EVEX has a constriant on dq for vxorps: this is a 512-bit operation
int vector_len = 2;
- __ vxorps($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ __ vpxor($dst$$XMMRegister,$dst$$XMMRegister, $dst$$XMMRegister, vector_len);
%}
ins_pipe( fpu_reg_reg );
%}
@@ -4373,13 +4457,38 @@
ins_pipe( pipe_slow );
%}
+instruct Repl2D_zero_evex(vecX dst, immD0 zero) %{
+ predicate(n->as_Vector()->length() == 2 && UseAVX > 2);
+ match(Set dst (ReplicateD zero));
+ format %{ "vpxor $dst k0,$dst,$dst\t! replicate2D zero" %}
+ ins_encode %{
+ // Use vpxor in place of vxorpd since EVEX has a constriant on dq for vxorpd: this is a 512-bit operation
+ int vector_len = 2;
+ __ vpxor($dst$$XMMRegister,$dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct Repl4D_zero_evex(vecY dst, immD0 zero) %{
+ predicate(n->as_Vector()->length() == 4 && UseAVX > 2);
+ match(Set dst (ReplicateD zero));
+ format %{ "vpxor $dst k0,$dst,$dst\t! replicate4D zero" %}
+ ins_encode %{
+ // Use vpxor in place of vxorpd since EVEX has a constriant on dq for vxorpd: this is a 512-bit operation
+ int vector_len = 2;
+ __ vpxor($dst$$XMMRegister,$dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
instruct Repl8D_zero_evex(vecZ dst, immD0 zero) %{
predicate(n->as_Vector()->length() == 8 && UseAVX > 2);
match(Set dst (ReplicateD zero));
- format %{ "vxorpd $dst k0,$dst,$dst,vect512\t! replicate8D zero" %}
- ins_encode %{
+ format %{ "vpxor $dst k0,$dst,$dst,vect512\t! replicate8D zero" %}
+ ins_encode %{
+ // Use vpxor in place of vxorpd since EVEX has a constriant on dq for vxorpd: this is a 512-bit operation
int vector_len = 2;
- __ vxorpd($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ __ vpxor($dst$$XMMRegister,$dst$$XMMRegister, $dst$$XMMRegister, vector_len);
%}
ins_pipe( fpu_reg_reg );
%}
@@ -7474,6 +7583,75 @@
ins_pipe( pipe_slow );
%}
+// --------------------------------- Sqrt --------------------------------------
+
+// Floating point vector sqrt - double precision only
+instruct vsqrt2D_reg(vecX dst, vecX src) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
+ match(Set dst (SqrtVD src));
+ format %{ "vsqrtpd $dst,$src\t! sqrt packed2D" %}
+ ins_encode %{
+ int vector_len = 0;
+ __ vsqrtpd($dst$$XMMRegister, $src$$XMMRegister, vector_len);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct vsqrt2D_mem(vecX dst, memory mem) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
+ match(Set dst (SqrtVD (LoadVector mem)));
+ format %{ "vsqrtpd $dst,$mem\t! sqrt packed2D" %}
+ ins_encode %{
+ int vector_len = 0;
+ __ vsqrtpd($dst$$XMMRegister, $mem$$Address, vector_len);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct vsqrt4D_reg(vecY dst, vecY src) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
+ match(Set dst (SqrtVD src));
+ format %{ "vsqrtpd $dst,$src\t! sqrt packed4D" %}
+ ins_encode %{
+ int vector_len = 1;
+ __ vsqrtpd($dst$$XMMRegister, $src$$XMMRegister, vector_len);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct vsqrt4D_mem(vecY dst, memory mem) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
+ match(Set dst (SqrtVD (LoadVector mem)));
+ format %{ "vsqrtpd $dst,$mem\t! sqrt packed4D" %}
+ ins_encode %{
+ int vector_len = 1;
+ __ vsqrtpd($dst$$XMMRegister, $mem$$Address, vector_len);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct vsqrt8D_reg(vecZ dst, vecZ src) %{
+ predicate(UseAVX > 2 && n->as_Vector()->length() == 8);
+ match(Set dst (SqrtVD src));
+ format %{ "vsqrtpd $dst,$src\t! sqrt packed8D" %}
+ ins_encode %{
+ int vector_len = 2;
+ __ vsqrtpd($dst$$XMMRegister, $src$$XMMRegister, vector_len);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct vsqrt8D_mem(vecZ dst, memory mem) %{
+ predicate(UseAVX > 2 && n->as_Vector()->length() == 8);
+ match(Set dst (SqrtVD (LoadVector mem)));
+ format %{ "vsqrtpd $dst,$mem\t! sqrt packed8D" %}
+ ins_encode %{
+ int vector_len = 2;
+ __ vsqrtpd($dst$$XMMRegister, $mem$$Address, vector_len);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
// ------------------------------ LeftShift -----------------------------------
// Shorts/Chars vector left shift
--- a/hotspot/src/cpu/x86/vm/x86_32.ad Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/cpu/x86/vm/x86_32.ad Mon Sep 21 17:49:57 2015 +0200
@@ -1004,10 +1004,10 @@
__ vmovdqu(Address(rsp, dst_offset), xmm0);
__ vmovdqu(xmm0, Address(rsp, -32));
case Op_VecZ:
- __ evmovdqu(Address(rsp, -64), xmm0, 2);
- __ evmovdqu(xmm0, Address(rsp, src_offset), 2);
- __ evmovdqu(Address(rsp, dst_offset), xmm0, 2);
- __ evmovdqu(xmm0, Address(rsp, -64), 2);
+ __ evmovdqul(Address(rsp, -64), xmm0, 2);
+ __ evmovdqul(xmm0, Address(rsp, src_offset), 2);
+ __ evmovdqul(Address(rsp, dst_offset), xmm0, 2);
+ __ evmovdqul(xmm0, Address(rsp, -64), 2);
break;
default:
ShouldNotReachHere();
--- a/hotspot/src/cpu/x86/vm/x86_64.ad Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/cpu/x86/vm/x86_64.ad Mon Sep 21 17:49:57 2015 +0200
@@ -1075,10 +1075,10 @@
__ vmovdqu(Address(rsp, dst_offset), xmm0);
__ vmovdqu(xmm0, Address(rsp, -32));
case Op_VecZ:
- __ evmovdqu(Address(rsp, -64), xmm0, 2);
- __ evmovdqu(xmm0, Address(rsp, src_offset), 2);
- __ evmovdqu(Address(rsp, dst_offset), xmm0, 2);
- __ evmovdqu(xmm0, Address(rsp, -64), 2);
+ __ evmovdqul(Address(rsp, -64), xmm0, 2);
+ __ evmovdqul(xmm0, Address(rsp, src_offset), 2);
+ __ evmovdqul(Address(rsp, dst_offset), xmm0, 2);
+ __ evmovdqul(xmm0, Address(rsp, -64), 2);
break;
default:
ShouldNotReachHere();
--- a/hotspot/src/share/vm/adlc/formssel.cpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/share/vm/adlc/formssel.cpp Mon Sep 21 17:49:57 2015 +0200
@@ -4143,6 +4143,7 @@
"SubVB","SubVS","SubVI","SubVL","SubVF","SubVD",
"MulVS","MulVI","MulVL","MulVF","MulVD",
"DivVF","DivVD",
+ "SqrtVD",
"AndV" ,"XorV" ,"OrV",
"AddReductionVI", "AddReductionVL",
"AddReductionVF", "AddReductionVD",
--- a/hotspot/src/share/vm/opto/classes.hpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/share/vm/opto/classes.hpp Mon Sep 21 17:49:57 2015 +0200
@@ -290,6 +290,7 @@
macro(MulReductionVD)
macro(DivVF)
macro(DivVD)
+macro(SqrtVD)
macro(LShiftCntV)
macro(RShiftCntV)
macro(LShiftVB)
--- a/hotspot/src/share/vm/opto/ifnode.cpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/share/vm/opto/ifnode.cpp Mon Sep 21 17:49:57 2015 +0200
@@ -858,18 +858,29 @@
// this_bool = <=
// dom_bool = >= (proj = True) or dom_bool = < (proj = False)
// x in [a, b] on the fail (= True) projection, b+1 > a-1:
- // lo = a, hi = b, adjusted_lim = b-a, cond = <=u
+ // lo = a, hi = b, adjusted_lim = b-a+1, cond = <u
+ // lo = a, hi = b, adjusted_lim = b-a, cond = <=u doesn't work because b = a - 1 is possible, then b-a = -1
// dom_bool = > (proj = True) or dom_bool = <= (proj = False)
// x in ]a, b] on the fail (= True) projection b+1 > a:
// lo = a+1, hi = b, adjusted_lim = b-a, cond = <u
- // lo = a+1, hi = b, adjusted_lim = b-a-1, cond = <=u doesn't work because a = b is possible, then hi-lo = -1
+ // lo = a+1, hi = b, adjusted_lim = b-a-1, cond = <=u doesn't work because a = b is possible, then b-a-1 = -1
- if (lo_test == BoolTest::gt || lo_test == BoolTest::le) {
- if (hi_test == BoolTest::le) {
+ if (hi_test == BoolTest::lt) {
+ if (lo_test == BoolTest::gt || lo_test == BoolTest::le) {
+ lo = igvn->transform(new AddINode(lo, igvn->intcon(1)));
+ }
+ } else {
+ assert(hi_test == BoolTest::le, "bad test");
+ if (lo_test == BoolTest::ge || lo_test == BoolTest::lt) {
adjusted_lim = igvn->transform(new SubINode(hi, lo));
+ adjusted_lim = igvn->transform(new AddINode(adjusted_lim, igvn->intcon(1)));
+ cond = BoolTest::lt;
+ } else {
+ assert(lo_test == BoolTest::gt || lo_test == BoolTest::le, "bad test");
+ adjusted_lim = igvn->transform(new SubINode(hi, lo));
+ lo = igvn->transform(new AddINode(lo, igvn->intcon(1)));
cond = BoolTest::lt;
}
- lo = igvn->transform(new AddINode(lo, igvn->intcon(1)));
}
} else if (lo_type->_lo > hi_type->_hi && lo_type->_hi == max_jint && hi_type->_lo == min_jint) {
@@ -879,7 +890,8 @@
// lo = b, hi = a, adjusted_lim = a-b, cond = >=u
// dom_bool = <= (proj = True) or dom_bool = > (proj = False)
// x in [b, a] on the fail (= False) projection, a+1 > b-1:
- // lo = b, hi = a, adjusted_lim = a-b, cond = >u
+ // lo = b, hi = a, adjusted_lim = a-b+1, cond = >=u
+ // lo = b, hi = a, adjusted_lim = a-b, cond = >u doesn't work because a = b - 1 is possible, then b-a = -1
// this_bool = <=
// dom_bool = < (proj = True) or dom_bool = >= (proj = False)
// x in ]b, a[ on the fail (= False) projection, a > b:
@@ -887,7 +899,7 @@
// dom_bool = <= (proj = True) or dom_bool = > (proj = False)
// x in ]b, a] on the fail (= False) projection, a+1 > b:
// lo = b+1, hi = a, adjusted_lim = a-b, cond = >=u
- // lo = b+1, hi = a, adjusted_lim = a-b-1, cond = >u doesn't work because a = b is possible, then hi-lo = -1
+ // lo = b+1, hi = a, adjusted_lim = a-b-1, cond = >u doesn't work because a = b is possible, then b-a-1 = -1
swap(lo, hi);
swap(lo_type, hi_type);
@@ -900,14 +912,26 @@
cond = (hi_test == BoolTest::le || hi_test == BoolTest::gt) ? BoolTest::gt : BoolTest::ge;
- if (lo_test == BoolTest::le) {
- if (cond == BoolTest::gt) {
+ if (lo_test == BoolTest::lt) {
+ if (hi_test == BoolTest::lt || hi_test == BoolTest::ge) {
+ cond = BoolTest::ge;
+ } else {
+ assert(hi_test == BoolTest::le || hi_test == BoolTest::gt, "bad test");
adjusted_lim = igvn->transform(new SubINode(hi, lo));
+ adjusted_lim = igvn->transform(new AddINode(adjusted_lim, igvn->intcon(1)));
cond = BoolTest::ge;
}
- lo = igvn->transform(new AddINode(lo, igvn->intcon(1)));
+ } else if (lo_test == BoolTest::le) {
+ if (hi_test == BoolTest::lt || hi_test == BoolTest::ge) {
+ lo = igvn->transform(new AddINode(lo, igvn->intcon(1)));
+ cond = BoolTest::ge;
+ } else {
+ assert(hi_test == BoolTest::le || hi_test == BoolTest::gt, "bad test");
+ adjusted_lim = igvn->transform(new SubINode(hi, lo));
+ lo = igvn->transform(new AddINode(lo, igvn->intcon(1)));
+ cond = BoolTest::ge;
+ }
}
-
} else {
const TypeInt* failtype = filtered_int_type(igvn, n, proj);
if (failtype != NULL) {
--- a/hotspot/src/share/vm/opto/loopPredicate.cpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/share/vm/opto/loopPredicate.cpp Mon Sep 21 17:49:57 2015 +0200
@@ -112,6 +112,13 @@
if (_idom != NULL) {
set_idom(call, rgn, dom_depth(rgn));
}
+ for (DUIterator_Fast imax, i = uncommon_proj->fast_outs(imax); i < imax; i++) {
+ Node* n = uncommon_proj->fast_out(i);
+ if (n->is_Load() || n->is_Store()) {
+ _igvn.replace_input_of(n, 0, rgn);
+ --i; --imax;
+ }
+ }
} else {
// Find region's edge corresponding to uncommon_proj
for (; proj_index < rgn->req(); proj_index++)
--- a/hotspot/src/share/vm/opto/loopnode.cpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/share/vm/opto/loopnode.cpp Mon Sep 21 17:49:57 2015 +0200
@@ -1901,7 +1901,7 @@
if (stride_con > 0) tty->print("+");
tty->print("%d", stride_con);
- tty->print(" (%d iters) ", (int)cl->profile_trip_cnt());
+ tty->print(" (%0.f iters) ", cl->profile_trip_cnt());
if (cl->is_pre_loop ()) tty->print(" pre" );
if (cl->is_main_loop()) tty->print(" main");
--- a/hotspot/src/share/vm/opto/superword.cpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/share/vm/opto/superword.cpp Mon Sep 21 17:49:57 2015 +0200
@@ -1858,6 +1858,11 @@
vn = VectorNode::make(opc, in1, in2, vlen, velt_basic_type(n));
vlen_in_bytes = vn->as_Vector()->length_in_bytes();
}
+ } else if (opc == Op_SqrtD) {
+ // Promote operand to vector (Sqrt is a 2 address instruction)
+ Node* in = vector_opd(p, 1);
+ vn = VectorNode::make(opc, in, NULL, vlen, velt_basic_type(n));
+ vlen_in_bytes = vn->as_Vector()->length_in_bytes();
} else {
ShouldNotReachHere();
}
--- a/hotspot/src/share/vm/opto/vectornode.cpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/share/vm/opto/vectornode.cpp Mon Sep 21 17:49:57 2015 +0200
@@ -92,6 +92,9 @@
case Op_DivD:
assert(bt == T_DOUBLE, "must be");
return Op_DivVD;
+ case Op_SqrtD:
+ assert(bt == T_DOUBLE, "must be");
+ return Op_SqrtVD;
case Op_LShiftI:
switch (bt) {
case T_BOOLEAN:
@@ -277,6 +280,9 @@
case Op_DivVF: return new DivVFNode(n1, n2, vt);
case Op_DivVD: return new DivVDNode(n1, n2, vt);
+ // Currently only supports double precision sqrt
+ case Op_SqrtVD: return new SqrtVDNode(n1, vt);
+
case Op_LShiftVB: return new LShiftVBNode(n1, n2, vt);
case Op_LShiftVS: return new LShiftVSNode(n1, n2, vt);
case Op_LShiftVI: return new LShiftVINode(n1, n2, vt);
--- a/hotspot/src/share/vm/opto/vectornode.hpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/share/vm/opto/vectornode.hpp Mon Sep 21 17:49:57 2015 +0200
@@ -309,6 +309,14 @@
virtual int Opcode() const;
};
+//------------------------------SqrtVDNode--------------------------------------
+// Vector Sqrt double
+class SqrtVDNode : public VectorNode {
+ public:
+ SqrtVDNode(Node* in, const TypeVect* vt) : VectorNode(in,vt) {}
+ virtual int Opcode() const;
+};
+
//------------------------------LShiftVBNode-----------------------------------
// Vector left shift bytes
class LShiftVBNode : public VectorNode {
--- a/hotspot/src/share/vm/prims/whitebox.cpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/share/vm/prims/whitebox.cpp Mon Sep 21 17:49:57 2015 +0200
@@ -1041,11 +1041,18 @@
}
WB_ENTRY(jlong, WB_AllocateCodeBlob(JNIEnv* env, jobject o, jint size, jint blob_type))
- return (jlong) WhiteBox::allocate_code_blob(size, blob_type);
+ if (size < 0) {
+ THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
+ err_msg("WB_AllocateCodeBlob: size is negative: " INT32_FORMAT, size));
+ }
+ return (jlong) WhiteBox::allocate_code_blob(size, blob_type);
WB_END
WB_ENTRY(void, WB_FreeCodeBlob(JNIEnv* env, jobject o, jlong addr))
- BufferBlob::free((BufferBlob*) addr);
+ if (addr == 0) {
+ return;
+ }
+ BufferBlob::free((BufferBlob*) addr);
WB_END
WB_ENTRY(jobjectArray, WB_GetCodeHeapEntries(JNIEnv* env, jobject o, jint blob_type))
@@ -1090,9 +1097,13 @@
WB_END
WB_ENTRY(jobjectArray, WB_GetCodeBlob(JNIEnv* env, jobject o, jlong addr))
- ThreadToNativeFromVM ttn(thread);
- CodeBlobStub stub((CodeBlob*) addr);
- return codeBlob2objectArray(thread, env, &stub);
+ if (addr == 0) {
+ THROW_MSG_NULL(vmSymbols::java_lang_NullPointerException(),
+ "WB_GetCodeBlob: addr is null");
+ }
+ ThreadToNativeFromVM ttn(thread);
+ CodeBlobStub stub((CodeBlob*) addr);
+ return codeBlob2objectArray(thread, env, &stub);
WB_END
WB_ENTRY(jlong, WB_GetThreadStackSize(JNIEnv* env, jobject o))
--- a/hotspot/src/share/vm/services/lowMemoryDetector.cpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/share/vm/services/lowMemoryDetector.cpp Mon Sep 21 17:49:57 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -200,9 +200,10 @@
// any clears unless the usage becomes greater than or equal
// to the high threshold.
//
-// If the current level is between high and low threhsold, no change.
+// If the current level is between high and low threshold, no change.
//
void SensorInfo::set_gauge_sensor_level(MemoryUsage usage, ThresholdSupport* high_low_threshold) {
+ assert(Service_lock->owned_by_self(), "Must own Service_lock");
assert(high_low_threshold->is_high_threshold_supported(), "just checking");
bool is_over_high = high_low_threshold->is_high_threshold_crossed(usage);
@@ -257,6 +258,7 @@
// the sensor will be on (i.e. sensor is currently off
// and has pending trigger requests).
void SensorInfo::set_counter_sensor_level(MemoryUsage usage, ThresholdSupport* counter_threshold) {
+ assert(Service_lock->owned_by_self(), "Must own Service_lock");
assert(counter_threshold->is_high_threshold_supported(), "just checking");
bool is_over_high = counter_threshold->is_high_threshold_crossed(usage);
@@ -278,9 +280,7 @@
}
void SensorInfo::process_pending_requests(TRAPS) {
- if (!has_pending_requests()) {
- return;
- }
+ assert(has_pending_requests(), "Must have pending request");
int pending_count = pending_trigger_count();
if (pending_clear_count() > 0) {
@@ -293,7 +293,6 @@
void SensorInfo::trigger(int count, TRAPS) {
assert(count <= _pending_trigger_count, "just checking");
-
if (_sensor_obj != NULL) {
Klass* k = Management::sun_management_Sensor_klass(CHECK);
instanceKlassHandle sensorKlass (THREAD, k);
@@ -316,6 +315,7 @@
{
// Holds Service_lock and update the sensor state
MutexLockerEx ml(Service_lock, Mutex::_no_safepoint_check_flag);
+ assert(_pending_trigger_count > 0, "Must have pending trigger");
_sensor_on = true;
_sensor_count += count;
_pending_trigger_count = _pending_trigger_count - count;
@@ -323,6 +323,20 @@
}
void SensorInfo::clear(int count, TRAPS) {
+ {
+ // Holds Service_lock and update the sensor state
+ MutexLockerEx ml(Service_lock, Mutex::_no_safepoint_check_flag);
+ if (_pending_clear_count == 0) {
+ // Bail out if we lost a race to set_*_sensor_level() which may have
+ // reactivated the sensor in the meantime because it was triggered again.
+ return;
+ }
+ _sensor_on = false;
+ _sensor_count += count;
+ _pending_clear_count = 0;
+ _pending_trigger_count = _pending_trigger_count - count;
+ }
+
if (_sensor_obj != NULL) {
Klass* k = Management::sun_management_Sensor_klass(CHECK);
instanceKlassHandle sensorKlass (THREAD, k);
@@ -338,14 +352,6 @@
&args,
CHECK);
}
-
- {
- // Holds Service_lock and update the sensor state
- MutexLockerEx ml(Service_lock, Mutex::_no_safepoint_check_flag);
- _sensor_on = false;
- _pending_clear_count = 0;
- _pending_trigger_count = _pending_trigger_count - count;
- }
}
//--------------------------------------------------------------
--- a/hotspot/src/share/vm/services/lowMemoryDetector.hpp Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/src/share/vm/services/lowMemoryDetector.hpp Mon Sep 21 17:49:57 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -180,7 +180,7 @@
// any clears unless the usage becomes greater than or equal
// to the high threshold.
//
- // If the current level is between high and low threhsold, no change.
+ // If the current level is between high and low threshold, no change.
//
void set_gauge_sensor_level(MemoryUsage usage, ThresholdSupport* high_low_threshold);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/arraycopy/TestEliminatedArrayLoopPredicateCopyDeopt.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,53 @@
+/*
+ * 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 8134974
+ * @summary Cannot pin eliminated arraycopy loads for deopt state in uncommon trap path if it is a loop predicate unc
+ * @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement TestEliminatedArrayLoopPredicateCopyDeopt
+ *
+ */
+
+public class TestEliminatedArrayLoopPredicateCopyDeopt {
+
+ static boolean test(int[] array_src) {
+ int[] array_dst = new int[10];
+ System.arraycopy(array_src, 0, array_dst, 0, 10);
+
+ for (int i = 0; i < 100; i++) {
+ array_src[i] = i;
+ }
+ if (array_dst[0] == 0) {
+ return true;
+ }
+ return false;
+ }
+
+ static public void main(String[] args) {
+ int[] array_src = new int[100];
+ for (int i = 0; i < 20000; i++) {
+ test(array_src);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/loopopts/superword/SumRedSqrt_Double.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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
+* @summary Add C2 x86 Superword support for scalar sum reduction optimizations : double sqrt test
+*
+* @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+SuperWordReductions -XX:LoopUnrollLimit=250 -XX:LoopMaxUnroll=2 -XX:CompileThresholdScaling=0.1 SumRedSqrt_Double
+* @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-SuperWordReductions -XX:LoopUnrollLimit=250 -XX:LoopMaxUnroll=2 -XX:CompileThresholdScaling=0.1 SumRedSqrt_Double
+*
+* @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+SuperWordReductions -XX:LoopUnrollLimit=250 -XX:LoopMaxUnroll=4 -XX:CompileThresholdScaling=0.1 SumRedSqrt_Double
+* @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-SuperWordReductions -XX:LoopUnrollLimit=250 -XX:LoopMaxUnroll=4 -XX:CompileThresholdScaling=0.1 SumRedSqrt_Double
+*
+* @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+SuperWordReductions -XX:LoopUnrollLimit=250 -XX:LoopMaxUnroll=8 -XX:CompileThresholdScaling=0.1 SumRedSqrt_Double
+* @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-SuperWordReductions -XX:LoopUnrollLimit=250 -XX:LoopMaxUnroll=8 -XX:CompileThresholdScaling=0.1 SumRedSqrt_Double
+*
+* @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+SuperWordReductions -XX:LoopUnrollLimit=250 -XX:LoopMaxUnroll=16 -XX:CompileThresholdScaling=0.1 SumRedSqrt_Double
+* @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-SuperWordReductions -XX:LoopUnrollLimit=250 -XX:LoopMaxUnroll=16 -XX:CompileThresholdScaling=0.1 SumRedSqrt_Double
+*/
+
+public class SumRedSqrt_Double
+{
+ public static void main(String[] args) throws Exception {
+ double[] a = new double[256*1024];
+ double[] b = new double[256*1024];
+ double[] c = new double[256*1024];
+ double[] d = new double[256*1024];
+ sumReductionInit(a,b,c);
+ double total = 0;
+ double valid = 2.06157643776E14;
+ for(int j = 0; j < 2000; j++) {
+ total = sumReductionImplement(a,b,c,d,total);
+ }
+ if(total == valid) {
+ System.out.println("Success");
+ } else {
+ System.out.println("Invalid sum of elements variable in total: " + total);
+ System.out.println("Expected value = " + valid);
+ throw new Exception("Failed");
+ }
+ }
+
+ public static void sumReductionInit(
+ double[] a,
+ double[] b,
+ double[] c)
+ {
+ for(int j = 0; j < 1; j++)
+ {
+ for(int i = 0; i < a.length; i++)
+ {
+ a[i] = i * 1 + j;
+ b[i] = i * 1 - j;
+ c[i] = i + j;
+ }
+ }
+ }
+
+ public static double sumReductionImplement(
+ double[] a,
+ double[] b,
+ double[] c,
+ double[] d,
+ double total)
+ {
+ for(int i = 0; i < a.length; i++)
+ {
+ d[i]= Math.sqrt(a[i] * b[i]) + Math.sqrt(a[i] * c[i]) + Math.sqrt(b[i] * c[i]);
+ total += d[i];
+ }
+ return total;
+ }
+
+}
--- a/hotspot/test/compiler/rangechecks/TestBadFoldCompare.java Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/test/compiler/rangechecks/TestBadFoldCompare.java Mon Sep 21 17:49:57 2015 +0200
@@ -24,7 +24,8 @@
/*
* @test
* @bug 8085832
- * @summary x <= 0 || x > 0 wrongly folded as (x-1) >u -1
+ * @bug 8135069
+ * @summary x <= 0 || x > 0 wrongly folded as (x-1) >u -1 and x < 0 || x > -1 wrongly folded as x >u -1
* @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement TestBadFoldCompare
*/
@@ -58,6 +59,34 @@
helper2(i, 0, 0, flag);
}
+ static boolean test3_taken;
+
+ static void helper3(int i, int a, int b, boolean flag) {
+ if (flag) {
+ if (i < a || i > b - 1) {
+ test3_taken = true;
+ }
+ }
+ }
+
+ static void test3(int i, boolean flag) {
+ helper3(i, 0, 0, flag);
+ }
+
+ static boolean test4_taken;
+
+ static void helper4(int i, int a, int b, boolean flag) {
+ if (flag) {
+ if (i > b - 1 || i < a) {
+ test4_taken = true;
+ }
+ }
+ }
+
+ static void test4(int i, boolean flag) {
+ helper4(i, 0, 0, flag);
+ }
+
static public void main(String[] args) {
boolean success = true;
@@ -87,6 +116,35 @@
System.out.println("Test2 failed");
success = false;
}
+
+ for (int i = 0; i < 20000; i++) {
+ helper3(5, 0, 10, (i%2)==0);
+ helper3(-1, 0, 10, (i%2)==0);
+ helper3(15, 0, 10, (i%2)==0);
+ test3(0, false);
+ }
+ test3_taken = false;
+ test3(0, true);
+
+ if (!test3_taken) {
+ System.out.println("Test3 failed");
+ success = false;
+ }
+
+ for (int i = 0; i < 20000; i++) {
+ helper4(5, 0, 10, (i%2)==0);
+ helper4(-1, 0, 10, (i%2)==0);
+ helper4(15, 0, 10, (i%2)==0);
+ test4(0, false);
+ }
+ test4_taken = false;
+ test4(0, true);
+
+ if (!test4_taken) {
+ System.out.println("Test4 failed");
+ success = false;
+ }
+
if (!success) {
throw new RuntimeException("Some tests failed");
}
--- a/hotspot/test/testlibrary/jdk/test/lib/Utils.java Tue Sep 22 14:24:31 2015 -0400
+++ b/hotspot/test/testlibrary/jdk/test/lib/Utils.java Mon Sep 21 17:49:57 2015 +0200
@@ -428,4 +428,28 @@
public static long adjustTimeout(long tOut) {
return Math.round(tOut * Utils.TIMEOUT_FACTOR);
}
+
+ /**
+ * Runs runnable and checks that it throws expected exception. If exceptionException is null it means
+ * that we expect no exception to be thrown.
+ * @param runnable what we run
+ * @param expectedException expected exception
+ */
+ public static void runAndCheckException(Runnable runnable, Class<? extends Throwable> expectedException) {
+ try {
+ runnable.run();
+ if (expectedException != null) {
+ throw new AssertionError("Didn't get expected exception " + expectedException.getSimpleName());
+ }
+ } catch (Throwable t) {
+ if (expectedException == null) {
+ throw new AssertionError("Got unexpected exception ", t);
+ }
+ if (!expectedException.isAssignableFrom(t.getClass())) {
+ throw new AssertionError(String.format("Got unexpected exception %s instead of %s",
+ t.getClass().getSimpleName(), expectedException.getSimpleName()), t);
+ }
+ }
+ }
+
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/testlibrary_tests/whitebox/BlobSanityTest.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,60 @@
+/*
+ * 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 BlobSanityTest
+ * @bug 8132980
+ * @library /testlibrary /../../test/lib
+ * @modules java.management/sun.management
+ * @build BlobSanityTest
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI BlobSanityTest
+ * @summary sanity testing of allocateCodeBlob, freeCodeBlob and getCodeBlob
+ */
+
+
+import sun.hotspot.WhiteBox;
+
+import java.util.function.Consumer;
+import jdk.test.lib.Utils;
+
+public class BlobSanityTest {
+
+ private static void runTest(Consumer<Integer> consumer, int val, String testCaseName, Class<? extends Throwable>
+ expectedException) {
+ System.out.println("Calling " + testCaseName);
+ Utils.runAndCheckException(() -> consumer.accept(val), expectedException);
+ System.out.println("Looks ok");
+ }
+
+ public static void main(String[] args) throws Exception {
+ System.out.println("Crash means that sanity check failed");
+
+ WhiteBox wb = WhiteBox.getWhiteBox();
+
+ runTest(wb::freeCodeBlob, 0, "wb::freeCodeBlob(0)", null);
+ runTest(wb::getCodeBlob, 0, "wb::getCodeBlob(0)", NullPointerException.class);
+ runTest(x -> wb.allocateCodeBlob(x, 0), -1, "wb::allocateCodeBlob(-1,0)", IllegalArgumentException.class);
+ }
+}
--- a/jaxp/.hgtags Tue Sep 22 14:24:31 2015 -0400
+++ b/jaxp/.hgtags Mon Sep 21 17:49:57 2015 +0200
@@ -323,3 +323,4 @@
5b1899c9822db4a80a29cac82af492afea9f8f41 jdk9-b78
cf809edc840ff7546677d38b13ebd8b3cae2bbda jdk9-b79
f464f9b2fb1178f6a957e5730b4b5252c6149ed9 jdk9-b80
+6a418934997fc4b56664b88f8417e2f0fe658091 jdk9-b81
--- a/jaxws/.hgtags Tue Sep 22 14:24:31 2015 -0400
+++ b/jaxws/.hgtags Mon Sep 21 17:49:57 2015 +0200
@@ -326,3 +326,4 @@
ac1748bab0743137574be3451307b6a6361719eb jdk9-b78
42ae657e0e104fa7877996b8095f2e3ab1596118 jdk9-b79
e9940bf1c8ddaa6f1f5f1813846b080f0ccaf50b jdk9-b80
+139338618c77d793ab8b550f06819ddb8381316f jdk9-b81
--- a/jdk/.hgtags Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/.hgtags Mon Sep 21 17:49:57 2015 +0200
@@ -323,3 +323,4 @@
0940ce86c614458f5bdd72278b190abbf36b7b45 jdk9-b78
d99c2ffdd0f15753e69126583688f2f075a0a5e8 jdk9-b79
4947810137ae53abba3028cc366af953d90fa81a jdk9-b80
+fdc13a2d32867ca3c57b7fa2620c6b59c83168cb jdk9-b81
--- a/jdk/make/Tools.gmk Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/make/Tools.gmk Mon Sep 21 17:49:57 2015 +0200
@@ -38,7 +38,9 @@
$(eval $(call SetupJavaCompilation,BUILD_TOOLS_JDK, \
SETUP := GENERATE_OLDBYTECODE, \
- ADD_JAVAC_FLAGS := "-Xbootclasspath/p:$(BUILDTOOLS_OUTPUTDIR)/interim_jimage_classes$(PATH_SEP)$(BUILDTOOLS_OUTPUTDIR)/interim_cldrconverter_classes", \
+ ADD_JAVAC_FLAGS := -Xbootclasspath/p:$(call PathList, \
+ $(BUILDTOOLS_OUTPUTDIR)/interim_jimage_classes \
+ $(BUILDTOOLS_OUTPUTDIR)/interim_cldrconverter_classes), \
SRC := $(JDK_TOPDIR)/make/src/classes $(BUILDTOOLS_OUTPUTDIR)/interim_cldrconverter_classes, \
BIN := $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes, \
COPY := boot.modules ext.modules))
@@ -126,11 +128,11 @@
build.tools.cldrconverter.CLDRConverter
TOOL_GENMODULESXML = $(JAVA_SMALL) -Xbootclasspath/p:$(INTERIM_LANGTOOLS_JAR) \
- -cp "$(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes$(PATH_SEP)$(JDK_OUTPUTDIR)" \
+ -cp $(call PathList, $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes $(JDK_OUTPUTDIR)) \
build.tools.module.GenJdepsModulesXml
TOOL_IMAGEBUILDER = $(JAVA_SMALL) -Xbootclasspath/p:$(BUILDTOOLS_OUTPUTDIR)/interim_jimage_classes \
- -cp "$(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes$(PATH_SEP)$(JDK_OUTPUTDIR)" \
+ -cp $(call PathList, $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes $(JDK_OUTPUTDIR)) \
build.tools.module.ImageBuilder
##########################################################################################
@@ -157,28 +159,6 @@
##########################################################################################
-# Tools needed on solaris because OBJCOPY is broken.
-
-ifeq ($(OPENJDK_TARGET_OS), solaris)
- $(eval $(call SetupNativeCompilation,ADD_GNU_DEBUGLINK, \
- SRC := $(JDK_TOPDIR)/make/src/native/add_gnu_debuglink, \
- TOOLCHAIN := TOOLCHAIN_BUILD, \
- LDFLAGS := -lelf, \
- OBJECT_DIR := $(BUILDTOOLS_OUTPUTDIR)/objs/add_gnu_debuglink, \
- OUTPUT_DIR := $(BUILDTOOLS_OUTPUTDIR)/bin, \
- PROGRAM := add_gnu_debuglink))
-
- $(eval $(call SetupNativeCompilation,FIX_EMPTY_SEC_HDR_FLAGS, \
- SRC := $(JDK_TOPDIR)/make/src/native/fix_empty_sec_hdr_flags, \
- TOOLCHAIN := TOOLCHAIN_BUILD, \
- LDFLAGS := -lelf, \
- OBJECT_DIR := $(BUILDTOOLS_OUTPUTDIR)/objs/fix_empty_sec_hdr_flags, \
- OUTPUT_DIR := $(BUILDTOOLS_OUTPUTDIR)/bin, \
- PROGRAM := fix_empty_sec_hdr_flags))
-
- BUILD_TOOLS_JDK += $(ADD_GNU_DEBUGLINK) $(FIX_EMPTY_SEC_HDR_FLAGS)
-endif
-
$(BUILD_TOOLS_JDK): $(BUILD_INTERIM_JIMAGE) $(COPY_JIMAGE_SERVICE_PROVIDER)
java-tools: $(BUILD_TOOLS_JDK)
--- a/jdk/make/gensrc/GensrcSwing.gmk Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/make/gensrc/GensrcSwing.gmk Mon Sep 21 17:49:57 2015 +0200
@@ -77,9 +77,9 @@
$(ECHO) Generating beaninfo
$(MKDIR) -p $(BEANINFO_OUTPUTDIR)/javax/swing
$(JAVA) -Djava.awt.headless=true $(NEW_JAVADOC) \
- -sourcepath "$(subst $(SPACE),$(PATH_SEP),\
+ -sourcepath $(call PathList,\
$(wildcard $(JDK_TOPDIR)/src/*/*/classes) \
- $(SUPPORT_OUTPUTDIR)/gensrc/java.base)" \
+ $(SUPPORT_OUTPUTDIR)/gensrc/java.base) \
-doclet build.tools.swingbeaninfo.GenDocletBeanInfo \
-x $(SWINGBEAN_DEBUG_FLAG) -d $(BEANINFO_OUTPUTDIR)/javax/swing \
-t $(DOCLET_DATA_DIR)/SwingBeanInfo.template \
--- a/jdk/make/launcher/LauncherCommon.gmk Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/make/launcher/LauncherCommon.gmk Mon Sep 21 17:49:57 2015 +0200
@@ -28,9 +28,6 @@
# Prepare the find cache.
$(eval $(call FillCacheFind, $(JDK_TOPDIR)/src/java.base/share/native/launcher))
-# Build tools
-include Tools.gmk
-
# When building a legacy overlay image (on solaris 64 bit), the launchers
# need to be built with a different rpath and a different output dir.
ifeq ($(OVERLAY_IMAGES), true)
--- a/jdk/make/lib/LibCommon.gmk Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/make/lib/LibCommon.gmk Mon Sep 21 17:49:57 2015 +0200
@@ -27,9 +27,6 @@
include MakeBase.gmk
include NativeCompilation.gmk
-# Build tools
-include Tools.gmk
-
GLOBAL_VERSION_INFO_RESOURCE := $(JDK_TOPDIR)/src/java.base/windows/native/common/version.rc
# Absolute paths to lib files on windows for use in LDFLAGS. Should figure out a more
--- a/jdk/make/mapfiles/libj2ucrypto/mapfile-vers Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/make/mapfiles/libj2ucrypto/mapfile-vers Mon Sep 21 17:49:57 2015 +0200
@@ -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
@@ -39,6 +39,7 @@
Java_com_oracle_security_ucrypto_NativeCipher_nativeUpdate;
Java_com_oracle_security_ucrypto_NativeCipher_nativeFinal;
Java_com_oracle_security_ucrypto_NativeKey_nativeFree;
+ Java_com_oracle_security_ucrypto_NativeKey_00024RSAPrivate_nativeInit;
Java_com_oracle_security_ucrypto_NativeKey_00024RSAPrivateCrt_nativeInit;
Java_com_oracle_security_ucrypto_NativeKey_00024RSAPublic_nativeInit;
Java_com_oracle_security_ucrypto_NativeRSASignature_nativeInit;
@@ -56,6 +57,7 @@
JavaCritical_com_oracle_security_ucrypto_NativeCipher_nativeUpdate;
JavaCritical_com_oracle_security_ucrypto_NativeCipher_nativeFinal;
JavaCritical_com_oracle_security_ucrypto_NativeKey_nativeFree;
+ JavaCritical_com_oracle_security_ucrypto_NativeKey_00024RSAPrivate_nativeInit;
JavaCritical_com_oracle_security_ucrypto_NativeKey_00024RSAPrivateCrt_nativeInit;
JavaCritical_com_oracle_security_ucrypto_NativeKey_00024RSAPublic_nativeInit;
JavaCritical_com_oracle_security_ucrypto_NativeRSASignature_nativeInit;
--- a/jdk/make/mapfiles/libnet/mapfile-vers Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/make/mapfiles/libnet/mapfile-vers Mon Sep 21 17:49:57 2015 +0200
@@ -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
@@ -28,8 +28,7 @@
SUNWprivate_1.1 {
global:
JNI_OnLoad;
- Java_java_net_AbstractPlainDatagramSocketImpl_init;
- Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable;
+ Java_java_net_PlainDatagramSocketImpl_dataAvailable;
Java_java_net_PlainSocketImpl_socketListen;
Java_java_net_PlainDatagramSocketImpl_getTTL;
Java_java_net_PlainDatagramSocketImpl_init;
--- a/jdk/make/rmic/RmicCommon.gmk Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/make/rmic/RmicCommon.gmk Mon Sep 21 17:49:57 2015 +0200
@@ -31,8 +31,9 @@
##########################################################################################
-BTRMIC_CP := $(INTERIM_CORBA_JAR)$(PATH_SEP)$(BUILDTOOLS_OUTPUTDIR)/interim_rmic_classes$(PATH_SEP)$(INTERIM_LANGTOOLS_JAR)
-BTRMIC_ARGS := "-Xbootclasspath/p:$(BTRMIC_CP)" -cp "$(BTRMIC_CP)"
+BTRMIC_CP := $(call PathList, $(INTERIM_CORBA_JAR) \
+ $(BUILDTOOLS_OUTPUTDIR)/interim_rmic_classes $(INTERIM_LANGTOOLS_JAR))
+BTRMIC_ARGS := -Xbootclasspath/p:$(BTRMIC_CP) -cp $(BTRMIC_CP)
RMIC := $(JAVA) $(BTRMIC_ARGS) sun.rmi.rmic.Main
CLASSES_DIR := $(JDK_OUTPUTDIR)/modules
--- a/jdk/make/src/classes/build/tools/cldrconverter/Bundle.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/make/src/classes/build/tools/cldrconverter/Bundle.java Mon Sep 21 17:49:57 2015 +0200
@@ -27,15 +27,12 @@
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Enumeration;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
-import java.util.Locale;
import java.util.Map;
import java.util.Objects;
-import java.util.ResourceBundle;
class Bundle {
static enum Type {
@@ -117,6 +114,7 @@
private final String cldrPath;
private final EnumSet<Type> bundleTypes;
private final String currencies;
+ private Map<String, Object> targetMap;
static Bundle getBundle(String id) {
return bundles.get(id);
@@ -176,6 +174,10 @@
* visible for the bundle's locale
*/
Map<String, Object> getTargetMap() throws Exception {
+ if (targetMap != null) {
+ return targetMap;
+ }
+
String[] cldrBundles = getCLDRPath().split(",");
// myMap contains resources for id.
@@ -398,6 +400,7 @@
}
}
+ targetMap = myMap;
return myMap;
}
@@ -632,7 +635,7 @@
return null;
}
- static Object[][] jreTimeZoneNames = TimeZoneNames.getContents();
+ static List<Object[]> jreTimeZoneNames = Arrays.asList(TimeZoneNames.getContents());
private void fillInJREs(String key, Map<String, String> map) {
String tzid = null;
--- a/jdk/make/src/classes/build/tools/cldrconverter/CLDRConverter.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/make/src/classes/build/tools/cldrconverter/CLDRConverter.java Mon Sep 21 17:49:57 2015 +0200
@@ -25,6 +25,7 @@
package build.tools.cldrconverter;
+import static build.tools.cldrconverter.Bundle.jreTimeZoneNames;
import build.tools.cldrconverter.BundleGenerator.BundleType;
import java.io.File;
import java.nio.file.DirectoryStream;
@@ -564,6 +565,44 @@
private static Map<String, Object> extractZoneNames(Map<String, Object> map, String id) {
Map<String, Object> names = new HashMap<>();
+
+ // Copy over missing time zone ids from JRE for English locale
+ if (id.equals("en")) {
+ Map<String[], String> jreMetaMap = new HashMap<>();
+ jreTimeZoneNames.stream().forEach(e -> {
+ String tzid = (String)e[0];
+ String[] data = (String[])e[1];
+
+ if (map.get(TIMEZONE_ID_PREFIX + tzid) == null &&
+ handlerMetaZones.get(tzid) == null) {
+ // First, check the CLDR meta key
+ Optional<Map.Entry<String, String>> cldrMeta =
+ handlerMetaZones.getData().entrySet().stream()
+ .filter(me ->
+ Arrays.deepEquals(data,
+ (String[])map.get(METAZONE_ID_PREFIX + me.getValue())))
+ .findAny();
+ if (cldrMeta.isPresent()) {
+ names.put(tzid, cldrMeta.get().getValue());
+ } else {
+ // check the JRE meta key, add if there is not.
+ Optional<Map.Entry<String[], String>> jreMeta =
+ jreMetaMap.entrySet().stream()
+ .filter(jm -> Arrays.deepEquals(data, jm.getKey()))
+ .findAny();
+ if (jreMeta.isPresent()) {
+ names.put(tzid, jreMeta.get().getValue());
+ } else {
+ String metaName = "JRE_" + tzid.replaceAll("[/-]", "_");
+ names.put(METAZONE_ID_PREFIX + metaName, data);
+ names.put(tzid, metaName);
+ jreMetaMap.put(data, metaName);
+ }
+ }
+ }
+ });
+ }
+
for (String tzid : handlerMetaZones.keySet()) {
String tzKey = TIMEZONE_ID_PREFIX + tzid;
Object data = map.get(tzKey);
--- a/jdk/make/src/classes/build/tools/cldrconverter/ResourceBundleGenerator.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/make/src/classes/build/tools/cldrconverter/ResourceBundleGenerator.java Mon Sep 21 17:49:57 2015 +0200
@@ -266,22 +266,47 @@
out.println((CLDRConverter.isBaseModule ? "package sun.util.cldr;\n\n" :
"package sun.util.resources.cldr.provider;\n\n")
+ "import java.util.HashMap;\n"
+ + "import java.util.Locale;\n"
+ "import java.util.Map;\n"
- + "import java.util.ListResourceBundle;\n"
+ "import sun.util.locale.provider.LocaleProviderAdapter;\n"
+ "import sun.util.locale.provider.LocaleDataMetaInfo;\n");
- out.printf("public class %s extends ListResourceBundle implements LocaleDataMetaInfo {\n", className);
- out.println(" @Override\n" +
- " protected final Object[][] getContents() {\n" +
- " final Object[][] data = new Object[][] {");
+ out.printf("public class %s implements LocaleDataMetaInfo {\n", className);
+ out.println(" private static final Map<String, String> resourceNameToLocales = new HashMap<>();\n" +
+ (CLDRConverter.isBaseModule ?
+ " private static final Map<Locale, String[]> parentLocalesMap = new HashMap<>();\n\n" : "\n") +
+ " static {\n");
+
for (String key : metaInfo.keySet()) {
- out.printf(" { \"%s\",\n", key);
- out.printf(" \"%s\" },\n",
+ if (key.startsWith(CLDRConverter.PARENT_LOCALE_PREFIX)) {
+ String parentTag = key.substring(CLDRConverter.PARENT_LOCALE_PREFIX.length());
+ if ("root".equals(parentTag)) {
+ out.printf(" parentLocalesMap.put(Locale.ROOT,\n");
+ } else {
+ out.printf(" parentLocalesMap.put(Locale.forLanguageTag(\"%s\"),\n",
+ parentTag);
+ }
+ String[] childlen = toLocaleList(metaInfo.get(key), true).split(" ");
+ out.printf(" new String[] {\n" +
+ " ");
+ int count = 0;
+ for (int i = 0; i < childlen.length; i++) {
+ String child = childlen[i];
+ out.printf("\"%s\", ", child);
+ count += child.length() + 4;
+ if (i != childlen.length - 1 && count > 64) {
+ out.printf("\n ");
+ count = 0;
+ }
+ }
+ out.printf("\n });\n");
+ } else {
+ out.printf(" resourceNameToLocales.put(\"%s\",\n", key);
+ out.printf(" \"%s\");\n",
toLocaleList(key.equals("FormatData") ? metaInfo.get("AvailableLocales") :
- metaInfo.get(key),
- key.startsWith(CLDRConverter.PARENT_LOCALE_PREFIX)));
+ metaInfo.get(key), false));
+ }
}
- out.println(" };\n return data;\n }\n\n");
+ out.println(" }\n\n");
out.println(" @Override\n" +
" public LocaleProviderAdapter.Type getType() {\n" +
@@ -290,19 +315,13 @@
out.println(" @Override\n" +
" public String availableLanguageTags(String category) {\n" +
- " return getString(category);\n" +
- " };\n\n");
+ " return resourceNameToLocales.getOrDefault(category, \"\");\n" +
+ " }\n\n");
if (CLDRConverter.isBaseModule) {
- out.printf(" public Map<String, String> parentLocales() {\n" +
- " Map<String, String> ret = new HashMap<>();\n" +
- " keySet().stream()\n" +
- " .filter(key -> key.startsWith(\"%s\"))\n" +
- " .forEach(key -> ret.put(key.substring(%d), getString(key)));\n" +
- " return ret.isEmpty() ? null : ret;\n" +
- " };\n}",
- CLDRConverter.PARENT_LOCALE_PREFIX,
- CLDRConverter.PARENT_LOCALE_PREFIX.length());
+ out.printf(" public Map<Locale, String[]> parentLocales() {\n" +
+ " return parentLocalesMap;\n" +
+ " }\n}");
} else {
out.println("}");
}
--- a/jdk/make/src/native/add_gnu_debuglink/add_gnu_debuglink.c Tue Sep 22 14:24:31 2015 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,285 +0,0 @@
-/*
- * Copyright (c) 2012, 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.
- *
- * 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.
- *
- */
-
-/*
- * Name: add_gnu_debuglink.c
- *
- * Description: Add a ".gnu_debuglink" section that refers to the specified
- * debug_info_path to the specified ELF object.
- *
- * This program is adapted from the example program shown on the
- * elf(3elf) man page and from code from the Solaris compiler
- * driver.
- */
-
-/*
- * needed to define SHF_EXCLUDE
- */
-#define ELF_TARGET_ALL
-
-#include <fcntl.h>
-#include <stdio.h>
-#include <libelf.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-static void failure(void);
-static unsigned int gnu_debuglink_crc32(unsigned int crc, unsigned char *buf,
- size_t len);
-
-void
-main(int argc, char ** argv) {
- /* new ELF section name */
- static char SEC_NAME[] = ".gnu_debuglink";
-
- unsigned char buffer[8 * 1024]; /* I/O buffer */
- int buffer_len; /* buffer length */
- char * debug_info_path; /* debug info path */
- void * ehdr; /* ELF header */
- Elf * elf; /* ELF descriptor */
- char * elf_ident; /* ELF identity string */
- char * elf_obj; /* elf_obj file */
- int fd; /* descriptor for files */
- unsigned int file_crc = 0; /* CRC for debug info file */
- int is_elfclass64; /* is an ELFCLASS64 file? */
- Elf_Data * link_dat; /* ELF data for new debug info link */
- Elf_Data * name_dat; /* ELF data for new section name */
- Elf_Scn * new_scn; /* new ELF section descriptor */
- void * new_shdr; /* new ELF section header */
- Elf_Scn * scn; /* ELF section descriptor */
- void * shdr; /* ELF section header */
-
- if (argc != 3) {
- (void) fprintf(stderr, "Usage: %s debug_info_path elf_obj\n", argv[0]);
- exit(2);
- }
-
- debug_info_path = argv[1]; /* save for later */
- if ((fd = open(debug_info_path, O_RDONLY)) == -1) {
- (void) fprintf(stderr, "%s: cannot open file.\n", debug_info_path);
- exit(3);
- }
-
- (void) printf("Computing CRC for '%s'\n", debug_info_path);
- (void) fflush(stdout);
- /* compute CRC for the debug info file */
- for (;;) {
- int len = read(fd, buffer, sizeof buffer);
- if (len <= 0) {
- break;
- }
- file_crc = gnu_debuglink_crc32(file_crc, buffer, len);
- }
- (void) close(fd);
-
- /* open the elf_obj */
- elf_obj = argv[2];
- if ((fd = open(elf_obj, O_RDWR)) == -1) {
- (void) fprintf(stderr, "%s: cannot open file.\n", elf_obj);
- exit(4);
- }
-
- (void) printf("Opening '%s' for update\n", elf_obj);
- (void) fflush(stdout);
- (void) elf_version(EV_CURRENT); /* coordinate ELF versions */
-
- /* obtain the ELF descriptors from the input file */
- if ((elf = elf_begin(fd, ELF_C_RDWR, NULL)) == NULL) {
- failure();
- }
-
- /* determine if ELFCLASS64 or not? */
- elf_ident = elf_getident(elf, NULL);
- is_elfclass64 = (elf_ident[EI_CLASS] == ELFCLASS64);
-
- /* get the ELF header */
- if (is_elfclass64) {
- ehdr = elf64_getehdr(elf);
- } else {
- ehdr = elf32_getehdr(elf);
- }
- if (ehdr == NULL) {
- failure();
- }
-
- /* get the ELF section descriptor */
- if (is_elfclass64) {
- scn = elf_getscn(elf, ((Elf64_Ehdr *) ehdr)->e_shstrndx);
- } else {
- scn = elf_getscn(elf, ((Elf32_Ehdr *) ehdr)->e_shstrndx);
- }
- if (scn == NULL) {
- failure();
- }
-
- /* get the section header */
- if (is_elfclass64) {
- shdr = elf64_getshdr(scn);
- } else {
- shdr = elf32_getshdr(scn);
- }
- if (shdr == NULL) {
- failure();
- }
-
- (void) printf("Adding ELF data for new section name\n");
- (void) fflush(stdout);
- name_dat = elf_newdata(scn);
- name_dat->d_buf = (void *) SEC_NAME;
- if (is_elfclass64) {
- name_dat->d_off = ((Elf64_Shdr *) shdr)->sh_size + 1;
- } else {
- name_dat->d_off = ((Elf32_Shdr *) shdr)->sh_size + 1;
- }
- name_dat->d_align = 1;
- name_dat->d_size = strlen(SEC_NAME) + 1;
-
- new_scn = elf_newscn(elf);
-
- if (is_elfclass64) {
- new_shdr = elf64_getshdr(new_scn);
- ((Elf64_Shdr *) new_shdr)->sh_flags = SHF_EXCLUDE;
- ((Elf64_Shdr *) new_shdr)->sh_type = SHT_PROGBITS;
- ((Elf64_Shdr *) new_shdr)->sh_name = ((Elf64_Shdr *) shdr)->sh_size;
- ((Elf64_Shdr *) new_shdr)->sh_addralign = 1;
- ((Elf64_Shdr *) shdr)->sh_size += (strlen(SEC_NAME) + 1);
- } else {
- new_shdr = elf32_getshdr(new_scn);
- ((Elf32_Shdr *) new_shdr)->sh_flags = SHF_EXCLUDE;
- ((Elf32_Shdr *) new_shdr)->sh_type = SHT_PROGBITS;
- ((Elf32_Shdr *) new_shdr)->sh_name = ((Elf32_Shdr *) shdr)->sh_size;
- ((Elf32_Shdr *) new_shdr)->sh_addralign = 1;
- ((Elf32_Shdr *) shdr)->sh_size += (strlen(SEC_NAME) + 1);
- }
-
- (void) printf("Adding ELF data for debug_info_path value\n");
- (void) fflush(stdout);
- (void) memset(buffer, 0, sizeof buffer);
- buffer_len = strlen(debug_info_path) + 1; /* +1 for NUL */
- (void) strncpy((char *) buffer, debug_info_path, buffer_len);
- if (buffer_len % 4 != 0) {
- /* not on a 4 byte boundary so pad to the next one */
- buffer_len += (4 - buffer_len % 4);
- }
- /* save the CRC */
- (void) memcpy(&buffer[buffer_len], &file_crc, sizeof file_crc);
- buffer_len += sizeof file_crc;
-
- link_dat = elf_newdata(new_scn);
- link_dat->d_type = ELF_T_BYTE;
- link_dat->d_size = buffer_len;
- link_dat->d_buf = buffer;
- link_dat->d_align = 1;
-
- (void) printf("Saving updates to '%s'\n", elf_obj);
- (void) fflush(stdout);
- (void) elf_update(elf, ELF_C_NULL); /* recalc ELF memory structures */
- (void) elf_update(elf, ELF_C_WRITE); /* write out changes to ELF obj */
- (void) elf_end(elf); /* done with ELF obj */
- (void) close(fd);
-
- (void) printf("Done updating '%s'\n", elf_obj);
- (void) fflush(stdout);
- exit(0);
-} /* end main */
-
-
-static void
-failure() {
- (void) fprintf(stderr, "%s\n", elf_errmsg(elf_errno()));
- exit(5);
-}
-
-
-/*
- * The CRC used in gnu_debuglink, retrieved from
- * http://sourceware.org/gdb/current/onlinedocs/gdb/Separate-Debug-Files.html#Separate-Debug-Files.
- */
-
-static unsigned int
-gnu_debuglink_crc32(unsigned int crc, unsigned char *buf, size_t len) {
- static const unsigned int crc32_table[256] = {
- 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
- 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
- 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
- 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
- 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
- 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
- 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
- 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
- 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
- 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
- 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
- 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
- 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
- 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
- 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
- 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
- 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
- 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
- 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
- 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
- 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
- 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
- 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
- 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
- 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
- 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
- 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
- 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
- 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
- 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
- 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
- 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
- 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
- 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
- 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
- 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
- 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
- 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
- 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
- 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
- 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
- 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
- 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
- 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
- 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
- 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
- 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
- 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
- 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
- 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
- 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
- 0x2d02ef8d
- };
-
- unsigned char *end;
-
- crc = ~crc & 0xffffffff;
- for (end = buf + len; buf < end; ++buf) {
- crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
- }
- return ~crc & 0xffffffff;
-}
--- a/jdk/make/src/native/fix_empty_sec_hdr_flags/fix_empty_sec_hdr_flags.c Tue Sep 22 14:24:31 2015 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,181 +0,0 @@
-/*
- * Copyright (c) 2012, 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.
- *
- * 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.
- *
- */
-
-/*
- * Name: fix_empty_sec_hdr_flags.c
- *
- * Description: Remove the SHF_ALLOC flag from "empty" section headers.
- * An "empty" section header has sh_addr == 0 and sh_size == 0.
- *
- * This program is adapted from the example program shown on the
- * elf(3elf) man page and from code from the Solaris compiler
- * driver.
- */
-
-#include <fcntl.h>
-#include <stdio.h>
-#include <libelf.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-static void failure(void);
-
-void
-main(int argc, char ** argv) {
- void * ehdr; /* ELF header */
- unsigned int i; /* section counter */
- int fd; /* descriptor for file */
- Elf * elf; /* ELF descriptor */
- char * elf_ident; /* ELF identity string */
- char * elf_obj; /* elf_obj file */
- int fix_count; /* number of flags fixed */
- int is_elfclass64; /* is an ELFCLASS64 file? */
- Elf_Scn * scn; /* ELF section descriptor */
- void * shdr; /* ELF section header */
- Elf_Data * shstrtab; /* ELF section header string table */
-
- if (argc != 2) {
- (void) fprintf(stderr, "Usage: %s elf_obj\n", argv[0]);
- exit(2);
- }
-
- /* open the elf_obj */
- elf_obj = argv[1];
- if ((fd = open(elf_obj, O_RDWR)) == -1) {
- (void) fprintf(stderr, "%s: cannot open file.\n", elf_obj);
- exit(3);
- }
-
- (void) printf("Opening '%s' for update\n", elf_obj);
- (void) fflush(stdout);
- (void) elf_version(EV_CURRENT); /* coordinate ELF versions */
-
- /* obtain the ELF descriptors from the input file */
- if ((elf = elf_begin(fd, ELF_C_RDWR, NULL)) == NULL) {
- failure();
- }
-
- /* determine if ELFCLASS64 or not? */
- elf_ident = elf_getident(elf, NULL);
- is_elfclass64 = (elf_ident[EI_CLASS] == ELFCLASS64);
-
- /* get the ELF header */
- if (is_elfclass64) {
- ehdr = elf64_getehdr(elf);
- } else {
- ehdr = elf32_getehdr(elf);
- }
- if (ehdr == NULL) {
- failure();
- }
-
- /* get the ELF section descriptor */
- if (is_elfclass64) {
- scn = elf_getscn(elf, ((Elf64_Ehdr *) ehdr)->e_shstrndx);
- } else {
- scn = elf_getscn(elf, ((Elf32_Ehdr *) ehdr)->e_shstrndx);
- }
- if (scn == NULL) {
- failure();
- }
-
- /* get the section header string table */
- shstrtab = elf_getdata(scn, NULL);
- if (shstrtab == NULL) {
- failure();
- }
-
- fix_count = 0;
-
- /* traverse the sections of the input file */
- for (i = 1, scn = NULL; scn = elf_nextscn(elf, scn); i++) {
- int has_flag_set; /* is SHF_ALLOC flag set? */
- int is_empty; /* is section empty? */
- char * name; /* short hand pointer */
-
- /* get the section header */
- if (is_elfclass64) {
- shdr = elf64_getshdr(scn);
- } else {
- shdr = elf32_getshdr(scn);
- }
- if (shdr == NULL) {
- failure();
- }
-
- if (is_elfclass64) {
- name = (char *)shstrtab->d_buf + ((Elf64_Shdr *) shdr)->sh_name;
- } else {
- name = (char *)shstrtab->d_buf + ((Elf32_Shdr *) shdr)->sh_name;
- }
-
- if (is_elfclass64) {
- has_flag_set = ((Elf64_Shdr *) shdr)->sh_flags & SHF_ALLOC;
- is_empty = ((Elf64_Shdr *) shdr)->sh_addr == 0 &&
- ((Elf64_Shdr *) shdr)->sh_size == 0;
- } else {
- has_flag_set = ((Elf32_Shdr *) shdr)->sh_flags & SHF_ALLOC;
- is_empty = ((Elf32_Shdr *) shdr)->sh_addr == 0 &&
- ((Elf32_Shdr *) shdr)->sh_size == 0;
- }
-
- if (is_empty && has_flag_set) {
- (void) printf("section[%u] '%s' is empty, "
- "but SHF_ALLOC flag is set.\n", i, name);
- (void) printf("Clearing the SHF_ALLOC flag.\n");
-
- if (is_elfclass64) {
- ((Elf64_Shdr *) shdr)->sh_flags &= ~SHF_ALLOC;
- } else {
- ((Elf32_Shdr *) shdr)->sh_flags &= ~SHF_ALLOC;
- }
- fix_count++;
- }
- } /* end for each ELF section */
-
- if (fix_count > 0) {
- (void) printf("Saving %d updates to '%s'\n", fix_count, elf_obj);
- (void) fflush(stdout);
- (void) elf_update(elf, ELF_C_NULL); /* recalc ELF memory structures */
- (void) elf_update(elf, ELF_C_WRITE); /* write out changes to ELF obj */
- } else {
- (void) printf("No SHF_ALLOC flags needed to be cleared.\n");
- }
-
- (void) elf_end(elf); /* done with ELF obj */
- (void) close(fd);
-
- (void) printf("Done %s '%s'\n",
- (fix_count > 0) ? "updating" : "with", elf_obj);
- (void) fflush(stdout);
- exit(0);
-} /* end main */
-
-
-static void
-failure() {
- (void) fprintf(stderr, "%s\n", elf_errmsg(elf_errno()));
- exit(6);
-}
--- a/jdk/src/java.base/linux/native/libjava/ProcessHandleImpl_linux.c Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.base/linux/native/libjava/ProcessHandleImpl_linux.c Mon Sep 21 17:49:57 2015 +0200
@@ -141,17 +141,21 @@
struct stat stat_buf;
/*
+ * Stat /proc/<pid> to get the user id
+ */
+ snprintf(fn, sizeof fn, "/proc/%d", pid);
+ if (stat(fn, &stat_buf) == 0) {
+ unix_getUserInfo(env, jinfo, stat_buf.st_uid);
+ }
+
+ /*
* Try to open /proc/<pid>/cmdline
*/
- snprintf(fn, sizeof fn, "/proc/%d/cmdline", pid);
+ strncat(fn, "/cmdline", sizeof fn - strnlen(fn, sizeof fn) - 1);
if ((fd = open(fn, O_RDONLY)) < 0) {
return;
}
- if (fstat(fd, &stat_buf) == 0) {
- unix_getUserInfo(env, jinfo, stat_buf.st_uid);
- }
-
do { // Block to break out of on errors
int i, truncated = 0;
int count;
--- a/jdk/src/java.base/share/classes/java/net/AbstractPlainDatagramSocketImpl.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/java/net/AbstractPlainDatagramSocketImpl.java Mon Sep 21 17:49:57 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -68,7 +68,6 @@
return null;
}
});
- init();
}
/**
@@ -364,6 +363,5 @@
return connectDisabled;
}
- native int dataAvailable();
- private static native void init();
+ abstract int dataAvailable();
}
--- a/jdk/src/java.base/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java Mon Sep 21 17:49:57 2015 +0200
@@ -233,8 +233,7 @@
}
CertStore ucs = null;
try {
- ucs = URICertStore.getInstance
- (new URICertStore.URICertStoreParameters(uri));
+ ucs = URICertStore.getInstance(new URICertStoreParameters(uri));
} catch (InvalidAlgorithmParameterException |
NoSuchAlgorithmException e) {
if (debug != null) {
--- a/jdk/src/java.base/share/classes/sun/security/provider/certpath/OCSPNonceExtension.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/security/provider/certpath/OCSPNonceExtension.java Mon Sep 21 17:49:57 2015 +0200
@@ -26,15 +26,13 @@
package sun.security.provider.certpath;
import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Enumeration;
+import java.util.Objects;
import java.security.SecureRandom;
-import sun.security.x509.AttributeNameEnumeration;
-import sun.security.x509.CertAttrSet;
import sun.security.x509.Extension;
import sun.security.x509.PKIXExtensions;
-import sun.security.util.*;
+import sun.security.util.Debug;
+import sun.security.util.DerValue;
/**
* Represent the OCSP Nonce Extension.
@@ -43,252 +41,139 @@
* and help to prevent replay attacks (see RFC 6960, section 4.4.1).
*
* @see Extension
- * @see CertAttrSet
*/
-public class OCSPNonceExtension extends Extension
-implements CertAttrSet<String> {
+public final class OCSPNonceExtension extends Extension {
/**
* Attribute name.
*/
- public static final String NAME = "OCSPNonce";
- public static final String NONCE = "nonce";
-
+ private static final String EXTENSION_NAME = "OCSPNonce";
private byte[] nonceData = null;
- private String extensionName;
-
- /**
- * Encode this extension value to DER and assign it to the
- * {@code extensionName} data member.
- *
- * @throws IOException if any errors occur during DER encoding
- */
- private void encodeInternal() throws IOException {
- if (nonceData == null) {
- this.extensionValue = null;
- return;
- }
- DerOutputStream os = new DerOutputStream();
- os.putOctetString(this.nonceData);
- this.extensionValue = os.toByteArray();
- }
/**
* Create a {@code OCSPNonceExtension} by providing the nonce length.
- * The criticality is set to false. The random bytes will be generated
- * using the SUN provider.
+ * The criticality is set to false, and the OID for the extension will
+ * be the value defined by "id-pkix-ocsp-nonce" from RFC 6960.
*
* @param length the number of random bytes composing the nonce
*
* @throws IOException if any errors happen during encoding of the
* extension.
+ * @throws IllegalArgumentException if length is not a positive integer.
*/
public OCSPNonceExtension(int length) throws IOException {
- this(PKIXExtensions.OCSPNonce_Id, false, length, NAME);
- }
-
- /**
- * Creates the extension (also called by the subclass).
- *
- * @param extensionId the {@code ObjectIdentifier} for the OCSP Nonce
- * extension
- * @param isCritical a boolean flag indicating if the criticality bit
- * is to be set for this extension
- * @param length the length of the nonce in bytes
- * @param extensionName the name of the extension
- *
- * @throws IOException if any errors happen during encoding of the
- * extension.
- */
- protected OCSPNonceExtension(ObjectIdentifier extensionId,
- boolean isCritical, int length, String extensionName)
- throws IOException {
- SecureRandom rng = new SecureRandom();
- this.nonceData = new byte[length];
- rng.nextBytes(nonceData);
- this.extensionId = extensionId;
- this.critical = isCritical;
- this.extensionName = extensionName;
- encodeInternal();
- }
-
- /**
- * Create the extension using the provided criticality bit setting and
- * DER encoding.
- *
- * @param critical true if the extension is to be treated as critical.
- * @param value an array of DER encoded bytes of the extnValue for the
- * extension. It must not include the encapsulating OCTET STRING
- * tag and length. For an {@code OCSPNonceExtension} the data value
- * should be a simple OCTET STRING containing random bytes
- * (see RFC 6960, section 4.4.1).
- *
- * @throws ClassCastException if value is not an array of bytes
- * @throws IOException if any errors happen during encoding of the
- * extension
- */
- public OCSPNonceExtension(Boolean critical, Object value)
- throws IOException {
- this(PKIXExtensions.OCSPNonce_Id, critical, value, NAME);
+ this(false, length);
}
/**
- * Creates the extension (also called by the subclass).
- *
- * @param extensionId the {@code ObjectIdentifier} for the OCSP Nonce
- * extension
- * @param critical a boolean flag indicating if the criticality bit
- * is to be set for this extension
- * @param value an array of DER encoded bytes of the extnValue for the
- * extension. It must not include the encapsulating OCTET STRING
- * tag and length. For an {@code OCSPNonceExtension} the data value
- * should be a simple OCTET STRING containing random bytes
- * (see RFC 6960, section 4.4.1).
- * @param extensionName the name of the extension
+ * Create a {@code OCSPNonceExtension} by providing the nonce length and
+ * criticality setting. The OID for the extension will
+ * be the value defined by "id-pkix-ocsp-nonce" from RFC 6960.
*
- * @throws ClassCastException if value is not an array of bytes
- * @throws IOException if any errors happen during encoding of the
- * extension
- */
- protected OCSPNonceExtension(ObjectIdentifier extensionId,
- Boolean critical, Object value, String extensionName)
- throws IOException {
- this.extensionId = extensionId;
- this.critical = critical;
- this.extensionValue = (byte[]) value;
- DerValue val = new DerValue(this.extensionValue);
- this.nonceData = val.getOctetString();
- this.extensionName = extensionName;
- }
-
- /**
- * Set the attribute value.
- *
- * @param name the name of the attribute.
- * @param obj an array of nonce bytes for the extension. It must not
- * contain any DER tags or length.
+ * @param isCritical a boolean flag indicating whether the criticality bit
+ * is set for this extension
+ * @param length the number of random bytes composing the nonce
*
- * @throws IOException if an unsupported name is provided or the supplied
- * {@code obj} is not a byte array
+ * @throws IOException if any errors happen during encoding of the
+ * extension.
+ * @throws IllegalArgumentException if length is not a positive integer.
*/
- @Override
- public void set(String name, Object obj) throws IOException {
- if (name.equalsIgnoreCase(NONCE)) {
- if (!(obj instanceof byte[])) {
- throw new IOException("Attribute must be of type byte[].");
- }
- nonceData = (byte[])obj;
- } else {
- throw new IOException("Attribute name not recognized by"
- + " CertAttrSet:" + extensionName + ".");
- }
- encodeInternal();
- }
+ public OCSPNonceExtension(boolean isCritical, int length)
+ throws IOException {
+ this.extensionId = PKIXExtensions.OCSPNonce_Id;
+ this.critical = isCritical;
- /**
- * Get the attribute value.
- *
- * @param name the name of the attribute to retrieve. Only "OCSPNonce"
- * is currently supported.
- *
- * @return an array of bytes that are the nonce data. It will not contain
- * any DER tags or length, only the random nonce bytes.
- *
- * @throws IOException if an unsupported name is provided.
- */
- @Override
- public Object get(String name) throws IOException {
- if (name.equalsIgnoreCase(NONCE)) {
- return nonceData;
+ if (length > 0) {
+ SecureRandom rng = new SecureRandom();
+ this.nonceData = new byte[length];
+ rng.nextBytes(nonceData);
+ this.extensionValue = new DerValue(DerValue.tag_OctetString,
+ nonceData).toByteArray();
} else {
- throw new IOException("Attribute name not recognized by"
- + " CertAttrSet:" + extensionName + ".");
+ throw new IllegalArgumentException(
+ "Length must be a positive integer");
}
}
/**
- * Delete the attribute value.
+ * Create a {@code OCSPNonceExtension} by providing a nonce value.
+ * The criticality is set to false, and the OID for the extension will
+ * be the value defined by "id-pkix-ocsp-nonce" from RFC 6960.
*
- * @param name the name of the attribute to retrieve. Only "OCSPNonce"
- * is currently supported.
+ * @param incomingNonce The nonce data to be set for the extension. This
+ * must be a non-null array of at least one byte long.
*
- * @throws IOException if an unsupported name is provided or an error
- * occurs during re-encoding of the extension.
+ * @throws IOException if any errors happen during encoding of the
+ * extension.
+ * @throws IllegalArgumentException if the incomingNonce length is not a
+ * positive integer.
+ * @throws NullPointerException if the incomingNonce is null.
*/
- @Override
- public void delete(String name) throws IOException {
- if (name.equalsIgnoreCase(NONCE)) {
- nonceData = null;
+ public OCSPNonceExtension(byte[] incomingNonce) throws IOException {
+ this(false, incomingNonce);
+ }
+
+ /**
+ * Create a {@code OCSPNonceExtension} by providing a nonce value and
+ * criticality setting. The OID for the extension will
+ * be the value defined by "id-pkix-ocsp-nonce" from RFC 6960.
+ *
+ * @param isCritical a boolean flag indicating whether the criticality bit
+ * is set for this extension
+ * @param incomingNonce The nonce data to be set for the extension. This
+ * must be a non-null array of at least one byte long.
+ *
+ * @throws IOException if any errors happen during encoding of the
+ * extension.
+ * @throws IllegalArgumentException if the incomingNonce length is not a
+ * positive integer.
+ * @throws NullPointerException if the incomingNonce is null.
+ */
+ public OCSPNonceExtension(boolean isCritical, byte[] incomingNonce)
+ throws IOException {
+ this.extensionId = PKIXExtensions.OCSPNonce_Id;
+ this.critical = isCritical;
+
+ Objects.requireNonNull(incomingNonce, "Nonce data must be non-null");
+ if (incomingNonce.length > 0) {
+ this.nonceData = incomingNonce.clone();
+ this.extensionValue = new DerValue(DerValue.tag_OctetString,
+ nonceData).toByteArray();
} else {
- throw new IOException("Attribute name not recognized by"
- + " CertAttrSet:" + extensionName + ".");
+ throw new IllegalArgumentException(
+ "Nonce data must be at least 1 byte in length");
}
- encodeInternal();
+ }
+
+ /**
+ * Return the nonce bytes themselves, without any DER encoding.
+ *
+ * @return A copy of the underlying nonce bytes
+ */
+ public byte[] getNonceValue() {
+ return nonceData.clone();
}
/**
* Returns a printable representation of the {@code OCSPNonceExtension}.
+ *
+ * @return a string representation of the extension.
*/
@Override
public String toString() {
- String s = super.toString() + extensionName + ": " +
- ((nonceData == null) ? "" : Debug.toString(nonceData))
- + "\n";
- return (s);
- }
-
- /**
- * Write the extension to an {@code OutputStream}
- *
- * @param out the {@code OutputStream} to write the extension to.
- *
- * @throws IOException on encoding errors.
- */
- @Override
- public void encode(OutputStream out) throws IOException {
- encode(out, PKIXExtensions.OCSPNonce_Id, this.critical);
+ StringBuilder sb = new StringBuilder();
+ sb.append(super.toString()).append(EXTENSION_NAME).append(": ");
+ sb.append((nonceData == null) ? "" : Debug.toString(nonceData));
+ sb.append("\n");
+ return sb.toString();
}
/**
- * Write the extension to the DerOutputStream.
+ * Return the name of the extension as a {@code String}
*
- * @param out the {@code OutputStream} to write the extension to.
- * @param extensionId the {@code ObjectIdentifier} used for this extension
- * @param isCritical a flag indicating if the criticality bit is set for
- * this extension.
- *
- * @throws IOException on encoding errors.
+ * @return the name of the extension
*/
- protected void encode(OutputStream out, ObjectIdentifier extensionId,
- boolean isCritical) throws IOException {
-
- DerOutputStream tmp = new DerOutputStream();
-
- if (this.extensionValue == null) {
- this.extensionId = extensionId;
- this.critical = isCritical;
- encodeInternal();
- }
- super.encode(tmp);
- out.write(tmp.toByteArray());
- }
-
- /**
- * Return an enumeration of names of attributes existing within this
- * attribute.
- */
- @Override
- public Enumeration<String> getElements() {
- AttributeNameEnumeration elements = new AttributeNameEnumeration();
- elements.addElement(NONCE);
- return (elements.elements());
- }
-
- /**
- * Return the name of this attribute.
- */
- @Override
public String getName() {
- return (extensionName);
+ return EXTENSION_NAME;
}
}
--- a/jdk/src/java.base/share/classes/sun/security/provider/certpath/URICertStore.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/security/provider/certpath/URICertStore.java Mon Sep 21 17:49:57 2015 +0200
@@ -44,9 +44,7 @@
import java.security.cert.CRLSelector;
import java.security.cert.URICertStoreParameters;
import java.security.cert.X509Certificate;
-import java.security.cert.X509CertSelector;
import java.security.cert.X509CRL;
-import java.security.cert.X509CRLSelector;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -160,12 +158,11 @@
throw new InvalidAlgorithmParameterException
("params must be instanceof URICertStoreParameters");
}
- this.uri = ((URICertStoreParameters) params).uri;
+ this.uri = ((URICertStoreParameters) params).getURI();
// if ldap URI, use an LDAPCertStore to fetch certs and CRLs
if (uri.getScheme().toLowerCase(Locale.ENGLISH).equals("ldap")) {
ldap = true;
- URICertStoreParameters lparams = new URICertStoreParameters(uri);
- ldapCertStore = CertStore.getInstance("LDAP", lparams);
+ ldapCertStore = CertStore.getInstance("LDAP", params);
}
try {
factory = CertificateFactory.getInstance("X.509");
@@ -183,7 +180,7 @@
static synchronized CertStore getInstance(URICertStoreParameters params)
throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
if (debug != null) {
- debug.println("CertStore URI:" + params.uri);
+ debug.println("CertStore URI:" + params.getURI());
}
CertStore ucs = certStoreCache.get(params);
if (ucs == null) {
@@ -212,8 +209,7 @@
}
URI uri = ((URIName) gn).getURI();
try {
- return URICertStore.getInstance
- (new URICertStore.URICertStoreParameters(uri));
+ return URICertStore.getInstance(new URICertStoreParameters(uri));
} catch (Exception ex) {
if (debug != null) {
debug.println("exception creating CertStore: " + ex);
@@ -421,40 +417,6 @@
}
/**
- * CertStoreParameters for the URICertStore.
- */
- static class URICertStoreParameters implements CertStoreParameters {
- private final URI uri;
- private volatile int hashCode = 0;
- URICertStoreParameters(URI uri) {
- this.uri = uri;
- }
- @Override public boolean equals(Object obj) {
- if (!(obj instanceof URICertStoreParameters)) {
- return false;
- }
- URICertStoreParameters params = (URICertStoreParameters) obj;
- return uri.equals(params.uri);
- }
- @Override public int hashCode() {
- if (hashCode == 0) {
- int result = 17;
- result = 37*result + uri.hashCode();
- hashCode = result;
- }
- return hashCode;
- }
- @Override public Object clone() {
- try {
- return super.clone();
- } catch (CloneNotSupportedException e) {
- /* Cannot happen */
- throw new InternalError(e.toString(), e);
- }
- }
- }
-
- /**
* This class allows the URICertStore to be accessed as a CertStore.
*/
private static class UCS extends CertStore {
--- a/jdk/src/java.base/share/classes/sun/util/cldr/CLDRLocaleProviderAdapter.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/util/cldr/CLDRLocaleProviderAdapter.java Mon Sep 21 17:49:57 2015 +0200
@@ -41,6 +41,7 @@
import java.util.ServiceLoader;
import java.util.Set;
import java.util.StringTokenizer;
+import java.util.stream.Stream;
import sun.util.locale.provider.JRELocaleProviderAdapter;
import sun.util.locale.provider.LocaleProviderAdapter;
import sun.util.locale.provider.LocaleDataMetaInfo;
@@ -148,11 +149,9 @@
private List<Locale> applyParentLocales(String baseName, List<Locale> candidates) {
if (Objects.isNull(parentLocalesMap)) {
Map<Locale, Locale> map = new HashMap<>();
- Map<String, String> parentLocales = baseMetaInfo.parentLocales();
- parentLocales.keySet().forEach(parent -> {
- Arrays.asList(parentLocales.get(parent).split(" ")).stream().forEach(child -> {
- map.put(Locale.forLanguageTag(child),
- "root".equals(parent) ? Locale.ROOT : Locale.forLanguageTag(parent));
+ baseMetaInfo.parentLocales().forEach((parent, children) -> {
+ Stream.of(children).forEach(child -> {
+ map.put(Locale.forLanguageTag(child), parent);
});
});
parentLocalesMap = Collections.unmodifiableMap(map);
--- a/jdk/src/java.base/share/native/libnet/InetAddress.c Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.base/share/native/libnet/InetAddress.c Mon Sep 21 17:49:57 2015 +0200
@@ -57,6 +57,7 @@
c = (*env)->FindClass(env,"java/net/InetAddress$InetAddressHolder");
CHECK_NULL(c);
iac_class = (*env)->NewGlobalRef(env, c);
+ CHECK_NULL(iac_class);
ia_holderID = (*env)->GetFieldID(env, ia_class, "holder", "Ljava/net/InetAddress$InetAddressHolder;");
CHECK_NULL(ia_holderID);
ia_preferIPv6AddressID = (*env)->GetStaticFieldID(env, ia_class, "preferIPv6Address", "Z");
--- a/jdk/src/java.base/unix/classes/java/net/PlainDatagramSocketImpl.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.base/unix/classes/java/net/PlainDatagramSocketImpl.java Mon Sep 21 17:49:57 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007,2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -130,6 +130,8 @@
protected native void disconnect0(int family);
+ native int dataAvailable();
+
/**
* Perform class load-time initializations.
*/
--- a/jdk/src/java.base/unix/conf/ppc64/jvm.cfg Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.base/unix/conf/ppc64/jvm.cfg Mon Sep 21 17:49:57 2015 +0200
@@ -1,4 +1,4 @@
-# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 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
@@ -31,3 +31,4 @@
# and may not be available in a future release.
#
-server KNOWN
+-client IGNORE
--- a/jdk/src/java.base/unix/native/libjava/TimeZone_md.c Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.base/unix/native/libjava/TimeZone_md.c Mon Sep 21 17:49:57 2015 +0200
@@ -35,14 +35,20 @@
#include <string.h>
#include <dirent.h>
#include <unistd.h>
-#ifdef __solaris__
+#if defined(__solaris__)
#include <libscf.h>
#endif
#include "jvm.h"
+#include "TimeZone_md.h"
#define SKIP_SPACE(p) while (*p == ' ' || *p == '\t') p++;
+#if defined(_ALLBSD_SOURCE)
+#define dirent64 dirent
+#define readdir64_r readdir_r
+#endif
+
#if !defined(__solaris__) || defined(__sparcv9) || defined(amd64)
#define fileopen fopen
#define filegets fgets
@@ -50,19 +56,20 @@
#endif
#if defined(__linux__) || defined(_ALLBSD_SOURCE)
-
-
static const char *ETC_TIMEZONE_FILE = "/etc/timezone";
static const char *ZONEINFO_DIR = "/usr/share/zoneinfo";
static const char *DEFAULT_ZONEINFO_FILE = "/etc/localtime";
#else
-#ifdef _AIX
-static const char *ETC_ENVIRONMENT_FILE = "/etc/environment";
-#endif
static const char *SYS_INIT_FILE = "/etc/default/init";
static const char *ZONEINFO_DIR = "/usr/share/lib/zoneinfo";
static const char *DEFAULT_ZONEINFO_FILE = "/usr/share/lib/zoneinfo/localtime";
-#endif /*__linux__*/
+#endif /* defined(__linux__) || defined(_ALLBSD_SOURCE) */
+
+#if defined(_AIX)
+static const char *ETC_ENVIRONMENT_FILE = "/etc/environment";
+#endif
+
+#if defined(__linux__) || defined(MACOSX) || defined(__solaris__)
/*
* Returns a pointer to the zone ID portion of the given zoneinfo file
@@ -108,8 +115,8 @@
{
DIR *dirp = NULL;
struct stat statbuf;
- struct dirent *dp = NULL;
- struct dirent *entry = NULL;
+ struct dirent64 *dp = NULL;
+ struct dirent64 *entry = NULL;
char *pathname = NULL;
int fd = -1;
char *dbuf = NULL;
@@ -120,19 +127,13 @@
return NULL;
}
- entry = (struct dirent *) malloc((size_t) pathconf(dir, _PC_NAME_MAX));
+ entry = (struct dirent64 *) malloc((size_t) pathconf(dir, _PC_NAME_MAX));
if (entry == NULL) {
(void) closedir(dirp);
return NULL;
}
-#if defined(_AIX) || defined(__linux__) || defined(MACOSX) || (defined(__solaris__) \
- && (defined(_POSIX_PTHREAD_SEMANTICS) || defined(_LP64)))
- while (readdir_r(dirp, entry, &dp) == 0 && dp != NULL) {
-#else
- while ((dp = readdir_r(dirp, entry)) != NULL) {
-#endif
-
+ while (readdir64_r(dirp, entry, &dp) == 0 && dp != NULL) {
/*
* Skip '.' and '..' (and possibly other .* files)
*/
@@ -145,7 +146,7 @@
*/
if ((strcmp(dp->d_name, "ROC") == 0)
|| (strcmp(dp->d_name, "posixrules") == 0)
-#ifdef __solaris__
+#if defined(__solaris__)
/*
* Skip the "src" and "tab" directories on Solaris.
*/
@@ -230,7 +231,7 @@
char *buf;
size_t size;
-#ifdef __linux__
+#if defined(__linux__)
/*
* Try reading the /etc/timezone file for Debian distros. There's
* no spec of the file format available. This parsing assumes that
@@ -254,7 +255,7 @@
return tz;
}
}
-#endif /* __linux__ */
+#endif /* defined(__linux__) */
/*
* Next, try /etc/localtime to find the zone ID.
@@ -318,8 +319,9 @@
free((void *) buf);
return tz;
}
-#else
-#ifdef __solaris__
+
+#elif defined(__solaris__)
+
#if !defined(__sparcv9) && !defined(amd64)
/*
@@ -444,8 +446,7 @@
}
/*NOTREACHED*/
}
-#endif /* not __sparcv9 */
-
+#endif /* !defined(__sparcv9) && !defined(amd64) */
/*
* Performs Solaris dependent mapping. Returns a zone ID if
@@ -546,7 +547,7 @@
}
/*
- * Retruns a zone ID of Solaris when the TZ value is "localtime".
+ * Returns a zone ID of Solaris when the TZ value is "localtime".
* First, it tries scf. If scf fails, it looks for the same file as
* /usr/share/lib/zoneinfo/localtime under /usr/share/lib/zoneinfo/.
*/
@@ -615,10 +616,11 @@
free((void *) buf);
return tz;
}
-#endif /*__solaris__*/
-#endif /*__linux__*/
+
+#endif /* defined(__solaris__) */
-#ifdef _AIX
+#elif defined(_AIX)
+
static char *
getPlatformTimeZoneID()
{
@@ -644,178 +646,33 @@
return tz;
}
-static char *mapPlatformToJavaTimezone(const char *java_home_dir, const char *tz);
-#endif
-/*
- * findJavaTZ_md() maps platform time zone ID to Java time zone ID
- * using <java_home>/lib/tzmappings. If the TZ value is not found, it
- * trys some libc implementation dependent mappings. If it still
- * can't map to a Java time zone ID, it falls back to the GMT+/-hh:mm
- * form.
- */
-/*ARGSUSED1*/
-char *
-findJavaTZ_md(const char *java_home_dir)
-{
- char *tz;
- char *javatz = NULL;
- char *freetz = NULL;
-
- tz = getenv("TZ");
-
-#if defined(__linux__) || defined(_ALLBSD_SOURCE)
- if (tz == NULL) {
-#else
-#if defined (__solaris__) || defined(_AIX)
- if (tz == NULL || *tz == '\0') {
-#endif
-#endif
- tz = getPlatformTimeZoneID();
- freetz = tz;
- }
-
- /*
- * Remove any preceding ':'
- */
- if (tz != NULL && *tz == ':') {
- tz++;
- }
-
-#ifdef __solaris__
- if (tz != NULL && strcmp(tz, "localtime") == 0) {
- tz = getSolarisDefaultZoneID();
- if (freetz != NULL) {
- free((void *) freetz);
- }
- freetz = tz;
- }
-#endif
-
- if (tz != NULL) {
-#ifdef __linux__
- /*
- * Ignore "posix/" prefix.
- */
- if (strncmp(tz, "posix/", 6) == 0) {
- tz += 6;
- }
-#endif
- javatz = strdup(tz);
- if (freetz != NULL) {
- free((void *) freetz);
- }
-
-#ifdef _AIX
- freetz = mapPlatformToJavaTimezone(java_home_dir, javatz);
- if (javatz != NULL) {
- free((void *) javatz);
- }
- javatz = freetz;
-#endif
- }
-
- return javatz;
-}
-
-/**
- * Returns a GMT-offset-based zone ID. (e.g., "GMT-08:00")
- */
-
-#ifdef MACOSX
-
-char *
-getGMTOffsetID()
-{
- time_t offset;
- char sign, buf[32];
- struct tm *local_tm;
- time_t clock;
- time_t currenttime;
-
- clock = time(NULL);
- tzset();
- local_tm = localtime(&clock);
- if (local_tm->tm_gmtoff >= 0) {
- offset = (time_t) local_tm->tm_gmtoff;
- sign = '+';
- } else {
- offset = (time_t) -local_tm->tm_gmtoff;
- sign = '-';
- }
- sprintf(buf, (const char *)"GMT%c%02d:%02d",
- sign, (int)(offset/3600), (int)((offset%3600)/60));
- return strdup(buf);
-}
-#else
-
-char *
-getGMTOffsetID()
-{
- time_t offset;
- char sign, buf[32];
-#ifdef __solaris__
- struct tm localtm;
- time_t currenttime;
-
- currenttime = time(NULL);
- if (localtime_r(¤ttime, &localtm) == NULL) {
- return NULL;
- }
-
- offset = localtm.tm_isdst ? altzone : timezone;
-#else
- offset = timezone;
-#endif /*__linux__*/
-
- if (offset == 0) {
- return strdup("GMT");
- }
-
- /* Note that the time offset direction is opposite. */
- if (offset > 0) {
- sign = '-';
- } else {
- offset = -offset;
- sign = '+';
- }
- sprintf(buf, (const char *)"GMT%c%02d:%02d",
- sign, (int)(offset/3600), (int)((offset%3600)/60));
- return strdup(buf);
-}
-#endif /* MACOSX */
-
-#ifdef _AIX
static char *
mapPlatformToJavaTimezone(const char *java_home_dir, const char *tz) {
FILE *tzmapf;
- char mapfilename[PATH_MAX+1];
+ char mapfilename[PATH_MAX + 1];
char line[256];
int linecount = 0;
- char temp[100], *temp_tz;
+ char *tz_buf = NULL;
+ char *temp_tz = NULL;
char *javatz = NULL;
- char *str_tmp = NULL;
- size_t temp_tz_len = 0;
+ size_t tz_len = 0;
/* On AIX, the TZ environment variable may end with a comma
- * followed by modifier fields. These are ignored here.
- */
- strncpy(temp, tz, 100);
- temp_tz = strtok_r(temp, ",", &str_tmp);
+ * followed by modifier fields. These are ignored here. */
+ temp_tz = strchr(tz, ',');
+ tz_len = (temp_tz == NULL) ? strlen(tz) : temp_tz - tz;
+ tz_buf = (char *)malloc(tz_len + 1);
+ memcpy(tz_buf, tz, tz_len);
+ tz_buf[tz_len] = 0;
- if(temp_tz == NULL)
- goto tzerr;
-
- temp_tz_len = strlen(temp_tz);
-
- if (strlen(java_home_dir) >= (PATH_MAX - 15)) {
- jio_fprintf(stderr, "java.home longer than maximum path length \n");
+ /* Open tzmappings file, with buffer overrun check */
+ if ((strlen(java_home_dir) + 15) > PATH_MAX) {
+ jio_fprintf(stderr, "Path %s/lib/tzmappings exceeds maximum path length\n", java_home_dir);
goto tzerr;
}
-
- strncpy(mapfilename, java_home_dir, PATH_MAX);
+ strcpy(mapfilename, java_home_dir);
strcat(mapfilename, "/lib/tzmappings");
-
if ((tzmapf = fopen(mapfilename, "r")) == NULL) {
jio_fprintf(stderr, "can't open %s\n", mapfilename);
goto tzerr;
@@ -848,7 +705,7 @@
}
*p++ = '\0';
- if ((result = strncmp(temp_tz, sol, temp_tz_len)) == 0) {
+ if ((result = strncmp(tz_buf, sol, tz_len)) == 0) {
/*
* If this is the current platform zone ID,
* take the Java time zone ID (2nd field).
@@ -874,11 +731,150 @@
(void) fclose(tzmapf);
tzerr:
+ if (tz_buf != NULL ) {
+ free((void *) tz_buf);
+ }
+
if (javatz == NULL) {
return getGMTOffsetID();
}
return javatz;
}
+
+#endif /* defined(_AIX) */
+
+/*
+ * findJavaTZ_md() maps platform time zone ID to Java time zone ID
+ * using <java_home>/lib/tzmappings. If the TZ value is not found, it
+ * trys some libc implementation dependent mappings. If it still
+ * can't map to a Java time zone ID, it falls back to the GMT+/-hh:mm
+ * form.
+ */
+/*ARGSUSED1*/
+char *
+findJavaTZ_md(const char *java_home_dir)
+{
+ char *tz;
+ char *javatz = NULL;
+ char *freetz = NULL;
+
+ tz = getenv("TZ");
+
+ if (tz == NULL || *tz == '\0') {
+ tz = getPlatformTimeZoneID();
+ freetz = tz;
+ }
+
+ if (tz != NULL) {
+ /* Ignore preceding ':' */
+ if (*tz == ':') {
+ tz++;
+ }
+#if defined(__linux__)
+ /* Ignore "posix/" prefix on Linux. */
+ if (strncmp(tz, "posix/", 6) == 0) {
+ tz += 6;
+ }
#endif
+#if defined(_AIX)
+ /* On AIX do the platform to Java mapping. */
+ javatz = mapPlatformToJavaTimezone(java_home_dir, tz);
+ if (freetz != NULL) {
+ free((void *) freetz);
+ }
+#else
+#if defined(__solaris__)
+ /* Solaris might use localtime, so handle it here. */
+ if (strcmp(tz, "localtime") == 0) {
+ javatz = getSolarisDefaultZoneID();
+ if (freetz != NULL) {
+ free((void *) freetz);
+ }
+ } else
+#endif
+ if (freetz == NULL) {
+ /* strdup if we are still working on getenv result. */
+ javatz = strdup(tz);
+ } else if (freetz != tz) {
+ /* strdup and free the old buffer, if we moved the pointer. */
+ javatz = strdup(tz);
+ free((void *) freetz);
+ } else {
+ /* we are good if we already work on a freshly allocated buffer. */
+ javatz = tz;
+ }
+#endif
+ }
+
+ return javatz;
+}
+
+/**
+ * Returns a GMT-offset-based zone ID. (e.g., "GMT-08:00")
+ */
+
+#if defined(MACOSX)
+
+char *
+getGMTOffsetID()
+{
+ time_t offset;
+ char sign, buf[32];
+ struct tm *local_tm;
+ time_t clock;
+ time_t currenttime;
+
+ clock = time(NULL);
+ tzset();
+ local_tm = localtime(&clock);
+ if (local_tm->tm_gmtoff >= 0) {
+ offset = (time_t) local_tm->tm_gmtoff;
+ sign = '+';
+ } else {
+ offset = (time_t) -local_tm->tm_gmtoff;
+ sign = '-';
+ }
+ sprintf(buf, (const char *)"GMT%c%02d:%02d",
+ sign, (int)(offset/3600), (int)((offset%3600)/60));
+ return strdup(buf);
+}
+
+#else
+
+char *
+getGMTOffsetID()
+{
+ time_t offset;
+ char sign, buf[32];
+#if defined(__solaris__)
+ struct tm localtm;
+ time_t currenttime;
+
+ currenttime = time(NULL);
+ if (localtime_r(¤ttime, &localtm) == NULL) {
+ return NULL;
+ }
+
+ offset = localtm.tm_isdst ? altzone : timezone;
+#else
+ offset = timezone;
+#endif
+
+ if (offset == 0) {
+ return strdup("GMT");
+ }
+
+ /* Note that the time offset direction is opposite. */
+ if (offset > 0) {
+ sign = '-';
+ } else {
+ offset = -offset;
+ sign = '+';
+ }
+ sprintf(buf, (const char *)"GMT%c%02d:%02d",
+ sign, (int)(offset/3600), (int)((offset%3600)/60));
+ return strdup(buf);
+}
+#endif /* MACOSX */
--- a/jdk/src/java.base/unix/native/libnet/AbstractPlainDatagramSocketImpl.c Tue Sep 22 14:24:31 2015 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,89 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#ifdef __solaris__
-#include <unistd.h>
-#include <stropts.h>
-
-#ifndef BSD_COMP
-#define BSD_COMP
-#endif
-
-#endif
-
-#include <sys/ioctl.h>
-
-#include "jvm.h"
-#include "jni_util.h"
-#include "net_util.h"
-
-#include "java_net_AbstractPlainDatagramSocketImpl.h"
-
-static jfieldID IO_fd_fdID;
-
-static jfieldID apdsi_fdID;
-
-
-/*
- * Class: java_net_AbstractPlainDatagramSocketImpl
- * Method: init
- * Signature: ()V
- */
-JNIEXPORT void JNICALL
-Java_java_net_AbstractPlainDatagramSocketImpl_init(JNIEnv *env, jclass cls) {
-
- apdsi_fdID = (*env)->GetFieldID(env, cls, "fd",
- "Ljava/io/FileDescriptor;");
- CHECK_NULL(apdsi_fdID);
-
- IO_fd_fdID = NET_GetFileDescriptorID(env);
-}
-
-/*
- * Class: java_net_AbstractPlainDatagramSocketImpl
- * Method: dataAvailable
- * Signature: ()I
- */
-JNIEXPORT jint JNICALL Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable
-(JNIEnv *env, jobject this) {
- int fd, retval;
-
- jobject fdObj = (*env)->GetObjectField(env, this, apdsi_fdID);
-
- if (IS_NULL(fdObj)) {
- JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
- "Socket closed");
- return -1;
- }
- fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID);
-
- if (ioctl(fd, FIONREAD, &retval) < 0) {
- return -1;
- }
- return retval;
-}
--- a/jdk/src/java.base/unix/native/libnet/PlainDatagramSocketImpl.c Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.base/unix/native/libnet/PlainDatagramSocketImpl.c Mon Sep 21 17:49:57 2015 +0200
@@ -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
@@ -32,6 +32,12 @@
#ifdef __solaris__
#include <fcntl.h>
+#include <unistd.h>
+#include <stropts.h>
+
+#ifndef BSD_COMP
+#define BSD_COMP
+#endif
#endif
#ifdef __linux__
#include <unistd.h>
@@ -52,6 +58,8 @@
#endif
#endif // __linux__
+#include <sys/ioctl.h>
+
#ifndef IPTOS_TOS_MASK
#define IPTOS_TOS_MASK 0x1e
#endif
@@ -2240,3 +2248,28 @@
{
mcast_join_leave(env, this, iaObj, niObj, JNI_FALSE);
}
+
+/*
+ * Class: java_net_PlainDatagramSocketImpl
+ * Method: dataAvailable
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL
+Java_java_net_PlainDatagramSocketImpl_dataAvailable(JNIEnv *env, jobject this)
+{
+ int fd, retval;
+
+ jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
+
+ if (IS_NULL(fdObj)) {
+ JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
+ "Socket closed");
+ return -1;
+ }
+ fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID);
+
+ if (ioctl(fd, FIONREAD, &retval) < 0) {
+ return -1;
+ }
+ return retval;
+}
--- a/jdk/src/java.base/unix/native/libnet/SdpSupport.c Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.base/unix/native/libnet/SdpSupport.c Mon Sep 21 17:49:57 2015 +0200
@@ -118,6 +118,8 @@
RESTARTABLE(dup2(s, fd), res);
if (res < 0)
JNU_ThrowIOExceptionWithLastError(env, "dup2");
- RESTARTABLE(close(s), res);
+ res = close(s);
+ if (res < 0 && !(*env)->ExceptionOccurred(env))
+ JNU_ThrowIOExceptionWithLastError(env, "close");
}
}
--- a/jdk/src/java.base/windows/classes/java/net/DefaultDatagramSocketImplFactory.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.base/windows/classes/java/net/DefaultDatagramSocketImplFactory.java Mon Sep 21 17:49:57 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -45,7 +45,7 @@
class DefaultDatagramSocketImplFactory
{
- static Class<?> prefixImplClass = null;
+ private final static Class<?> prefixImplClass;
/* the windows version. */
private static float version;
@@ -54,16 +54,19 @@
private static boolean preferIPv4Stack = false;
/* If the version supports a dual stack TCP implementation */
- private static boolean useDualStackImpl = false;
+ private final static boolean useDualStackImpl;
/* sun.net.useExclusiveBind */
private static String exclBindProp;
/* True if exclusive binding is on for Windows */
- private static boolean exclusiveBind = true;
-
+ private final static boolean exclusiveBind;
static {
+ Class<?> prefixImplClassLocal = null;
+ boolean useDualStackImplLocal = false;
+ boolean exclusiveBindLocal = true;
+
// Determine Windows Version.
java.security.AccessController.doPrivileged(
new PrivilegedAction<Object>() {
@@ -78,7 +81,7 @@
"java.net.preferIPv4Stack"));
exclBindProp = System.getProperty(
"sun.net.useExclusiveBind");
- } catch (NumberFormatException e ) {
+ } catch (NumberFormatException e) {
assert false : e;
}
return null; // nothing to return
@@ -87,14 +90,14 @@
// (version >= 6.0) implies Vista or greater.
if (version >= 6.0 && !preferIPv4Stack) {
- useDualStackImpl = true;
+ useDualStackImplLocal = true;
}
if (exclBindProp != null) {
// sun.net.useExclusiveBind is true
- exclusiveBind = exclBindProp.length() == 0 ? true
+ exclusiveBindLocal = exclBindProp.length() == 0 ? true
: Boolean.parseBoolean(exclBindProp);
} else if (version < 6.0) {
- exclusiveBind = false;
+ exclusiveBindLocal = false;
}
// impl.prefix
@@ -103,12 +106,16 @@
prefix = AccessController.doPrivileged(
new sun.security.action.GetPropertyAction("impl.prefix", null));
if (prefix != null)
- prefixImplClass = Class.forName("java.net."+prefix+"DatagramSocketImpl");
+ prefixImplClassLocal = Class.forName("java.net."+prefix+"DatagramSocketImpl");
} catch (Exception e) {
System.err.println("Can't find class: java.net." +
prefix +
"DatagramSocketImpl: check impl.prefix property");
}
+
+ prefixImplClass = prefixImplClassLocal;
+ useDualStackImpl = useDualStackImplLocal;
+ exclusiveBind = exclusiveBindLocal;
}
/**
@@ -126,12 +133,10 @@
throw new SocketException("can't instantiate DatagramSocketImpl");
}
} else {
- if (isMulticast)
- exclusiveBind = false;
if (useDualStackImpl && !isMulticast)
return new DualStackPlainDatagramSocketImpl(exclusiveBind);
else
- return new TwoStacksPlainDatagramSocketImpl(exclusiveBind);
+ return new TwoStacksPlainDatagramSocketImpl(exclusiveBind && !isMulticast);
}
}
}
--- a/jdk/src/java.base/windows/classes/java/net/DualStackPlainDatagramSocketImpl.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.base/windows/classes/java/net/DualStackPlainDatagramSocketImpl.java Mon Sep 21 17:49:57 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -292,4 +292,6 @@
int optionValue) throws SocketException;
private static native int socketGetIntOption(int fd, int cmd) throws SocketException;
+
+ native int dataAvailable();
}
--- a/jdk/src/java.base/windows/classes/java/net/TwoStacksPlainDatagramSocketImpl.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.base/windows/classes/java/net/TwoStacksPlainDatagramSocketImpl.java Mon Sep 21 17:49:57 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -207,6 +207,8 @@
protected native void disconnect0(int family);
+ native int dataAvailable();
+
/**
* Perform class load-time initializations.
*/
--- a/jdk/src/java.base/windows/native/libnet/AbstractPlainDatagramSocketImpl.c Tue Sep 22 14:24:31 2015 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,113 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include <windows.h>
-#include <winsock2.h>
-
-#include "jvm.h"
-#include "jni_util.h"
-#include "net_util.h"
-
-#include "java_net_AbstractPlainDatagramSocketImpl.h"
-
-static jfieldID IO_fd_fdID = NULL;
-static jfieldID apdsi_fdID = NULL;
-
-static jfieldID apdsi_fd1ID = NULL;
-static jclass two_stacks_clazz = NULL;
-
-
-/*
- * Class: java_net_AbstractPlainDatagramSocketImpl
- * Method: init
- * Signature: ()V
- */
-JNIEXPORT void JNICALL
-Java_java_net_AbstractPlainDatagramSocketImpl_init(JNIEnv *env, jclass cls) {
-
- apdsi_fdID = (*env)->GetFieldID(env, cls, "fd",
- "Ljava/io/FileDescriptor;");
- CHECK_NULL(apdsi_fdID);
- IO_fd_fdID = NET_GetFileDescriptorID(env);
- CHECK_NULL(IO_fd_fdID);
-
- two_stacks_clazz = (*env)->FindClass(env, "java/net/TwoStacksPlainDatagramSocketImpl");
- CHECK_NULL(two_stacks_clazz);
-
- /* Handle both TwoStacks and DualStack here */
-
- if (JNU_Equals(env, cls, two_stacks_clazz)) {
- /* fd1 present only in TwoStack.. */
- apdsi_fd1ID = (*env)->GetFieldID(env, cls, "fd1",
- "Ljava/io/FileDescriptor;");
- CHECK_NULL(apdsi_fd1ID);
- }
-
- JNU_CHECK_EXCEPTION(env);
-}
-
-/*
- * Class: java_net_AbstractPlainDatagramSocketImpl
- * Method: dataAvailable
- * Signature: ()I
- */
-JNIEXPORT jint JNICALL Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable
-(JNIEnv *env, jobject this) {
- SOCKET fd;
- SOCKET fd1;
- int rv = -1, rv1 = -1;
- jobject fdObj = (*env)->GetObjectField(env, this, apdsi_fdID);
-
- if (!IS_NULL(fdObj)) {
- int retval = 0;
- fd = (SOCKET)(*env)->GetIntField(env, fdObj, IO_fd_fdID);
- rv = ioctlsocket(fd, FIONREAD, &retval);
- if (retval > 0) {
- return retval;
- }
- }
-
- if (!IS_NULL(apdsi_fd1ID)) {
- /* TwoStacks */
- jobject fd1Obj = (*env)->GetObjectField(env, this, apdsi_fd1ID);
- if (!IS_NULL(fd1Obj)) {
- int retval = 0;
- fd1 = (SOCKET)(*env)->GetIntField(env, fd1Obj, IO_fd_fdID);
- rv1 = ioctlsocket(fd1, FIONREAD, &retval);
- if (retval > 0) {
- return retval;
- }
- }
- }
-
- if (rv < 0 && rv1 < 0) {
- JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
- "Socket closed");
- return -1;
- }
-
- return 0;
-}
-
--- a/jdk/src/java.base/windows/native/libnet/DualStackPlainDatagramSocketImpl.c Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.base/windows/native/libnet/DualStackPlainDatagramSocketImpl.c Mon Sep 21 17:49:57 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -70,6 +70,9 @@
return got_icmp;
}
+static jfieldID IO_fd_fdID = NULL;
+static jfieldID pdsi_fdID = NULL;
+
/*
* Class: java_net_DualStackPlainDatagramSocketImpl
* Method: initIDs
@@ -78,6 +81,13 @@
JNIEXPORT void JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_initIDs
(JNIEnv *env, jclass clazz)
{
+ pdsi_fdID = (*env)->GetFieldID(env, clazz, "fd",
+ "Ljava/io/FileDescriptor;");
+ CHECK_NULL(pdsi_fdID);
+ IO_fd_fdID = NET_GetFileDescriptorID(env);
+ CHECK_NULL(IO_fd_fdID);
+ JNU_CHECK_EXCEPTION(env);
+
initInetAddressIDs(env);
}
@@ -503,3 +513,32 @@
return result;
}
+
+/*
+ * Class: java_net_DualStackPlainDatagramSocketImpl
+ * Method: dataAvailable
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_dataAvailable
+(JNIEnv *env, jobject this) {
+ SOCKET fd;
+ int rv = -1;
+ jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
+
+ if (!IS_NULL(fdObj)) {
+ int retval = 0;
+ fd = (SOCKET)(*env)->GetIntField(env, fdObj, IO_fd_fdID);
+ rv = ioctlsocket(fd, FIONREAD, &retval);
+ if (retval > 0) {
+ return retval;
+ }
+ }
+
+ if (rv < 0) {
+ JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
+ "Socket closed");
+ return -1;
+ }
+
+ return 0;
+}
--- a/jdk/src/java.base/windows/native/libnet/DualStackPlainSocketImpl.c Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.base/windows/native/libnet/DualStackPlainSocketImpl.c Mon Sep 21 17:49:57 2015 +0200
@@ -45,9 +45,10 @@
jclass cls = (*env)->FindClass(env, "java/net/InetSocketAddress");
CHECK_NULL(cls);
isa_class = (*env)->NewGlobalRef(env, cls);
+ CHECK_NULL(isa_class);
isa_ctorID = (*env)->GetMethodID(env, cls, "<init>",
"(Ljava/net/InetAddress;I)V");
-
+ CHECK_NULL(isa_ctorID);
initInetAddressIDs(env);
// implement read timeout with select.
--- a/jdk/src/java.base/windows/native/libnet/TwoStacksPlainDatagramSocketImpl.c Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.base/windows/native/libnet/TwoStacksPlainDatagramSocketImpl.c Mon Sep 21 17:49:57 2015 +0200
@@ -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
@@ -2563,3 +2563,44 @@
{
mcast_join_leave (env, this, iaObj, niObj, JNI_FALSE);
}
+
+/*
+ * Class: java_net_TwoStacksPlainDatagramSocketImpl
+ * Method: dataAvailable
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_java_net_TwoStacksPlainDatagramSocketImpl_dataAvailable
+(JNIEnv *env, jobject this) {
+ SOCKET fd;
+ SOCKET fd1;
+ int rv = -1, rv1 = -1;
+ jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
+ jobject fd1Obj;
+
+ if (!IS_NULL(fdObj)) {
+ int retval = 0;
+ fd = (SOCKET)(*env)->GetIntField(env, fdObj, IO_fd_fdID);
+ rv = ioctlsocket(fd, FIONREAD, &retval);
+ if (retval > 0) {
+ return retval;
+ }
+ }
+
+ fd1Obj = (*env)->GetObjectField(env, this, pdsi_fd1ID);
+ if (!IS_NULL(fd1Obj)) {
+ int retval = 0;
+ fd1 = (SOCKET)(*env)->GetIntField(env, fd1Obj, IO_fd_fdID);
+ rv1 = ioctlsocket(fd1, FIONREAD, &retval);
+ if (retval > 0) {
+ return retval;
+ }
+ }
+
+ if (rv < 0 && rv1 < 0) {
+ JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
+ "Socket closed");
+ return -1;
+ }
+
+ return 0;
+}
--- a/jdk/src/java.datatransfer/share/classes/java/awt/datatransfer/MimeType.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.datatransfer/share/classes/java/awt/datatransfer/MimeType.java Mon Sep 21 17:49:57 2015 +0200
@@ -224,7 +224,7 @@
* Set the value to be associated with the given name, replacing
* any previous association.
*
- * @throw IllegalArgumentException if parameter or value is illegal
+ * @throws IllegalArgumentException if parameter or value is illegal
*/
public void setParameter(String name, String value) {
parameters.set(name, value);
@@ -233,7 +233,7 @@
/**
* Remove any value associated with the given name.
*
- * @throw IllegalArgumentException if parameter may not be deleted
+ * @throws IllegalArgumentException if parameter may not be deleted
*/
public void removeParameter(String name) {
parameters.remove(name);
--- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaComboBoxButton.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaComboBoxButton.java Mon Sep 21 17:49:57 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -58,6 +58,7 @@
this.list = list;
setModel(new DefaultButtonModel() {
+ @Override
public void setArmed(final boolean armed) {
super.setArmed(isPressed() ? true : armed);
}
@@ -66,12 +67,13 @@
setEnabled(comboBox.isEnabled());
}
+ @Override
public boolean isEnabled() {
return comboBox == null ? true : comboBox.isEnabled();
}
- @SuppressWarnings("deprecation")
- public boolean isFocusTraversable() {
+ @Override
+ public boolean isFocusable() {
return false;
}
@@ -92,6 +94,7 @@
return State.ACTIVE;
}
+ @Override
public void paintComponent(final Graphics g) {
// Don't Paint the button as usual
// super.paintComponent( g );
--- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaInternalFrameDockIconUI.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaInternalFrameDockIconUI.java Mon Sep 21 17:49:57 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -303,7 +303,7 @@
}
}
- @SuppressWarnings("deprecation")
+ @Deprecated
public void hide() {
final Container parent = getParent();
final Rectangle r = this.getBounds();
--- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaLookAndFeel.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaLookAndFeel.java Mon Sep 21 17:49:57 2015 +0200
@@ -991,9 +991,7 @@
"Tree.ancestorInputMap", new UIDefaults.LazyInputMap(new Object[]{"ESCAPE", "cancel"}),};
table.putDefaults(defaults);
-
- Object aaTextInfo = SwingUtilities2.AATextInfo.getAATextInfo(true);
- table.put(SwingUtilities2.AA_TEXT_PROPERTY_KEY, aaTextInfo);
+ SwingUtilities2.putAATextInfo(true, table);
}
protected void initSystemColorDefaults(final UIDefaults table) {
--- a/jdk/src/java.desktop/macosx/classes/sun/java2d/OSXSurfaceData.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/macosx/classes/sun/java2d/OSXSurfaceData.java Mon Sep 21 17:49:57 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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,9 +125,8 @@
return fConfig;
}
- @SuppressWarnings("deprecation")
protected void setBounds(int x, int y, int w, int h) {
- fBounds.reshape(x, y, w, y + h);
+ fBounds.setBounds(x, y, w, y + h);
}
// START compositing support API
--- a/jdk/src/java.desktop/macosx/classes/sun/java2d/opengl/CGLLayer.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/macosx/classes/sun/java2d/opengl/CGLLayer.java Mon Sep 21 17:49:57 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -77,7 +77,7 @@
}
public Object getDestination() {
- return peer;
+ return peer.getTarget();
}
public SurfaceData replaceSurfaceData() {
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/LWWindowPeer.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/LWWindowPeer.java Mon Sep 21 17:49:57 2015 +0200
@@ -576,6 +576,14 @@
: getDefaultMaximizedBounds());
}
+ public Rectangle getMaximizedBounds() {
+ synchronized (getStateLock()) {
+ return (maximizedBounds == null)
+ ? getDefaultMaximizedBounds()
+ : maximizedBounds;
+ }
+ }
+
private void setPlatformMaximizedBounds(Rectangle bounds) {
platformWindow.setMaximizedBounds(
bounds.x, bounds.y,
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Mon Sep 21 17:49:57 2015 +0200
@@ -498,14 +498,9 @@
// to be sure that there are no setBounds requests in the queue.
LWCToolkit.flushNativeSelectors();
this.normalBounds = peer.getBounds();
-
- GraphicsConfiguration config = getPeer().getGraphicsConfiguration();
- Insets i = ((CGraphicsDevice)config.getDevice()).getScreenInsets();
- Rectangle toBounds = config.getBounds();
- setBounds(toBounds.x + i.left,
- toBounds.y + i.top,
- toBounds.width - i.left - i.right,
- toBounds.height - i.top - i.bottom);
+ Rectangle maximizedBounds = peer.getMaximizedBounds();
+ setBounds(maximizedBounds.x, maximizedBounds.y,
+ maximizedBounds.width, maximizedBounds.height);
}
}
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java Mon Sep 21 17:49:57 2015 +0200
@@ -26,7 +26,6 @@
package com.sun.java.swing.plaf.gtk;
import java.awt.*;
-import java.awt.event.*;
import java.beans.*;
import java.io.File;
import java.lang.ref.*;
@@ -41,6 +40,8 @@
import com.sun.java.swing.plaf.gtk.GTKConstants.PositionType;
import com.sun.java.swing.plaf.gtk.GTKConstants.StateType;
+import java.util.HashMap;
+import java.util.Map;
import sun.awt.SunToolkit;
import sun.awt.UNIXToolkit;
import sun.awt.OSInfo;
@@ -61,7 +62,7 @@
* We should assume ON - or some variation of ON as no GTK desktop
* ships with it OFF.
*/
- static Object aaTextInfo;
+ static Map<Object, Object> aaTextInfo;
/**
* Solaris, or Linux with Sun JDS in a CJK Locale.
@@ -1337,7 +1338,9 @@
if (fallbackFont != null) {
table.put("TitledBorder.font", fallbackFont);
}
- table.put(SwingUtilities2.AA_TEXT_PROPERTY_KEY, aaTextInfo);
+ if (aaTextInfo != null) {
+ table.putAll(aaTextInfo);
+ }
}
protected void initSystemColorDefaults(UIDefaults table) {
@@ -1477,7 +1480,8 @@
* XRender.
*/
gtkAAFontSettingsCond = !isSunCJK && SwingUtilities2.isLocalDisplay();
- aaTextInfo = SwingUtilities2.AATextInfo.getAATextInfo(gtkAAFontSettingsCond);
+ aaTextInfo = new HashMap<>(2);
+ SwingUtilities2.putAATextInfo(gtkAAFontSettingsCond, aaTextInfo);
}
static ReferenceQueue<GTKLookAndFeel> queue = new ReferenceQueue<GTKLookAndFeel>();
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKStyle.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKStyle.java Mon Sep 21 17:49:57 2015 +0200
@@ -39,6 +39,8 @@
import sun.swing.plaf.synth.SynthIcon;
import com.sun.java.swing.plaf.gtk.GTKEngine.WidgetType;
+import static java.awt.RenderingHints.KEY_TEXT_ANTIALIASING;
+import static java.awt.RenderingHints.KEY_TEXT_LCD_CONTRAST;
/**
*
@@ -115,10 +117,12 @@
@Override
public void installDefaults(SynthContext context) {
super.installDefaults(context);
- if (!context.getRegion().isSubregion()) {
- context.getComponent().putClientProperty(
- SwingUtilities2.AA_TEXT_PROPERTY_KEY,
- GTKLookAndFeel.aaTextInfo);
+ Map<Object, Object> aaTextInfo = GTKLookAndFeel.aaTextInfo;
+ if (aaTextInfo != null && !context.getRegion().isSubregion()) {
+ context.getComponent().putClientProperty(KEY_TEXT_ANTIALIASING,
+ aaTextInfo.get(KEY_TEXT_ANTIALIASING));
+ context.getComponent().putClientProperty(KEY_TEXT_LCD_CONTRAST,
+ aaTextInfo.get(KEY_TEXT_LCD_CONTRAST));
}
}
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java Mon Sep 21 17:49:57 2015 +0200
@@ -556,8 +556,7 @@
* for both client property and UIDefaults.
* Also need to set up listeners for changes in these settings.
*/
- Object aaTextInfo = SwingUtilities2.AATextInfo.getAATextInfo(true);
- table.put(SwingUtilities2.AA_TEXT_PROPERTY_KEY, aaTextInfo);
+ SwingUtilities2.putAATextInfo(true, table);
this.aaSettings =
new FontDesktopProperty(SunToolkit.DESKTOPFONTHINTS);
}
@@ -835,12 +834,12 @@
"InternalFrame.closeIcon",
WindowsIconFactory.createFrameCloseIcon(),
"InternalFrame.icon",
- (LazyValue) t -> new Object[]{
+ (LazyValue) t -> new WindowsInternalFrameTitlePane.ScalableIconUIResource(new Object[]{
// The constructor takes one arg: an array of UIDefaults.LazyValue
// representing the icons
SwingUtilities2.makeIcon(getClass(), BasicLookAndFeel.class, "icons/JavaCup16.png"),
SwingUtilities2.makeIcon(getClass(), WindowsLookAndFeel.class, "icons/JavaCup32.png")
- },
+ }),
// Internal Frame Auditory Cue Mappings
"InternalFrame.closeSound", "win.sound.close",
"InternalFrame.maximizeSound", "win.sound.maximize",
@@ -2402,9 +2401,8 @@
}
protected void updateUI() {
- Object aaTextInfo = SwingUtilities2.AATextInfo.getAATextInfo(true);
UIDefaults defaults = UIManager.getLookAndFeelDefaults();
- defaults.put(SwingUtilities2.AA_TEXT_PROPERTY_KEY, aaTextInfo);
+ SwingUtilities2.putAATextInfo(true, defaults);
super.updateUI();
}
}
--- a/jdk/src/java.desktop/share/classes/java/awt/MultipleGradientPaintContext.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/java/awt/MultipleGradientPaintContext.java Mon Sep 21 17:49:57 2015 +0200
@@ -517,7 +517,7 @@
*
* @param position the unmanipulated position, which will be mapped
* into the range 0 to 1
- * @returns integer color to display
+ * @return integer color to display
*/
protected final int indexIntoGradientsArrays(float position) {
// first, manipulate position value depending on the cycle method
--- a/jdk/src/java.desktop/share/classes/java/awt/Robot.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/java/awt/Robot.java Mon Sep 21 17:49:57 2015 +0200
@@ -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
@@ -33,13 +33,10 @@
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import java.awt.peer.RobotPeer;
-import java.lang.reflect.InvocationTargetException;
-import java.security.AccessController;
import sun.awt.AWTPermissions;
import sun.awt.ComponentFactory;
import sun.awt.SunToolkit;
-import sun.awt.OSInfo;
import sun.awt.image.SunWritableRaster;
/**
@@ -558,28 +555,8 @@
*/
public synchronized void waitForIdle() {
checkNotDispatchThread();
-
- try {
- SunToolkit.flushPendingEvents();
- // 7185258: realSync() call blocks all DnD tests on OS X
- if (AccessController.doPrivileged(OSInfo.getOSTypeAction()) == OSInfo.OSType.MACOSX) {
- // post a dummy event to the queue so we know when
- // all the events before it have been processed
- EventQueue.invokeAndWait( new Runnable() {
- public void run() {
- // dummy implementation
- }
- } );
- } else {
- ((SunToolkit) Toolkit.getDefaultToolkit()).realSync();
- }
- } catch(InterruptedException ite) {
- System.err.println("Robot.waitForIdle, non-fatal exception caught:");
- ite.printStackTrace();
- } catch(InvocationTargetException ine) {
- System.err.println("Robot.waitForIdle, non-fatal exception caught:");
- ine.printStackTrace();
- }
+ SunToolkit.flushPendingEvents();
+ ((SunToolkit) Toolkit.getDefaultToolkit()).realSync();
}
private void checkNotDispatchThread() {
@@ -593,6 +570,7 @@
*
* @return the string representation.
*/
+ @Override
public synchronized String toString() {
String params = "autoDelay = "+getAutoDelay()+", "+"autoWaitForIdle = "+isAutoWaitForIdle();
return getClass().getName() + "[ " + params + " ]";
--- a/jdk/src/java.desktop/share/classes/java/awt/Toolkit.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/java/awt/Toolkit.java Mon Sep 21 17:49:57 2015 +0200
@@ -448,7 +448,7 @@
*
* @param s the error message
* @param e the original exception
- * @throw the new AWTError including the cause (the original exception)
+ * @throws the new AWTError including the cause (the original exception)
*/
private static void newAWTError(Throwable e, String s) {
AWTError newAWTError = new AWTError(s);
--- a/jdk/src/java.desktop/share/classes/javax/swing/JColorChooser.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/javax/swing/JColorChooser.java Mon Sep 21 17:49:57 2015 +0200
@@ -133,13 +133,42 @@
* returns true.
* @see java.awt.GraphicsEnvironment#isHeadless
*/
+ public static Color showDialog(Component component,
+ String title, Color initialColor) throws HeadlessException {
+ return showDialog(component, title, initialColor, true);
+ }
+
+ /**
+ * Shows a modal color-chooser dialog and blocks until the
+ * dialog is hidden. If the user presses the "OK" button, then
+ * this method hides/disposes the dialog and returns the selected color.
+ * If the user presses the "Cancel" button or closes the dialog without
+ * pressing "OK", then this method hides/disposes the dialog and returns
+ * <code>null</code>.
+ *
+ * @param component the parent <code>Component</code> for the dialog
+ * @param title the String containing the dialog's title
+ * @param initialColor the initial Color set when the color-chooser is shown
+ * @param colorTransparencySelectionEnabled true if the transparency of
+ * a color can be selected
+ * @return the selected color or <code>null</code> if the user opted out
+ * @exception HeadlessException if GraphicsEnvironment.isHeadless()
+ * returns true.
+ * @see java.awt.GraphicsEnvironment#isHeadless
+ */
@SuppressWarnings("deprecation")
- public static Color showDialog(Component component,
- String title, Color initialColor) throws HeadlessException {
+ public static Color showDialog(Component component, String title,
+ Color initialColor, boolean colorTransparencySelectionEnabled)
+ throws HeadlessException {
final JColorChooser pane = new JColorChooser(initialColor != null?
initialColor : Color.white);
+ for (AbstractColorChooserPanel ccPanel : pane.getChooserPanels()) {
+ ccPanel.setColorTransparencySelectionEnabled(
+ colorTransparencySelectionEnabled);
+ }
+
ColorTracker ok = new ColorTracker(pane);
JDialog dialog = createDialog(component, title, true, pane, ok, null);
@@ -150,7 +179,6 @@
return ok.getColor();
}
-
/**
* Creates and returns a new dialog containing the specified
* <code>ColorChooser</code> pane along with "OK", "Cancel", and "Reset"
--- a/jdk/src/java.desktop/share/classes/javax/swing/JComponent.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/javax/swing/JComponent.java Mon Sep 21 17:49:57 2015 +0200
@@ -377,7 +377,8 @@
/**
* AA text hints.
*/
- transient private Object aaTextInfo;
+ transient private Object aaHint;
+ transient private Object lcdRenderingHint;
static Graphics safelyGetGraphics(Component c) {
return safelyGetGraphics(c, SwingUtilities.getRoot(c));
@@ -616,6 +617,15 @@
*/
public void updateUI() {}
+ /**
+ * Returns the look and feel delegate that renders this component.
+ *
+ * @return the {@code ComponentUI} object that renders this component
+ * @since 1.9
+ */
+ public ComponentUI getUI() {
+ return ui;
+ }
/**
* Sets the look and feel delegate for this component.
@@ -655,8 +665,10 @@
uninstallUIAndProperties();
// aaText shouldn't persist between look and feels, reset it.
- aaTextInfo =
- UIManager.getDefaults().get(SwingUtilities2.AA_TEXT_PROPERTY_KEY);
+ aaHint = UIManager.getDefaults().get(
+ RenderingHints.KEY_TEXT_ANTIALIASING);
+ lcdRenderingHint = UIManager.getDefaults().get(
+ RenderingHints.KEY_TEXT_LCD_CONTRAST);
ComponentUI oldUI = ui;
ui = newUI;
if (ui != null) {
@@ -4048,8 +4060,10 @@
* @see #putClientProperty
*/
public final Object getClientProperty(Object key) {
- if (key == SwingUtilities2.AA_TEXT_PROPERTY_KEY) {
- return aaTextInfo;
+ if (key == RenderingHints.KEY_TEXT_ANTIALIASING) {
+ return aaHint;
+ } else if (key == RenderingHints.KEY_TEXT_LCD_CONTRAST) {
+ return lcdRenderingHint;
} else if (key == SwingUtilities2.COMPONENT_UI_PROPERTY_KEY) {
return ui;
}
@@ -4091,8 +4105,11 @@
* @see #addPropertyChangeListener
*/
public final void putClientProperty(Object key, Object value) {
- if (key == SwingUtilities2.AA_TEXT_PROPERTY_KEY) {
- aaTextInfo = value;
+ if (key == RenderingHints.KEY_TEXT_ANTIALIASING) {
+ aaHint = value;
+ return;
+ } else if (key == RenderingHints.KEY_TEXT_LCD_CONTRAST) {
+ lcdRenderingHint = value;
return;
}
if (value == null && clientProperties == null) {
--- a/jdk/src/java.desktop/share/classes/javax/swing/JTabbedPane.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/javax/swing/JTabbedPane.java Mon Sep 21 17:49:57 2015 +0200
@@ -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
@@ -2304,8 +2304,10 @@
}
public Rectangle getBounds() {
- return parent.getUI().getTabBounds(parent,
- parent.indexOfTab(title));
+ int i = parent.indexOfTab(title);
+ // Check for no title. Even though that's a bug in the app we should
+ // inhibit an ArrayIndexOutOfBoundsException from getTabBounds.
+ return (i == -1) ? null : parent.getUI().getTabBounds(parent, i);
}
public void setBounds(Rectangle r) {
--- a/jdk/src/java.desktop/share/classes/javax/swing/colorchooser/AbstractColorChooserPanel.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/javax/swing/colorchooser/AbstractColorChooserPanel.java Mon Sep 21 17:49:57 2015 +0200
@@ -50,6 +50,14 @@
@SuppressWarnings("serial") // Same-version serialization only
public abstract class AbstractColorChooserPanel extends JPanel {
+
+ /**
+ * Identifies that the transparency of the color (alpha value) can be
+ * selected
+ */
+ public static final String TRANSPARENCY_ENABLED_PROPERTY
+ = "TransparencyEnabled";
+
private final PropertyChangeListener enabledListener = new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
Object value = event.getNewValue();
@@ -202,6 +210,40 @@
}
/**
+ * Sets whether color chooser panel allows to select the transparency
+ * (alpha value) of a color.
+ * This method fires a property-changed event, using the string value of
+ * {@code TRANSPARENCY_ENABLED_PROPERTY} as the name
+ * of the property.
+ *
+ * <p>The value is a hint and may not be applicable to all types of chooser
+ * panel.
+ *
+ * <p>The default value is {@code true}.
+ *
+ * @param b true if the transparency of a color can be selected
+ *
+ * @beaninfo
+ * bound: true
+ * description: Sets the transparency of a color selection on or off.
+ *
+ * @see #isColorTransparencySelectionEnabled()
+ */
+ public void setColorTransparencySelectionEnabled(boolean b){
+ }
+
+ /**
+ * Gets whether color chooser panel allows to select the transparency
+ * (alpha value) of a color.
+ *
+ * @return true if the transparency of a color can be selected
+ * @see #setColorTransparencySelectionEnabled(boolean)
+ */
+ public boolean isColorTransparencySelectionEnabled(){
+ return true;
+ }
+
+ /**
* Draws the panel.
* @param g the <code>Graphics</code> object
*/
--- a/jdk/src/java.desktop/share/classes/javax/swing/colorchooser/ColorChooserPanel.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/javax/swing/colorchooser/ColorChooserPanel.java Mon Sep 21 17:49:57 2015 +0200
@@ -176,6 +176,21 @@
return null;
}
+ @Override
+ public void setColorTransparencySelectionEnabled(boolean b){
+ boolean oldValue = isColorTransparencySelectionEnabled();
+ if (b != oldValue) {
+ panel.setColorTransparencySelectionEnabled(b);
+ firePropertyChange(TRANSPARENCY_ENABLED_PROPERTY,
+ oldValue, b);
+ }
+ }
+
+ @Override
+ public boolean isColorTransparencySelectionEnabled(){
+ return panel.isColorTransparencySelectionEnabled();
+ }
+
public void propertyChange(PropertyChangeEvent event) {
ColorSelectionModel model = getColorSelectionModel();
if (model != null) {
--- a/jdk/src/java.desktop/share/classes/javax/swing/colorchooser/ColorPanel.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/javax/swing/colorchooser/ColorPanel.java Mon Sep 21 17:49:57 2015 +0200
@@ -145,7 +145,7 @@
}
void colorChanged() {
- this.color = new Color(getColor(0), true);
+ this.color = new Color(getColor(0), isColorTransparencySelectionEnabled());
Object parent = getParent();
if (parent instanceof ColorChooserPanel) {
ColorChooserPanel chooser = (ColorChooserPanel) parent;
@@ -208,6 +208,17 @@
return this.model.getColor(this.values);
}
+ void setColorTransparencySelectionEnabled(boolean b) {
+ if (spinners[model.getCount() - 1].isVisible() != b) {
+ spinners[model.getCount() - 1].setVisible(b);
+ colorChanged();
+ }
+ }
+
+ boolean isColorTransparencySelectionEnabled() {
+ return spinners[model.getCount() - 1].isVisible();
+ }
+
private void setValue(int index) {
this.values[index] = this.spinners[index].getValue();
}
--- a/jdk/src/java.desktop/share/classes/javax/swing/colorchooser/SlidingSpinner.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/javax/swing/colorchooser/SlidingSpinner.java Mon Sep 21 17:49:57 2015 +0200
@@ -95,6 +95,10 @@
this.spinner.setVisible(visible);
}
+ boolean isVisible() {
+ return this.slider.isVisible();
+ }
+
public void stateChanged(ChangeEvent event) {
if (!this.internal) {
if (this.spinner == event.getSource()) {
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/LayerUI.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/LayerUI.java Mon Sep 21 17:49:57 2015 +0200
@@ -90,7 +90,7 @@
* and set the layer event mask to {@code 0}
* in {@link #uninstallUI(javax.swing.JComponent)} after that.
* By default this method calls the appropriate
- * {@code process<event type>Event}
+ * {@code process<event} {@code type>Event}
* method for the given class of event.
* <p>
* <b>Note:</b> Events are processed only for displayable {@code JLayer}s.
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicInternalFrameTitlePane.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicInternalFrameTitlePane.java Mon Sep 21 17:49:57 2015 +0200
@@ -35,11 +35,11 @@
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyVetoException;
+import static java.awt.RenderingHints.KEY_TEXT_ANTIALIASING;
+import static java.awt.RenderingHints.KEY_TEXT_LCD_CONTRAST;
import sun.swing.DefaultLookup;
-import static sun.swing.SwingUtilities2.AA_TEXT_PROPERTY_KEY;
-
/**
* The class that manages a basic title bar
* <p>
@@ -217,8 +217,10 @@
}
private void updateProperties() {
- final Object aaTextInfo = frame.getClientProperty(AA_TEXT_PROPERTY_KEY);
- putClientProperty(AA_TEXT_PROPERTY_KEY, aaTextInfo);
+ putClientProperty(KEY_TEXT_ANTIALIASING,
+ frame.getClientProperty(KEY_TEXT_ANTIALIASING));
+ putClientProperty(KEY_TEXT_LCD_CONTRAST,
+ frame.getClientProperty(KEY_TEXT_LCD_CONTRAST));
}
/**
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java Mon Sep 21 17:49:57 2015 +0200
@@ -1514,8 +1514,7 @@
flushUnreferenced(); // Remove old listeners
boolean lafCond = SwingUtilities2.isLocalDisplay();
- Object aaTextInfo = SwingUtilities2.AATextInfo.getAATextInfo(lafCond);
- table.put(SwingUtilities2.AA_TEXT_PROPERTY_KEY, aaTextInfo);
+ SwingUtilities2.putAATextInfo(lafCond, table);
new AATextListener(this);
}
@@ -2204,9 +2203,7 @@
}
UIDefaults defaults = UIManager.getLookAndFeelDefaults();
boolean lafCond = SwingUtilities2.isLocalDisplay();
- Object aaTextInfo =
- SwingUtilities2.AATextInfo.getAATextInfo(lafCond);
- defaults.put(SwingUtilities2.AA_TEXT_PROPERTY_KEY, aaTextInfo);
+ SwingUtilities2.putAATextInfo(lafCond, defaults);
updateUI();
}
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/synth/SynthLookAndFeel.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/synth/SynthLookAndFeel.java Mon Sep 21 17:49:57 2015 +0200
@@ -688,8 +688,7 @@
// enabled antialiasing depending on desktop settings
flushUnreferenced();
- Object aaTextInfo = getAATextInfo();
- table.put(SwingUtilities2.AA_TEXT_PROPERTY_KEY, aaTextInfo);
+ SwingUtilities2.putAATextInfo(useLAFConditions(), table);
new AATextListener(this);
if (defaultsMap != null) {
@@ -794,7 +793,7 @@
*
* @return the text antialiasing information associated to the desktop
*/
- private static Object getAATextInfo() {
+ private static boolean useLAFConditions() {
String language = Locale.getDefault().getLanguage();
String desktop =
AccessController.doPrivileged(new GetPropertyAction("sun.desktop"));
@@ -805,10 +804,7 @@
boolean isGnome = "gnome".equals(desktop);
boolean isLocal = SwingUtilities2.isLocalDisplay();
- boolean setAA = isLocal && (!isGnome || !isCjkLocale);
-
- Object aaTextInfo = SwingUtilities2.AATextInfo.getAATextInfo(setAA);
- return aaTextInfo;
+ return isLocal && (!isGnome || !isCjkLocale);
}
private static ReferenceQueue<LookAndFeel> queue = new ReferenceQueue<LookAndFeel>();
@@ -844,8 +840,7 @@
return;
}
- Object aaTextInfo = getAATextInfo();
- defaults.put(SwingUtilities2.AA_TEXT_PROPERTY_KEY, aaTextInfo);
+ SwingUtilities2.putAATextInfo(useLAFConditions(), defaults);
updateUI();
}
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/rtf/RTFReader.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/javax/swing/text/rtf/RTFReader.java Mon Sep 21 17:49:57 2015 +0200
@@ -298,8 +298,8 @@
* Handles a parameterless RTF keyword. This is called by the superclass
* (RTFParser) when a keyword is found in the input stream.
*
- * @returns <code>true</code> if the keyword is recognized and handled;
- * <code>false</code> otherwise
+ * @return true if the keyword is recognized and handled;
+ * false otherwise
* @see RTFParser#handleKeyword
*/
public boolean handleKeyword(String keyword)
@@ -444,8 +444,8 @@
* This is called by the superclass
* (RTFParser) when a keyword is found in the input stream.
*
- * @returns <code>true</code> if the keyword is recognized and handled;
- * <code>false</code> otherwise
+ * @return true if the keyword is recognized and handled;
+ * false otherwise
* @see RTFParser#handleKeyword
*/
public boolean handleKeyword(String keyword, int parameter)
@@ -553,7 +553,7 @@
* array of characters, mapping unsigned byte values to their Unicode
* equivalents. The character set is loaded if necessary.
*
- * @returns the character set
+ * @return the character set
*/
public static Object
getCharacterSet(final String name)
@@ -577,7 +577,7 @@
* must contain 256 decimal integers, separated by whitespace, with
* no punctuation. B- and C- style comments are allowed.
*
- * @returns the newly read character set
+ * @return the newly read character set
*/
static char[] readCharset(InputStream strm)
throws IOException
@@ -1349,7 +1349,7 @@
* Calculates the current text (character) attributes in a form suitable
* for SwingText from the current parser state.
*
- * @returns a new MutableAttributeSet containing the text attributes.
+ * @return a new MutableAttributeSet containing the text attributes.
*/
MutableAttributeSet currentTextAttributes()
{
@@ -1410,7 +1410,7 @@
* Calculates the current paragraph attributes (with keys
* as given in StyleConstants) from the current parser state.
*
- * @returns a newly created MutableAttributeSet.
+ * @return a newly created MutableAttributeSet.
* @see StyleConstants
*/
MutableAttributeSet currentParagraphAttributes()
@@ -1449,7 +1449,7 @@
* Calculates the current section attributes
* from the current parser state.
*
- * @returns a newly created MutableAttributeSet.
+ * @return a newly created MutableAttributeSet.
*/
public AttributeSet currentSectionAttributes()
{
--- a/jdk/src/java.desktop/share/classes/sun/awt/SunToolkit.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/sun/awt/SunToolkit.java Mon Sep 21 17:49:57 2015 +0200
@@ -124,18 +124,7 @@
* @param appContext AppContext to associate with the event queue
*/
private static void initEQ(AppContext appContext) {
- EventQueue eventQueue;
-
- String eqName = System.getProperty("AWT.EventQueueClass",
- "java.awt.EventQueue");
-
- try {
- eventQueue = (EventQueue)Class.forName(eqName).newInstance();
- } catch (Exception e) {
- e.printStackTrace();
- System.err.println("Failed loading " + eqName + ": " + e);
- eventQueue = new EventQueue();
- }
+ EventQueue eventQueue = new EventQueue();
appContext.put(AppContext.EVENT_QUEUE_KEY, eventQueue);
PostEventQueue postEventQueue = new PostEventQueue(eventQueue);
--- a/jdk/src/java.desktop/share/classes/sun/awt/shell/DefaultShellFolder.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/sun/awt/shell/DefaultShellFolder.java Mon Sep 21 17:49:57 2015 +0200
@@ -50,7 +50,7 @@
* this default implementation can always be represented with a
* <code>java.io.File</code> object instead.
*
- * @returns a <code>java.io.File</code> replacement object.
+ * @return a java.io.File replacement object.
*/
protected Object writeReplace() throws java.io.ObjectStreamException {
return new File(getPath());
--- a/jdk/src/java.desktop/share/classes/sun/awt/shell/ShellFolder.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/sun/awt/shell/ShellFolder.java Mon Sep 21 17:49:57 2015 +0200
@@ -67,8 +67,8 @@
* <code>java.io.File</code> instead. If not, then the object is most likely
* depending on some internal (native) state and cannot be serialized.
*
- * @returns a <code>java.io.File</code> replacement object, or <code>null</code>
- * if no suitable replacement can be found.
+ * @return a java.io.File replacement object, or null
+ * if no suitable replacement can be found.
*/
protected abstract Object writeReplace() throws java.io.ObjectStreamException;
--- a/jdk/src/java.desktop/share/classes/sun/print/PSPrinterJob.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/sun/print/PSPrinterJob.java Mon Sep 21 17:49:57 2015 +0200
@@ -419,8 +419,8 @@
/**
* Presents the user a dialog for changing properties of the
* print job interactively.
- * @returns false if the user cancels the dialog and
- * true otherwise.
+ * @return false if the user cancels the dialog and
+ * true otherwise.
* @exception HeadlessException if GraphicsEnvironment.isHeadless()
* returns true.
* @see java.awt.GraphicsEnvironment#isHeadless
--- a/jdk/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java Mon Sep 21 17:49:57 2015 +0200
@@ -964,8 +964,8 @@
/**
* Presents the user a dialog for changing properties of the
* print job interactively.
- * @returns false if the user cancels the dialog and
- * true otherwise.
+ * @return false if the user cancels the dialog and
+ * true otherwise.
* @exception HeadlessException if GraphicsEnvironment.isHeadless()
* returns true.
* @see java.awt.GraphicsEnvironment#isHeadless
--- a/jdk/src/java.desktop/share/classes/sun/swing/SwingUtilities2.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/sun/swing/SwingUtilities2.java Mon Sep 21 17:49:57 2015 +0200
@@ -103,14 +103,6 @@
new FontRenderContext(null, false, false);
/**
- * A JComponent client property is used to determine text aa settings.
- * To avoid having this property persist between look and feels changes
- * the value of the property is set to null in JComponent.setUI
- */
- public static final Object AA_TEXT_PROPERTY_KEY =
- new StringBuffer("AATextInfoPropertyKey");
-
- /**
* Attribute key for the content elements. If it is set on an element, the
* element is considered to be a line break.
*/
@@ -123,58 +115,23 @@
private static final StringBuilder SKIP_CLICK_COUNT =
new StringBuilder("skipClickCount");
- /* Presently this class assumes default fractional metrics.
- * This may need to change to emulate future platform L&Fs.
- */
- public static class AATextInfo {
-
- private static AATextInfo getAATextInfoFromMap(Map<java.awt.RenderingHints.Key, Object> hints) {
-
- Object aaHint = hints.get(KEY_TEXT_ANTIALIASING);
- Object contHint = hints.get(KEY_TEXT_LCD_CONTRAST);
-
- if (aaHint == null ||
- aaHint == VALUE_TEXT_ANTIALIAS_OFF ||
- aaHint == VALUE_TEXT_ANTIALIAS_DEFAULT) {
- return null;
- } else {
- return new AATextInfo(aaHint, (Integer)contHint);
- }
- }
+ @SuppressWarnings("unchecked")
+ public static void putAATextInfo(boolean lafCondition,
+ Map<Object, Object> map) {
+ SunToolkit.setAAFontSettingsCondition(lafCondition);
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ Object desktopHints = tk.getDesktopProperty(SunToolkit.DESKTOPFONTHINTS);
- @SuppressWarnings("unchecked")
- public static AATextInfo getAATextInfo(boolean lafCondition) {
- SunToolkit.setAAFontSettingsCondition(lafCondition);
- Toolkit tk = Toolkit.getDefaultToolkit();
- Object map = tk.getDesktopProperty(SunToolkit.DESKTOPFONTHINTS);
- if (map instanceof Map) {
- return getAATextInfoFromMap((Map<java.awt.RenderingHints.Key, Object>)map);
- } else {
- return null;
+ if (desktopHints instanceof Map) {
+ Map<Object, Object> hints = (Map<Object, Object>) desktopHints;
+ Object aaHint = hints.get(KEY_TEXT_ANTIALIASING);
+ if (aaHint == null
+ || aaHint == VALUE_TEXT_ANTIALIAS_OFF
+ || aaHint == VALUE_TEXT_ANTIALIAS_DEFAULT) {
+ return;
}
- }
-
- Object aaHint;
- Integer lcdContrastHint;
- FontRenderContext frc;
-
- /* These are rarely constructed objects, and only when a complete
- * UI is being updated, so the cost of the tests here is minimal
- * and saves tests elsewhere.
- * We test that the values are ones we support/expect.
- */
- public AATextInfo(Object aaHint, Integer lcdContrastHint) {
- if (aaHint == null) {
- throw new InternalError("null not allowed here");
- }
- if (aaHint == VALUE_TEXT_ANTIALIAS_OFF ||
- aaHint == VALUE_TEXT_ANTIALIAS_DEFAULT) {
- throw new InternalError("AA must be on");
- }
- this.aaHint = aaHint;
- this.lcdContrastHint = lcdContrastHint;
- this.frc = new FontRenderContext(null, aaHint,
- VALUE_FRACTIONALMETRICS_DEFAULT);
+ map.put(KEY_TEXT_ANTIALIASING, aaHint);
+ map.put(KEY_TEXT_LCD_CONTRAST, hints.get(KEY_TEXT_LCD_CONTRAST));
}
}
@@ -241,22 +198,6 @@
//
/**
- * Returns whether or not text should be drawn antialiased.
- *
- * @param c JComponent to test.
- * @return Whether or not text should be drawn antialiased for the
- * specified component.
- */
- public static AATextInfo drawTextAntialiased(JComponent c) {
- if (c != null) {
- /* a non-null property implies some form of AA requested */
- return (AATextInfo)c.getClientProperty(AA_TEXT_PROPERTY_KEY);
- }
- // No component, assume aa is off
- return null;
- }
-
- /**
* Returns the left side bearing of the first character of string. The
* left side bearing is calculated from the passed in
* FontMetrics. If the passed in String is less than one
@@ -530,7 +471,6 @@
// If we get here we're not printing
if (g instanceof Graphics2D) {
- AATextInfo info = drawTextAntialiased(c);
Graphics2D g2 = (Graphics2D)g;
boolean needsTextLayout = ((c != null) &&
@@ -543,21 +483,27 @@
}
}
- if (info != null) {
+ Object aaHint = (c == null)
+ ? null
+ : c.getClientProperty(KEY_TEXT_ANTIALIASING);
+ if (aaHint != null) {
Object oldContrast = null;
Object oldAAValue = g2.getRenderingHint(KEY_TEXT_ANTIALIASING);
- if (info.aaHint != oldAAValue) {
- g2.setRenderingHint(KEY_TEXT_ANTIALIASING, info.aaHint);
+ if (aaHint != oldAAValue) {
+ g2.setRenderingHint(KEY_TEXT_ANTIALIASING, aaHint);
} else {
oldAAValue = null;
}
- if (info.lcdContrastHint != null) {
+
+ Object lcdContrastHint = c.getClientProperty(
+ KEY_TEXT_LCD_CONTRAST);
+ if (lcdContrastHint != null) {
oldContrast = g2.getRenderingHint(KEY_TEXT_LCD_CONTRAST);
- if (info.lcdContrastHint.equals(oldContrast)) {
+ if (lcdContrastHint.equals(oldContrast)) {
oldContrast = null;
} else {
g2.setRenderingHint(KEY_TEXT_LCD_CONTRAST,
- info.lcdContrastHint);
+ lcdContrastHint);
}
}
@@ -821,24 +767,28 @@
}
// Assume we're not printing if we get here, or that we are invoked
// via Swing text printing which is laid out for the printer.
- AATextInfo info = drawTextAntialiased(c);
- if (info != null && (g instanceof Graphics2D)) {
+ Object aaHint = (c == null)
+ ? null
+ : c.getClientProperty(KEY_TEXT_ANTIALIASING);
+ if (aaHint != null && (g instanceof Graphics2D)) {
Graphics2D g2 = (Graphics2D)g;
Object oldContrast = null;
Object oldAAValue = g2.getRenderingHint(KEY_TEXT_ANTIALIASING);
- if (info.aaHint != null && info.aaHint != oldAAValue) {
- g2.setRenderingHint(KEY_TEXT_ANTIALIASING, info.aaHint);
+ if (aaHint != null && aaHint != oldAAValue) {
+ g2.setRenderingHint(KEY_TEXT_ANTIALIASING, aaHint);
} else {
oldAAValue = null;
}
- if (info.lcdContrastHint != null) {
+
+ Object lcdContrastHint = c.getClientProperty(KEY_TEXT_LCD_CONTRAST);
+ if (lcdContrastHint != null) {
oldContrast = g2.getRenderingHint(KEY_TEXT_LCD_CONTRAST);
- if (info.lcdContrastHint.equals(oldContrast)) {
+ if (lcdContrastHint.equals(oldContrast)) {
oldContrast = null;
} else {
g2.setRenderingHint(KEY_TEXT_LCD_CONTRAST,
- info.lcdContrastHint);
+ lcdContrastHint);
}
}
@@ -1117,15 +1067,35 @@
*/
private static FontRenderContext getFRCProperty(JComponent c) {
if (c != null) {
- AATextInfo info =
- (AATextInfo)c.getClientProperty(AA_TEXT_PROPERTY_KEY);
- if (info != null) {
- return info.frc;
+ Object aaHint = c.getClientProperty(KEY_TEXT_ANTIALIASING);
+ if (aaHint != null) {
+ return getFRCFromCache(aaHint);
}
}
return null;
}
+ private static final Object APP_CONTEXT_FRC_CACHE_KEY = new Object();
+
+ private static FontRenderContext getFRCFromCache(Object aaHint) {
+ @SuppressWarnings("unchecked")
+ Map<Object, FontRenderContext> cache = (Map<Object, FontRenderContext>)
+ AppContext.getAppContext().get(APP_CONTEXT_FRC_CACHE_KEY);
+
+ if (cache == null) {
+ cache = new HashMap<>();
+ AppContext.getAppContext().put(APP_CONTEXT_FRC_CACHE_KEY, cache);
+ }
+
+ FontRenderContext frc = cache.get(aaHint);
+ if (frc == null) {
+ frc = new FontRenderContext(null, aaHint,
+ VALUE_FRACTIONALMETRICS_DEFAULT);
+ cache.put(aaHint, frc);
+ }
+ return frc;
+ }
+
/*
* returns true if the Graphics is print Graphics
* false otherwise
--- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/MotifDnDDragSourceProtocol.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/MotifDnDDragSourceProtocol.java Mon Sep 21 17:49:57 2015 +0200
@@ -96,7 +96,7 @@
/**
* Processes the specified client message event.
*
- * @returns true if the event was successfully processed.
+ * @return true if the event was successfully processed.
*/
public boolean processClientMessage(XClientMessageEvent xclient) {
if (xclient.get_message_type() !=
--- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XDnDDragSourceProtocol.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XDnDDragSourceProtocol.java Mon Sep 21 17:49:57 2015 +0200
@@ -68,7 +68,7 @@
/**
* Performs protocol-specific drag initialization.
*
- * @returns true if the initialized successfully.
+ * @return true if the initialized successfully.
*/
protected void initializeDragImpl(int actions, Transferable contents,
Map<Long, DataFlavor> formatMap, long[] formats)
--- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XDragSourceContextPeer.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XDragSourceContextPeer.java Mon Sep 21 17:49:57 2015 +0200
@@ -379,7 +379,7 @@
/**
* Updates the source action according to the specified state.
*
- * @returns true if the source
+ * @return true if the source
*/
private boolean updateSourceAction(int state) {
int action = SunDragSourceContextPeer.convertModifiersToDropAction(XWindow.getModifiers(state, 0, 0),
@@ -570,7 +570,7 @@
/**
* The caller must own awtLock.
*
- * @returns true if the even was processed and shouldn't be passed along.
+ * @return true if the event was processed and shouldn't be passed along.
*/
private boolean doProcessEvent(XEvent ev) {
assert XToolkit.isAWTLockHeldByCurrentThread();
--- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XDragSourceProtocol.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XDragSourceProtocol.java Mon Sep 21 17:49:57 2015 +0200
@@ -140,7 +140,7 @@
/**
* Processes the specified client message event.
*
- * @returns true if the event was successfully processed.
+ * @return true if the event was successfully processed.
*/
public abstract boolean processClientMessage(XClientMessageEvent xclient)
throws XException;
--- a/jdk/src/java.desktop/unix/classes/sun/awt/X11InputMethod.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11InputMethod.java Mon Sep 21 17:49:57 2015 +0200
@@ -293,7 +293,7 @@
/**
* Query and then return the current composition state.
- * @returns the composition state if isCompositionEnabled call
+ * @return the composition state if isCompositionEnabled call
* is successful. Otherwise, it returns false.
*/
private boolean getCompositionState() {
--- a/jdk/src/java.desktop/windows/classes/sun/awt/Win32GraphicsEnvironment.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/windows/classes/sun/awt/Win32GraphicsEnvironment.java Mon Sep 21 17:49:57 2015 +0200
@@ -97,14 +97,14 @@
* Returns the number of pixels per logical inch along the screen width.
* In a system with multiple display monitors, this value is the same for
* all monitors.
- * @returns number of pixels per logical inch in X direction
+ * @return number of pixels per logical inch in X direction
*/
public native int getXResolution();
/**
* Returns the number of pixels per logical inch along the screen height.
* In a system with multiple display monitors, this value is the same for
* all monitors.
- * @returns number of pixels per logical inch in Y direction
+ * @return number of pixels per logical inch in Y direction
*/
public native int getYResolution();
--- a/jdk/src/java.desktop/windows/classes/sun/awt/windows/WPrinterJob.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/windows/classes/sun/awt/windows/WPrinterJob.java Mon Sep 21 17:49:57 2015 +0200
@@ -556,8 +556,8 @@
/**
* Presents the user a dialog for changing properties of the
* print job interactively.
- * @returns false if the user cancels the dialog and
- * true otherwise.
+ * @return false if the user cancels the dialog and
+ * true otherwise.
* @exception HeadlessException if GraphicsEnvironment.isHeadless()
* returns true.
* @see java.awt.GraphicsEnvironment#isHeadless
--- a/jdk/src/java.desktop/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.desktop/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java Mon Sep 21 17:49:57 2015 +0200
@@ -201,8 +201,8 @@
* - it's one of the classes likely to have custom rendering worth
* accelerating
*
- * @returns true if we can use a d3d surface for this peer's onscreen
- * rendering
+ * @return true if we can use a d3d surface for this peer's onscreen
+ * rendering
*/
public static boolean canUseD3DOnScreen(final WComponentPeer peer,
final Win32GraphicsConfig gc,
--- a/jdk/src/java.management/share/classes/sun/management/HotspotCompilation.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.management/share/classes/sun/management/HotspotCompilation.java Mon Sep 21 17:49:57 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -76,7 +76,6 @@
private LongCounter lastInvalidatedType;
private class CompilerThreadInfo {
- int index;
String name;
StringCounter method;
LongCounter type;
@@ -90,14 +89,6 @@
this.compiles = (LongCounter) lookup(basename + "compiles");
this.time = (LongCounter) lookup(basename + "time");
}
- CompilerThreadInfo(String bname) {
- String basename = bname + ".";
- this.name = bname;
- this.method = (StringCounter) lookup(basename + "method");
- this.type = (LongCounter) lookup(basename + "type");
- this.compiles = (LongCounter) lookup(basename + "compiles");
- this.time = (LongCounter) lookup(basename + "time");
- }
CompilerThreadStat getCompilerThreadStat() {
MethodInfo minfo = new MethodInfo(method.stringValue(),
@@ -109,7 +100,7 @@
minfo);
}
}
- private CompilerThreadInfo[] threads;
+ private List<CompilerThreadInfo> threads;
private int numActiveThreads; // number of active compiler threads
private Map<String, Counter> counters;
@@ -158,18 +149,12 @@
numActiveThreads = (int) compilerThreads.longValue();
// Allocate CompilerThreadInfo for compilerThread and adaptorThread
- threads = new CompilerThreadInfo[numActiveThreads+1];
+ threads = new ArrayList<CompilerThreadInfo>();
- // AdaptorThread has index 0
- if (counters.containsKey(SUN_CI + "adapterThread.compiles")) {
- threads[0] = new CompilerThreadInfo("adapterThread", 0);
- numActiveThreads++;
- } else {
- threads[0] = null;
- }
-
- for (int i = 1; i < threads.length; i++) {
- threads[i] = new CompilerThreadInfo("compilerThread", i-1);
+ for (int i = 0; i < numActiveThreads; i++) {
+ if (counters.containsKey(SUN_CI + "compilerThread." + i + ".method")) {
+ threads.add(new CompilerThreadInfo("compilerThread", i));
+ }
}
}
@@ -197,15 +182,10 @@
return nmethodSize.longValue();
}
- public java.util.List<CompilerThreadStat> getCompilerThreadStats() {
- List<CompilerThreadStat> list = new ArrayList<>(threads.length);
- int i = 0;
- if (threads[0] == null) {
- // no adaptor thread
- i = 1;
- }
- for (; i < threads.length; i++) {
- list.add(threads[i].getCompilerThreadStat());
+ public List<CompilerThreadStat> getCompilerThreadStats() {
+ List<CompilerThreadStat> list = new ArrayList<>(threads.size());
+ for (CompilerThreadInfo info : threads) {
+ list.add(info.getCompilerThreadStat());
}
return list;
}
--- a/jdk/src/java.naming/share/classes/sun/security/provider/certpath/ldap/LDAPCertStore.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/java.naming/share/classes/sun/security/provider/certpath/ldap/LDAPCertStore.java Mon Sep 21 17:49:57 2015 +0200
@@ -25,18 +25,12 @@
package sun.security.provider.certpath.ldap;
-import java.math.BigInteger;
import java.net.URI;
-import java.util.*;
-
import java.security.*;
-import java.security.cert.Certificate;
import java.security.cert.*;
-import javax.security.auth.x500.X500Principal;
-
+import java.util.*;
import sun.security.util.Cache;
import sun.security.util.Debug;
-import sun.security.x509.X500Name;
/**
* A <code>CertStore</code> that retrieves <code>Certificates</code> and
@@ -93,8 +87,6 @@
private static final Debug debug = Debug.getInstance("certpath");
- private final static boolean DEBUG = false;
-
private String ldapDN;
private LDAPCertStoreImpl impl;
@@ -108,7 +100,7 @@
String dn = null;
if (params == null) {
throw new InvalidAlgorithmParameterException(
- "parameters required for LDAP Certore");
+ "Parameters required for LDAP certstore");
}
if (params instanceof LDAPCertStoreParameters) {
LDAPCertStoreParameters p = (LDAPCertStoreParameters) params;
@@ -119,7 +111,9 @@
URI u = p.getURI();
if (!u.getScheme().equalsIgnoreCase("ldap")) {
throw new InvalidAlgorithmParameterException(
- "Only LDAP URIs are supported for LDAP Certore");
+ "Unsupported scheme '" + u.getScheme()
+ + "', only LDAP URIs are supported "
+ + "for LDAP certstore");
}
// Use the same default values as in LDAPCertStoreParameters
// if unspecified in URI
@@ -137,8 +131,9 @@
}
} else {
throw new InvalidAlgorithmParameterException(
- "parameters must be either LDAPCertStoreParameters or " +
- "URICertStoreParameters");
+ "Parameters must be either LDAPCertStoreParameters or "
+ + "URICertStoreParameters, but instance of "
+ + params.getClass().getName() + " passed");
}
Key k = new Key(serverName, port);
@@ -236,6 +231,7 @@
* match the specified selector
* @throws CertStoreException if an exception occurs
*/
+ @Override
public synchronized Collection<X509Certificate> engineGetCertificates
(CertSelector selector) throws CertStoreException {
if (debug != null) {
@@ -245,7 +241,9 @@
if (selector == null) {
selector = new X509CertSelector();
} else if (!(selector instanceof X509CertSelector)) {
- throw new CertStoreException("need X509CertSelector to find certs");
+ throw new CertStoreException("Need X509CertSelector to find certs, "
+ + "but instance of " + selector.getClass().getName()
+ + " passed");
}
return impl.getCertificates((X509CertSelector) selector, ldapDN);
}
@@ -271,6 +269,7 @@
* match the specified selector
* @throws CertStoreException if an exception occurs
*/
+ @Override
public synchronized Collection<X509CRL> engineGetCRLs(CRLSelector selector)
throws CertStoreException {
if (debug != null) {
@@ -281,7 +280,9 @@
if (selector == null) {
selector = new X509CRLSelector();
} else if (!(selector instanceof X509CRLSelector)) {
- throw new CertStoreException("need X509CRLSelector to find CRLs");
+ throw new CertStoreException("Need X509CRLSelector to find CRLs, "
+ + "but instance of " + selector.getClass().getName()
+ + " passed");
}
return impl.getCRLs((X509CRLSelector) selector, ldapDN);
}
--- a/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/NativeKey.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/NativeKey.java Mon Sep 21 17:49:57 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 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
@@ -31,19 +31,9 @@
import java.lang.ref.*;
import java.math.BigInteger;
-import java.security.InvalidKeyException;
-import java.security.NoSuchAlgorithmException;
-import java.security.Key;
-import java.security.PublicKey;
-import java.security.PrivateKey;
-import java.security.KeyFactorySpi;
-import java.security.interfaces.RSAPrivateCrtKey;
-import java.security.interfaces.RSAPublicKey;
-
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.KeySpec;
-import java.security.spec.RSAPrivateCrtKeySpec;
-import java.security.spec.RSAPublicKeySpec;
+import java.security.*;
+import java.security.interfaces.*;
+import java.security.spec.*;
/**
* Wrapper class for native keys needed for using ucrypto APIs.
@@ -87,6 +77,41 @@
return b;
}
+ static final class RSAPrivate extends NativeKey implements RSAPrivateKey {
+
+ private static final long serialVersionUID = 1622705588904302831L;
+
+ private final RSAPrivateKeySpec keySpec;
+ private final long keyId;
+
+ RSAPrivate(KeySpec keySpec) throws InvalidKeySpecException {
+ super(2);
+ long pKey = 0L;
+ if (keySpec instanceof RSAPrivateKeySpec) {
+ RSAPrivateKeySpec ks = (RSAPrivateKeySpec) keySpec;
+ BigInteger mod = ks.getModulus();
+ BigInteger privateExp = ks.getPrivateExponent();
+ pKey = nativeInit(NativeKey.getMagnitude(mod),
+ NativeKey.getMagnitude(privateExp));
+ } else {
+ throw new InvalidKeySpecException("Only supports RSAPrivateKeySpec");
+ }
+ if (pKey == 0L) {
+ throw new UcryptoException("Error constructing RSA PrivateKey");
+ }
+ // track native resource clean up
+ new KeyRef(this, pKey);
+ this.keySpec = (RSAPrivateKeySpec) keySpec;
+ this.keyId = pKey;
+ }
+
+ long value() { return keyId; }
+ public BigInteger getModulus() { return keySpec.getModulus(); };
+ public BigInteger getPrivateExponent() { return keySpec.getPrivateExponent(); };
+
+ private native static long nativeInit(byte[] mod, byte[] privExp);
+ }
+
static final class RSAPrivateCrt extends NativeKey implements RSAPrivateCrtKey {
private static final long serialVersionUID = 6812507588904302831L;
@@ -119,7 +144,7 @@
throw new InvalidKeySpecException("Only supports RSAPrivateCrtKeySpec");
}
if (pKey == 0L) {
- throw new UcryptoException("Error constructing RSA PrivateKey");
+ throw new UcryptoException("Error constructing RSA PrivateCrtKey");
}
// track native resource clean up
new KeyRef(this, pKey);
--- a/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/NativeRSACipher.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/NativeRSACipher.java Mon Sep 21 17:49:57 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 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
@@ -37,9 +37,11 @@
import java.security.PublicKey;
import java.security.PrivateKey;
import java.security.spec.RSAPrivateCrtKeySpec;
+import java.security.spec.RSAPrivateKeySpec;
import java.security.spec.RSAPublicKeySpec;
import java.security.interfaces.RSAKey;
import java.security.interfaces.RSAPrivateCrtKey;
+import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.KeyFactory;
@@ -205,8 +207,8 @@
// Make sure the proper opmode uses the proper key
if (doEncrypt && (!(newKey instanceof RSAPublicKey))) {
throw new InvalidKeyException("RSAPublicKey required for encryption");
- } else if (!doEncrypt && (!(newKey instanceof RSAPrivateCrtKey))) {
- throw new InvalidKeyException("RSAPrivateCrtKey required for decryption");
+ } else if (!doEncrypt && (!(newKey instanceof RSAPrivateKey))) {
+ throw new InvalidKeyException("RSAPrivateKey required for decryption");
}
NativeKey nativeKey = null;
@@ -223,17 +225,26 @@
throw new InvalidKeyException(ikse);
}
} else {
- RSAPrivateCrtKey privateKey = (RSAPrivateCrtKey) newKey;
try {
- nativeKey = (NativeKey) keyFactory.engineGeneratePrivate
- (new RSAPrivateCrtKeySpec(privateKey.getModulus(),
- privateKey.getPublicExponent(),
- privateKey.getPrivateExponent(),
- privateKey.getPrimeP(),
- privateKey.getPrimeQ(),
- privateKey.getPrimeExponentP(),
- privateKey.getPrimeExponentQ(),
- privateKey.getCrtCoefficient()));
+ if (newKey instanceof RSAPrivateCrtKey) {
+ RSAPrivateCrtKey privateKey = (RSAPrivateCrtKey) newKey;
+ nativeKey = (NativeKey) keyFactory.engineGeneratePrivate
+ (new RSAPrivateCrtKeySpec(privateKey.getModulus(),
+ privateKey.getPublicExponent(),
+ privateKey.getPrivateExponent(),
+ privateKey.getPrimeP(),
+ privateKey.getPrimeQ(),
+ privateKey.getPrimeExponentP(),
+ privateKey.getPrimeExponentQ(),
+ privateKey.getCrtCoefficient()));
+ } else if (newKey instanceof RSAPrivateKey) {
+ RSAPrivateKey privateKey = (RSAPrivateKey) newKey;
+ nativeKey = (NativeKey) keyFactory.engineGeneratePrivate
+ (new RSAPrivateKeySpec(privateKey.getModulus(),
+ privateKey.getPrivateExponent()));
+ } else {
+ throw new InvalidKeyException("Unsupported type of RSAPrivateKey");
+ }
} catch (InvalidKeySpecException ikse) {
throw new InvalidKeyException(ikse);
}
--- a/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/NativeRSAKeyFactory.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/NativeRSAKeyFactory.java Mon Sep 21 17:49:57 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 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
@@ -38,16 +38,11 @@
import java.security.PrivateKey;
import java.security.KeyFactorySpi;
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.KeySpec;
-import java.security.spec.RSAPrivateCrtKeySpec;
-import java.security.spec.RSAPublicKeySpec;
+import java.security.spec.*;
/**
* Ucrypto-private KeyFactory class for generating native keys
- * needed for using ucrypto APIs. Given that it's not used
- * externally, it only needs to support RSAPrivateCrtKeySpec
- * and RSAPublicKeySpec objects.
+ * needed for using ucrypto APIs.
*
* @since 1.9
*/
@@ -56,7 +51,13 @@
@Override
protected PrivateKey engineGeneratePrivate(KeySpec keySpec)
throws InvalidKeySpecException {
- return new NativeKey.RSAPrivateCrt(keySpec);
+ if (keySpec instanceof RSAPrivateCrtKeySpec) {
+ return new NativeKey.RSAPrivateCrt(keySpec);
+ } else if (keySpec instanceof RSAPrivateKeySpec) {
+ return new NativeKey.RSAPrivate(keySpec);
+ } else {
+ throw new InvalidKeySpecException("Unsupported key spec");
+ }
}
@Override
--- a/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/NativeRSASignature.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/NativeRSASignature.java Mon Sep 21 17:49:57 2015 +0200
@@ -43,9 +43,8 @@
import java.security.*;
import java.security.interfaces.*;
-import java.security.spec.RSAPrivateCrtKeySpec;
-import java.security.spec.RSAPublicKeySpec;
-import java.security.spec.InvalidKeySpecException;
+import java.security.spec.*;
+
import sun.nio.ch.DirectBuffer;
import java.nio.ByteBuffer;
@@ -192,25 +191,31 @@
int newSigLength = sigLength;
// Need to check RSA key length whenever a new private key is set
if (privateKey != key) {
- if (privateKey instanceof RSAPrivateCrtKey) {
- RSAPrivateCrtKey rsaPrivKey = (RSAPrivateCrtKey) privateKey;
- BigInteger mod = rsaPrivKey.getModulus();
- newSigLength = checkRSAKeyLength(mod);
- try {
+ if (!(privateKey instanceof RSAPrivateKey)) {
+ throw new InvalidKeyException("RSAPrivateKey required");
+ }
+ RSAPrivateKey rsaPrivKey = (RSAPrivateKey) privateKey;
+ BigInteger mod = rsaPrivKey.getModulus();
+ newSigLength = checkRSAKeyLength(mod);
+ BigInteger pe = rsaPrivKey.getPrivateExponent();
+ try {
+ if (rsaPrivKey instanceof RSAPrivateCrtKey) {
+ RSAPrivateCrtKey rsaPrivCrtKey = (RSAPrivateCrtKey) rsaPrivKey;
newKey = (NativeKey) keyFactory.engineGeneratePrivate
(new RSAPrivateCrtKeySpec(mod,
- rsaPrivKey.getPublicExponent(),
- rsaPrivKey.getPrivateExponent(),
- rsaPrivKey.getPrimeP(),
- rsaPrivKey.getPrimeQ(),
- rsaPrivKey.getPrimeExponentP(),
- rsaPrivKey.getPrimeExponentQ(),
- rsaPrivKey.getCrtCoefficient()));
- } catch (InvalidKeySpecException ikse) {
- throw new InvalidKeyException(ikse);
+ rsaPrivCrtKey.getPublicExponent(),
+ pe,
+ rsaPrivCrtKey.getPrimeP(),
+ rsaPrivCrtKey.getPrimeQ(),
+ rsaPrivCrtKey.getPrimeExponentP(),
+ rsaPrivCrtKey.getPrimeExponentQ(),
+ rsaPrivCrtKey.getCrtCoefficient()));
+ } else {
+ newKey = (NativeKey) keyFactory.engineGeneratePrivate
+ (new RSAPrivateKeySpec(mod, pe));
}
- } else {
- throw new InvalidKeyException("RSAPrivateCrtKey required");
+ } catch (InvalidKeySpecException ikse) {
+ throw new InvalidKeyException(ikse);
}
}
init(true, newKey, newSigLength);
--- a/jdk/src/jdk.crypto.ucrypto/solaris/native/libj2ucrypto/nativeCrypto.c Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/jdk.crypto.ucrypto/solaris/native/libj2ucrypto/nativeCrypto.c Mon Sep 21 17:49:57 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 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
@@ -430,12 +430,18 @@
* Signature: (JZ[BI)I
*/
jint JavaCritical_com_oracle_security_ucrypto_NativeCipher_nativeFinal
- (jlong pContext, jboolean encrypt, int outLen, jbyte* bufOut, jint outOfs) {
+ (jlong pContext, jboolean encrypt, int outLen, jbyte* out, jint outOfs) {
crypto_ctx_t *context;
int rv = 0;
+ unsigned char* bufOut = (unsigned char*) out;
context = (crypto_ctx_t *) pContext;
- rv = CipherFinal(context, encrypt, (unsigned char*)bufOut, outOfs, &outLen);
+ // Avoid null output buffer to workaround Solaris bug21481818 (fixed in S12)
+ if (bufOut == NULL) {
+ bufOut = (unsigned char*)(&outLen);
+ outLen = 0;
+ }
+ rv = CipherFinal(context, encrypt, bufOut, outOfs, &outLen);
free(context);
if (rv) {
return -rv; // use negative value to indicate error!
@@ -648,7 +654,8 @@
// out is null when nativeFinal() is called solely for resource clean up
if (out == NULL) {
- bufOut = NULL;
+ // Avoid null output buffer to workaround Solaris bug21481818 (fixed in S12)
+ bufOut = (unsigned char *)(&outLen);
outLen = 0;
} else {
outLen = (*env)->GetArrayLength(env, out) - outOfs;
@@ -661,10 +668,12 @@
rv = CipherFinal(context, encrypt, bufOut, 0, &outLen);
if (rv) {
free(context);
- free(bufOut);
+ if (outLen != 0) {
+ free(bufOut);
+ }
return -rv;
} else {
- if (bufOut != NULL) {
+ if (bufOut != NULL && outLen != 0) {
(*env)->SetByteArrayRegion(env, out, outOfs, outLen, (jbyte *)bufOut);
free(bufOut);
}
@@ -697,6 +706,86 @@
}
/*
+ * Class: com_oracle_security_ucrypto_NativeKey_RSAPrivate
+ * Method: nativeInit
+ * Signature: ([B[B)J
+ */
+jlong JavaCritical_com_oracle_security_ucrypto_NativeKey_00024RSAPrivate_nativeInit
+(int modLen, jbyte* jMod, int privLen, jbyte* jPriv) {
+
+ unsigned char *mod, *priv;
+ crypto_object_attribute_t* pKey = NULL;
+
+ pKey = calloc(2, sizeof(crypto_object_attribute_t));
+ if (pKey == NULL) {
+ return 0L;
+ }
+ mod = priv = NULL;
+ mod = malloc(modLen);
+ priv = malloc(privLen);
+ if (mod == NULL || priv == NULL) {
+ free(pKey);
+ free(mod);
+ free(priv);
+ return 0L;
+ } else {
+ memcpy(mod, jMod, modLen);
+ memcpy(priv, jPriv, privLen);
+ }
+
+ // NOTE: numOfComponents should be 2
+ pKey[0].oa_type = SUN_CKA_MODULUS;
+ pKey[0].oa_value = (char*) mod;
+ pKey[0].oa_value_len = (size_t) modLen;
+ pKey[1].oa_type = SUN_CKA_PRIVATE_EXPONENT;
+ pKey[1].oa_value = (char*) priv;
+ pKey[1].oa_value_len = (size_t) privLen;
+
+ return (jlong) pKey;
+}
+
+JNIEXPORT jlong JNICALL
+Java_com_oracle_security_ucrypto_NativeKey_00024RSAPrivate_nativeInit
+ (JNIEnv *env, jclass jCls, jbyteArray jMod, jbyteArray jPriv) {
+
+ int modLen, privLen;
+ jbyte *bufMod, *bufPriv;
+ crypto_object_attribute_t* pKey = NULL;
+
+ bufMod = bufPriv = NULL;
+
+ modLen = (*env)->GetArrayLength(env, jMod);
+ bufMod = getBytes(env, jMod, 0, modLen);
+ if ((*env)->ExceptionCheck(env)) goto cleanup;
+
+ privLen = (*env)->GetArrayLength(env, jPriv);
+ bufPriv = getBytes(env, jPriv, 0, privLen);
+ if ((*env)->ExceptionCheck(env)) goto cleanup;
+
+ // proceed if no error; otherwise free allocated memory
+ pKey = calloc(2, sizeof(crypto_object_attribute_t));
+ if (pKey == NULL) {
+ throwOutOfMemoryError(env, NULL);
+ goto cleanup;
+ }
+
+ // NOTE: numOfComponents should be 2
+ pKey[0].oa_type = SUN_CKA_MODULUS;
+ pKey[0].oa_value = (char*) bufMod;
+ pKey[0].oa_value_len = (size_t) modLen;
+ pKey[1].oa_type = SUN_CKA_PRIVATE_EXPONENT;
+ pKey[1].oa_value = (char*) bufPriv;
+ pKey[1].oa_value_len = (size_t) privLen;
+ return (jlong) pKey;
+
+cleanup:
+ free(bufMod);
+ free(bufPriv);
+
+ return 0L;
+}
+
+/*
* Class: com_oracle_security_ucrypto_NativeKey_RSAPrivateCrt
* Method: nativeInit
* Signature: ([B[B[B[B[B[B[B[B)J
--- a/jdk/src/jdk.jcmd/share/classes/sun/tools/jps/Jps.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/src/jdk.jcmd/share/classes/sun/tools/jps/Jps.java Mon Sep 21 17:49:57 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 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
@@ -106,7 +106,11 @@
errorString = " -- jvm args information unavailable";
String jvmArgs = MonitoredVmUtil.jvmArgs(vm);
if (jvmArgs != null && jvmArgs.length() > 0) {
- output.append(' ').append(jvmArgs);
+ output.append(' ')
+ .append(
+ // multi-line args are permitted
+ jvmArgs.replace("\n", "\\n").replace("\r", "\\r")
+ );
}
}
if (arguments.showVmFlags()) {
--- a/jdk/test/ProblemList.txt Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/test/ProblemList.txt Mon Sep 21 17:49:57 2015 +0200
@@ -133,9 +133,6 @@
# 8029891
java/lang/ClassLoader/deadlock/GetResource.java generic-all
-# 8133552
-java/lang/ProcessHandle/InfoTest.java generic-all
-
############################################################################
# jdk_instrument
@@ -363,10 +360,6 @@
# 8062512
java/util/spi/ResourceBundleControlProvider/UserDefaultControlTest.java generic-all
-# 8029453
-java/util/concurrent/locks/ReentrantLock/TimeoutLockLoops.java linux-all
-
-
############################################################################
# jdk_instrument
@@ -387,11 +380,6 @@
# 6456333
sun/tools/jps/TestJpsJarRelative.java generic-all
-# 8134420
-sun/tools/jps/TestJpsClass.java generic-all
-sun/tools/jps/TestJpsJar.java generic-all
-sun/tools/jps/TestJpsSanity.java generic-all
-
# 6734748
sun/tools/jinfo/JInfoRunningProcessFlagTest.java generic-all
--- a/jdk/test/com/apple/eawt/DefaultMenuBar/DefaultMenuBarTest.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/test/com/apple/eawt/DefaultMenuBar/DefaultMenuBarTest.java Mon Sep 21 17:49:57 2015 +0200
@@ -25,6 +25,7 @@
* @test
* @bug 8007267
* @summary [macosx] com.apple.eawt.Application.setDefaultMenuBar is not working
+ * @requires (os.family == "mac")
* @author leonid.romanov@oracle.com
* @modules java.desktop/sun.awt
* java.desktop/com.apple.eawt
@@ -34,7 +35,6 @@
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
-import sun.awt.*;
import java.lang.reflect.Method;
@@ -43,7 +43,7 @@
static volatile int listenerCallCounter = 0;
public static void main(String[] args) throws Exception {
- if (sun.awt.OSInfo.getOSType() != sun.awt.OSInfo.OSType.MACOSX) {
+ if (!System.getProperty("os.name").contains("OS X")) {
System.out.println("This test is for MacOS only. Automatically passed on other platforms.");
return;
}
@@ -55,7 +55,6 @@
}
});
- SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
Robot robot = new Robot();
robot.setAutoDelay(100);
@@ -64,7 +63,7 @@
robot.keyRelease(ks.getKeyCode());
robot.keyRelease(KeyEvent.VK_META);
- toolkit.realSync();
+ robot.waitForIdle();
if (listenerCallCounter != 1) {
throw new Exception("Test failed: ActionListener either wasn't called or was called more than once");
--- a/jdk/test/com/oracle/security/ucrypto/CipherSignNotSupported.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/test/com/oracle/security/ucrypto/CipherSignNotSupported.java Mon Sep 21 17:49:57 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 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
@@ -23,7 +23,7 @@
/**
* @test
- * @bug 8029849
+ * @bug 8029849 8132082
* @summary Make sure signing via encrypt and verifying via decrypt are not
* supported by OracleUcrypto provider.
* @author Anthony Scarpino
@@ -31,12 +31,10 @@
*/
import java.util.Random;
-import java.security.KeyPairGenerator;
-import java.security.KeyPair;
+import java.security.*;
+import java.security.interfaces.*;
+import java.security.spec.RSAPrivateKeySpec;
import javax.crypto.Cipher;
-import java.security.InvalidKeyException;
-import java.security.NoSuchAlgorithmException;
-import java.security.Provider;
public class CipherSignNotSupported extends UcryptoTest {
@@ -69,27 +67,43 @@
c.init(Cipher.ENCRYPT_MODE, kp.getPublic());
ct = c.doFinal(pt);
// Decryption
- c.init(Cipher.DECRYPT_MODE, kp.getPrivate());
- c.doFinal(ct);
- // Sign
- try {
- c.init(Cipher.ENCRYPT_MODE, kp.getPrivate());
- ct = c.doFinal(pt);
- throw new RuntimeException("Encrypt operation should have failed.");
- } catch (InvalidKeyException e) {
- if (e.getMessage().compareTo("RSAPublicKey required for " +
- "encryption") != 0) {
- System.out.println("Wrong exception thrown.");
- throw e;
+ PrivateKey[] privKeys = new PrivateKey[2];
+ privKeys[0] = kp.getPrivate();
+ if (privKeys[0] instanceof RSAPrivateCrtKey) {
+ RSAPrivateCrtKey k = (RSAPrivateCrtKey) privKeys[0];
+ KeyFactory kf = KeyFactory.getInstance("RSA");
+ privKeys[1] = kf.generatePrivate
+ (new RSAPrivateKeySpec(k.getModulus(), k.getPrivateExponent()));
+ } else {
+ privKeys = new PrivateKey[] {privKeys[0]};
+ }
+
+ for (PrivateKey pk : privKeys) {
+ System.out.println("Testing " + pk);
+ c.init(Cipher.DECRYPT_MODE, pk);
+ c.doFinal(ct);
+
+ // Sign
+ try {
+ c.init(Cipher.ENCRYPT_MODE, pk);
+ ct = c.doFinal(pt);
+ throw new RuntimeException("Encrypt operation should have failed.");
+ } catch (InvalidKeyException e) {
+ if (e.getMessage().compareTo("RSAPublicKey required for " +
+ "encryption") != 0) {
+ System.out.println("Wrong exception thrown.");
+ throw e;
+ }
}
}
+
// Verify
try {
c.init(Cipher.DECRYPT_MODE, kp.getPublic());
c.doFinal(ct);
throw new RuntimeException("Decrypt operation should have failed.");
} catch (InvalidKeyException e) {
- if (e.getMessage().compareTo("RSAPrivateCrtKey required for " +
+ if (e.getMessage().compareTo("RSAPrivateKey required for " +
"decryption") != 0) {
System.out.println("Wrong exception thrown.");
throw e;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Component/GetScreenLocTest/GetScreenLocTest.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 2002, 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.awt.AWTException;
+import java.awt.BorderLayout;
+import java.awt.Canvas;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Frame;
+import java.awt.Graphics;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Robot;
+import java.awt.Toolkit;
+import java.awt.event.InputEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+
+/**
+ * @test
+ * @bug 4356202
+ * @summary Tests that getLocationOnScreen returns valid value(WindowMaker
+ * only).
+ * @author dom@sparc.spb.su:
+ */
+public class GetScreenLocTest {
+ //Declare things used in the test, like buttons and labels here
+ static Robot robot = null;
+ private static class MyCanvas extends Canvas {
+ public Dimension getPreferredSize() {
+ return new Dimension(100, 100);
+ }
+ public void paint(Graphics g) {
+ super.paint(g);
+ g.setColor(Color.blue);
+ Rectangle r = getBounds();
+ g.fillRect(0, 0, r.width, r.height);
+ }
+ }
+ static int state = 0; // there are three states - (-1,-1),(0,0),(1,1)
+
+ static void bigPause() {
+ Toolkit.getDefaultToolkit().sync();
+ robot.waitForIdle();
+ robot.delay(1000);
+ }
+
+ static void doPress(Point p) {
+ robot.mouseMove(p.x, p.y);
+ robot.mousePress(InputEvent.BUTTON1_MASK);
+ robot.mouseRelease(InputEvent.BUTTON1_MASK);
+ }
+
+ public static void main(final String[] args) throws AWTException {
+ robot = new Robot();
+ Frame bigOne = new Frame();
+ bigOne.setSize(200, 200);
+ bigOne.setLocationRelativeTo(null);
+ bigOne.setVisible(true);
+ Frame f = new Frame();
+ f.setLayout(new BorderLayout());
+ f.setSize(120, 150);
+ f.setLocationRelativeTo(null);
+ Canvas c = new MyCanvas();
+ f.add(c, BorderLayout.CENTER);
+ c.addMouseListener(new MouseAdapter() {
+ public void mousePressed(MouseEvent e) {
+ switch(state) {
+ case 0: // the first event should be (0,0)
+ if (e.getX() != 0 || e.getY() != 0) {
+ System.out.println("state 0: wrong location" + e);
+ break;
+ }
+ state++;
+ break;
+ case 1: // the second event should be (1,1)
+ if (e.getX() != 1 || e.getY() != 1) {
+ System.out.println("state 1: wrong location " + e);
+ break;
+ }
+ state++;
+ break;
+ case 2: // this should never happen
+ System.out.println("state 2: wrong location " + e);
+ }
+ }
+ });
+ f.pack();
+ f.setVisible(true);
+ bigPause();
+
+ Point p = c.getLocationOnScreen();
+ doPress(p);
+ p.x += 1;
+ p.y += 1;
+ doPress(p);
+ p.x -= 2;
+ p.y -= 2;
+ doPress(p);
+ bigPause();
+
+ f.dispose();
+ bigOne.dispose();
+
+ // ...and at the end the state should be 2
+ if (state != 2) {
+ throw new RuntimeException("wrong state: " + state);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/EmbeddedFrame/DisplayChangedTest/DisplayChangedTest.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,99 @@
+/*
+ * 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
+ * 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 4980592
+ @summary switching user in XP causes an NPE in
+ sun.awt.windows.WWindowPeer.displayChanged
+ @requires (os.family == "windows")
+ @modules java.desktop/java.awt.peer
+ @modules java.desktop/sun.awt.windows
+ @modules java.desktop/sun.awt
+ @author son@sparc.spb.su: area=embedded
+ @run main DisplayChangedTest
+ */
+/**
+ * DisplayChangedTest.java
+ *
+ * summary: switching user in XP causes an NPE in
+ * sun.awt.windows.WWindowPeer.displayChanged
+ */
+import java.awt.Frame;
+import java.awt.Dialog;
+import java.awt.TextArea;
+import java.awt.peer.ComponentPeer;
+import java.awt.peer.FramePeer;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.lang.reflect.Field;
+
+import sun.awt.AWTAccessor;
+
+public class DisplayChangedTest {
+
+ /**
+ * Test fails if it throws any exception.
+ *
+ * @throws Exception
+ */
+ private void init() throws Exception {
+
+ if (!System.getProperty("os.name").startsWith("Windows")) {
+ System.out.println("This is Windows only test.");
+ return;
+ }
+
+ Frame frame = new Frame("AWT Frame");
+ frame.pack();
+
+ FramePeer frame_peer = AWTAccessor.getComponentAccessor()
+ .getPeer(frame);
+ Class comp_peer_class = Class.forName("sun.awt.windows.WComponentPeer");
+ Field hwnd_field = comp_peer_class.getDeclaredField("hwnd");
+ hwnd_field.setAccessible(true);
+ long hwnd = hwnd_field.getLong(frame_peer);
+
+ Class clazz = Class.forName("sun.awt.windows.WEmbeddedFrame");
+ Constructor constructor = clazz
+ .getConstructor(new Class[]{long.class});
+ Frame embedded_frame = (Frame) constructor
+ .newInstance(new Object[]{new Long(hwnd)});
+ frame.setVisible(true);
+
+ ComponentPeer peer = AWTAccessor.getComponentAccessor().getPeer(
+ embedded_frame);
+ Class peerClass = peer.getClass();
+ Method displayChangedM = peerClass.getMethod("displayChanged",
+ new Class[0]);
+ displayChangedM.invoke(peer, null);
+ embedded_frame.dispose();
+ frame.dispose();
+
+ }
+
+ public static void main(String args[]) throws Exception {
+ new DisplayChangedTest().init();
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/EmbeddedFrame/EmbeddedFrameGrabTest/EmbeddedFrameGrabTest.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,126 @@
+/*
+ * 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
+ * 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 6345002
+ @summary grab problems with EmbeddedFrame
+ @requires (os.family == "windows")
+ @modules java.desktop/java.awt.peer
+ @modules java.desktop/sun.awt
+ @modules java.desktop/sun.awt.windows
+ @author Oleg.Semenov@sun.com area=EmbeddedFrame
+ @run main EmbeddedFrameGrabTest
+ */
+/**
+ * EmbeddedFrameGrabTest.java
+ *
+ * summary: grab problems with EmbeddedFrame
+ */
+import java.awt.Frame;
+import java.awt.peer.FramePeer;
+import javax.swing.JComboBox;
+import java.awt.Panel;
+import java.awt.BorderLayout;
+import java.awt.Robot;
+import java.awt.event.InputEvent;
+import java.awt.Rectangle;
+import java.awt.TextArea;
+import java.awt.Dialog;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+
+import sun.awt.AWTAccessor;
+
+public class EmbeddedFrameGrabTest {
+
+ /**
+ * Test fails if it throws any exception.
+ *
+ * @throws Exception
+ */
+ private void init() throws Exception {
+
+ if (!System.getProperty("os.name").startsWith("Windows")) {
+ System.out.println("This is Windows only test.");
+ return;
+ }
+
+ final Frame frame = new Frame("AWT Frame");
+ frame.pack();
+ frame.setSize(200, 200);
+ FramePeer frame_peer = AWTAccessor.getComponentAccessor()
+ .getPeer(frame);
+ Class comp_peer_class
+ = Class.forName("sun.awt.windows.WComponentPeer");
+ Field hwnd_field = comp_peer_class.getDeclaredField("hwnd");
+ hwnd_field.setAccessible(true);
+ long hwnd = hwnd_field.getLong(frame_peer);
+
+ Class clazz = Class.forName("sun.awt.windows.WEmbeddedFrame");
+ Constructor constructor
+ = clazz.getConstructor(new Class[]{long.class});
+ final Frame embedded_frame
+ = (Frame) constructor.newInstance(new Object[]{
+ new Long(hwnd)});;
+ final JComboBox<String> combo = new JComboBox<>(new String[]{
+ "Item 1", "Item 2"
+ });
+ combo.setSelectedIndex(1);
+ final Panel p = new Panel();
+ p.setLayout(new BorderLayout());
+ embedded_frame.add(p, BorderLayout.CENTER);
+ embedded_frame.validate();
+ p.add(combo);
+ p.validate();
+ frame.setVisible(true);
+ Robot robot = new Robot();
+ robot.delay(2000);
+ Rectangle clos = new Rectangle(
+ combo.getLocationOnScreen(), combo.getSize());
+ robot.mouseMove(clos.x + clos.width / 2, clos.y + clos.height / 2);
+ robot.mousePress(InputEvent.BUTTON1_MASK);
+ robot.mouseRelease(InputEvent.BUTTON1_MASK);
+ robot.delay(1000);
+ if (!combo.isPopupVisible()) {
+ throw new RuntimeException("Combobox popup is not visible!");
+ }
+ robot.mouseMove(clos.x + clos.width / 2, clos.y + clos.height + 3);
+ robot.mousePress(InputEvent.BUTTON1_MASK);
+ robot.mouseRelease(InputEvent.BUTTON1_MASK);
+ robot.delay(1000);
+ if (combo.getSelectedIndex() != 0) {
+ throw new RuntimeException("Combobox selection has not changed!");
+ }
+ embedded_frame.remove(p);
+ embedded_frame.dispose();
+ frame.dispose();
+
+ }
+
+ public static void main(String args[]) throws Exception {
+ new EmbeddedFrameGrabTest().init();
+ }
+
+}
--- a/jdk/test/java/awt/Frame/SetMaximizedBounds/SetMaximizedBounds.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/test/java/awt/Frame/SetMaximizedBounds/SetMaximizedBounds.java Mon Sep 21 17:49:57 2015 +0200
@@ -24,6 +24,7 @@
import java.awt.*;
/*
* @test
+ * @bug 8065739 8131339
* @summary When Frame.setExtendedState(Frame.MAXIMIZED_BOTH)
* is called for a Frame after been called setMaximizedBounds() with
* certain value, Frame bounds must equal to this value.
@@ -55,12 +56,14 @@
for (GraphicsDevice gd : ge.getScreenDevices()) {
for (GraphicsConfiguration gc : gd.getConfigurations()) {
- testMaximizedBounds(gc);
+ testMaximizedBounds(gc, false);
+ testMaximizedBounds(gc, true);
}
}
}
- static void testMaximizedBounds(GraphicsConfiguration gc) throws Exception {
+ static void testMaximizedBounds(GraphicsConfiguration gc, boolean undecorated)
+ throws Exception {
Frame frame = null;
try {
@@ -71,6 +74,7 @@
robot.setAutoDelay(50);
frame = new Frame();
+ frame.setUndecorated(undecorated);
Rectangle maximizedBounds = new Rectangle(
maxArea.x + maxArea.width / 6,
maxArea.y + maxArea.height / 6,
--- a/jdk/test/java/awt/Mouse/EnterExitEvents/FullscreenEnterEventTest.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/test/java/awt/Mouse/EnterExitEvents/FullscreenEnterEventTest.java Mon Sep 21 17:49:57 2015 +0200
@@ -37,6 +37,8 @@
* @bug 8013468
* @summary Cursor does not update properly when in fullscreen mode on Mac
* The core reason of the issue was the lack of a mouse entered event in fullscreen
+ * @requires (os.family == "mac")
+ * @modules java.desktop/com.apple.eawt
* @library ../../regtesthelpers
* @build Util
* @modules java.desktop/com.apple.eawt
--- a/jdk/test/java/awt/SplashScreen/FullscreenAfterSplash/FullScreenAfterSplash.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/test/java/awt/SplashScreen/FullscreenAfterSplash/FullScreenAfterSplash.java Mon Sep 21 17:49:57 2015 +0200
@@ -36,6 +36,7 @@
* @test
* @bug 8024185
* @summary Native Mac OS X full screen does not work after showing the splash
+ * @requires (os.family == "mac")
* @library ../
* @library ../../../../lib/testlibrary
* @modules java.desktop/sun.awt
--- a/jdk/test/java/beans/Introspector/4058433/TestBeanProperty.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/test/java/beans/Introspector/4058433/TestBeanProperty.java Mon Sep 21 17:49:57 2015 +0200
@@ -39,7 +39,7 @@
Class<?>[] types =
{B.class, BL.class, BLF.class, E.class, H.class, P.class,
VU.class, D.class, EVD.class, EVE.class, EV.class, EVL.class,
- EVX.class};
+ EVX.class, R.class};
for (Class<?> type : types) {
PropertyDescriptor pd = BeanUtils.getPropertyDescriptor(type, "value");
if (((B.class == type) || (BLF.class == type)) && pd.isBound()) {
@@ -66,6 +66,10 @@
BeanUtils.reportPropertyDescriptor(pd);
throw new Error("required");
}
+ if ((D.class == type) == !"getter".equals(pd.getShortDescription())) {
+ BeanUtils.reportPropertyDescriptor(pd);
+ throw new Error("shortDescription");
+ }
if ((VU.class == type) == !Boolean.TRUE.equals(pd.getValue("visualUpdate"))) {
BeanUtils.reportPropertyDescriptor(pd);
throw new Error("visualUpdate");
--- a/jdk/test/java/lang/ProcessHandle/InfoTest.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/test/java/lang/ProcessHandle/InfoTest.java Mon Sep 21 17:49:57 2015 +0200
@@ -203,8 +203,10 @@
"commandLine() should start with: " + expectedPath +
" but starts with " + commandLineCmdPath);
+ Assert.assertTrue(commandLine.contains(command.get()),
+ "commandLine() must contain the command: " + command.get());
List<String> allArgs = p1.getArgs();
- for (int i = 0; i < allArgs.size(); i++) {
+ for (int i = 1; i < allArgs.size(); i++) {
Assert.assertTrue(commandLine.contains(allArgs.get(i)),
"commandLine() must contain argument: " + allArgs.get(i));
}
@@ -255,10 +257,15 @@
}
}
}
- p1.waitFor(Utils.adjustTimeout(5), TimeUnit.SECONDS);
+ p1.sendAction("exit");
+ Assert.assertTrue(p1.waitFor(Utils.adjustTimeout(30L), TimeUnit.SECONDS),
+ "timeout waiting for process to terminate");
} catch (IOException | InterruptedException ie) {
ie.printStackTrace(System.out);
Assert.fail("unexpected exception", ie);
+ } finally {
+ // Destroy any children that still exist
+ ProcessUtil.destroyProcessTree(ProcessHandle.current());
}
}
@@ -268,8 +275,9 @@
@Test
public static void test3() {
try {
- for (int sleepTime : Arrays.asList(1, 2)) {
+ for (long sleepTime : Arrays.asList(Utils.adjustTimeout(30), Utils.adjustTimeout(32))) {
Process p = spawn("sleep", String.valueOf(sleepTime));
+
ProcessHandle.Info info = p.info();
System.out.printf(" info: %s%n", info);
@@ -295,7 +303,9 @@
Assert.assertEquals(args[0], String.valueOf(sleepTime));
}
}
- Assert.assertTrue(p.waitFor(15, TimeUnit.SECONDS));
+ p.destroy();
+ Assert.assertTrue(p.waitFor(Utils.adjustTimeout(30), TimeUnit.SECONDS),
+ "timeout waiting for process to terminate");
}
} catch (IOException | InterruptedException ex) {
ex.printStackTrace(System.out);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/MulticastSocket/MultiDead.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,114 @@
+/*
+ * 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 8072466
+ * @summary Deadlock when initializing MulticastSocket and DatagramSocket
+ * @library /lib/testlibrary
+ * @build jdk.testlibrary.*
+ * @run main/othervm MultiDead
+ */
+
+import java.net.DatagramSocket;
+import java.net.MulticastSocket;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.CountDownLatch;
+import jdk.testlibrary.JDKToolLauncher;
+
+public class MultiDead {
+ private static final int THREAD_PAIR_COUNT = 4;
+ private static final int CHILDREN_COUNT = 20;
+
+ public static void main(String[] args) throws Throwable {
+ if (args.length == 0 || args[0].equals("parent")) {
+ parentProcess();
+ }
+
+ if (args.length > 0 && args[0].equals("child")) {
+ childProcess();
+ }
+ }
+
+ private static void parentProcess() throws Throwable {
+ JDKToolLauncher launcher = JDKToolLauncher
+ .createUsingTestJDK("java")
+ .addToolArg("MultiDead")
+ .addToolArg("child");
+ ProcessBuilder pb = new ProcessBuilder(launcher.getCommand());
+
+ AtomicReference<Process> child = new AtomicReference<>();
+ AtomicBoolean stopFlag = new AtomicBoolean(false);
+
+ Thread th = new Thread(() -> {
+ for (int i = 0; i < CHILDREN_COUNT; ++i) {
+ System.out.println("child #" + (i + 1) + " of " +
+ CHILDREN_COUNT);
+ try {
+ child.set(pb.start());
+ child.get().waitFor();
+ if (stopFlag.get()) {
+ break;
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ });
+
+ th.start();
+ th.join(CHILDREN_COUNT * 1000); // 1 sec for a child to complete
+ stopFlag.set(true);
+ if (th.isAlive()) {
+ if (child.get() != null) {
+ child.get().destroyForcibly();
+ }
+ throw new RuntimeException("Failed to complete on time.");
+ }
+ }
+
+ private static void childProcess() {
+ CountDownLatch latch = new CountDownLatch(1);
+ for (int i = 0; i < THREAD_PAIR_COUNT; ++i) {
+ new Thread(() -> {
+ try {
+ latch.await();
+ try (MulticastSocket a = new MulticastSocket(6000)) {
+ }
+ } catch (Exception ignore) {
+ }
+ }).start();
+
+ new Thread(() -> {
+ try {
+ latch.await();
+ try (DatagramSocket b = new DatagramSocket(6000)) {
+ }
+ } catch (Exception ignore) {
+ }
+ }).start();
+ }
+ latch.countDown();
+ }
+}
--- a/jdk/test/java/nio/file/Files/StreamLinesTest.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/test/java/nio/file/Files/StreamLinesTest.java Mon Sep 21 17:49:57 2015 +0200
@@ -138,18 +138,25 @@
StandardCharsets.ISO_8859_1,
StandardCharsets.UTF_16);
String[] lines = {"", "A", "AB", "ABC", "ABCD"};
- int[] linesSizes = {1, 2, 3, 4, 16, 256, 1024};
+ int[] linesSizes = {0, 1, 2, 3, 4, 16, 256, 1024};
for (Charset charset : charsets) {
- for (String line : lines) {
- for (int linesSize : linesSizes) {
- for (LineSeparator ls : EnumSet.complementOf(EnumSet.of(LineSeparator.NONE))) {
- String description = String.format("%d lines of \"%s\" with separator %s", linesSize, line, ls);
- l.add(of(description,
- i -> line,
- i -> ls,
- linesSize, charset));
+ for (int linesSize : linesSizes) {
+ if (linesSize > 0) {
+ for (String line : lines) {
+ for (LineSeparator ls : EnumSet.complementOf(EnumSet.of(LineSeparator.NONE))) {
+ String description = String.format("%d lines of \"%s\" with separator %s", linesSize, line, ls);
+ l.add(of(description,
+ i -> line,
+ i -> ls,
+ linesSize, charset));
+ }
}
+ } else {
+ l.add(of("Empty file: 0 lines",
+ i -> "",
+ i -> LineSeparator.NONE,
+ 0, charset));
}
}
}
--- a/jdk/test/java/util/concurrent/locks/ReentrantLock/TimeoutLockLoops.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/test/java/util/concurrent/locks/ReentrantLock/TimeoutLockLoops.java Mon Sep 21 17:49:57 2015 +0200
@@ -35,7 +35,6 @@
* @test
* @bug 4486658 5031862
* @run main TimeoutLockLoops
- * @key intermittent
* @summary Checks for responsiveness of locks to timeouts.
* Runs under the assumption that ITERS computations require more than
* TIMEOUT msecs to complete, which seems to be a safe assumption for
--- a/jdk/test/javax/sound/midi/Gervill/SoftProvider/GetDevice.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/test/javax/sound/midi/Gervill/SoftProvider/GetDevice.java Mon Sep 21 17:49:57 2015 +0200
@@ -27,9 +27,6 @@
*/
import javax.sound.midi.MidiDevice;
-import javax.sound.midi.MidiUnavailableException;
-import javax.sound.midi.Patch;
-import javax.sound.sampled.*;
import javax.sound.midi.MidiDevice.Info;
import com.sun.media.sound.*;
@@ -48,13 +45,6 @@
throw new RuntimeException("assertTrue fails!");
}
-
- private static class FakeInfo extends Info {
- public FakeInfo() {
- super("a", "b", "c", "d");
- }
- }
-
public static void main(String[] args) throws Exception {
SoftProvider provider = new SoftProvider();
Info[] infos = provider.getDeviceInfo();
@@ -64,7 +54,5 @@
MidiDevice d = provider.getDevice(infos[i]);
assertTrue(d instanceof SoftSynthesizer);
}
- assertTrue(provider.getDevice(new FakeInfo()) == null);
-
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sound/midi/MidiDeviceProvider/FakeInfo.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,80 @@
+/*
+ * 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.util.Collection;
+import java.util.HashSet;
+
+import javax.sound.midi.MidiDevice;
+import javax.sound.midi.MidiDevice.Info;
+import javax.sound.midi.MidiSystem;
+import javax.sound.midi.MidiUnavailableException;
+import javax.sound.midi.spi.MidiDeviceProvider;
+
+import static java.util.ServiceLoader.load;
+
+/**
+ * @test
+ * @bug 8059743
+ * @summary MidiDeviceProvider shouldn't returns incorrect results in case of
+ * some unknown MidiDevice.Info
+ * @author Sergey Bylokhov
+ */
+public final class FakeInfo {
+
+ private static final class Fake extends Info {
+
+ Fake() {
+ super("a", "b", "c", "d");
+ }
+ }
+
+ public static void main(final String[] args) {
+ final Info fake = new Fake();
+ // MidiSystem API
+ try {
+ MidiSystem.getMidiDevice(fake);
+ throw new RuntimeException("IllegalArgumentException expected");
+ } catch (final MidiUnavailableException e) {
+ throw new RuntimeException("IllegalArgumentException expected", e);
+ } catch (final IllegalArgumentException ignored) {
+ // expected
+ }
+ // MidiDeviceProvider API
+ final Collection<String> errors = new HashSet<>();
+ for (final MidiDeviceProvider mdp : load(MidiDeviceProvider.class)) {
+ try {
+ if (mdp.isDeviceSupported(fake)) {
+ throw new RuntimeException("fake is supported");
+ }
+ final MidiDevice device = mdp.getDevice(fake);
+ System.err.println("MidiDevice: " + device);
+ throw new RuntimeException("IllegalArgumentException expected");
+ } catch (final IllegalArgumentException e) {
+ errors.add(e.getMessage());
+ }
+ }
+ if (errors.size() != 1) {
+ throw new RuntimeException("Wrong number of messages:" + errors);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JColorChooser/Test8051548.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,228 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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.Color;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Frame;
+import java.awt.Robot;
+import java.awt.event.KeyEvent;
+import java.util.function.Predicate;
+import javax.swing.JColorChooser;
+import javax.swing.JFormattedTextField;
+import javax.swing.JFrame;
+import javax.swing.JTabbedPane;
+import javax.swing.SwingUtilities;
+import javax.swing.colorchooser.AbstractColorChooserPanel;
+
+/*
+ * @test
+ * @bug 8051548
+ * @summary JColorChooser should have a way to disable transparency controls
+ * @author Alexandr Scherbatiy
+ * @run main Test8051548
+ */
+
+public class Test8051548 {
+
+ private static final String[][] TABS = {
+ {"HSV", "0"},
+ {"HSL", "0"},
+ {"RGB", "255"},
+ {"CMYK", "255"}
+ };
+
+ private static JColorChooser colorChooser;
+ private static boolean propertyChangeListenerInvoked;
+ private static volatile Color color;
+
+ public static void main(String[] args) throws Exception {
+ testColorPanels();
+ testShowDialog(true);
+ testShowDialog(false);
+ }
+
+ private static void testColorPanels() throws Exception {
+ SwingUtilities.invokeAndWait(() -> createAndShowGUI());
+
+ Robot robot = new Robot();
+ robot.setAutoDelay(50);
+ robot.waitForIdle();
+
+ for (String[] tabs : TABS) {
+ final String tab = tabs[0];
+ final String initialValue = tabs[1];
+
+ SwingUtilities.invokeAndWait(() -> {
+
+ colorChooser.setColor(new Color(50, 100, 85));
+ JTabbedPane tabbedPane =
+ (JTabbedPane) findComponent(colorChooser, "JTabbedPane");
+ int index = tabbedPane.indexOfTab(tab);
+ tabbedPane.setSelectedIndex(index);
+
+ AbstractColorChooserPanel colorChooserPanel
+ = (AbstractColorChooserPanel) findComponent(
+ tabbedPane.getComponent(index), "ColorChooserPanel");
+
+ propertyChangeListenerInvoked = false;
+ colorChooserPanel.addPropertyChangeListener((e) -> {
+ if (AbstractColorChooserPanel.TRANSPARENCY_ENABLED_PROPERTY.
+ equals(e.getPropertyName())) {
+ propertyChangeListenerInvoked = true;
+ if(!(Boolean)e.getOldValue()){
+ throw new RuntimeException("Old color transparency"
+ + " selection property should be true!");
+ }
+ if((Boolean)e.getNewValue()){
+ throw new RuntimeException("New color transparency"
+ + " selection property should be false!");
+ }
+ }
+ });
+
+ if (!colorChooserPanel.isColorTransparencySelectionEnabled()) {
+ throw new RuntimeException("Color transparency selection"
+ + " should be enabled by default");
+ }
+
+ JFormattedTextField transparencyTextField = (JFormattedTextField)
+ findTextField(colorChooserPanel, initialValue);
+
+ if (!transparencyTextField.isEnabled()) {
+ throw new RuntimeException("Transparency controls are"
+ + " disabled by default!");
+ }
+
+ transparencyTextField.setValue(50);
+
+ if(!colorHasAlpha()){
+ throw new RuntimeException("Transparency selection should"
+ + " be enabled!");
+ }
+
+ colorChooserPanel.setColorTransparencySelectionEnabled(false);
+
+ if (colorChooserPanel.isColorTransparencySelectionEnabled()) {
+ throw new RuntimeException("Color transparency selection"
+ + " should be disabled!");
+ }
+
+ if(!propertyChangeListenerInvoked){
+ throw new RuntimeException("Property change listener is not"
+ + " invoked!");
+ }
+
+ if(colorHasAlpha()){
+ throw new RuntimeException("Transparency selection should"
+ + " be disabled!");
+ }
+ });
+
+ robot.waitForIdle();
+ }
+
+ }
+
+ static void testShowDialog(boolean colorTransparencySelectionEnabled) throws Exception {
+ int alphaValue = 123;
+ Robot robot = new Robot();
+ robot.setAutoDelay(50);
+
+ SwingUtilities.invokeLater(() -> {
+ color = JColorChooser.showDialog(null, "Change Color",
+ new Color(10, 20, 30, alphaValue),
+ colorTransparencySelectionEnabled);
+ });
+
+ SwingUtilities.invokeAndWait(() -> {
+ // wait for dialog is shown
+ });
+
+ robot.waitForIdle();
+
+ robot.keyPress(KeyEvent.VK_ENTER);
+ robot.keyRelease(KeyEvent.VK_ENTER);
+ robot.waitForIdle();
+
+ if (colorTransparencySelectionEnabled) {
+ if (color.getAlpha() != alphaValue) {
+ throw new RuntimeException("Color alpha has not bee reseted!");
+ }
+ } else {
+ if (color.getAlpha() != 255) {
+ throw new RuntimeException("Color alpha has not bee reseted!");
+ }
+ }
+ }
+
+ private static boolean colorHasAlpha(){
+ return colorChooser.getColor().getAlpha() != 255;
+ }
+
+ private static void createAndShowGUI() {
+ JFrame frame = new JFrame();
+ frame.setSize(700, 500);
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ colorChooser = new JColorChooser();
+ frame.getContentPane().add(colorChooser);
+ frame.setVisible(true);
+ }
+
+ private static Component findComponent(Component component, String name) {
+ return findComponent(component,
+ (comp) -> comp.getClass().getName().contains(name));
+ }
+
+ private static Component findTextField(Component component, String value) {
+ return findComponent(component, (comp) -> {
+
+ if (comp instanceof JFormattedTextField) {
+ JFormattedTextField textField = (JFormattedTextField) comp;
+ return value.equals(textField.getText());
+ }
+ return false;
+ });
+ }
+
+ private static Component findComponent(Component component,
+ Predicate<Component> predicate) {
+
+ if (predicate.test(component)) {
+ return component;
+ }
+
+ if (component instanceof Container) {
+ Container container = (Container) component;
+ for (int i = 0; i < container.getComponentCount(); i++) {
+ Component child = findComponent(container.getComponent(i),
+ predicate);
+ if (child != null) {
+ return child;
+ }
+ }
+ }
+
+ return null;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JComponent/4339584/GetUI.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,58 @@
+/*
+ * 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 javax.swing.JComponent;
+import javax.swing.plaf.ComponentUI;
+
+/**
+ * @test
+ * @bug 4339584
+ */
+public final class GetUI {
+
+ public static void main(final String[] args) {
+ CustomJComponent component = new CustomJComponent();
+ ComponentUI ui = new ComponentUI() {
+ };
+ component.setUI(ui);
+ ComponentUI actual = component.getUI();
+ if (actual != ui) {
+ System.err.println("Expected: " + ui);
+ System.err.println("Actual: " + actual);
+ throw new RuntimeException("Test failed");
+ }
+ }
+
+ private static class CustomJComponent extends JComponent {
+
+ @Override
+ public ComponentUI getUI() {
+ return super.getUI();
+ }
+
+ @Override
+ public void setUI(ComponentUI ui) {
+ super.setUI(ui);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JMenu/4213634/bug4213634.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,123 @@
+/*
+ * 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.awt.AWTException;
+import java.awt.Robot;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.lang.reflect.InvocationTargetException;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.JTextArea;
+import javax.swing.SwingUtilities;
+
+/* @test
+ * @bug 4213634 8017187
+ * @author Scott Violet
+ * @library ../../regtesthelpers
+ * @build Util
+ * @run main bug4213634
+ */
+
+
+public class bug4213634 {
+
+ private JMenu menu;
+
+ private JFrame frame;
+
+ public static void main(String[] args) throws Throwable {
+ new bug4213634();
+ }
+
+ bug4213634() throws AWTException, InterruptedException, InvocationTargetException {
+ SwingUtilities.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ createAndShowGUI();
+ }
+ });
+
+ test();
+ }
+
+ public void createAndShowGUI() {
+ frame = new JFrame("TEST");
+ JMenuBar mb = new JMenuBar();
+ menu = mb.add(createMenu("1 - First Menu", true));
+ mb.add(createMenu("2 - Second Menu", false));
+ frame.setJMenuBar(mb);
+ JTextArea ta = new JTextArea("This test dedicated to Nancy and Kathleen, testers and bowlers extraordinaire\n\n\nNo exception means pass.");
+ frame.getContentPane().add("Center", ta);
+ JButton button = new JButton("Test");
+ frame.getContentPane().add("South", button);
+ frame.setBounds(100, 100, 400, 400);
+ frame.setVisible(true);
+ button.requestFocusInWindow();
+ }
+
+ private void test() throws AWTException, InterruptedException, InvocationTargetException {
+ Robot robot = new Robot();
+ robot.setAutoDelay(50);
+ robot.waitForIdle();
+
+ Util.hitMnemonics(robot, KeyEvent.VK_1);
+ robot.waitForIdle();
+
+ SwingUtilities.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ if (!menu.isSelected()) {
+ throw new RuntimeException(
+ "Failed: Menu didn't remain posted at end of test");
+ } else {
+ System.out.println("Test passed!");
+ frame.dispose();
+ }
+ }
+ });
+ }
+ private JMenu createMenu(String str, boolean bFlag) {
+ JMenuItem menuitem;
+ JMenu menu = new JMenu(str);
+ menu.setMnemonic(str.charAt(0));
+
+ for(int i = 0; i < 10; i ++) {
+ menuitem = new JMenuItem("JMenuItem" + i);
+ menuitem.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ throw new RuntimeException(
+ "Failed: Mnemonic activated");
+ }
+ });
+ if(bFlag)
+ menuitem.setMnemonic('0' + i);
+ menu.add(menuitem);
+ }
+ return menu;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/UIDefaults/6302464/bug6302464.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,283 @@
+/*
+ * 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.util.Map;
+import java.util.HashSet;
+import java.awt.Color;
+import java.awt.Toolkit;
+import java.awt.Graphics2D;
+import java.awt.font.FontRenderContext;
+import java.awt.image.BufferedImage;
+import javax.swing.JLabel;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UIDefaults;
+import javax.swing.UIManager.LookAndFeelInfo;
+import javax.swing.plaf.basic.BasicLookAndFeel;
+import static java.awt.RenderingHints.KEY_TEXT_ANTIALIASING;
+import static java.awt.RenderingHints.KEY_TEXT_LCD_CONTRAST;
+import static java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_GASP;
+import static java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HBGR;
+import static java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB;
+import static java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_VBGR;
+import static java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_VRGB;
+import static java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_OFF;
+
+/**
+ * @test
+ * @bug 6302464
+ * @author Alexandr Scherbatiy
+ * @summary Allow programmatic enabling of subpixel anti-aliasing in Swing
+ */
+public class bug6302464 {
+
+ public static void main(String[] args) throws Exception {
+ SwingUtilities.invokeAndWait(bug6302464::testAntialiasingProperties);
+ }
+
+ private static void testAntialiasingProperties() {
+ testCustomLAF();
+ testFontRenderingContext();
+ testAntialiasingHints();
+ testLAFAAHints();
+ }
+
+ private static void testCustomLAF() {
+ try {
+ testCustomLAF(false);
+ testCustomLAF(true);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static void testCustomLAF(boolean useAAHints) throws Exception {
+ CustomLookAndFeel customLAF = new CustomLookAndFeel(useAAHints);
+ UIManager.setLookAndFeel(customLAF);
+
+ JLabel label = new JLabel();
+ Object aaHint = label.getClientProperty(KEY_TEXT_ANTIALIASING);
+ Object lcdContrastHint = label.getClientProperty(KEY_TEXT_LCD_CONTRAST);
+
+ if (aaHint != customLAF.getAAHint()) {
+ throw new RuntimeException("AA hint from custom L&F is not set");
+ }
+
+ if (lcdContrastHint != customLAF.getLCDContarstHint()) {
+ throw new RuntimeException("AA hint from custom L&F is not set");
+ }
+ }
+
+ private static final Object[] ANTIALIASING_HINTS = {
+ VALUE_TEXT_ANTIALIAS_GASP,
+ VALUE_TEXT_ANTIALIAS_LCD_HRGB,
+ VALUE_TEXT_ANTIALIAS_LCD_HBGR,
+ VALUE_TEXT_ANTIALIAS_LCD_VRGB,
+ VALUE_TEXT_ANTIALIAS_LCD_VBGR
+ };
+
+ private static void testFontRenderingContext() {
+ for (Object aaHint : ANTIALIASING_HINTS) {
+ testFontRenderingContext(aaHint);
+ }
+ }
+
+ private static void testFontRenderingContext(Object aaHint) {
+
+ JLabel label = new JLabel("Test");
+ label.putClientProperty(KEY_TEXT_ANTIALIASING, aaHint);
+ FontRenderContext frc = label.getFontMetrics(
+ label.getFont()).getFontRenderContext();
+
+ if (!aaHint.equals(frc.getAntiAliasingHint())) {
+ throw new RuntimeException("Wrong aa hint in FontRenderContext");
+ }
+ }
+
+ private static void testAntialiasingHints() {
+ setMetalLookAndFeel();
+
+ HashSet colorsAAOff = getAntialiasedColors(VALUE_TEXT_ANTIALIAS_OFF, 100);
+
+ if (colorsAAOff.size() > 2) {
+ throw new RuntimeException("Wrong number of antialiased colors.");
+ }
+
+ HashSet colorsAAOnLCD100 = getAntialiasedColors(
+ VALUE_TEXT_ANTIALIAS_LCD_HRGB, 100);
+
+ if (colorsAAOnLCD100.size() <= 2) {
+ throw new RuntimeException("Wrong number of antialiased colors.");
+ }
+
+ HashSet colorsAAOnLCD250 = getAntialiasedColors(
+ VALUE_TEXT_ANTIALIAS_LCD_HRGB, 250);
+
+ if (colorsAAOnLCD250.size() <= 2) {
+ throw new RuntimeException("Wrong number of antialiased colors.");
+ }
+
+ if (colorsAAOnLCD100.equals(colorsAAOnLCD250)) {
+ throw new RuntimeException("LCD contarst is not used.");
+ }
+ }
+
+ private static HashSet getAntialiasedColors(Object aaHint, int lcdContrast) {
+
+ JLabel label = new JLabel("ABCD");
+ label.setSize(label.getPreferredSize());
+ label.putClientProperty(KEY_TEXT_ANTIALIASING, aaHint);
+ label.putClientProperty(KEY_TEXT_LCD_CONTRAST, lcdContrast);
+
+ int w = label.getWidth();
+ int h = label.getHeight();
+
+ BufferedImage buffImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
+ Graphics2D g = buffImage.createGraphics();
+ g.setColor(Color.WHITE);
+ g.fillRect(0, 0, w, h);
+ label.paint(g);
+ g.dispose();
+
+ HashSet<Color> colors = new HashSet<>();
+
+ for (int i = 0; i < w; i++) {
+ for (int j = 0; j < h; j++) {
+ Color color = new Color(buffImage.getRGB(i, j));
+ colors.add(color);
+ }
+ }
+
+ return colors;
+ }
+
+ private static void setMetalLookAndFeel() {
+ setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
+ }
+
+ private static void setLookAndFeel(String lafClass) {
+ try {
+ UIManager.setLookAndFeel(lafClass);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static void testLAFAAHints() {
+
+ for (LookAndFeelInfo lafInfo : UIManager.getInstalledLookAndFeels()) {
+ testLAFAAHints(lafInfo);
+ }
+ }
+
+ private static final String[] EXCLUDED_LAFS = {"CDE/Motif"};
+
+ private static boolean isExcludedLAF(LookAndFeelInfo lafInfo) {
+ for (String excludedLaf : EXCLUDED_LAFS) {
+ if (lafInfo.getName().equals(excludedLaf)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static void testLAFAAHints(LookAndFeelInfo lafInfo) {
+ setLookAndFeel(lafInfo.getClassName());
+
+ Object uiAAHint = UIManager.getDefaults().get(KEY_TEXT_ANTIALIASING);
+ Object uiLCDContrastHint = UIManager.getDefaults().get(
+ KEY_TEXT_LCD_CONTRAST);
+
+ Object aaHints = Toolkit.getDefaultToolkit().
+ getDesktopProperty("awt.font.desktophints");
+
+ if (isExcludedLAF(lafInfo)) {
+ if (uiAAHint != null || uiLCDContrastHint != null) {
+ throw new RuntimeException("Rendering hints set for excluded L&F");
+ }
+ } else if (aaHints instanceof Map) {
+ Map map = (Map) aaHints;
+
+ if (uiAAHint != map.get(KEY_TEXT_ANTIALIASING)) {
+ throw new RuntimeException("UI defaults contains wrong aa hint");
+ }
+
+ if (uiLCDContrastHint != map.get(KEY_TEXT_LCD_CONTRAST)) {
+ throw new RuntimeException("UI defaults contains wrong"
+ + "lcd contrast hint");
+ }
+ } else if (uiAAHint != null || uiLCDContrastHint != null) {
+ throw new RuntimeException("Rendering hints set for empty desktop"
+ + "properties");
+ }
+ }
+
+ private static class CustomLookAndFeel extends BasicLookAndFeel {
+
+ private final boolean useAAHints;
+
+ public CustomLookAndFeel(boolean useAAHints) {
+ this.useAAHints = useAAHints;
+ }
+
+ @Override
+ public String getDescription() {
+ return getName();
+ }
+
+ @Override
+ public String getName() {
+ return "Custom L&F";
+ }
+
+ @Override
+ public String getID() {
+ return getName();
+ }
+
+ @Override
+ public boolean isNativeLookAndFeel() {
+ return false;
+ }
+
+ @Override
+ public boolean isSupportedLookAndFeel() {
+ return true;
+ }
+
+ @Override
+ protected void initClassDefaults(UIDefaults table) {
+ super.initClassDefaults(table);
+ table.put(KEY_TEXT_ANTIALIASING, getAAHint());
+ table.put(KEY_TEXT_LCD_CONTRAST, getLCDContarstHint());
+ }
+
+ private Object getAAHint() {
+ return useAAHints ? VALUE_TEXT_ANTIALIAS_GASP : null;
+ }
+
+ private Object getLCDContarstHint() {
+ return useAAHints ? 115 : null;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/UIDefaults/8133926/InternalFrameIcon.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,61 @@
+/*
+ * 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 javax.swing.Icon;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
+
+import static javax.swing.UIManager.getInstalledLookAndFeels;
+
+/**
+ * @test
+ * @bug 8133926
+ */
+public final class InternalFrameIcon implements Runnable {
+
+ public static void main(final String[] args) throws Exception {
+ for (final UIManager.LookAndFeelInfo laf : getInstalledLookAndFeels()) {
+ SwingUtilities.invokeAndWait(() -> setLookAndFeel(laf));
+ SwingUtilities.invokeAndWait(new InternalFrameIcon());
+ }
+ }
+
+ private static void setLookAndFeel(final UIManager.LookAndFeelInfo laf) {
+ try {
+ UIManager.setLookAndFeel(laf.getClassName());
+ System.out.println("LookAndFeel: " + laf.getClassName());
+ } catch (ClassNotFoundException | InstantiationException |
+ UnsupportedLookAndFeelException | IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void run() {
+ Object o = UIManager.getDefaults().get("InternalFrame.icon");
+ if (o != null && !(o instanceof Icon)) {
+ throw new RuntimeException("Wrong object: " + o);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/text/Utilities/8134721/bug8134721.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,58 @@
+/*
+ * 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.awt.Graphics;
+import java.awt.image.BufferedImage;
+import javax.swing.SwingUtilities;
+import javax.swing.text.Segment;
+import javax.swing.text.Utilities;
+
+/**
+ * @test
+ * @bug 8134721
+ * @author Alexandr Scherbatiy
+ * @summary NPE in SwingUtilities2.drawChars after JDK-6302464
+ */
+public class bug8134721 {
+
+ public static void main(String[] args) throws Exception {
+ SwingUtilities.invokeAndWait(bug8134721::testNPE);
+ }
+
+ private static void testNPE() {
+
+ Graphics g = null;
+ try {
+ String test = "\ttest\ttest2";
+ BufferedImage buffImage = new BufferedImage(
+ 100, 100, BufferedImage.TYPE_INT_RGB);
+ g = buffImage.createGraphics();
+ Segment segment = new Segment(test.toCharArray(), 0, test.length());
+ Utilities.drawTabbedText(segment, 0, 0, g, null, 0);
+ } finally {
+ if (g != null) {
+ g.dispose();
+ }
+ }
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/java2d/SunGraphics2D/SurfaceDestination/SurfaceDestination.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,84 @@
+/*
+ * 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.awt.Component;
+import java.awt.Frame;
+import java.awt.Graphics;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+import java.awt.Image;
+import java.awt.Window;
+import java.awt.image.BufferedImage;
+
+import sun.java2d.SunGraphics2D;
+
+import static java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment;
+import static java.awt.Transparency.BITMASK;
+import static java.awt.Transparency.OPAQUE;
+import static java.awt.Transparency.TRANSLUCENT;
+import static java.awt.image.BufferedImage.TYPE_INT_ARGB;
+
+/**
+ * @test
+ * @bug 8134603
+ * @modules java.desktop/sun.java2d
+ * @run main/othervm SurfaceDestination
+ */
+public final class SurfaceDestination {
+
+ public static void main(final String[] args) {
+ final GraphicsEnvironment lge = getLocalGraphicsEnvironment();
+ final GraphicsDevice dev = lge.getDefaultScreenDevice();
+ final GraphicsConfiguration config = dev.getDefaultConfiguration();
+
+ test(config.createCompatibleImage(10, 10).getGraphics());
+ test(config.createCompatibleImage(10, 10, OPAQUE).getGraphics());
+ test(config.createCompatibleImage(10, 10, BITMASK).getGraphics());
+ test(config.createCompatibleImage(10, 10, TRANSLUCENT).getGraphics());
+
+ test(new BufferedImage(10, 10, TYPE_INT_ARGB).getGraphics());
+
+ final Window frame = new Frame();
+ frame.pack();
+ try {
+ test(frame.getGraphics());
+ test(frame.createImage(10, 10).getGraphics());
+ } finally {
+ frame.dispose();
+ }
+ }
+
+ private static void test(final Graphics graphics) {
+ try {
+ if (graphics instanceof SunGraphics2D) {
+ final Object dst = ((SunGraphics2D) graphics).getDestination();
+ if (!(dst instanceof Image) && !(dst instanceof Component)) {
+ throw new RuntimeException("Wrong type:" + dst);
+ }
+ }
+ } finally {
+ graphics.dispose();
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/krb5/auto/KrbTicket.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,146 @@
+/*
+ * 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.nio.file.Files;
+import java.nio.file.Paths;
+import java.time.Instant;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import javax.security.auth.RefreshFailedException;
+import javax.security.auth.Subject;
+import javax.security.auth.kerberos.KerberosTicket;
+import javax.security.auth.login.LoginContext;
+
+/*
+ * @test
+ * @bug 6857795 8075299
+ * @summary Checks Kerberos ticket properties
+ * @run main/othervm KrbTicket
+ */
+public class KrbTicket {
+
+ private static final String REALM = "TEST.REALM";
+ private static final String HOST = "localhost";
+ private static final String USER = "TESTER";
+ private static final String USER_PRINCIPAL = USER + "@" + REALM;
+ private static final String PASSWORD = "password";
+ private static final String KRBTGT_PRINCIPAL = "krbtgt/" + REALM;
+ private static final String KRB5_CONF_FILENAME = "krb5.conf";
+ private static final String JAAS_CONF = "jaas.conf";
+ private static final long TICKET_LIFTETIME = 5 * 60 * 1000; // 5 mins
+
+ public static void main(String[] args) throws Exception {
+ // define principals
+ Map<String, String> principals = new HashMap<>();
+ principals.put(USER_PRINCIPAL, PASSWORD);
+ principals.put(KRBTGT_PRINCIPAL, null);
+
+ System.setProperty("java.security.krb5.conf", KRB5_CONF_FILENAME);
+
+ // start a local KDC instance
+ KDC kdc = KDC.startKDC(HOST, null, REALM, principals, null, null);
+ KDC.saveConfig(KRB5_CONF_FILENAME, kdc,
+ "forwardable = true", "proxiable = true");
+
+ // create JAAS config
+ Files.write(Paths.get(JAAS_CONF), Arrays.asList(
+ "Client {",
+ " com.sun.security.auth.module.Krb5LoginModule required;",
+ "};"
+ ));
+ System.setProperty("java.security.auth.login.config", JAAS_CONF);
+ System.setProperty("javax.security.auth.useSubjectCredsOnly", "false");
+
+ long startTime = Instant.now().getEpochSecond() * 1000;
+
+ LoginContext lc = new LoginContext("Client",
+ new Helper.UserPasswordHandler(USER, PASSWORD));
+ lc.login();
+
+ Subject subject = lc.getSubject();
+ System.out.println("subject: " + subject);
+
+ Set creds = subject.getPrivateCredentials(
+ KerberosTicket.class);
+
+ if (creds.size() > 1) {
+ throw new RuntimeException("Multiple credintials found");
+ }
+
+ Object o = creds.iterator().next();
+ if (!(o instanceof KerberosTicket)) {
+ throw new RuntimeException("Instance of KerberosTicket expected");
+ }
+ KerberosTicket krbTkt = (KerberosTicket) o;
+
+ System.out.println("forwardable = " + krbTkt.isForwardable());
+ System.out.println("proxiable = " + krbTkt.isProxiable());
+ System.out.println("renewable = " + krbTkt.isRenewable());
+ System.out.println("current = " + krbTkt.isCurrent());
+
+ if (!krbTkt.isForwardable()) {
+ throw new RuntimeException("Forwardable ticket expected");
+ }
+
+ if (!krbTkt.isProxiable()) {
+ throw new RuntimeException("Proxiable ticket expected");
+ }
+
+ if (!krbTkt.isCurrent()) {
+ throw new RuntimeException("Ticket is not current");
+ }
+
+ if (krbTkt.isRenewable()) {
+ throw new RuntimeException("Not renewable ticket expected");
+ }
+ try {
+ krbTkt.refresh();
+ throw new RuntimeException(
+ "Expected RefreshFailedException not thrown");
+ } catch(RefreshFailedException e) {
+ System.out.println("Expected exception: " + e);
+ }
+
+ if (!checkTime(krbTkt, startTime)) {
+ throw new RuntimeException("Wrong ticket life time");
+ }
+
+ krbTkt.destroy();
+ if (!krbTkt.isDestroyed()) {
+ throw new RuntimeException("Ticket not destroyed");
+ }
+
+ System.out.println("Test passed");
+ }
+
+ private static boolean checkTime(KerberosTicket krbTkt, long startTime) {
+ long ticketEndTime = krbTkt.getEndTime().getTime();
+ long roughLifeTime = ticketEndTime - startTime;
+ System.out.println("start time = " + startTime);
+ System.out.println("end time = " + ticketEndTime);
+ System.out.println("rough life time = " + roughLifeTime);
+ return roughLifeTime >= TICKET_LIFTETIME;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/krb5/auto/tools/KinitConfPlusProps.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,188 @@
+/*
+ * 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.File;
+import java.net.PortUnreachableException;
+import java.util.HashMap;
+import java.util.Map;
+import jdk.testlibrary.ProcessTools;
+import jdk.testlibrary.OutputAnalyzer;
+
+/*
+ * @test
+ * @bug 6857795 8075299
+ * @summary Checks if kinit uses both krb5 conf file and system properties
+ * @requires os.family == "windows"
+ * @library /lib/testlibrary
+ * @library /sun/security/krb5/auto
+ * @run main/othervm KinitConfPlusProps
+ */
+public class KinitConfPlusProps {
+
+ private static final String KINIT = System.getProperty("java.home")
+ + File.separator + "bin" + File.separator + "kinit";
+ private static final String KLIST = System.getProperty("java.home")
+ + File.separator + "bin" + File.separator + "klist";
+ private static final String REALM = "REALM";
+ private static final String ANOTHER_REALM = "ANOTHER.REALM";
+ private static final String HOST = "localhost";
+ private static final String CC_FILENAME = "krb5cc_test";
+ private static final String USER = "TESTER";
+ private static final String USER_PRINCIPAL = USER + "@" + REALM;
+ private static final String KRBTGT_PRINCIPAL = "krbtgt/" + REALM;
+ private static final String KEYTAB_FILE = "test.keytab";
+ private static final String KRB5_CONF_FILENAME = "krb5.conf";
+
+ public static void main(String[] args) throws Exception {
+ // define principals
+ Map<String, String> principals = new HashMap<>();
+ principals.put(USER_PRINCIPAL, null);
+ principals.put(KRBTGT_PRINCIPAL, null);
+
+ System.setProperty("java.security.krb5.conf", KRB5_CONF_FILENAME);
+
+ // start a local KDC instance
+ KDC kdc = KDC.startKDC(HOST, null, REALM, principals, KEYTAB_FILE,
+ KDC.KtabMode.APPEND);
+ KDC.saveConfig(KRB5_CONF_FILENAME, kdc,
+ "forwardable = true", "proxiable = true");
+
+ boolean success = true;
+
+ /*
+ * kinit should fail since java.security.krb5.kdc
+ * and java.security.krb5.realm properties override correct values
+ * in krb5 conf file
+ */
+ String[] command = {KINIT, "-k",
+ "-J-Djava.security.krb5.realm=" + REALM,
+ "-J-Djava.security.krb5.kdc=" + HOST, // without port
+ "-J-Djava.security.krb5.conf=" + KRB5_CONF_FILENAME,
+ "-t", KEYTAB_FILE,
+ "-c", CC_FILENAME,
+ USER
+ };
+
+ try {
+ OutputAnalyzer out = ProcessTools.executeCommand(command);
+ out.shouldHaveExitValue(-1);
+ out.shouldContain(PortUnreachableException.class.getName());
+ } catch(Throwable e) {
+ System.out.println("Unexpected exception: " + e);
+ e.printStackTrace(System.out);
+ success = false;
+ }
+
+ /*
+ * kinit should succeed
+ * since realm should be picked up from principal name
+ */
+ command = new String[] {KINIT, "-k",
+ "-J-Djava.security.krb5.realm=" + ANOTHER_REALM,
+ "-J-Djava.security.krb5.kdc=" + HOST,
+ "-J-Djava.security.krb5.conf=" + KRB5_CONF_FILENAME,
+ "-t", KEYTAB_FILE,
+ "-c", CC_FILENAME,
+ USER_PRINCIPAL
+ };
+
+ try {
+ OutputAnalyzer out = ProcessTools.executeCommand(command);
+ out.shouldHaveExitValue(0);
+ out.shouldContain(CC_FILENAME);
+ } catch(Throwable e) {
+ System.out.println("Unexpected exception: " + e);
+ e.printStackTrace(System.out);
+ success = false;
+ }
+
+ success &= checkTicketFlags();
+
+ /*
+ * kinit should succeed
+ * since realm should be picked up from principal name,
+ * and other data should come from krb5 conf file
+ */
+ command = new String[] {KINIT, "-k",
+ "-J-Djava.security.krb5.conf=" + KRB5_CONF_FILENAME,
+ "-t", KEYTAB_FILE,
+ "-c", CC_FILENAME,
+ USER_PRINCIPAL
+ };
+
+ try {
+ OutputAnalyzer out = ProcessTools.executeCommand(command);
+ out.shouldHaveExitValue(0);
+ out.shouldContain(CC_FILENAME);
+ } catch(Throwable e) {
+ System.out.println("Unexpected exception: " + e);
+ e.printStackTrace(System.out);
+ success = false;
+ }
+
+ success &= checkTicketFlags();
+
+ // kinit should succeed even if a principal name doesn't have realm
+ command = new String[] {KINIT, "-k",
+ "-J-Djava.security.krb5.conf=" + KRB5_CONF_FILENAME,
+ "-t", KEYTAB_FILE,
+ "-c", CC_FILENAME,
+ USER
+ };
+
+ try {
+ OutputAnalyzer out = ProcessTools.executeCommand(command);
+ out.shouldHaveExitValue(0);
+ out.shouldContain(CC_FILENAME);
+ } catch(Throwable e) {
+ System.out.println("Unexpected exception: " + e);
+ e.printStackTrace(System.out);
+ success = false;
+ }
+
+ success &= checkTicketFlags();
+
+ if (!success) {
+ throw new RuntimeException("At least one test case failed");
+ }
+ System.out.println("Test passed");
+ }
+
+ // check if a ticket has forwardable and proxiable flags
+ private static boolean checkTicketFlags() {
+ String[] command = new String[] {KLIST, "-f", "-c", CC_FILENAME};
+
+ try {
+ OutputAnalyzer out = ProcessTools.executeCommand(command);
+ out.shouldHaveExitValue(0);
+ out.shouldContain("FORWARDABLE");
+ out.shouldContain("PROXIABLE");
+ } catch(Throwable e) {
+ System.out.println("Unexpected exception: " + e);
+ e.printStackTrace(System.out);
+ return false;
+ }
+
+ return true;
+ }
+}
--- a/jdk/test/sun/security/provider/certpath/Extensions/OCSPNonceExtensionTests.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/test/sun/security/provider/certpath/Extensions/OCSPNonceExtensionTests.java Mon Sep 21 17:49:57 2015 +0200
@@ -79,14 +79,11 @@
Map<String, TestCase> testList =
new LinkedHashMap<String, TestCase>() {{
put("CTOR Test (provide length)", testCtorByLength);
+ put("CTOR Test (provide nonce bytes)", testCtorByValue);
+ put("CTOR Test (set criticality forms)", testCtorCritForms);
put("CTOR Test (provide extension DER encoding)",
testCtorSuperByDerValue);
- put("Use set() call to provide random data", testResetValue);
- put("Test get() method", testGet);
- put("test set() method", testSet);
- put("Test getElements() method", testGetElements);
put("Test getName() method", testGetName);
- put("Test delete() method", testDelete);
}};
System.out.println("============ Tests ============");
@@ -179,6 +176,20 @@
Boolean pass = Boolean.FALSE;
String message = null;
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
+ // Try sending in a negative length
+ try {
+ Extension negLenNonce = new OCSPNonceExtension(-8);
+ throw new RuntimeException(
+ "Accepted a negative length nonce");
+ } catch (IllegalArgumentException iae) { }
+
+ // How about a zero length?
+ try {
+ Extension zeroLenNonce = new OCSPNonceExtension(0);
+ throw new RuntimeException("Accepted a zero length nonce");
+ } catch (IllegalArgumentException iae) { }
+
+ // Valid input to constructor
Extension nonceByLen = new OCSPNonceExtension(32);
// Verify overall encoded extension structure
@@ -216,6 +227,82 @@
}
};
+ public static final TestCase testCtorByValue = new TestCase() {
+ @Override
+ public Map.Entry<Boolean, String> runTest() {
+ Boolean pass = Boolean.FALSE;
+ String message = null;
+ try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
+
+ // Try giving a null value for the nonce
+ try {
+ Extension nullNonce = new OCSPNonceExtension(null);
+ throw new RuntimeException("Accepted a null nonce");
+ } catch (NullPointerException npe) { }
+
+ // How about a zero-length byte array?
+ try {
+ Extension zeroLenNonce =
+ new OCSPNonceExtension(new byte[0]);
+ throw new RuntimeException("Accepted a zero length nonce");
+ } catch (IllegalArgumentException iae) { }
+
+ OCSPNonceExtension nonceByValue =
+ new OCSPNonceExtension(DEADBEEF_16);
+
+ // Verify overall encoded extension structure
+ nonceByValue.encode(baos);
+ verifyExtStructure(baos.toByteArray());
+
+ // Verify the name, elements, and data conform to
+ // expected values for this specific object.
+ boolean crit = nonceByValue.isCritical();
+ String oid = nonceByValue.getId();
+ byte[] nonceData = nonceByValue.getNonceValue();
+
+ if (crit) {
+ message = "Extension incorrectly marked critical";
+ } else if (!oid.equals(OCSP_NONCE_OID)) {
+ message = "Incorrect OID (Got " + oid + ", Expected " +
+ OCSP_NONCE_OID + ")";
+ } else if (!Arrays.equals(nonceData, DEADBEEF_16)) {
+ message = "Returned nonce value did not match input";
+ } else {
+ pass = Boolean.TRUE;
+ }
+ } catch (Exception e) {
+ e.printStackTrace(System.out);
+ message = e.getClass().getName();
+ }
+
+ return new AbstractMap.SimpleEntry<>(pass, message);
+ }
+ };
+
+ public static final TestCase testCtorCritForms = new TestCase() {
+ @Override
+ public Map.Entry<Boolean, String> runTest() {
+ Boolean pass = Boolean.FALSE;
+ String message = null;
+ try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
+ Extension nonceByLength = new OCSPNonceExtension(true, 32);
+ Extension nonceByValue =
+ new OCSPNonceExtension(true, DEADBEEF_16);
+ pass = nonceByLength.isCritical() && nonceByValue.isCritical();
+ if (!pass) {
+ message = "nonceByLength or nonceByValue was not marked " +
+ "critical as expected";
+ }
+ } catch (Exception e) {
+ e.printStackTrace(System.out);
+ message = e.getClass().getName();
+ }
+
+ return new AbstractMap.SimpleEntry<>(pass, message);
+ }
+ };
+
+
public static final TestCase testCtorSuperByDerValue = new TestCase() {
@Override
public Map.Entry<Boolean, String> runTest() {
@@ -260,145 +347,6 @@
}
};
- public static final TestCase testResetValue = new TestCase() {
- @Override
- public Map.Entry<Boolean, String> runTest() {
- Boolean pass = Boolean.FALSE;
- String message = null;
- try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
- OCSPNonceExtension nonce = new OCSPNonceExtension(32);
-
- // Reset the nonce data to reflect 16 bytes of DEADBEEF
- nonce.set(OCSPNonceExtension.NONCE, (Object)DEADBEEF_16);
-
- // Verify overall encoded extension content
- nonce.encode(baos);
- dumpHexBytes(OCSP_NONCE_DB16);
- System.out.println();
- dumpHexBytes(baos.toByteArray());
-
- pass = Arrays.equals(baos.toByteArray(), OCSP_NONCE_DB16);
- } catch (Exception e) {
- e.printStackTrace(System.out);
- message = e.getClass().getName();
- }
-
- return new AbstractMap.SimpleEntry<>(pass, message);
- }
- };
-
- public static final TestCase testSet = new TestCase() {
- @Override
- public Map.Entry<Boolean, String> runTest() {
- Boolean pass = Boolean.FALSE;
- String message = null;
- try {
- OCSPNonceExtension nonceByLen = new OCSPNonceExtension(32);
-
- // Set the nonce data to 16 bytes of DEADBEEF
- nonceByLen.set(ELEMENT_NONCE, DEADBEEF_16);
- byte[] nonceData = (byte[])nonceByLen.get(ELEMENT_NONCE);
- if (!Arrays.equals(nonceData, DEADBEEF_16)) {
- throw new RuntimeException("Retuned nonce data does not " +
- "match expected result");
- }
-
- // Now try to set a value using an object that is not a byte
- // array
- int[] INT_DB_16 = {
- 0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF
- };
- try {
- nonceByLen.set(ELEMENT_NONCE, INT_DB_16);
- throw new RuntimeException("Accepted get() for " +
- "unsupported element name");
- } catch (IOException ioe) { } // Expected result
-
- // And try setting a value using an unknown element name
- try {
- nonceByLen.set("FOO", DEADBEEF_16);
- throw new RuntimeException("Accepted get() for " +
- "unsupported element name");
- } catch (IOException ioe) { } // Expected result
-
- pass = Boolean.TRUE;
- } catch (Exception e) {
- e.printStackTrace(System.out);
- message = e.getClass().getName();
- }
-
- return new AbstractMap.SimpleEntry<>(pass, message);
- }
- };
-
- public static final TestCase testGet = new TestCase() {
- @Override
- public Map.Entry<Boolean, String> runTest() {
- Boolean pass = Boolean.FALSE;
- String message = null;
- try {
- OCSPNonceExtension nonceByLen = new OCSPNonceExtension(32);
-
- // Grab the nonce data by its correct element name
- byte[] nonceData = (byte[])nonceByLen.get(ELEMENT_NONCE);
- if (nonceData == null || nonceData.length != 32) {
- throw new RuntimeException("Unexpected return value from " +
- "get() method: either null or incorrect length");
- }
-
- // Now try to get any kind of data using an element name that
- // doesn't exist for this extension.
- try {
- nonceByLen.get("FOO");
- throw new RuntimeException("Accepted get() for " +
- "unsupported element name");
- } catch (IOException ioe) { } // Expected result
-
- pass = Boolean.TRUE;
- } catch (Exception e) {
- e.printStackTrace(System.out);
- message = e.getClass().getName();
- }
-
- return new AbstractMap.SimpleEntry<>(pass, message);
- }
- };
-
- public static final TestCase testGetElements = new TestCase() {
- @Override
- public Map.Entry<Boolean, String> runTest() {
- Boolean pass = Boolean.FALSE;
- String message = null;
- try {
- OCSPNonceExtension nonceByLen = new OCSPNonceExtension(32);
-
- int elementCount = 0;
- boolean foundElement = false;
-
- // There should be exactly one element and its name should
- // be "nonce"
- for (Enumeration<String> elements = nonceByLen.getElements();
- elements.hasMoreElements(); elementCount++) {
- if (elements.nextElement().equals(ELEMENT_NONCE)) {
- foundElement = true;
- }
- }
-
- if (!foundElement || elementCount != 1) {
- throw new RuntimeException("Unexpected or missing " +
- "Enumeration element");
- }
-
- pass = Boolean.TRUE;
- } catch (Exception e) {
- e.printStackTrace(System.out);
- message = e.getClass().getName();
- }
-
- return new AbstractMap.SimpleEntry<>(pass, message);
- }
- };
-
public static final TestCase testGetName = new TestCase() {
@Override
public Map.Entry<Boolean, String> runTest() {
@@ -415,44 +363,4 @@
return new AbstractMap.SimpleEntry<>(pass, message);
}
};
-
- public static final TestCase testDelete = new TestCase() {
- @Override
- public Map.Entry<Boolean, String> runTest() {
- Boolean pass = Boolean.FALSE;
- String message = null;
- try {
- OCSPNonceExtension nonceByLen = new OCSPNonceExtension(32);
-
- // First verify that there's data to begin with
- byte[] nonceData = (byte[])nonceByLen.get(ELEMENT_NONCE);
- if (nonceData == null || nonceData.length != 32) {
- throw new RuntimeException("Unexpected return value from " +
- "get() method: either null or incorrect length");
- }
-
- // Attempt to delete using an element name that doesn't exist
- // for this extension.
- try {
- nonceByLen.delete("FOO");
- throw new RuntimeException("Accepted delete() for " +
- "unsupported element name");
- } catch (IOException ioe) { } // Expected result
-
- // Now attempt to properly delete the extension data
- nonceByLen.delete(ELEMENT_NONCE);
- nonceData = (byte[])nonceByLen.get(ELEMENT_NONCE);
- if (nonceData != null) {
- throw new RuntimeException("Unexpected non-null return");
- }
-
- pass = Boolean.TRUE;
- } catch (Exception e) {
- e.printStackTrace(System.out);
- message = e.getClass().getName();
- }
-
- return new AbstractMap.SimpleEntry<>(pass, message);
- }
- };
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/rsa/KeySizeTest.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,130 @@
+/*
+ * 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.security.KeyFactory;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.interfaces.RSAKey;
+import java.security.interfaces.RSAPrivateKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.RSAPrivateKeySpec;
+import java.security.spec.RSAPublicKeySpec;
+
+/**
+ * @test
+ * @bug 8044199
+ * @summary test if the private and public key size are the same as what is set
+ * through KeyPairGenerator.
+ * @run main KeySizeTest 512 10
+ * @run main KeySizeTest 768 10
+ * @run main KeySizeTest 1024 10
+ * @run main KeySizeTest 2048 5
+ * @run main KeySizeTest 4096 1
+ */
+public class KeySizeTest {
+
+ /**
+ * ALGORITHM name, fixed as RSA.
+ */
+ private static final String KEYALG = "RSA";
+
+ /**
+ * JDK default RSA Provider.
+ */
+ private static final String PROVIDER_NAME = "SunRsaSign";
+
+ public static void main(String[] args) throws Exception {
+ int iKeyPairSize = Integer.parseInt(args[0]);
+ int maxLoopCnt = Integer.parseInt(args[1]);
+
+ int failCount = 0;
+ KeyPairGenerator keyPairGen
+ = KeyPairGenerator.getInstance(KEYALG, PROVIDER_NAME);
+ keyPairGen.initialize(iKeyPairSize);
+ // Generate RSA keypair
+ KeyPair keyPair = keyPairGen.generateKeyPair();
+
+ // Get priavte and public keys
+ PrivateKey privateKey = keyPair.getPrivate();
+ PublicKey publicKey = keyPair.getPublic();
+ try {
+ if (!sizeTest(keyPair)) {
+ failCount++;
+ }
+ } catch (Exception ex) {
+ ex.printStackTrace(System.err);
+ failCount++;
+ }
+
+ for (int iCnt = 0; iCnt < maxLoopCnt; iCnt++) {
+
+ // Get keysize (modulus) of keys
+ KeyFactory keyFact = KeyFactory.getInstance(KEYALG, PROVIDER_NAME);
+
+ // Comparing binary length.
+ RSAPrivateKeySpec privateKeySpec
+ = (RSAPrivateKeySpec) keyFact.getKeySpec(privateKey,
+ RSAPrivateKeySpec.class);
+ int iPrivateKeySize = privateKeySpec.getModulus().bitLength();
+
+ RSAPublicKeySpec publicKeySpec
+ = (RSAPublicKeySpec) keyFact.getKeySpec(publicKey,
+ RSAPublicKeySpec.class);
+ int iPublicKeySize = publicKeySpec.getModulus().bitLength();
+
+ if ((iKeyPairSize != iPublicKeySize) || (iKeyPairSize != iPrivateKeySize)) {
+ System.err.println("iKeyPairSize : " + iKeyPairSize);
+ System.err.println("Generated a " + iPrivateKeySize
+ + " bit RSA private key");
+ System.err.println("Generated a " + iPublicKeySize
+ + " bit RSA public key");
+ failCount++;
+ }
+ }
+
+ if (failCount > 0) {
+ throw new RuntimeException("There are " + failCount + " tests failed.");
+ }
+ }
+
+ /**
+ * @param kpair test key pair.
+ * @return true if test passed. false if test failed.
+ */
+ private static boolean sizeTest(KeyPair kpair) {
+ RSAPrivateKey priv = (RSAPrivateKey) kpair.getPrivate();
+ RSAPublicKey pub = (RSAPublicKey) kpair.getPublic();
+
+ // test the getModulus method
+ if ((priv instanceof RSAKey) && (pub instanceof RSAKey)) {
+ if (!priv.getModulus().equals(pub.getModulus())) {
+ System.err.println("priv.getModulus() = " + priv.getModulus());
+ System.err.println("pub.getModulus() = " + pub.getModulus());
+ return false;
+ }
+ }
+ return true;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/rsa/PrivateKeyEqualityTest.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,108 @@
+/*
+ * 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.security.KeyFactory;
+import java.security.KeyPairGenerator;
+import java.security.KeyPair;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.interfaces.RSAPrivateCrtKey;
+import java.security.interfaces.RSAPrivateKey;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.RSAPrivateKeySpec;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.RSAPrivateCrtKeySpec;
+
+/**
+ * @test
+ * @bug 8044199 4666485
+ * @summary Equality checking for RSAPrivateKey by SunRsaSign provider.
+ */
+public class PrivateKeyEqualityTest {
+ /**
+ * ALGORITHM name, fixed as RSA.
+ */
+ private static final String KEYALG = "RSA";
+
+ /**
+ * JDK default RSA Provider.
+ */
+ private static final String PROVIDER_NAME = "SunRsaSign";
+
+ public static void main(String[] args) throws NoSuchAlgorithmException,
+ NoSuchProviderException, InvalidKeySpecException {
+ // Generate the first key.
+ KeyPairGenerator generator
+ = KeyPairGenerator.getInstance(KEYALG, PROVIDER_NAME);
+ KeyPair keyPair = generator.generateKeyPair();
+ RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
+ if (!(rsaPrivateKey instanceof RSAPrivateCrtKey)) {
+ System.err.println("rsaPrivateKey class : " + rsaPrivateKey.getClass().getName());
+ throw new RuntimeException("rsaPrivateKey is not a RSAPrivateCrtKey instance");
+ }
+
+ // Generate the second key.
+ KeyFactory factory = KeyFactory.getInstance(KEYALG, PROVIDER_NAME);
+ RSAPrivateKeySpec rsaPrivateKeySpec = new RSAPrivateKeySpec(
+ rsaPrivateKey.getModulus(), rsaPrivateKey.getPrivateExponent());
+ RSAPrivateKey rsaPrivateKey2 = (RSAPrivateKey) factory.generatePrivate(
+ rsaPrivateKeySpec);
+
+ // Generate the third key.
+ PKCS8EncodedKeySpec encodedKeySpec = new PKCS8EncodedKeySpec(
+ rsaPrivateKey.getEncoded());
+ RSAPrivateKey rsaPrivateKey3 = (RSAPrivateKey) factory.generatePrivate(
+ encodedKeySpec);
+
+ // Check for equality.
+ if (rsaPrivateKey.equals(rsaPrivateKey2)) {
+ throw new RuntimeException("rsaPrivateKey should not equal to rsaPrivateKey2");
+ }
+ if (!rsaPrivateKey3.equals(rsaPrivateKey)) {
+ throw new RuntimeException("rsaPrivateKey3 should equal to rsaPrivateKey");
+ }
+ if (rsaPrivateKey3.equals(rsaPrivateKey2)) {
+ throw new RuntimeException("rsaPrivateKey3 should not equal to rsaPrivateKey2");
+ }
+ if (rsaPrivateKey2.equals(rsaPrivateKey3)) {
+ throw new RuntimeException("rsaPrivateKey2 should not equal to rsaPrivateKey3");
+ }
+
+ // Generate the fourth key.
+ RSAPrivateCrtKey rsaPrivateCrtKey = (RSAPrivateCrtKey)rsaPrivateKey;
+ RSAPrivateCrtKeySpec rsaPrivateCrtKeySpec = new RSAPrivateCrtKeySpec(
+ rsaPrivateCrtKey.getModulus(),
+ rsaPrivateCrtKey.getPublicExponent(),
+ rsaPrivateCrtKey.getPrivateExponent(),
+ rsaPrivateCrtKey.getPrimeP(),
+ rsaPrivateCrtKey.getPrimeQ(),
+ rsaPrivateCrtKey.getPrimeExponentP(),
+ rsaPrivateCrtKey.getPrimeExponentQ(),
+ rsaPrivateCrtKey.getCrtCoefficient()
+ );
+ RSAPrivateCrtKey rsaPrivateKey4 = (RSAPrivateCrtKey) factory.generatePrivate(
+ rsaPrivateCrtKeySpec);
+ if (!rsaPrivateKey.equals(rsaPrivateKey4)) {
+ throw new RuntimeException("rsaPrivateKey should equal to rsaPrivateKey4");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/rsa/SignatureTest.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,209 @@
+/*
+ * 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.security.InvalidKeyException;
+import java.security.Key;
+import java.security.KeyFactory;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.Signature;
+import java.security.SignatureException;
+import java.security.interfaces.RSAPrivateKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.RSAPrivateKeySpec;
+import java.security.spec.RSAPublicKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Arrays;
+import static javax.crypto.Cipher.PRIVATE_KEY;
+import static javax.crypto.Cipher.PUBLIC_KEY;
+import jdk.testlibrary.RandomFactory;
+
+/**
+ * @test
+ * @bug 8044199
+ * @summary Create a signature for RSA and get its signed data. re-initiate
+ * the signature with the public key. The signature can be verified
+ * by acquired signed data.
+ * @key randomness
+ * @library ../../../lib/testlibrary
+ * @run main SignatureTest MD2withRSA 512
+ * @run main SignatureTest MD5withRSA 512
+ * @run main SignatureTest SHA1withRSA 512
+ * @run main SignatureTest SHA256withRSA 512
+ * @run main SignatureTest MD2withRSA 768
+ * @run main SignatureTest MD5withRSA 768
+ * @run main SignatureTest SHA1withRSA 768
+ * @run main SignatureTest SHA256withRSA 768
+ * @run main SignatureTest MD2withRSA 1024
+ * @run main SignatureTest MD5withRSA 1024
+ * @run main SignatureTest SHA1withRSA 1024
+ * @run main SignatureTest SHA256withRSA 1024
+ * @run main SignatureTest MD2withRSA 2048
+ * @run main SignatureTest MD5withRSA 2048
+ * @run main SignatureTest SHA1withRSA 2048
+ * @run main SignatureTest SHA256withRSA 2048
+ * @run main/timeout=240 SignatureTest MD2withRSA 4096
+ * @run main/timeout=240 SignatureTest MD5withRSA 4096
+ * @run main/timeout=240 SignatureTest SHA1withRSA 4096
+ * @run main/timeout=240 SignatureTest SHA256withRSA 4096
+ * @run main/timeout=240 SignatureTest MD2withRSA 5120
+ * @run main/timeout=240 SignatureTest MD5withRSA 5120
+ * @run main/timeout=240 SignatureTest SHA1withRSA 5120
+ * @run main/timeout=240 SignatureTest SHA256withRSA 5120
+ * @run main/timeout=240 SignatureTest MD2withRSA 6144
+ * @run main/timeout=240 SignatureTest MD5withRSA 6144
+ * @run main/timeout=240 SignatureTest SHA1withRSA 6144
+ * @run main/timeout=240 SignatureTest SHA256withRSA 6144
+ */
+public class SignatureTest {
+ /**
+ * ALGORITHM name, fixed as RSA.
+ */
+ private static final String KEYALG = "RSA";
+
+ /**
+ * JDK default RSA Provider.
+ */
+ private static final String PROVIDER = "SunRsaSign";
+
+ /**
+ * How much times signature updated.
+ */
+ private static final int UPDATE_TIMES_FIFTY = 50;
+
+ /**
+ * How much times signature initial updated.
+ */
+ private static final int UPDATE_TIMES_HUNDRED = 100;
+
+ public static void main(String[] args) throws Exception {
+ String testAlg = args[0];
+ int testSize = Integer.parseInt(args[1]);
+
+ byte[] data = new byte[100];
+ RandomFactory.getRandom().nextBytes(data);
+
+ // create a key pair
+ KeyPair kpair = generateKeys(KEYALG, testSize);
+ Key[] privs = manipulateKey(PRIVATE_KEY, kpair.getPrivate());
+ Key[] pubs = manipulateKey(PUBLIC_KEY, kpair.getPublic());
+ // For signature algorithm, create and verify a signature
+
+ Arrays.stream(privs).forEach(priv
+ -> Arrays.stream(pubs).forEach(pub -> {
+ try {
+ checkSignature(data, (PublicKey) pub, (PrivateKey) priv,
+ testAlg);
+ } catch (NoSuchAlgorithmException | InvalidKeyException
+ | SignatureException | NoSuchProviderException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+ ));
+
+ }
+
+ private static KeyPair generateKeys(String keyalg, int size)
+ throws NoSuchAlgorithmException {
+ KeyPairGenerator kpg = KeyPairGenerator.getInstance(keyalg);
+ kpg.initialize(size);
+ return kpg.generateKeyPair();
+ }
+
+ private static Key[] manipulateKey(int type, Key key)
+ throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchProviderException {
+ KeyFactory kf = KeyFactory.getInstance(KEYALG, PROVIDER);
+
+ switch (type) {
+ case PUBLIC_KEY:
+ try {
+ kf.getKeySpec(key, RSAPrivateKeySpec.class);
+ throw new RuntimeException("Expected InvalidKeySpecException "
+ + "not thrown");
+ } catch (InvalidKeySpecException expected) {
+ }
+
+ return new Key[]{
+ kf.generatePublic(kf.getKeySpec(key, RSAPublicKeySpec.class)),
+ kf.generatePublic(new X509EncodedKeySpec(key.getEncoded())),
+ kf.generatePublic(new RSAPublicKeySpec(
+ ((RSAPublicKey) key).getModulus(),
+ ((RSAPublicKey) key).getPublicExponent()))
+ };
+ case PRIVATE_KEY:
+ try {
+ kf.getKeySpec(key, RSAPublicKeySpec.class);
+ throw new RuntimeException("Expected InvalidKeySpecException"
+ + " not thrown");
+ } catch (InvalidKeySpecException expected) {
+ }
+ return new Key[]{
+ kf.generatePrivate(kf.getKeySpec(key,
+ RSAPrivateKeySpec.class)),
+ kf.generatePrivate(new PKCS8EncodedKeySpec(
+ key.getEncoded())),
+ kf.generatePrivate(new RSAPrivateKeySpec(((RSAPrivateKey) key).getModulus(),
+ ((RSAPrivateKey) key).getPrivateExponent()))
+ };
+ }
+ throw new RuntimeException("We shouldn't reach here");
+ }
+
+ private static void checkSignature(byte[] data, PublicKey pub,
+ PrivateKey priv, String sigalg) throws NoSuchAlgorithmException,
+ InvalidKeyException, SignatureException, NoSuchProviderException {
+ Signature sig = Signature.getInstance(sigalg, PROVIDER);
+ sig.initSign(priv);
+ for (int i = 0; i < UPDATE_TIMES_HUNDRED; i++) {
+ sig.update(data);
+ }
+ byte[] signedData = sig.sign();
+
+ // Make sure signature verifies with original data
+ sig.initVerify(pub);
+ for (int i = 0; i < UPDATE_TIMES_HUNDRED; i++) {
+ sig.update(data);
+ }
+ if (!sig.verify(signedData)) {
+ throw new RuntimeException("Failed to verify " + sigalg
+ + " signature");
+ }
+
+ // Make sure signature does NOT verify when the original data
+ // has changed
+ sig.initVerify(pub);
+ for (int i = 0; i < UPDATE_TIMES_FIFTY; i++) {
+ sig.update(data);
+ }
+
+ if (sig.verify(signedData)) {
+ throw new RuntimeException("Failed to detect bad " + sigalg
+ + " signature");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/rsa/SpecTest.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,119 @@
+/*
+ * 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.math.BigInteger;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.interfaces.RSAKey;
+import java.security.interfaces.RSAPrivateKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.RSAKeyGenParameterSpec;
+
+/**
+ * @test
+ * @bug 8044199
+ * @summary Check same KeyPair's private key and public key have same modulus.
+ * also check public key's public exponent equals to given spec's public
+ * exponent.
+ * @run main SpecTest 512
+ * @run main SpecTest 768
+ * @run main SpecTest 1024
+ * @run main SpecTest 2048
+ * @run main/timeout=240 SpecTest 4096
+ * @run main/timeout=240 SpecTest 5120
+ */
+public class SpecTest {
+ /**
+ * ALGORITHM name, fixed as RSA.
+ */
+ private static final String KEYALG = "RSA";
+
+ /**
+ * JDK default RSA Provider.
+ */
+ private static final String PROVIDER = "SunRsaSign";
+
+ /**
+ *
+ * @param kpair test key pair
+ * @param pubExponent expected public exponent.
+ * @return true if test passed. false if test failed.
+ */
+ private static boolean specTest(KeyPair kpair, BigInteger pubExponent) {
+ boolean passed = true;
+ RSAPrivateKey priv = (RSAPrivateKey) kpair.getPrivate();
+ RSAPublicKey pub = (RSAPublicKey) kpair.getPublic();
+
+ // test the getModulus method
+ if ((priv instanceof RSAKey) && (pub instanceof RSAKey)) {
+ if (!priv.getModulus().equals(pub.getModulus())) {
+ System.err.println("priv.getModulus() = " + priv.getModulus());
+ System.err.println("pub.getModulus() = " + pub.getModulus());
+ passed = false;
+ }
+
+ if (!pubExponent.equals(pub.getPublicExponent())) {
+ System.err.println("pubExponent = " + pubExponent);
+ System.err.println("pub.getPublicExponent() = "
+ + pub.getPublicExponent());
+ passed = false;
+ }
+ }
+ return passed;
+ }
+
+ public static void main(String[] args) {
+ int failCount = 0;
+
+ // Test key size.
+ int size = Integer.parseInt(args[0]);
+
+ try {
+ KeyPairGenerator kpg1 = KeyPairGenerator.getInstance(KEYALG, PROVIDER);
+ kpg1.initialize(new RSAKeyGenParameterSpec(size,
+ RSAKeyGenParameterSpec.F4));
+ if (!specTest(kpg1.generateKeyPair(),
+ RSAKeyGenParameterSpec.F4)) {
+ failCount++;
+ }
+
+ KeyPairGenerator kpg2 = KeyPairGenerator.getInstance(KEYALG, PROVIDER);
+ kpg2.initialize(new RSAKeyGenParameterSpec(size,
+ RSAKeyGenParameterSpec.F0));
+ if (!specTest(kpg2.generateKeyPair(), RSAKeyGenParameterSpec.F0)) {
+ failCount++;
+ }
+ } catch (NoSuchAlgorithmException | NoSuchProviderException
+ | InvalidAlgorithmParameterException ex) {
+ ex.printStackTrace(System.err);
+ failCount++;
+ }
+
+ if (failCount != 0) {
+ throw new RuntimeException("There are " + failCount
+ + " tests failed.");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/x509/URICertStore/ExtensionsWithLDAP.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,247 @@
+/*
+ * 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.
+ */
+
+import java.io.IOException;
+import java.io.StringBufferInputStream;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.CertPath;
+import java.security.cert.CertPathValidator;
+import java.security.cert.CertPathValidatorException;
+import java.security.cert.PKIXParameters;
+import java.security.cert.TrustAnchor;
+import java.security.cert.X509Certificate;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+import sun.net.spi.nameservice.NameService;
+import sun.net.spi.nameservice.NameServiceDescriptor;
+
+/*
+ * @test
+ * @bug 8134708
+ * @summary Check if LDAP resources from CRLDP and AIA extensions can be loaded
+ * @run main/othervm ExtensionsWithLDAP
+ */
+public class ExtensionsWithLDAP {
+
+ /*
+ * Certificate:
+ * Data:
+ * Version: 3 (0x2)
+ * Serial Number: 11174053930990688938 (0x9b1236d8f9c1daaa)
+ * Signature Algorithm: sha512WithRSAEncryption
+ * Issuer: CN=Root
+ * Validity
+ * Not Before: Sep 1 18:03:59 2015 GMT
+ * Not After : Jan 17 18:03:59 2043 GMT
+ * Subject: CN=Root
+ */
+ private static final String CA_CERT = ""
+ + "-----BEGIN CERTIFICATE-----\n"
+ + "MIIC8TCCAdmgAwIBAgIJAJsSNtj5wdqqMA0GCSqGSIb3DQEBDQUAMA8xDTALBgNV\n"
+ + "BAMMBFJvb3QwHhcNMTUwOTAxMTgwMzU5WhcNNDMwMTE3MTgwMzU5WjAPMQ0wCwYD\n"
+ + "VQQDDARSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvj892vPm\n"
+ + "bB++x9QqqyBveP+ZqQ2B1stV7vh5JmDnOTevkZUOcemp3SXu/esNLSbpL+fARYXH\n"
+ + "V5ubnrfip6RbvcxPfVIIDJrRTLIIsU6W7M6/LJLbLkEVGy4ZV4IHkOw9W2O92rcv\n"
+ + "BkoqhzZnOTGR6uT3rRcKx4RevEKBKhZO+OPPf//lnckOybmYL7t7yQrajzHro76b\n"
+ + "QTXYjAUq/DKhglXfC7vF/JzlAvG2IunGmIfjGcnuDo/9X3Bxef/q5TxCS35fvb7t\n"
+ + "svC+g2QhTcBkQh4uNW2jSjlTIVp1uErCfP5aCjLaez5mqmb1hxPIlcvsNR23HwU6\n"
+ + "bQO7z7NBo9Do6QIDAQABo1AwTjAdBgNVHQ4EFgQUmLZNOBBkqdYoElyxklPYHmAb\n"
+ + "QXIwHwYDVR0jBBgwFoAUmLZNOBBkqdYoElyxklPYHmAbQXIwDAYDVR0TBAUwAwEB\n"
+ + "/zANBgkqhkiG9w0BAQ0FAAOCAQEAYV4fOhDi5q7+XNXCxO8Eil2frR9jqdP4LaQp\n"
+ + "3L0evW0gvPX68s2WmkPWzIu4TJcpdGFQqxyQFSXuKBXjthyiln77QItGTHWeafES\n"
+ + "q5ESrKdSaJZq1bTIrrReCIP74f+fY/F4Tnb3dCqzaljXfzpdbeRsIW6gF71xcOUQ\n"
+ + "nnPEjGVPLUegN+Wn/jQpeLxxIB7FmNXncdRUfMfZ43xVSKuMCy1UUYqJqTa/pXZj\n"
+ + "jCMeRPThRjRqHlJ69jStfWUQATbLyj9KN09rUaJxzmUSt61UqJi7sjcGySaCjAJc\n"
+ + "IcCdVmX/DmRLsdv8W36O3MgrvpT1zR3kaAlv2d8HppnBqcL3xg==\n"
+ + "-----END CERTIFICATE-----";
+
+ /*
+ * Certificate:
+ * Data:
+ * Version: 3 (0x2)
+ * Serial Number: 7 (0x7)
+ * Signature Algorithm: sha512WithRSAEncryption
+ * Issuer: CN=Root
+ * Validity
+ * Not Before: Sep 1 18:03:59 2015 GMT
+ * Not After : Jan 17 18:03:59 2043 GMT
+ * Subject: CN=EE
+ * ...
+ * X509v3 extensions:
+ * X509v3 CRL Distribution Points:
+ * Full Name:
+ * URI:ldap://ldap.host.for.crldp/main.crl
+ * Authority Information Access:
+ * CA Issuers - URI:ldap://ldap.host.for.aia/dc=Root?cACertificate
+ */
+ private static final String EE_CERT = ""
+ + "-----BEGIN CERTIFICATE-----\n"
+ + "MIIDHTCCAgWgAwIBAgIBBzANBgkqhkiG9w0BAQ0FADAPMQ0wCwYDVQQDDARSb290\n"
+ + "MB4XDTE1MDkwMTE4MDM1OVoXDTQzMDExNzE4MDM1OVowDTELMAkGA1UEAwwCRUUw\n"
+ + "ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpyz97liuWPDYcLH9TX8Bi\n"
+ + "T78olCmAfmevvch6ncXUVuCzbdaKuKXwn4EVbDszsVJLoK5zdtP+X3iDhutj+IgK\n"
+ + "mLhuczF3M9VIcWr+JJUyTH4+3h/RT8cjCDZOmk9iXkb5ifruVsLqzb9g+Vp140Oz\n"
+ + "7leikne7KmclHvTfvFd0WDI7Gb9vo4f5rT717BXJ/n+M6pNk8DLpLiEu6eziYvXR\n"
+ + "v5x+t5Go3x0eCXdaxEQUf2j876Wfr2qHRJK7lDfFe1DDsMg/KpKGiILYZ+g2qtVM\n"
+ + "ZSxtp5BZEtfB5qV/IE5kWO+mCIAGpXSZIdbERR6pZUq8GLEe1T9e+sO6H24w2F19\n"
+ + "AgMBAAGjgYUwgYIwNAYDVR0fBC0wKzApoCegJYYjbGRhcDovL2xkYXAuaG9zdC5m\n"
+ + "b3IuY3JsZHAvbWFpbi5jcmwwSgYIKwYBBQUHAQEEPjA8MDoGCCsGAQUFBzAChi5s\n"
+ + "ZGFwOi8vbGRhcC5ob3N0LmZvci5haWEvZGM9Um9vdD9jQUNlcnRpZmljYXRlMA0G\n"
+ + "CSqGSIb3DQEBDQUAA4IBAQBWDfZHpuUx0yn5d3+BuztFqoks1MkGdk+USlH0TB1/\n"
+ + "gWWBd+4S4PCKlpSur0gj2rMW4fP5HQfNlHci8JV8/bG4KuKRAXW56dg1818Hl3pc\n"
+ + "iIrUSRn8uUjH3p9qb+Rb/u3mmVQRyJjN2t/zceNsO8/+Dd808OB9aEwGs8lMT0nn\n"
+ + "ZYaaAqYz1GIY/Ecyx1vfEZEQ1ljo6i/r70C3igbypBUShxSiGsleiVTLOGNA+MN1\n"
+ + "/a/Qh0bkaQyTGqK3bwvzzMeQVqWu2EWTBD/PmND5ExkpRICdv8LBVXfLnpoBr4lL\n"
+ + "hnxn9+e0Ah+t8dS5EKfn44w5bI5PCu2bqxs6RCTxNjcY\n"
+ + "-----END CERTIFICATE-----";
+
+
+ private static final String LDAP_HOST_CRLDP = "ldap.host.for.crldp";
+ private static final String LDAP_HOST_AIA = "ldap.host.for.aia";
+
+ // a date within the certificates validity period
+ static final Date validationDate;
+ static {
+ try {
+ validationDate = DateFormat.getDateInstance(
+ DateFormat.MEDIUM, Locale.US).parse("Sep 02, 2015");
+ } catch (ParseException e) {
+ throw new RuntimeException("Couldn't parse date", e);
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ // enable CRLDP and AIA extensions
+ System.setProperty("com.sun.security.enableCRLDP", "true");
+ System.setProperty("com.sun.security.enableAIAcaIssuers", "true");
+
+ // register a local name service
+ System.setProperty("sun.net.spi.nameservice.provider.1", "ns,localdns");
+
+ X509Certificate trustedCert = loadCertificate(CA_CERT);
+ X509Certificate eeCert = loadCertificate(EE_CERT);
+
+ Set<TrustAnchor> trustedCertsSet = new HashSet<>();
+ trustedCertsSet.add(new TrustAnchor(trustedCert, null));
+
+ CertPath cp = (CertPath) CertificateFactory.getInstance("X509")
+ .generateCertPath(Arrays.asList(eeCert));
+
+ PKIXParameters params = new PKIXParameters(trustedCertsSet);
+ params.setDate(validationDate);
+
+ // certpath validator should try to parse CRLDP and AIA extensions,
+ // and load CRLs/certs which they point to
+ // if a local name service catched requests for resolving host names
+ // which extensions contain, then it means that certpath validator
+ // tried to load CRLs/certs which they point to
+ try {
+ CertPathValidator.getInstance("PKIX").validate(cp, params);
+ throw new RuntimeException("CertPathValidatorException not thrown");
+ } catch (CertPathValidatorException cpve) {
+ System.out.println("Expected exception: " + cpve);
+ }
+
+ // check if it tried to resolve a host name from CRLDP extension
+ if (!LocalNameService.requestedHosts.contains(LDAP_HOST_CRLDP)) {
+ throw new RuntimeException(
+ "A hostname from CRLDP extension not requested");
+ }
+
+ // check if it tried to resolve a host name from AIA extension
+ if (!LocalNameService.requestedHosts.contains(LDAP_HOST_AIA)) {
+ throw new RuntimeException(
+ "A hostname from AIA extension not requested");
+ }
+
+ System.out.println("Test passed");
+ }
+
+ // load a X509 certificate
+ public static X509Certificate loadCertificate(String s)
+ throws IOException, CertificateException {
+
+ try (StringBufferInputStream is = new StringBufferInputStream(s)) {
+ return (X509Certificate) CertificateFactory.getInstance("X509")
+ .generateCertificate(is);
+ }
+ }
+
+ // a local name service which log requested host names
+ public static class LocalNameService implements NameServiceDescriptor {
+
+ static final List<String> requestedHosts = new ArrayList<>();
+
+ @Override
+ public NameService createNameService() throws Exception {
+ System.out.println("LocalNameService: createNameService() called");
+ NameService ns = new NameService() {
+
+ @Override
+ public InetAddress[] lookupAllHostAddr(String host)
+ throws UnknownHostException {
+
+ System.out.println("LocalNameService: "
+ + "NameService.lookupAllHostAddr(): " + host);
+
+ requestedHosts.add(host);
+
+ throw new UnknownHostException();
+ }
+
+ @Override
+ public String getHostByAddr(byte[] addr)
+ throws UnknownHostException {
+ System.out.println("LocalNameService: "
+ + "NameService.getHostByAddr(): "
+ + Arrays.toString(addr));
+ throw new UnknownHostException("No reverse lookup");
+ }
+ };
+ return ns;
+ }
+
+ @Override
+ public String getProviderName() {
+ return "localdns";
+ }
+
+ @Override
+ public String getType() {
+ return "ns";
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/x509/URICertStore/META-INF/services/sun.net.spi.nameservice.NameServiceDescriptor Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,1 @@
+ExtensionsWithLDAP$LocalNameService
--- a/jdk/test/sun/tools/jps/JpsBase.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/test/sun/tools/jps/JpsBase.java Mon Sep 21 17:49:57 2015 +0200
@@ -138,6 +138,8 @@
String tmp = str.replace("\\", "\\\\");
tmp = tmp.replace("+", "\\+");
tmp = tmp.replace(".", "\\.");
+ tmp = tmp.replace("\n", "\\\\n");
+ tmp = tmp.replace("\r", "\\\\r");
return tmp;
}
--- a/jdk/test/sun/tools/jps/JpsHelper.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/test/sun/tools/jps/JpsHelper.java Mon Sep 21 17:49:57 2015 +0200
@@ -97,7 +97,10 @@
* VM arguments to start test application with.
* -XX:+UsePerfData is required for running the tests on embedded platforms.
*/
- public static final String[] VM_ARGS = {"-XX:+UsePerfData", "-Xmx512m", "-XX:+PrintGCDetails"};
+ public static final String[] VM_ARGS = {
+ "-XX:+UsePerfData", "-Xmx512m", "-XX:+PrintGCDetails",
+ "-Dmultiline.prop=value1\nvalue2\r\nvalue3"
+ };
/**
* VM flag to start test application with
*/
--- a/jdk/test/sun/util/resources/TimeZone/Bug6377794.java Tue Sep 22 14:24:31 2015 -0400
+++ b/jdk/test/sun/util/resources/TimeZone/Bug6377794.java Mon Sep 21 17:49:57 2015 +0200
@@ -25,6 +25,7 @@
*@test
*@bug 6377794
*@summary Test case for tzdata2005r support for 9 locales
+ *@run main/othervm -Djava.locale.providers=JRE,SPI Bug6377794
*/
import java.util.Locale;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/util/resources/cldr/Bug8134384.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,66 @@
+/*
+ * 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 8134384
+ * @summary Tests CLDR TimeZoneNames has English names for all tzids
+ * @run main/othervm -Djava.locale.providers=CLDR Bug8134384
+ */
+
+import java.text.*;
+import java.time.*;
+import java.util.*;
+
+public class Bug8134384 {
+ public static void main(String [] args) {
+ TimeZone original = TimeZone.getDefault();
+
+ try {
+ for (String tz : TimeZone.getAvailableIDs() ) {
+ TimeZone.setDefault(TimeZone.getTimeZone(tz));
+ // Summer solstice
+ String date1 = Date.from(Instant.parse("2015-06-21T00:00:00.00Z")).toString();
+ testParse(Locale.ENGLISH, date1, tz);
+ testParse(Locale.US, date1, tz);
+ testParse(Locale.ROOT, date1, tz);
+ // Winter solstice
+ String date2 = Date.from(Instant.parse("2015-12-22T00:00:00.00Z")).toString();
+ testParse(Locale.ENGLISH, date2, tz);
+ testParse(Locale.US, date2, tz);
+ testParse(Locale.ROOT, date2, tz);
+ }
+ } finally {
+ TimeZone.setDefault(original);
+ }
+ }
+
+ private static void testParse(Locale locale, String date, String tz) {
+ try {
+ new SimpleDateFormat("EEE MMM d hh:mm:ss z yyyy", locale).parse(date);
+ System.out.println(String.format(Locale.ENGLISH, "OK parsing '%s' in locale '%s', tz: %s", date, locale, tz));
+ } catch (ParseException pe) {
+ throw new RuntimeException(String.format(Locale.ENGLISH, "ERROR parsing '%s' in locale '%s', tz: %s: %s", date, locale, tz, pe.toString()));
+ }
+ }
+}
--- a/langtools/.hgtags Tue Sep 22 14:24:31 2015 -0400
+++ b/langtools/.hgtags Mon Sep 21 17:49:57 2015 +0200
@@ -323,3 +323,4 @@
7fd155b7041c8aba7084f03e2fd1d6f74cceda75 jdk9-b78
eaab8a16dcfb807acacdb6d133f3ecd502667a8c jdk9-b79
c5671e662392df372b2005b75afa6cfdc0eebce7 jdk9-b80
+ead8b7192f00417185f0e64d0cb332f0f8ad4ae1 jdk9-b81
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java Tue Sep 22 14:24:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java Mon Sep 21 17:49:57 2015 +0200
@@ -1436,6 +1436,7 @@
}
Assert.check(!sym.kind.isResolutionError());
try {
+ types.noWarnings.clear();
Type mt = rawInstantiate(env, site, sym, null, argtypes, typeargtypes,
allowBoxing, useVarargs, types.noWarnings);
currentResolutionContext.addApplicableCandidate(sym, mt);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/AutoFlushWriter.java Mon Sep 21 17:49:57 2015 +0200
@@ -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.
+ */
+
+package com.sun.tools.sjavac;
+
+import java.io.FilterWriter;
+import java.io.IOException;
+import java.io.Writer;
+
+public class AutoFlushWriter extends FilterWriter {
+
+ public AutoFlushWriter(Writer out) {
+ super(out);
+ }
+
+ @Override
+ public void write(int c) throws IOException {
+ super.write(c);
+ if (c == '\n' || c == '\r')
+ flush();
+ }
+
+ @Override
+ public void write(String str, int off, int len) throws IOException {
+ super.write(str, off, len);
+ if (str.contains("\n") || str.contains("\r"))
+ flush();
+ }
+
+ @Override
+ public void write(char[] cbuf, int off, int len) throws IOException {
+ super.write(cbuf, off, len);
+ for (char c : cbuf) {
+ if (c == '\n' || c == '\r') {
+ flush();
+ break;
+ }
+ }
+ }
+}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CleanProperties.java Tue Sep 22 14:24:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CleanProperties.java Mon Sep 21 17:49:57 2015 +0200
@@ -31,7 +31,6 @@
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
-import java.io.PrintStream;
import java.io.Writer;
import java.net.URI;
import java.util.ArrayList;
@@ -78,8 +77,8 @@
int debugLevel,
boolean incremental,
int numCores,
- PrintStream out,
- PrintStream err) {
+ Writer out,
+ Writer err) {
boolean rc = true;
for (String pkgName : pkgSrcs.keySet()) {
String pkgNameF = pkgName.replace('.',File.separatorChar);
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CompileJavaPackages.java Tue Sep 22 14:24:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CompileJavaPackages.java Mon Sep 21 17:49:57 2015 +0200
@@ -26,14 +26,22 @@
package com.sun.tools.sjavac;
import java.io.File;
-import java.io.PrintStream;
+import java.io.IOException;
+import java.io.Writer;
import java.net.URI;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
import com.sun.tools.sjavac.comp.CompilationService;
import com.sun.tools.sjavac.options.Options;
@@ -83,8 +91,8 @@
int debugLevel,
boolean incremental,
int numCores,
- final PrintStream out,
- final PrintStream err) {
+ final Writer out,
+ final Writer err) {
Log.debug("Performing CompileJavaPackages transform...");
@@ -200,102 +208,83 @@
}
}
- // The return values for each chunked compile.
- final CompilationSubResult[] rn = new CompilationSubResult[numCompiles];
- // The requets, might or might not run as a background thread.
- final Thread[] requests = new Thread[numCompiles];
-
long start = System.currentTimeMillis();
- for (int i=0; i<numCompiles; ++i) {
- final int ii = i;
- final CompileChunk cc = compileChunks[i];
-
- // Pass the num_cores and the id (appended with the chunk number) to the server.
- Object lock = new Object();
- requests[i] = new Thread() {
- @Override
- public void run() {
- rn[ii] = sjavac.compile("n/a",
- id + "-" + ii,
- args.prepJavacArgs(),
- Collections.<File>emptyList(),
- cc.srcs,
- visibleSources);
- // In the code below we have to keep in mind that two
- // different compilation results may include results for
- // the same package.
- synchronized (lock) {
-
- for (String pkg : rn[ii].packageArtifacts.keySet()) {
- Set<URI> pkgArtifacts = rn[ii].packageArtifacts.get(pkg);
- packageArtifacts.merge(pkg, pkgArtifacts, Util::union);
- }
-
- for (String pkg : rn[ii].packageDependencies.keySet()) {
- packageDependencies.putIfAbsent(pkg, new HashMap<>());
- packageDependencies.get(pkg).putAll(rn[ii].packageDependencies.get(pkg));
- }
-
- for (String pkg : rn[ii].packageCpDependencies.keySet()) {
- packageCpDependencies.putIfAbsent(pkg, new HashMap<>());
- packageCpDependencies.get(pkg).putAll(rn[ii].packageCpDependencies.get(pkg));
- }
+ // Prepare compilation calls
+ List<Callable<CompilationSubResult>> compilationCalls = new ArrayList<>();
+ final Object lock = new Object();
+ for (int i = 0; i < numCompiles; i++) {
+ CompileChunk cc = compileChunks[i];
+ if (cc.srcs.isEmpty()) {
+ continue;
+ }
- for (String pkg : rn[ii].packagePubapis.keySet()) {
- packagePubapis.merge(pkg, rn[ii].packagePubapis.get(pkg), PubApi::mergeTypes);
- }
-
- for (String pkg : rn[ii].dependencyPubapis.keySet()) {
- dependencyPubapis.merge(pkg, rn[ii].dependencyPubapis.get(pkg), PubApi::mergeTypes);
- }
- }
+ String chunkId = id + "-" + String.valueOf(i);
+ compilationCalls.add(() -> {
+ CompilationSubResult result = sjavac.compile("n/a",
+ chunkId,
+ args.prepJavacArgs(),
+ Collections.<File>emptyList(),
+ cc.srcs,
+ visibleSources);
+ synchronized (lock) {
+ safeWrite(result.stdout, out);
+ safeWrite(result.stderr, err);
}
- };
+ return result;
+ });
+ }
- if (cc.srcs.size() > 0) {
- String numdeps = "";
- if (cc.numDependents > 0) numdeps = "(with "+cc.numDependents+" dependents) ";
- if (!incremental || cc.numPackages > 16) {
- String info = "("+cc.pkgFromTos+")";
- if (info.equals("( to )")) {
- info = "";
- }
- Log.info("Compiling "+cc.srcs.size()+" files "+numdeps+"in "+cc.numPackages+" packages "+info);
- } else {
- Log.info("Compiling "+cc.pkgNames+numdeps);
- }
- if (concurrentCompiles) {
- requests[ii].start();
- }
- else {
- requests[ii].run();
- // If there was an error, then stop early when running single threaded.
- if (rn[i].returnCode != 0) {
- Log.info(rn[i].stdout);
- Log.error(rn[i].stderr);
- return false;
- }
- }
+ // Perform compilations and collect results
+ List<CompilationSubResult> subResults = new ArrayList<>();
+ List<Future<CompilationSubResult>> futs = new ArrayList<>();
+ ExecutorService exec = Executors.newFixedThreadPool(concurrentCompiles ? compilationCalls.size() : 1);
+ for (Callable<CompilationSubResult> compilationCall : compilationCalls) {
+ futs.add(exec.submit(compilationCall));
+ }
+ for (Future<CompilationSubResult> fut : futs) {
+ try {
+ subResults.add(fut.get());
+ } catch (ExecutionException ee) {
+ Log.error("Compilation failed: " + ee.getMessage());
+ } catch (InterruptedException ee) {
+ Log.error("Compilation interrupted: " + ee.getMessage());
+ Thread.currentThread().interrupt();
}
}
- if (concurrentCompiles) {
- // If there are background threads for the concurrent compiles, then join them.
- for (int i=0; i<numCompiles; ++i) {
- try { requests[i].join(); } catch (InterruptedException e) { }
+ exec.shutdownNow();
+
+ // Process each sub result
+ for (CompilationSubResult subResult : subResults) {
+ for (String pkg : subResult.packageArtifacts.keySet()) {
+ Set<URI> pkgArtifacts = subResult.packageArtifacts.get(pkg);
+ packageArtifacts.merge(pkg, pkgArtifacts, Util::union);
+ }
+
+ for (String pkg : subResult.packageDependencies.keySet()) {
+ packageDependencies.putIfAbsent(pkg, new HashMap<>());
+ packageDependencies.get(pkg).putAll(subResult.packageDependencies.get(pkg));
+ }
+
+ for (String pkg : subResult.packageCpDependencies.keySet()) {
+ packageCpDependencies.putIfAbsent(pkg, new HashMap<>());
+ packageCpDependencies.get(pkg).putAll(subResult.packageCpDependencies.get(pkg));
+ }
+
+ for (String pkg : subResult.packagePubapis.keySet()) {
+ packagePubapis.merge(pkg, subResult.packagePubapis.get(pkg), PubApi::mergeTypes);
+ }
+
+ for (String pkg : subResult.dependencyPubapis.keySet()) {
+ dependencyPubapis.merge(pkg, subResult.dependencyPubapis.get(pkg), PubApi::mergeTypes);
+ }
+
+ // Check the return values.
+ if (subResult.returnCode != 0) {
+ rc = false;
}
}
- // Check the return values.
- for (int i=0; i<numCompiles; ++i) {
- if (compileChunks[i].srcs.size() > 0) {
- if (rn[i].returnCode != 0) {
- Log.info(rn[i].stdout);
- Log.error(rn[i].stderr);
- rc = false;
- }
- }
- }
long duration = System.currentTimeMillis() - start;
long minutes = duration/60000;
long seconds = (duration-minutes*60000)/1000;
@@ -304,6 +293,16 @@
return rc;
}
+ private void safeWrite(String str, Writer w) {
+ if (str.length() > 0) {
+ try {
+ w.write(str);
+ } catch (IOException e) {
+ Log.error("Could not print compilation output.");
+ }
+ }
+ }
+
/**
* Split up the sources into compile chunks. If old package dependents information
* is available, sort the order of the chunks into the most dependent first!
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CompileProperties.java Tue Sep 22 14:24:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CompileProperties.java Mon Sep 21 17:49:57 2015 +0200
@@ -85,8 +85,8 @@
int debugLevel,
boolean incremental,
int numCores,
- PrintStream out,
- PrintStream err) {
+ Writer out,
+ Writer err) {
boolean rc = true;
for (String pkgName : pkgSrcs.keySet()) {
String pkgNameF = Util.toFileSystemPath(pkgName);
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CopyFile.java Tue Sep 22 14:24:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CopyFile.java Mon Sep 21 17:49:57 2015 +0200
@@ -31,7 +31,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
-import java.io.PrintStream;
+import java.io.Writer;
import java.net.URI;
import java.util.HashSet;
import java.util.Map;
@@ -72,8 +72,8 @@
int debugLevel,
boolean incremental,
int numCores,
- PrintStream out,
- PrintStream err)
+ Writer out,
+ Writer err)
{
boolean rc = true;
String dest_filename;
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/JavacState.java Tue Sep 22 14:24:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/JavacState.java Mon Sep 21 17:49:57 2015 +0200
@@ -31,7 +31,7 @@
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
-import java.io.PrintStream;
+import java.io.Writer;
import java.net.URI;
import java.nio.file.NoSuchFileException;
import java.text.SimpleDateFormat;
@@ -131,12 +131,12 @@
private CompileJavaPackages compileJavaPackages = new CompileJavaPackages();
// Where to send stdout and stderr.
- private PrintStream out, err;
+ private Writer out, err;
// Command line options.
private Options options;
- JavacState(Options op, boolean removeJavacState, PrintStream o, PrintStream e) {
+ JavacState(Options op, boolean removeJavacState, Writer o, Writer e) {
options = op;
out = o;
err = e;
@@ -311,7 +311,7 @@
/**
* Load a javac_state file.
*/
- public static JavacState load(Options options, PrintStream out, PrintStream err) {
+ public static JavacState load(Options options, Writer out, Writer err) {
JavacState db = new JavacState(options, false, out, err);
Module lastModule = null;
Package lastPackage = null;
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Log.java Tue Sep 22 14:24:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Log.java Mon Sep 21 17:49:57 2015 +0200
@@ -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
@@ -25,7 +25,8 @@
package com.sun.tools.sjavac;
-import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.io.Writer;
/**
* Utility class only for sjavac logging.
@@ -37,7 +38,7 @@
* deletion without notice.</b>
*/
public class Log {
- private static PrintStream out, err;
+ private static PrintWriter out, err;
public final static int WARN = 1;
public final static int INFO = 2;
@@ -71,9 +72,9 @@
err.println(msg);
}
- static public void initializeLog(PrintStream o, PrintStream e) {
- out = o;
- err = e;
+ static public void initializeLog(Writer o, Writer e) {
+ out = new PrintWriter(o);
+ err = new PrintWriter(e);
}
static public void setLogLevel(String l) {
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Transformer.java Tue Sep 22 14:24:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Transformer.java Mon Sep 21 17:49:57 2015 +0200
@@ -25,7 +25,7 @@
package com.sun.tools.sjavac;
-import java.io.PrintStream;
+import java.io.Writer;
import java.net.URI;
import java.util.Map;
import java.util.Set;
@@ -97,8 +97,8 @@
int debugLevel,
boolean incremental,
int numCores,
- PrintStream out,
- PrintStream err);
+ Writer out,
+ Writer err);
void setExtra(String e);
void setExtra(Options args);
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/client/ClientMain.java Tue Sep 22 14:24:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/client/ClientMain.java Mon Sep 21 17:49:57 2015 +0200
@@ -25,13 +25,14 @@
package com.sun.tools.sjavac.client;
-import java.io.PrintStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import com.sun.tools.sjavac.AutoFlushWriter;
import com.sun.tools.sjavac.Log;
import com.sun.tools.sjavac.Util;
import com.sun.tools.sjavac.comp.SjavacImpl;
import com.sun.tools.sjavac.options.Options;
-import com.sun.tools.sjavac.server.CompilationResult;
import com.sun.tools.sjavac.server.Sjavac;
/**
@@ -43,10 +44,12 @@
public class ClientMain {
public static int run(String[] args) {
- return run(args, System.out, System.err);
+ return run(args,
+ new AutoFlushWriter(new OutputStreamWriter(System.out)),
+ new AutoFlushWriter(new OutputStreamWriter(System.err)));
}
- public static int run(String[] args, PrintStream out, PrintStream err) {
+ public static int run(String[] args, Writer out, Writer err) {
Log.initializeLog(out, err);
@@ -78,14 +81,11 @@
sjavac = new SjavacImpl();
}
- CompilationResult cr = sjavac.compile(args);
-
- out.print(cr.stdout);
- err.print(cr.stderr);
+ int rc = sjavac.compile(args, out, err);
if (!background)
sjavac.shutdown();
- return cr.returnCode;
+ return rc;
}
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/client/SjavacClient.java Tue Sep 22 14:24:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/client/SjavacClient.java Mon Sep 21 17:49:57 2015 +0200
@@ -25,11 +25,14 @@
package com.sun.tools.sjavac.client;
+import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.io.Writer;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
@@ -43,7 +46,6 @@
import com.sun.tools.sjavac.options.OptionHelper;
import com.sun.tools.sjavac.options.Options;
import com.sun.tools.sjavac.server.CompilationSubResult;
-import com.sun.tools.sjavac.server.CompilationResult;
import com.sun.tools.sjavac.server.PortFile;
import com.sun.tools.sjavac.server.Sjavac;
import com.sun.tools.sjavac.server.SjavacServer;
@@ -119,29 +121,47 @@
}
@Override
- public CompilationResult compile(String[] args) {
- CompilationResult result;
+ public int compile(String[] args, Writer stdout, Writer stderr) {
+ int result = -1;
try (Socket socket = tryConnect()) {
- // The ObjectInputStream constructor will block until the
- // corresponding ObjectOutputStream has written and flushed the
- // header, so it is important that the ObjectOutputStreams on server
- // and client are opened before the ObjectInputStreams.
- ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
- ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
- oos.writeObject(id);
- oos.writeObject(SjavacServer.CMD_COMPILE);
- oos.writeObject(args);
- oos.flush();
- result = (CompilationResult) ois.readObject();
- } catch (IOException | ClassNotFoundException ex) {
- Log.error("[CLIENT] Exception caught: " + ex);
- result = new CompilationResult(CompilationSubResult.ERROR_FATAL);
- result.stderr = Util.getStackTrace(ex);
+ PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
+ BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
+
+ // Send args array to server
+ out.println(args.length);
+ for (String arg : args)
+ out.println(arg);
+ out.flush();
+
+ // Read server response line by line
+ String line;
+ while (null != (line = in.readLine())) {
+ String[] typeAndContent = line.split(":", 2);
+ String type = typeAndContent[0];
+ String content = typeAndContent[1];
+ switch (type) {
+ case SjavacServer.LINE_TYPE_STDOUT:
+ stdout.write(content);
+ stdout.write('\n');
+ break;
+ case SjavacServer.LINE_TYPE_STDERR:
+ stderr.write(content);
+ stderr.write('\n');
+ break;
+ case SjavacServer.LINE_TYPE_RC:
+ result = Integer.parseInt(content);
+ break;
+ }
+ }
+ } catch (IOException ioe) {
+ Log.error("[CLIENT] Exception caught: " + ioe);
+ result = CompilationSubResult.ERROR_FATAL;
+ ioe.printStackTrace(new PrintWriter(stderr));
} catch (InterruptedException ie) {
Thread.currentThread().interrupt(); // Restore interrupt
Log.error("[CLIENT] compile interrupted.");
- result = new CompilationResult(CompilationSubResult.ERROR_FATAL);
- result.stderr = Util.getStackTrace(ie);
+ result = CompilationSubResult.ERROR_FATAL;
+ ie.printStackTrace(new PrintWriter(stderr));
}
return result;
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/PooledSjavac.java Tue Sep 22 14:24:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/PooledSjavac.java Mon Sep 21 17:49:57 2015 +0200
@@ -24,13 +24,13 @@
*/
package com.sun.tools.sjavac.comp;
+import java.io.Writer;
import java.util.Objects;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import com.sun.tools.sjavac.Log;
-import com.sun.tools.sjavac.server.CompilationResult;
import com.sun.tools.sjavac.server.Sjavac;
/**
@@ -54,10 +54,10 @@
}
@Override
- public CompilationResult compile(String[] args) {
+ public int compile(String[] args, Writer out, Writer err) {
try {
return pool.submit(() -> {
- return delegate.compile(args);
+ return delegate.compile(args, out, err);
}).get();
} catch (Exception e) {
e.printStackTrace();
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/SjavacImpl.java Tue Sep 22 14:24:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/SjavacImpl.java Mon Sep 21 17:49:57 2015 +0200
@@ -24,12 +24,9 @@
*/
package com.sun.tools.sjavac.comp;
-import static com.sun.tools.sjavac.server.CompilationResult.ERROR_FATAL;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import java.io.ByteArrayOutputStream;
import java.io.IOException;
-import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
@@ -49,7 +46,6 @@
import com.sun.tools.sjavac.Util;
import com.sun.tools.sjavac.options.Options;
import com.sun.tools.sjavac.options.SourceLocation;
-import com.sun.tools.sjavac.server.CompilationResult;
import com.sun.tools.sjavac.server.Sjavac;
/**
@@ -64,39 +60,33 @@
public class SjavacImpl implements Sjavac {
@Override
- public CompilationResult compile(String[] args) {
-
- ByteArrayOutputStream outBaos = new ByteArrayOutputStream();
- ByteArrayOutputStream errBaos = new ByteArrayOutputStream();
- PrintStream out = new PrintStream(outBaos);
- PrintStream err = new PrintStream(errBaos);
-
+ public int compile(String[] args, Writer out, Writer err) {
Options options;
try {
options = Options.parseArgs(args);
} catch (IllegalArgumentException e) {
Log.error(e.getMessage());
- return new CompilationResult(ERROR_FATAL);
+ return RC_FATAL;
}
Log.setLogLevel(options.getLogLevel());
if (!validateOptions(options))
- return new CompilationResult(ERROR_FATAL);
+ return RC_FATAL;
if (!createIfMissing(options.getDestDir()))
- return new CompilationResult(ERROR_FATAL);
+ return RC_FATAL;
if (!createIfMissing(options.getStateDir()))
- return new CompilationResult(ERROR_FATAL);
+ return RC_FATAL;
Path gensrc = options.getGenSrcDir();
if (gensrc != null && !createIfMissing(gensrc))
- return new CompilationResult(ERROR_FATAL);
+ return RC_FATAL;
Path hdrdir = options.getHeaderDir();
if (hdrdir != null && !createIfMissing(hdrdir))
- return new CompilationResult(ERROR_FATAL);
+ return RC_FATAL;
// Load the prev build state database.
JavacState javac_state = JavacState.load(options, out, err);
@@ -132,9 +122,7 @@
if (sources.isEmpty()) {
Log.error("Found nothing to compile!");
- return new CompilationResult(CompilationResult.ERROR_FATAL,
- new String(outBaos.toByteArray(), UTF_8),
- new String(errBaos.toByteArray(), UTF_8));
+ return RC_FATAL;
}
@@ -251,19 +239,13 @@
javac_state.removeSuperfluousArtifacts(recently_compiled);
}
- return new CompilationResult(rc[0] ? 0 : ERROR_FATAL,
- new String(outBaos.toByteArray(), UTF_8),
- new String(errBaos.toByteArray(), UTF_8));
+ return rc[0] ? RC_OK : RC_FATAL;
} catch (ProblemException e) {
Log.error(e.getMessage());
- return new CompilationResult(ERROR_FATAL,
- new String(outBaos.toByteArray(), UTF_8),
- new String(errBaos.toByteArray(), UTF_8));
+ return RC_FATAL;
} catch (Exception e) {
- e.printStackTrace(err);
- return new CompilationResult(ERROR_FATAL,
- new String(outBaos.toByteArray(), UTF_8),
- new String(errBaos.toByteArray(), UTF_8));
+ e.printStackTrace(new PrintWriter(err));
+ return RC_FATAL;
}
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/CompilationResult.java Tue Sep 22 14:24:31 2015 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2014, 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 com.sun.tools.sjavac.server;
-
-import java.io.Serializable;
-
-/**
- * <p><b>This is NOT part of any supported API.
- * If you write code that depends on this, you do so at your own risk.
- * This code and its internal interfaces are subject to change or
- * deletion without notice.</b>
- */
-public class CompilationResult implements Serializable {
-
- static final long serialVersionUID = 46739181113L;
-
- // Return code constants
- public final static int ERROR_FATAL = -1;
-
- public String stdout;
- public String stderr;
- public int returnCode;
-
- public CompilationResult(int returnCode) {
- this(returnCode, "", "");
- }
-
- public CompilationResult(int returnCode, String stdout, String stderr) {
- this.returnCode = returnCode;
- this.stdout = stdout;
- this.stderr = stderr;
- }
-
- public void setReturnCode(int returnCode) {
- this.returnCode = returnCode;
- }
-}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/IdleResetSjavac.java Tue Sep 22 14:24:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/IdleResetSjavac.java Mon Sep 21 17:49:57 2015 +0200
@@ -24,6 +24,7 @@
*/
package com.sun.tools.sjavac.server;
+import java.io.Writer;
import java.util.Timer;
import java.util.TimerTask;
@@ -60,10 +61,10 @@
}
@Override
- public CompilationResult compile(String[] args) {
+ public int compile(String[] args, Writer out, Writer err) {
startCall();
try {
- return delegate.compile(args);
+ return delegate.compile(args, out, err);
} finally {
endCall();
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/LinePrefixFilterWriter.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,77 @@
+/*
+ * 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 com.sun.tools.sjavac.server;
+
+import java.io.FilterWriter;
+import java.io.IOException;
+import java.io.Writer;
+
+/**
+ * Inserts {@literal prefix} in front of each line written.
+ *
+ * A line is considered to be terminated by any one of a line feed, a carriage
+ * return, or a carriage return followed immediately by a line feed.
+ */
+public class LinePrefixFilterWriter extends FilterWriter {
+
+ private final String prefix;
+ private boolean atBeginningOfLine = true;
+ private char lastChar = '\0';
+
+ protected LinePrefixFilterWriter(Writer out, String prefix) {
+ super(out);
+ this.prefix = prefix;
+ }
+
+ @Override
+ public void write(String str, int off, int len) throws IOException {
+ for (int i = 0; i < len; i++) {
+ write(str.charAt(off + i));
+ }
+ }
+
+ @Override
+ public void write(char[] cbuf, int off, int len) throws IOException {
+ for (int i = 0; i < len; i++) {
+ write(cbuf[off + i]);
+ }
+ }
+
+ @Override
+ public void write(int c) throws IOException {
+ if (lastChar == '\r' && c == '\n') {
+ // Second character of CR+LF sequence.
+ // Do nothing. We already started a new line on last character.
+ } else {
+ if (atBeginningOfLine) {
+ super.write(prefix, 0, prefix.length());
+ }
+ super.write(c);
+ atBeginningOfLine = c == '\r' || c == '\n';
+ }
+ lastChar = (char) c;
+ }
+}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/RequestHandler.java Tue Sep 22 14:24:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/RequestHandler.java Mon Sep 21 17:49:57 2015 +0200
@@ -24,15 +24,21 @@
*/
package com.sun.tools.sjavac.server;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
+import static com.sun.tools.sjavac.server.SjavacServer.LINE_TYPE_RC;
+import static com.sun.tools.sjavac.server.SjavacServer.LINE_TYPE_STDERR;
+import static com.sun.tools.sjavac.server.SjavacServer.LINE_TYPE_STDOUT;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
+import java.io.Writer;
import java.net.Socket;
+import com.sun.tools.sjavac.AutoFlushWriter;
import com.sun.tools.sjavac.Log;
+
/**
* A RequestHandler handles requests performed over a socket. Specifically it
* - Reads the command string specifying which method is to be invoked
@@ -61,15 +67,26 @@
@Override
public void run() {
- try (ObjectOutputStream oout = new ObjectOutputStream(socket.getOutputStream());
- ObjectInputStream oin = new ObjectInputStream(socket.getInputStream())) {
- String id = (String) oin.readObject();
- String cmd = (String) oin.readObject();
- Log.info("Handling request, id: " + id + " cmd: " + cmd);
- switch (cmd) {
- case SjavacServer.CMD_COMPILE: handleCompileRequest(oin, oout); break;
- default: Log.error("Unknown command: " + cmd);
+ try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
+ PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) {
+
+ // Read argument array
+ int n = Integer.parseInt(in.readLine());
+ String[] args = new String[n];
+ for (int i = 0; i < n; i++) {
+ args[i] = in.readLine();
}
+
+ // Perform compilation
+ Writer stdout = new LinePrefixFilterWriter(new AutoFlushWriter(out), LINE_TYPE_STDOUT + ":");
+ Writer stderr = new LinePrefixFilterWriter(new AutoFlushWriter(out), LINE_TYPE_STDERR + ":");
+ int rc = sjavac.compile(args, stdout, stderr);
+ stdout.flush();
+ stderr.flush();
+
+ // Send return code back to client
+ out.println(LINE_TYPE_RC + ":" + rc);
+
} catch (Exception ex) {
// Not much to be done at this point. The client side request
// code will most likely throw an IOException and the
@@ -79,21 +96,4 @@
Log.error(sw.toString());
}
}
-
- private void handleCompileRequest(ObjectInputStream oin,
- ObjectOutputStream oout) throws IOException {
- try {
- // Read request arguments
- String[] args = (String[]) oin.readObject();
-
- // Perform compilation
- CompilationResult cr = sjavac.compile(args);
-
- // Write request response
- oout.writeObject(cr);
- oout.flush();
- } catch (ClassNotFoundException cnfe) {
- throw new IOException(cnfe);
- }
- }
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/ServerMain.java Tue Sep 22 14:24:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/ServerMain.java Mon Sep 21 17:49:57 2015 +0200
@@ -26,6 +26,7 @@
package com.sun.tools.sjavac.server;
import java.io.IOException;
+import java.io.OutputStreamWriter;
import com.sun.tools.sjavac.Log;
@@ -38,7 +39,8 @@
public class ServerMain {
public static int run(String[] args) {
- Log.initializeLog(System.out, System.err);
+ Log.initializeLog(new OutputStreamWriter(System.out),
+ new OutputStreamWriter(System.err));
// Any options other than --startserver?
if (args.length > 1) {
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/Sjavac.java Tue Sep 22 14:24:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/Sjavac.java Mon Sep 21 17:49:57 2015 +0200
@@ -24,6 +24,8 @@
*/
package com.sun.tools.sjavac.server;
+import java.io.Writer;
+
/**
* Interface of the SjavacImpl, the sjavac client and all wrappers such as
@@ -35,6 +37,10 @@
* deletion without notice.</b>
*/
public interface Sjavac {
- CompilationResult compile(String[] args);
+
+ final static int RC_FATAL = -1;
+ final static int RC_OK = 0;
+
+ int compile(String[] args, Writer stdout, Writer stderr);
void shutdown();
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/SjavacServer.java Tue Sep 22 14:24:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/SjavacServer.java Mon Sep 21 17:49:57 2015 +0200
@@ -53,8 +53,10 @@
*/
public class SjavacServer implements Terminable {
- // Used in protocol to indicate which method to invoke
- public final static String CMD_COMPILE = "compile";
+ // Used in protocol to tell the content of each line
+ public final static String LINE_TYPE_RC = "RC";
+ public final static String LINE_TYPE_STDOUT = "STDOUT";
+ public final static String LINE_TYPE_STDERR = "STDERR";
final private String portfilename;
final private String logfile;
--- a/langtools/test/tools/javac/lib/combo/ReusableContext.java Tue Sep 22 14:24:31 2015 -0400
+++ b/langtools/test/tools/javac/lib/combo/ReusableContext.java Mon Sep 21 17:49:57 2015 +0200
@@ -31,8 +31,12 @@
import com.sun.source.util.TaskListener;
import com.sun.source.util.TreeScanner;
import com.sun.tools.javac.api.MultiTaskListener;
+import com.sun.tools.javac.code.Kinds;
import com.sun.tools.javac.code.Symbol;
import com.sun.tools.javac.code.Symtab;
+import com.sun.tools.javac.code.Type;
+import com.sun.tools.javac.code.Type.ClassType;
+import com.sun.tools.javac.code.TypeTag;
import com.sun.tools.javac.code.Types;
import com.sun.tools.javac.comp.Check;
import com.sun.tools.javac.comp.CompileStates;
@@ -93,23 +97,46 @@
//find if any of the roots have redefined java.* classes
Symtab syms = Symtab.instance(this);
- new TreeScanner<Void, Void>() {
- @Override
- public Void visitClass(ClassTree node, Void aVoid) {
- Symbol sym = ((JCClassDecl)node).sym;
- if (sym != null) {
- syms.classes.remove(sym.flatName());
- if (sym.flatName().toString().startsWith("java.")) {
- polluted = true;
- }
- }
- return super.visitClass(node, aVoid);
- }
- }.scan(roots, null);
+ pollutionScanner.scan(roots, syms);
roots.clear();
}
}
+ /**
+ * This scanner detects as to whether the shared context has been polluted. This happens
+ * whenever a compiled program redefines a core class (in 'java.*' package) or when
+ * (typically because of cyclic inheritance) the symbol kind of a core class has been touched.
+ */
+ TreeScanner<Void, Symtab> pollutionScanner = new TreeScanner<Void, Symtab>() {
+ @Override
+ public Void visitClass(ClassTree node, Symtab syms) {
+ Symbol sym = ((JCClassDecl)node).sym;
+ if (sym != null) {
+ syms.classes.remove(sym.flatName());
+ Type sup = supertype(sym);
+ if (isCoreClass(sym) ||
+ (sup != null && isCoreClass(sup.tsym) && sup.tsym.kind != Kinds.Kind.TYP)) {
+ polluted = true;
+ }
+ }
+ return super.visitClass(node, syms);
+ }
+
+ private boolean isCoreClass(Symbol s) {
+ return s.flatName().toString().startsWith("java.");
+ }
+
+ private Type supertype(Symbol s) {
+ if (s.type == null ||
+ !s.type.hasTag(TypeTag.CLASS)) {
+ return null;
+ } else {
+ ClassType ct = (ClassType)s.type;
+ return ct.supertype_field;
+ }
+ }
+ };
+
@Override
public void finished(TaskEvent e) {
if (e.getKind() == Kind.PARSE) {
--- a/langtools/test/tools/javac/sym/ElementStructureTest.java Tue Sep 22 14:24:31 2015 -0400
+++ b/langtools/test/tools/javac/sym/ElementStructureTest.java Mon Sep 21 17:49:57 2015 +0200
@@ -56,6 +56,7 @@
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.ServiceLoader;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
@@ -76,6 +77,7 @@
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeMirror;
import javax.tools.FileObject;
+import javax.tools.JavaCompiler;
import javax.tools.JavaFileManager;
import javax.tools.JavaFileObject;
import javax.tools.JavaFileObject.Kind;
@@ -88,7 +90,6 @@
import com.sun.tools.javac.api.JavacTaskImpl;
import com.sun.tools.javac.code.Symbol.CompletionFailure;
import com.sun.tools.javac.platform.PlatformProvider;
-import com.sun.tools.javac.util.ServiceLoader;
/**To generate the hash values for version N, invoke this class like:
*
@@ -243,7 +244,11 @@
}
void run(Writer output, String version) throws Exception {
- JavacTaskImpl task = (JavacTaskImpl) ToolProvider.getSystemJavaCompiler().getTask(null, null, null, Arrays.asList("-release", version), null, Arrays.asList(new ToolBox.JavaSource("Test", "")));
+ List<String> options = Arrays.asList("-release", version, "-classpath", "");
+ List<ToolBox.JavaSource> files = Arrays.asList(new ToolBox.JavaSource("Test", ""));
+ JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
+ JavacTaskImpl task = (JavacTaskImpl) compiler.getTask(null, null, null, options, null, files);
+
task.parse();
JavaFileManager fm = task.getContext().get(JavaFileManager.class);
--- a/langtools/test/tools/sjavac/IdleShutdown.java Tue Sep 22 14:24:31 2015 -0400
+++ b/langtools/test/tools/sjavac/IdleShutdown.java Mon Sep 21 17:49:57 2015 +0200
@@ -29,9 +29,9 @@
* @build Wrapper
* @run main Wrapper IdleShutdown
*/
+import java.io.Writer;
import java.util.concurrent.atomic.AtomicLong;
-import com.sun.tools.sjavac.server.CompilationResult;
import com.sun.tools.sjavac.server.IdleResetSjavac;
import com.sun.tools.sjavac.server.Sjavac;
import com.sun.tools.sjavac.server.Terminable;
@@ -65,11 +65,11 @@
// Use Sjavac object and wait less than TIMEOUT_MS in between calls
Thread.sleep(TIMEOUT_MS - 1000);
log("Compiling");
- service.compile(new String[0]);
+ service.compile(new String[0], null, null);
Thread.sleep(TIMEOUT_MS - 1000);
log("Compiling");
- service.compile(new String[0]);
+ service.compile(new String[0], null, null);
if (timeoutTimestamp.get() != -1)
throw new AssertionError("Premature timeout detected.");
@@ -103,13 +103,13 @@
public void shutdown() {
}
@Override
- public CompilationResult compile(String[] args) {
+ public int compile(String[] args, Writer out, Writer err) {
// Attempt to trigger idle timeout during a call by sleeping
try {
Thread.sleep(TIMEOUT_MS + 1000);
} catch (InterruptedException e) {
}
- return null;
+ return 0;
}
}
}
--- a/langtools/test/tools/sjavac/PooledExecution.java Tue Sep 22 14:24:31 2015 -0400
+++ b/langtools/test/tools/sjavac/PooledExecution.java Mon Sep 21 17:49:57 2015 +0200
@@ -30,11 +30,11 @@
* @build Wrapper
* @run main Wrapper PooledExecution
*/
+import java.io.Writer;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;
import com.sun.tools.sjavac.comp.PooledSjavac;
-import com.sun.tools.sjavac.server.CompilationResult;
import com.sun.tools.sjavac.server.Sjavac;
@@ -67,7 +67,7 @@
for (int i = 0; i < NUM_REQUESTS; i++) {
tasks[i] = new Thread() {
public void run() {
- service.compile(new String[0]);
+ service.compile(new String[0], null, null);
tasksFinished.incrementAndGet();
}
};
@@ -109,7 +109,7 @@
AtomicInteger activeRequests = new AtomicInteger(0);
@Override
- public CompilationResult compile(String[] args) {
+ public int compile(String[] args, Writer out, Writer err) {
leftToStart.countDown();
int numActiveRequests = activeRequests.incrementAndGet();
System.out.printf("Left to start: %2d / Currently active: %2d%n",
@@ -123,7 +123,7 @@
}
activeRequests.decrementAndGet();
System.out.println("Task completed");
- return null;
+ return 0;
}
@Override
--- a/make/CompileJavaModules.gmk Tue Sep 22 14:24:31 2015 -0400
+++ b/make/CompileJavaModules.gmk Mon Sep 21 17:49:57 2015 +0200
@@ -534,8 +534,7 @@
## Service types are required in the classpath when compiing module-info
$1_CLASSPATH := $$($1_CLASSPATH) $$(addprefix $(JDK_OUTPUTDIR)/modules/,jdk.hotspot.agent)
endif
- $1_CLASSPATH := $$(subst $$(SPACE),$$(PATH_SEP),$$($1_CLASSPATH))
- $1_JAVAC_FLAGS := -bootclasspath $(EMPTY_DIR) -extdirs $(EMPTY_DIR) -endorseddirs $(EMPTY_DIR) -classpath "$$($1_CLASSPATH)" $$($1_ADD_JAVAC_FLAGS)
+ $1_JAVAC_FLAGS := -bootclasspath $(EMPTY_DIR) -extdirs $(EMPTY_DIR) -endorseddirs $(EMPTY_DIR) $$($1_ADD_JAVAC_FLAGS)
$$(eval $$(call SetupJavaCompilation,$1, \
SETUP := $$(if $$($1_SETUP), $$($1_SETUP), GENERATE_JDKBYTECODE), \
@@ -543,6 +542,7 @@
INCLUDES := $(JDK_USER_DEFINED_FILTER),\
BIN := $$(if $$($1_BIN), $$($1_BIN), $(JDK_OUTPUTDIR)/modules/$1), \
HEADERS := $(SUPPORT_OUTPUTDIR)/headers/$1, \
+ CLASSPATH := $$($1_CLASSPATH), \
ADD_JAVAC_FLAGS := $$($1_ADD_JAVAC_FLAGS) $$($1_JAVAC_FLAGS)))
$1: $$($1) $$($1_COPY_EXTRA)
--- a/make/Init.gmk Tue Sep 22 14:24:31 2015 -0400
+++ b/make/Init.gmk Mon Sep 21 17:49:57 2015 +0200
@@ -50,7 +50,7 @@
include $(topdir)/make/Help.gmk
# Targets provided by Init.gmk.
- ALL_INIT_TARGETS := print-modules print-targets reconfigure
+ ALL_INIT_TARGETS := print-modules print-targets print-configuration reconfigure
# CALLED_TARGETS is the list of targets that the user provided,
# or "default" if unspecified.
@@ -228,6 +228,9 @@
$(MAKE) $(MAKE_ARGS) -j 1 -f make/Main.gmk $(USER_MAKE_VARS) \
NO_RECIPES=true print-targets )
+ print-configuration:
+ $(ECHO) $(CONFIGURE_COMMAND_LINE)
+
reconfigure:
ifneq ($(CONFIGURE_COMMAND_LINE), )
$(ECHO) "Re-running configure using arguments '$(CONFIGURE_COMMAND_LINE)'"
--- a/make/common/JavaCompilation.gmk Tue Sep 22 14:24:31 2015 -0400
+++ b/make/common/JavaCompilation.gmk Mon Sep 21 17:49:57 2015 +0200
@@ -403,6 +403,7 @@
# SRC:=one or more directories to search for sources. The order of the source roots
# is significant. The first found file of a certain name has priority.
# BIN:=store classes here
+# CLASSPATH:=a list of additional entries to set as classpath to javac
# INCLUDES:=myapp.foo means will only compile java files in myapp.foo or any of its sub-packages.
# EXCLUDES:=myapp.foo means will do not compile java files in myapp.foo or any of its sub-packages.
# COPY:=.prp means copy all prp files to the corresponding package in BIN.
@@ -428,6 +429,9 @@
$1_JVM := $$($$($1_SETUP)_JVM)
$1_JAVAC := $$($$($1_SETUP)_JAVAC)
$1_FLAGS := $$($$($1_SETUP)_FLAGS) $(JAVAC_FLAGS) $$($1_ADD_JAVAC_FLAGS)
+ ifneq ($$($1_CLASSPATH), )
+ $1_FLAGS += -cp $$(call PathList, $$($1_CLASSPATH))
+ endif
ifeq ($$($1_JAVAC),)
$$(error The Java compilation $1 refers to a non-existant java compiler setup $$($1_SETUP))
endif
@@ -482,7 +486,7 @@
$$(addprefix -i ,$$(addsuffix /*,$$($1_INCLUDES))) \
$$(addprefix -xf *,$$(strip $$($1_EXCLUDE_FILES) $$($1_SJAVAC_EXCLUDE_FILES))) \
$$(addprefix -if *,$$(strip $$($1_INCLUDE_FILES))) \
- -src "$$(subst $$(SPACE),$$(PATH_SEP),$$(strip $$($1_SRC)))"
+ -src $$(call PathList, $$($1_SRC))
# All files below META-INF are always copied.
$1_ALL_COPIES := $$(filter $$(addsuffix /META-INF%,$$($1_SRC)),$$($1_ALL_SRCS))
--- a/make/common/MakeBase.gmk Tue Sep 22 14:24:31 2015 -0400
+++ b/make/common/MakeBase.gmk Mon Sep 21 17:49:57 2015 +0200
@@ -41,6 +41,29 @@
# next make invocation.
.DELETE_ON_ERROR:
+################################################################################
+# Definitions for special characters
+################################################################################
+
+# When calling macros, the spaces between arguments are
+# often semantically important! Sometimes we need to subst
+# spaces and commas, therefore we need the following macros.
+X:=
+SPACE:=$(X) $(X)
+COMMA:=,
+DOLLAR:=$$
+HASH:=\#
+LEFT_PAREN:=(
+RIGHT_PAREN:=)
+SQUOTE:='
+#'
+DQUOTE:="
+#"
+define NEWLINE
+
+
+endef
+
##############################
# Functions
##############################
@@ -780,6 +803,14 @@
endif
################################################################################
+# Return a string suitable for use after a -classpath option. It will correct and safe to use
+# on all platforms. Arguments are given as space separate classpath entries.
+# param 1 : A space separated list of classpath entries
+# The surrounding strip is needed to keep additional whitespace out
+PathList = \
+ "$(subst $(SPACE),$(PATH_SEP),$(strip $1))"
+
+################################################################################
# Hook to include the corresponding custom file, if present.
$(eval $(call IncludeCustomExtension, , common/MakeBase.gmk))
--- a/make/common/NativeCompilation.gmk Tue Sep 22 14:24:31 2015 -0400
+++ b/make/common/NativeCompilation.gmk Mon Sep 21 17:49:57 2015 +0200
@@ -624,28 +624,7 @@
$1_DEBUGINFO_FILES := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).pdb \
$$($1_OBJECT_DIR)/$$($1_NOSUFFIX).map
- else ifeq ($(OPENJDK_TARGET_OS), solaris)
- $1_DEBUGINFO_FILES := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).debuginfo
- # Setup the command line creating debuginfo files, to be run after linking.
- # It cannot be run separately since it updates the original target file
- #
- # gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set.
- # Use $(FIX_EMPTY_SEC_HDR_FLAGS) to clear the SHF_ALLOC flag (if set) from
- # empty section headers until a fixed $(OBJCOPY) is available.
- # An empty section header has sh_addr == 0 and sh_size == 0.
- # This problem has only been seen on Solaris X64, but we call this tool
- # on all Solaris builds just in case.
- #
- # $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections.
- # Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available.
- $1_CREATE_DEBUGINFO_CMDS := \
- $(FIX_EMPTY_SEC_HDR_FLAGS) $(LOG_INFO) $$($1_TARGET) $$(NEWLINE) \
- $(OBJCOPY) --only-keep-debug $$($1_TARGET) $$($1_DEBUGINFO_FILES) $$(NEWLINE) \
- $(CD) $$($1_OUTPUT_DIR) && \
- $(ADD_GNU_DEBUGLINK) $(LOG_INFO) $$($1_DEBUGINFO_FILES) $$($1_TARGET)
- $1_DEBUGINFO_EXTRA_DEPS := $(FIX_EMPTY_SEC_HDR_FLAGS) $(ADD_GNU_DEBUGLINK)
-
- else ifeq ($(OPENJDK_TARGET_OS), linux)
+ else ifneq ($(findstring $(OPENJDK_TARGET_OS), linux solaris), )
$1_DEBUGINFO_FILES := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).debuginfo
# Setup the command line creating debuginfo files, to be run after linking.
# It cannot be run separately since it updates the original target file
@@ -653,7 +632,6 @@
$(OBJCOPY) --only-keep-debug $$($1_TARGET) $$($1_DEBUGINFO_FILES) $$(NEWLINE) \
$(CD) $$($1_OUTPUT_DIR) && \
$(OBJCOPY) --add-gnu-debuglink=$$($1_DEBUGINFO_FILES) $$($1_TARGET)
-
endif # No MacOS X support
# This dependency dance ensures that debug info files get rebuilt
@@ -694,7 +672,7 @@
$$($1_OBJECT_DIR)/$$($1_NOSUFFIX).vardeps)
$$($1_TARGET): $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_REAL_MAPFILE) \
- $$($1_DEBUGINFO_EXTRA_DEPS) $$($1_VARDEPS_FILE)
+ $$($1_VARDEPS_FILE)
$(ECHO) $(LOG_INFO) "Linking $$($1_BASENAME)"
$(call LogFailures, $$($1_OBJECT_DIR)/$1_link.log, $1_link, \
$$($1_LD) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $$($1_SYSROOT_LDFLAGS) \
@@ -735,7 +713,7 @@
$$($1_OBJECT_DIR)/$$($1_NOSUFFIX).vardeps)
$$($1_TARGET): $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_MANIFEST) \
- $$($1_DEBUGINFO_EXTRA_DEPS) $$($1_VARDEPS_FILE)
+ $$($1_VARDEPS_FILE)
$(ECHO) $(LOG_INFO) "Linking executable $$($1_BASENAME)"
$(call LogFailures, $$($1_OBJECT_DIR)/$1_link.log, $1_link, \
$$($1_LD) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $$($1_SYSROOT_LDFLAGS) \
--- a/make/common/SetupJavaCompilers.gmk Tue Sep 22 14:24:31 2015 -0400
+++ b/make/common/SetupJavaCompilers.gmk Mon Sep 21 17:49:57 2015 +0200
@@ -78,7 +78,7 @@
SERVER_DIR := $(SJAVAC_SERVER_DIR), \
SERVER_JVM := $(SJAVAC_SERVER_JAVA)))
-JDK_BOOTCLASSPATH := $(subst $(SPACE),$(PATH_SEP),\
+JDK_BOOTCLASSPATH := $(call PathList, \
$(filter-out $(JDK_OUTPUTDIR)/modules/_%, $(wildcard $(JDK_OUTPUTDIR)/modules/*)))
# After the jdk is built, we want to build demos using only the recently
@@ -88,7 +88,7 @@
$(eval $(call SetupJavaCompiler,GENERATE_USINGJDKBYTECODE, \
JVM := $(JAVA_SMALL), \
JAVAC := $(NEW_JAVAC), \
- FLAGS := -bootclasspath "$(JDK_BOOTCLASSPATH)" $(DISABLE_WARNINGS), \
+ FLAGS := -bootclasspath $(JDK_BOOTCLASSPATH) $(DISABLE_WARNINGS), \
SERVER_DIR := $(SJAVAC_SERVER_DIR), \
SERVER_JVM := $(SJAVAC_SERVER_JAVA)))
--- a/make/common/TestFilesCompilation.gmk Tue Sep 22 14:24:31 2015 -0400
+++ b/make/common/TestFilesCompilation.gmk Mon Sep 21 17:49:57 2015 +0200
@@ -32,8 +32,6 @@
include NativeCompilation.gmk
-# FIXME: This is a bad fix currently needed due to JDK-8064808 not being resolved.
-include $(JDK_TOPDIR)/make/Tools.gmk
# Setup make rules for creating a set of native test files (libraries or
# executables). This will locate native files matching a certain pattern,
--- a/nashorn/.hgtags Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/.hgtags Mon Sep 21 17:49:57 2015 +0200
@@ -314,3 +314,4 @@
6f634e84387e97b2421d5e776e46935784156d1c jdk9-b78
9b3eca69b88b2d1bebce92d58280ae66fc0b6091 jdk9-b79
61b401b23fc28208930977d46b690423911173c6 jdk9-b80
+42d8ed4651b62572b39e6fed3fafcb7ee93f9dc2 jdk9-b81
--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ClassGenerator.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ClassGenerator.java Mon Sep 21 17:49:57 2015 +0200
@@ -54,10 +54,9 @@
import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_NEWMAP;
import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_NEWMAP_DESC;
import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_TYPE;
-import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTIONIMPL_MAKEFUNCTION;
-import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTIONIMPL_MAKEFUNCTION_DESC;
-import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTIONIMPL_MAKEFUNCTION_SPECS_DESC;
-import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTIONIMPL_TYPE;
+import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_CREATEBUILTIN;
+import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_CREATEBUILTIN_DESC;
+import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_CREATEBUILTIN_SPECS_DESC;
import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETARITY;
import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETARITY_DESC;
import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_TYPE;
@@ -282,9 +281,9 @@
assert specs != null;
if (!specs.isEmpty()) {
mi.memberInfoArray(className, specs);
- mi.invokeStatic(SCRIPTFUNCTIONIMPL_TYPE, SCRIPTFUNCTIONIMPL_MAKEFUNCTION, SCRIPTFUNCTIONIMPL_MAKEFUNCTION_SPECS_DESC);
+ mi.invokeStatic(SCRIPTFUNCTION_TYPE, SCRIPTFUNCTION_CREATEBUILTIN, SCRIPTFUNCTION_CREATEBUILTIN_SPECS_DESC);
} else {
- mi.invokeStatic(SCRIPTFUNCTIONIMPL_TYPE, SCRIPTFUNCTIONIMPL_MAKEFUNCTION, SCRIPTFUNCTIONIMPL_MAKEFUNCTION_DESC);
+ mi.invokeStatic(SCRIPTFUNCTION_TYPE, SCRIPTFUNCTION_CREATEBUILTIN, SCRIPTFUNCTION_CREATEBUILTIN_DESC);
}
if (arityFound) {
--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ConstructorGenerator.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ConstructorGenerator.java Mon Sep 21 17:49:57 2015 +0200
@@ -38,9 +38,8 @@
import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROTOTYPEOBJECT_SETCONSTRUCTOR;
import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROTOTYPEOBJECT_SETCONSTRUCTOR_DESC;
import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROTOTYPEOBJECT_TYPE;
-import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTIONIMPL_INIT_DESC3;
-import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTIONIMPL_INIT_DESC4;
-import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTIONIMPL_TYPE;
+import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_INIT_DESC3;
+import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_INIT_DESC4;
import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETARITY;
import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETARITY_DESC;
import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETPROTOTYPE;
@@ -76,7 +75,7 @@
byte[] getClassBytes() {
// new class extending from ScriptObject
- final String superClass = (constructor != null)? SCRIPTFUNCTIONIMPL_TYPE : SCRIPTOBJECT_TYPE;
+ final String superClass = (constructor != null)? SCRIPTFUNCTION_TYPE : SCRIPTOBJECT_TYPE;
cw.visit(V1_7, ACC_FINAL, className, null, superClass, null);
if (memberCount > 0) {
// add fields
@@ -182,8 +181,8 @@
loadMap(mi);
} else {
// call Function.<init>
- superClass = SCRIPTFUNCTIONIMPL_TYPE;
- superDesc = (memberCount > 0) ? SCRIPTFUNCTIONIMPL_INIT_DESC4 : SCRIPTFUNCTIONIMPL_INIT_DESC3;
+ superClass = SCRIPTFUNCTION_TYPE;
+ superDesc = (memberCount > 0) ? SCRIPTFUNCTION_INIT_DESC4 : SCRIPTFUNCTION_INIT_DESC3;
mi.loadLiteral(constructor.getName());
mi.visitLdcInsn(new Handle(H_INVOKESTATIC, scriptClassInfo.getJavaName(), constructor.getJavaName(), constructor.getJavaDesc()));
loadMap(mi);
--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/StringConstants.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/StringConstants.java Mon Sep 21 17:49:57 2015 +0200
@@ -31,10 +31,9 @@
import java.util.Collections;
import java.util.List;
import jdk.internal.org.objectweb.asm.Type;
-import jdk.nashorn.internal.objects.PrototypeObject;
-import jdk.nashorn.internal.objects.ScriptFunctionImpl;
import jdk.nashorn.internal.runtime.AccessorProperty;
import jdk.nashorn.internal.runtime.PropertyMap;
+import jdk.nashorn.internal.runtime.PrototypeObject;
import jdk.nashorn.internal.runtime.ScriptFunction;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.Specialization;
@@ -88,7 +87,6 @@
static final Type TYPE_PROPERTYMAP = Type.getType(PropertyMap.class);
static final Type TYPE_PROTOTYPEOBJECT = Type.getType(PrototypeObject.class);
static final Type TYPE_SCRIPTFUNCTION = Type.getType(ScriptFunction.class);
- static final Type TYPE_SCRIPTFUNCTIONIMPL = Type.getType(ScriptFunctionImpl.class);
static final Type TYPE_SCRIPTOBJECT = Type.getType(ScriptObject.class);
static final String PROTOTYPE_SUFFIX = "$Prototype";
@@ -122,17 +120,14 @@
static final String SCRIPTFUNCTION_SETARITY_DESC = Type.getMethodDescriptor(Type.VOID_TYPE, Type.INT_TYPE);
static final String SCRIPTFUNCTION_SETPROTOTYPE = "setPrototype";
static final String SCRIPTFUNCTION_SETPROTOTYPE_DESC = Type.getMethodDescriptor(Type.VOID_TYPE, TYPE_OBJECT);
-
- // ScriptFunctionImpl
- static final String SCRIPTFUNCTIONIMPL_TYPE = TYPE_SCRIPTFUNCTIONIMPL.getInternalName();
- static final String SCRIPTFUNCTIONIMPL_MAKEFUNCTION = "makeFunction";
- static final String SCRIPTFUNCTIONIMPL_MAKEFUNCTION_DESC =
+ static final String SCRIPTFUNCTION_CREATEBUILTIN = "createBuiltin";
+ static final String SCRIPTFUNCTION_CREATEBUILTIN_DESC =
Type.getMethodDescriptor(TYPE_SCRIPTFUNCTION, TYPE_STRING, TYPE_METHODHANDLE);
- static final String SCRIPTFUNCTIONIMPL_MAKEFUNCTION_SPECS_DESC =
+ static final String SCRIPTFUNCTION_CREATEBUILTIN_SPECS_DESC =
Type.getMethodDescriptor(TYPE_SCRIPTFUNCTION, TYPE_STRING, TYPE_METHODHANDLE, TYPE_SPECIALIZATION_ARRAY);
- static final String SCRIPTFUNCTIONIMPL_INIT_DESC3 =
+ static final String SCRIPTFUNCTION_INIT_DESC3 =
Type.getMethodDescriptor(Type.VOID_TYPE, TYPE_STRING, TYPE_METHODHANDLE, TYPE_SPECIALIZATION_ARRAY);
- static final String SCRIPTFUNCTIONIMPL_INIT_DESC4 =
+ static final String SCRIPTFUNCTION_INIT_DESC4 =
Type.getMethodDescriptor(Type.VOID_TYPE, TYPE_STRING, TYPE_METHODHANDLE, TYPE_PROPERTYMAP, TYPE_SPECIALIZATION_ARRAY);
// ScriptObject
--- a/nashorn/make/BuildNashorn.gmk Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/make/BuildNashorn.gmk Mon Sep 21 17:49:57 2015 +0200
@@ -31,7 +31,7 @@
include JavaCompilation.gmk
include SetupJavaCompilers.gmk
-JDK_CLASSES := $(subst $(SPACE),$(PATH_SEP),$(strip $(addprefix $(JDK_OUTPUTDIR)/modules/, \
+JDK_CLASSES := $(call PathList, $(strip $(addprefix $(JDK_OUTPUTDIR)/modules/, \
java.base java.logging java.scripting)))
NASHORN_JAR := $(IMAGES_OUTPUTDIR)/nashorn.jar
@@ -48,7 +48,7 @@
$(eval $(call SetupJavaCompiler,GENERATE_NEWBYTECODE_DEBUG, \
JVM := $(JAVA), \
JAVAC := $(NEW_JAVAC), \
- FLAGS := -g -source 8 -target 8 -bootclasspath "$(JDK_CLASSES)", \
+ FLAGS := -g -source 8 -target 8 -bootclasspath $(JDK_CLASSES), \
SERVER_DIR := $(SJAVAC_SERVER_DIR), \
SERVER_JVM := $(SJAVAC_SERVER_JAVA)))
@@ -86,7 +86,8 @@
$(RM) -rf $(@D)/jdk $(@D)/netscape
$(CP) -R -p $(SUPPORT_OUTPUTDIR)/special_classes/jdk.scripting.nashorn/classes/* $(@D)/
$(FIXPATH) $(JAVA) \
- -Xbootclasspath/p:"$(BUILDTOOLS_OUTPUTDIR)/nasgen_classes$(PATH_SEP)$(SUPPORT_OUTPUTDIR)/special_classes/jdk.scripting.nashorn/classes" \
+ -Xbootclasspath/p:$(call PathList, $(BUILDTOOLS_OUTPUTDIR)/nasgen_classes \
+ $(SUPPORT_OUTPUTDIR)/special_classes/jdk.scripting.nashorn/classes) \
jdk.nashorn.internal.tools.nasgen.Main $(@D) jdk.nashorn.internal.objects $(@D)
$(TOUCH) $@
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/EvalWithArbitraryThis.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import javax.script.*;
+import jdk.nashorn.api.scripting.*;
+
+// Simple nashorn demo that evals a script with arbitrary script
+// object bound as "this" for the evaluated script.
+
+public class EvalWithArbitraryThis {
+ public static void main(String[] args) throws Exception {
+ ScriptEngineManager m = new ScriptEngineManager();
+ ScriptEngine e = m.getEngineByName("nashorn");
+ Object sobj = e.eval("( { foo: 343, bar: 'hello' } )");
+
+ // "this" bound to sobj in this eval.
+ // so it prints sobj.foo and sobj.bar.
+ ((ScriptObjectMirror)sobj).eval("print(this.foo); print(this.bar)");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/EvalWithArbitraryThis.java.orig Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import javax.script.*;
+import jdk.nashorn.api.scripting.*;
+
+// Simple nashorn demo that evals a script with arbitrary script
+// object bound as "this" for the evaluated script.
+
+public class EvalWithArbitraryThis {
+ public static void main(String[] args) throws Exception {
+ ScriptEngineManager m = new ScriptEngineManager();
+ ScriptEngine e = m.getEngineByName("nashorn");
+ Object sobj = e.eval("( { foo: 343, bar: 'hello' } )");
+
+ // "this" bound to sobj in this eval.
+ // so it prints sobj.foo and sobj.bar.
+ ((ScriptObjectMirror)sobj).eval("print(this.foo); print(this.bar)");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/LambdaAsFunc.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import javax.script.*;
+import java.util.function.*;
+
+// example demonstrating that arbitrary Lambda can be called as function from script
+
+public class LambdaAsFunc {
+ public static void main(String[] args) throws Exception {
+ ScriptEngineManager m = new ScriptEngineManager();
+ ScriptEngine e = m.getEngineByName("nashorn");
+
+ // expose a lambda as top-level script function
+ e.put("upper", (Function<String, String>) String::toUpperCase);
+
+ // call lambda as though it is a normal script function
+ System.out.println(e.eval("upper('hello')"));
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/Main.asm Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// Simple sample to demonstrate openjdk asmtools assembler with
+// nashorn dynalink linker in a invokedynamic instruction.
+//
+// To assemble this file, use the following command:
+//
+// java -cp <asmtools.jar> org.openjdk.asmtools.Main jasm Main.asm
+//
+// See also: https://wiki.openjdk.java.net/display/CodeTools/asmtools
+//
+// NOTE: Uses nashorn internals and so *may* break with later nashorn!
+
+super public class Main
+ version 52:0
+{
+
+
+public Method "<init>":"()V"
+ stack 1 locals 1
+{
+ aload_0;
+ invokespecial Method java/lang/Object."<init>":"()V";
+ return;
+}
+
+public static Method main:"([Ljava/lang/String;)V"
+ stack 2 locals 2
+{
+ // List l = new ArrayList();
+ new class java/util/ArrayList;
+ dup;
+ invokespecial Method java/util/ArrayList."<init>":"()V";
+ astore_1;
+ aload_1;
+
+ // l.add("hello");
+ ldc String "hello";
+ invokeinterface InterfaceMethod java/util/List.add:"(Ljava/lang/Object;)Z", 2;
+ pop;
+
+ // l.add("world");
+ aload_1;
+ ldc String "world";
+ invokeinterface InterfaceMethod java/util/List.add:"(Ljava/lang/Object;)Z", 2;
+ pop;
+
+ // printLength(l);
+ aload_1;
+ invokestatic Method printLength:"(Ljava/lang/Object;)V";
+
+ // printLength(args); // args is argument of main method
+ aload_0;
+ invokestatic Method printLength:"(Ljava/lang/Object;)V";
+ return;
+}
+
+private static Method printLength:"(Ljava/lang/Object;)V"
+ stack 2 locals 1
+{
+ getstatic Field java/lang/System.out:"Ljava/io/PrintStream;";
+ aload_0;
+
+ // Using nashorn embedded dynalink linker with the following invokedynamic
+ // 'length' property on a bean - arrays, lists supported
+
+ invokedynamic InvokeDynamic REF_invokeStatic:jdk/nashorn/internal/runtime/linker/Bootstrap.bootstrap:"(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;I)Ljava/lang/invoke/CallSite;":"dyn:getProp|getElem|getMethod:length":"(Ljava/lang/Object;)Ljava/lang/Object;" int 0;
+
+ // print 'length' value
+ invokevirtual Method java/io/PrintStream.println:"(Ljava/lang/Object;)V";
+ return;
+}
+
+} // end Class Main
Binary file nashorn/samples/Main.class has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/PrintToString.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import javax.script.*;
+import java.io.StringWriter;
+
+// simple example demonstrating capturing of "print" output
+// from script execution as a String via script engine API.
+
+public class PrintToString {
+ public static void main(String[] args) throws ScriptException {
+ ScriptEngineManager m = new ScriptEngineManager();
+ ScriptEngine e = m.getEngineByName("nashorn");
+ StringWriter sw = new StringWriter();
+ e.getContext().setWriter(sw);
+ e.eval("print('hello world')");
+ System.out.println(sw.toString());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/array_removeif.js Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// Sample for Collection.removeIf and Java.to
+// See http://docs.oracle.com/javase/8/docs/api/java/util/Collection.html#removeIf-java.util.function.Predicate-
+
+var langs = [
+ "java", "javascript",
+ "C", "C#", "C++",
+ "Erlang", "Haskell"
+];
+
+// convert script array to a Java List
+function asList(array) {
+ return Java.to(array, java.util.List);
+}
+
+// remove elements that satisfy a predicate
+// using Collection.removeIf(Predicate)
+asList(langs).removeIf(
+ function(s) s.startsWith("C"));
+
+// print modified array
+print(langs);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/bind_on_java.js Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// sample to demonstrate calling Function.prototype.bind on Java methods.
+
+var DoubleStream = java.util.stream.DoubleStream;
+var r = new java.util.Random();
+
+// bind "this" for nextGaussian method of Random class
+var next = Function.bind.call(r.nextGaussian, r);
+
+// next is used as no argument "function"
+DoubleStream
+ .generate(function() next())
+ .limit(100)
+ .forEach(print);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/call_bind_java.js Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// Sample demonstrating calling Java methods like normal
+// functions. Bound instance methods, static methods can be
+// called like normal script functions.
+
+// Java types used
+var Files = Java.type("java.nio.file.Files");
+var FileSystems = Java.type("java.nio.file.FileSystems");
+var System = Java.type("java.lang.System");
+
+var fs = FileSystems.default;
+var bind = Function.prototype.bind;
+
+// Java methods as "functions"
+
+// Java method with bound "this"
+var Path = bind.call(fs.getPath, fs);
+// Java static method
+var Property = System.getProperty;
+
+// call Java static methods and bound instance methods
+// like normal script functions.
+
+var root = Path("/");
+// print URI for root dir
+print(root.toUri());
+var home = Path(Property("user.home"));
+// list home directory
+Files.walk(home).forEach(print);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/check_nashorn.js Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// check if script is being run using nashorn script engine
+function isNashorn() {
+ try {
+ // "engine" variable is of type javax.script.ScriptEngine is defined
+ // by nashorn jsr-223 engine. Check the name of the engine from
+ // javax.script.ScriptEngineFactory associated
+
+ return engine.factory.engineName.contains("Nashorn");
+ } catch (e) {
+ // if engine or any of the properties are undefined
+ // then script is not being run using nashorn.
+ return false;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/datetime.js Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// converting b/w JavaScript Date and Java LocalDateTime
+
+// JavaScript Date with current time
+var d = new Date();
+print(d);
+
+// Java 8 java.time classes used
+var Instant = java.time.Instant;
+var LocalDateTime = java.time.LocalDateTime;
+var ZoneId = java.time.ZoneId;
+
+// Date.prototype.getTime
+
+// getTime() method returns the numeric value corresponding to the time
+// for the specified date according to universal time. The value returned
+// by the getTime() method is the number of milliseconds since 1 January 1970 00:00:00 UTC.
+// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTime
+
+// Java Instant.ofEpochMilli to convert time in milliseconds to Instant object
+// https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html#ofEpochMilli-long-
+
+var instant = Instant.ofEpochMilli(d.getTime());
+
+// Instant to LocalDateTime using LocalDateTime.ofInstant
+// https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html#ofInstant-java.time.Instant-java.time.ZoneId-
+
+var ldt = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
+print(ldt);
+
+// converting a LocalDateTime to JavaScript Date
+// convert LocalDateTime to Instant first
+// https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html#atZone-java.time.ZoneId-
+
+var instant = ldt.atZone(ZoneId.systemDefault()).toInstant();
+
+// instant to to epoch milliseconds
+// https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html#toEpochMilli--
+// and then to JavaScript Date from time in milliseconds
+// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date
+
+var d1 = new Date(instant.toEpochMilli());
+print(d1);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/defaults.js Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// print default methods of a Java class
+
+if (arguments.length == 0) {
+ print("Usage: jjs defaults.js -- <java class name>");
+ exit(1);
+}
+
+var jclass = Java.type(arguments[0]).class;
+for each (m in jclass.methods) {
+ // http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html#isDefault--
+ if (m.default) print(m);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/find_max_lines.js Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// Find the file with maximum number of lines
+
+var Files = Java.type("java.nio.file.Files");
+var Integer = Java.type("java.lang.Integer");
+var Paths = Java.type("java.nio.file.Paths");
+
+var file = arguments.length == 0? "." : arguments[0];
+var ext = arguments.length > 1? arguments[1] : ".java";
+var path = Paths.get(file);
+
+// return number of lines in given Path (that represents a file)
+function lines(p) {
+ var strm = Files.lines(p);
+ try {
+ return strm.count();
+ } finally {
+ strm.close();
+ }
+}
+
+// walk files, map to file and lines, find the max
+var obj = Files.find(path, Integer.MAX_VALUE,
+ function(p, a) !p.toFile().isDirectory() && p.toString().endsWith(ext)).
+map(function(p) ({ path : p, lines: lines(p) })).
+max(function(x, y) x.lines - y.lines).get();
+
+// print path and lines of the max line file
+print(obj.path, obj.lines);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/fixed_point.js Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// Simple sample demonstrating "fixed point" computation with Streams
+
+// See also https://mitpress.mit.edu/sicp/chapter1/node21.html#secprocgeneralmethods
+var Stream = Java.type("java.util.stream.Stream");
+
+// generic fixed point procedure
+function fixed_point(f, init_guess) {
+ var tolerance = 0.00001;
+ function close_enough(v1, v2) Math.abs(v1 - v2) < tolerance;
+
+ var prev;
+ return Stream.iterate(init_guess, f)
+ .filter(function(x) {
+ try {
+ return prev == undefined? false : close_enough(prev, x);
+ } finally {
+ prev = x;
+ }
+ })
+ .findFirst()
+ .get();
+}
+
+// solution to x = cos(x)
+print(fixed_point(Math.cos, 1.0))
+
+// solution to x = sin(x) + cos(x)
+print(fixed_point(function(x) Math.sin(x) + Math.cos(x), 1.0));
+
+// square root by Newton's method
+// http://en.wikipedia.org/wiki/Newton's_method
+function sqrt(n)
+ fixed_point(function(x) (x + n/x) / 2, 2.0);
+
+print(sqrt(2))
+print(sqrt(3))
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/importstatic.js Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// Java like "import static class_name.*" for nashorn
+
+function importStatic(clazz) {
+ // make sure the argument is a Java type
+ if (! Java.isType(clazz)) {
+ throw new TypeError(clazz + " is not a Java type");
+ }
+
+ // bind properties of clazz to an object
+ var obj = Object.bindProperties({}, clazz);
+
+ // copy properties to global to "import" those
+ for (var i in obj) {
+ this[i] = obj[i];
+ }
+}
+
+importStatic(java.time.Instant);
+print(now());
+print(ofEpochSecond(1));
+print(parse("2007-12-03T10:15:30.00Z"));
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/java_completion.js Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// Simple sample demonstrating the use of JShell API with nashorn
+
+// display source code completion suggestions for a Java snippet using JShell's API
+// See http://openjdk.java.net/projects/kulla/
+
+var repl = Java.type("jdk.jshell.JShell").create()
+var analysis = repl.sourceCodeAnalysis()
+var code = "System."
+var suggestions = analysis.completionSuggestions(code, code.length, [0])
+suggestions.forEach(function(s) print(s.continuation))
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/jrtlist.js Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// list contents of "jrt" file system in Java 9
+
+with(new JavaImporter(java.nio.file, java.net)) {
+ var fs = FileSystems.getFileSystem(URI.create("jrt:/"))
+ Files.walk(fs.getPath("/")).forEach(print);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/mothers_day.js Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,56 @@
+# compute Mothers day of the given the year
+
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// print "Mother's day" of the given year using Java Time API
+
+if (arguments.length == 0) {
+ print("Usage: jjs mothers_day.js -- year");
+ exit(1);
+}
+
+// java classes used
+var DayOfWeek = java.time.DayOfWeek;
+var LocalDate = java.time.LocalDate;
+var TemporalAdjusters = java.time.temporal.TemporalAdjusters;
+
+var year = parseInt(arguments[0]);
+
+// See: https://en.wikipedia.org/?title=Mother%27s_Day
+// We need second Sunday of May. Make April 30 of the given
+// year adjust and adjust to next Sunday from there twice. To adjust a Date
+// we use a common TemporalAdjuster provided in JDK8.
+// https://docs.oracle.com/javase/8/docs/api/java/time/temporal/TemporalAdjusters.html
+
+print(LocalDate.of(year, 4, 30).
+ with(TemporalAdjusters.next(DayOfWeek.SUNDAY)).
+ with(TemporalAdjusters.next(DayOfWeek.SUNDAY)));
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/passwordgen.js Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// Simple password generator using SecureRandom + stream API
+
+// accept optional password length from command line
+var len = arguments.length? parseInt(arguments[0]) : 8;
+
+// Java types used
+var Collectors = Java.type("java.util.stream.Collectors");
+var SecureRandom = Java.type("java.security.SecureRandom");
+
+// allowed password chars
+var chars =
+ "!@#$%ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+
+// generated and print password
+print(new SecureRandom().
+ ints(len, 0, chars.length).
+ mapToObj(function(i) chars[i]).
+ collect(Collectors.joining("")));
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/print_symlinks.js Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// Print all symbolic links in user's home directory
+
+// JavaImporter and "with" to simulate "import" statements in Java.
+// See https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions
+
+with (new JavaImporter(java.nio.file, java.lang)) {
+
+ var userDir = System.getProperty("user.dir")
+ var home = FileSystems.default.getPath(userDir);
+
+ // JS functions can be passed where Java lambdas are required.
+ // Also, using "Expression closure" extension here.
+ // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Expression_Closures
+
+ Files.walk(home).
+ filter(function(p) Files.isSymbolicLink(p)).
+ forEach(function(p)
+ print(p, '->', Files.readSymbolicLink(p)));
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/sort_by_java8.js Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// Simple sorting with Java8 APIs
+
+// Separation key-extraction from key ordering
+
+// Simple demo for Comparator.comparing
+// http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#comparing-java.util.function.Function-
+
+// data to be sorted
+var cards = [
+ { name: "hello", email: "foo@hello.com" },
+ { name: "world", email: "bar@world.com" },
+ { name: "see", email: "see@dontsee.com" },
+];
+
+var Collections = java.util.Collections;
+var Comparator = java.util.Comparator;
+
+// sort records name in reverse order of names
+Collections.sort(cards,
+ Comparator.comparing(function(a) a.name).reversed());
+
+print(JSON.stringify(cards))
+
+// sort records by email
+Collections.sort(cards,
+ Comparator.comparing(function(a) a.email));
+
+print(JSON.stringify(cards))
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/this_for_eval.js Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// how to pass arbitrary "this" object for eval'ed script?
+
+var obj = { foo: 44 };
+
+// the following won't work. eval.apply is indirect eval call
+// and so 'this' will be global object always! So, this
+// line will print 'undefined'
+eval.apply(obj, [ " print(this.foo)" ]);
+
+obj.myEval = eval;
+
+// still won't work - still indirect 'eval' call!
+// still undefined is printed!
+obj.myEval("print(this.foo)");
+
+function func(code) {
+ eval(code);
+}
+
+// eval called inside func and so get's func's "this" as it's "this"!
+// So, 44 is printed
+
+func.apply(obj, [ "print(this.foo)" ]);
--- a/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Console.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Console.java Mon Sep 21 17:49:57 2015 +0200
@@ -49,9 +49,9 @@
Console(final InputStream cmdin, final PrintStream cmdout, final File historyFile,
final Completer completer) throws IOException {
+ TerminalFactory.registerFlavor(Flavor.WINDOWS, isCygwin()? JJSUnixTerminal::new : JJSWindowsTerminal::new);
+ TerminalFactory.registerFlavor(Flavor.UNIX, JJSUnixTerminal::new);
in = new ConsoleReader(cmdin, cmdout);
- TerminalFactory.registerFlavor(Flavor.WINDOWS, JJSWindowsTerminal :: new);
- TerminalFactory.registerFlavor(Flavor.UNIX, JJSUnixTerminal :: new);
in.setExpandEvents(false);
in.setHandleUserInterrupt(true);
in.setBellEnabled(true);
@@ -134,4 +134,8 @@
setAnsiSupported(false);
}
}
+
+ private static boolean isCygwin() {
+ return System.getenv("SHELL") != null;
+ }
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/DynamicLinker.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/DynamicLinker.java Mon Sep 21 17:49:57 2015 +0200
@@ -117,7 +117,7 @@
* return factory.createLinker();
* }
*
- * public static CallSite bootstrap(MethodHandles.Lookup caller, String name, MethodType type) {
+ * public static CallSite bootstrap(MethodHandles.Lookup lookup, String name, MethodType type) {
* return dynamicLinker.link(new MonomorphicCallSite(CallSiteDescriptorFactory.create(lookup, name, type)));
* }
* }
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/beans/FacetIntrospector.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/beans/FacetIntrospector.java Mon Sep 21 17:49:57 2015 +0200
@@ -152,7 +152,7 @@
boolean isAccessible(final Member m) {
final Class<?> declaring = m.getDeclaringClass();
// (declaring == clazz) is just an optimization - we're calling this only from code that operates on a
- // non-restriced class, so if the declaring class is identical to the class being inspected, then forego
+ // non-restricted class, so if the declaring class is identical to the class being inspected, then forego
// a potentially expensive restricted-package check.
return declaring == clazz || !CheckRestrictedPackage.isRestrictedClass(declaring);
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/beans/SingleDynamicMethod.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/beans/SingleDynamicMethod.java Mon Sep 21 17:49:57 2015 +0200
@@ -98,7 +98,6 @@
* target method to a call site type (including mapping variable arity methods to a call site signature with different
* arity).
* @author Attila Szegedi
- * @version $Id: $
*/
abstract class SingleDynamicMethod extends DynamicMethod {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/linker/GuardedInvocation.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/linker/GuardedInvocation.java Mon Sep 21 17:49:57 2015 +0200
@@ -353,7 +353,7 @@
/**
* Applies argument filters to both the invocation and the guard (if there is one).
- * @param pos the position of the first argumen being filtered
+ * @param pos the position of the first argument being filtered
* @param filters the argument filters
* @return a filtered invocation
*/
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/linker/GuardedTypeConversion.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/linker/GuardedTypeConversion.java Mon Sep 21 17:49:57 2015 +0200
@@ -110,7 +110,7 @@
/**
* Check if invocation is cacheable
- * @return true if cachable, false otherwise
+ * @return true if cacheable, false otherwise
*/
public boolean isCacheable() {
return cacheable;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/ScriptUtils.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/ScriptUtils.java Mon Sep 21 17:49:57 2015 +0200
@@ -77,7 +77,7 @@
* @return a synchronizing wrapper function
*/
public static Object makeSynchronizedFunction(final ScriptFunction func, final Object sync) {
- return func.makeSynchronizedFunction(unwrap(sync));
+ return func.createSynchronized(unwrap(sync));
}
/**
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/URLReader.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/URLReader.java Mon Sep 21 17:49:57 2015 +0200
@@ -103,7 +103,7 @@
/**
* Charset used by this reader
*
- * @return the Chartset used to convert bytes to chars
+ * @return the Charset used to convert bytes to chars
*/
public Charset getCharset() {
return cs;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/Parser.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/Parser.java Mon Sep 21 17:49:57 2015 +0200
@@ -80,7 +80,7 @@
public CompilationUnitTree parse(final URL url, final DiagnosticListener listener) throws IOException, NashornException;
/**
- * Parses the readerand returns compilation unit tree
+ * Parses the reader and returns compilation unit tree
*
* @param name name of the source file to parse
* @param reader from which source is read
@@ -133,7 +133,7 @@
* <dt>"-strict"</dt><dd>enable ECMAScript strict mode</dd>
* </dl>
*
- * @throws NullPointerException if options arrry or any of it's element is null
+ * @throws NullPointerException if options array or any of its element is null
* @throws IllegalArgumentException on unsupported option value.
* @return a new Parser instance.
*/
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/RegExpLiteralTree.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/RegExpLiteralTree.java Mon Sep 21 17:49:57 2015 +0200
@@ -35,7 +35,7 @@
/**
* Regular expression pattern to match.
*
- * @return regular expression patten
+ * @return regular expression pattern
*/
public String getPattern();
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ApplySpecialization.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ApplySpecialization.java Mon Sep 21 17:49:57 2015 +0200
@@ -298,7 +298,28 @@
@Override
public boolean enterFunctionNode(final FunctionNode functionNode) {
- if (!USE_APPLY2CALL) {
+ // Cheap tests first
+ if (!(
+ // is the transform globally enabled?
+ USE_APPLY2CALL
+
+ // Are we compiling lazily? We can't known the number and types of the actual parameters at
+ // the caller when compiling eagerly, so this only works with on-demand compilation.
+ && compiler.isOnDemandCompilation()
+
+ // Does the function even reference the "arguments" identifier (without redefining it)? If not,
+ // it trivially can't have an expression of form "f.apply(self, arguments)" that this transform
+ // is targeting.
+ && functionNode.needsArguments()
+
+ // Does the function have eval? If so, it can arbitrarily modify arguments so we can't touch it.
+ && !functionNode.hasEval()
+
+ // Finally, does the function declare any parameters explicitly? We don't support that. It could
+ // be done, but has some complications. Therefore only a function with no explicit parameters
+ // is considered.
+ && functionNode.getNumOfParams() == 0))
+ {
return false;
}
@@ -308,18 +329,6 @@
return false;
}
- if (!compiler.isOnDemandCompilation()) {
- return false;
- }
-
- if (functionNode.getNumOfParams() != 0) {
- return false;
- }
-
- if (functionNode.hasEval()) {
- return false;
- }
-
if (!hasApplies(functionNode)) {
return false;
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/AssignSymbols.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/AssignSymbols.java Mon Sep 21 17:49:57 2015 +0200
@@ -244,7 +244,7 @@
/**
* Creates a synthetic initializer for a variable (a var statement that doesn't occur in the source code). Typically
- * used to create assignmnent of {@code :callee} to the function name symbol in self-referential function
+ * used to create assignment of {@code :callee} to the function name symbol in self-referential function
* expressions as well as for assignment of {@code :arguments} to {@code arguments}.
*
* @param name the ident node identifying the variable to initialize
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java Mon Sep 21 17:49:57 2015 +0200
@@ -132,7 +132,6 @@
import jdk.nashorn.internal.ir.visitor.NodeOperatorVisitor;
import jdk.nashorn.internal.ir.visitor.NodeVisitor;
import jdk.nashorn.internal.objects.Global;
-import jdk.nashorn.internal.objects.ScriptFunctionImpl;
import jdk.nashorn.internal.parser.Lexer.RegexToken;
import jdk.nashorn.internal.parser.TokenType;
import jdk.nashorn.internal.runtime.Context;
@@ -195,9 +194,9 @@
private static final Call ENSURE_NUMBER = CompilerConstants.staticCallNoLookup(OptimisticReturnFilters.class,
"ensureNumber", double.class, Object.class, int.class);
- private static final Call CREATE_FUNCTION_OBJECT = CompilerConstants.staticCallNoLookup(ScriptFunctionImpl.class,
+ private static final Call CREATE_FUNCTION_OBJECT = CompilerConstants.staticCallNoLookup(ScriptFunction.class,
"create", ScriptFunction.class, Object[].class, int.class, ScriptObject.class);
- private static final Call CREATE_FUNCTION_OBJECT_NO_SCOPE = CompilerConstants.staticCallNoLookup(ScriptFunctionImpl.class,
+ private static final Call CREATE_FUNCTION_OBJECT_NO_SCOPE = CompilerConstants.staticCallNoLookup(ScriptFunction.class,
"create", ScriptFunction.class, Object[].class, int.class);
private static final Call TO_NUMBER_FOR_EQ = CompilerConstants.staticCallNoLookup(JSType.class,
@@ -1495,7 +1494,7 @@
int argsCount;
@Override
void loadStack() {
- /**
+ /*
* We want to load 'eval' to check if it is indeed global builtin eval.
* If this eval call is inside a 'with' statement, dyn:getMethod|getProp|getElem
* would be generated if ident is a "isFunction". But, that would result in a
@@ -4330,7 +4329,7 @@
}
private void prologue() {
- /**
+ /*
* This loads the parts of the target, e.g base and index. they are kept
* on the stack throughout the store and used at the end to execute it
*/
@@ -4798,7 +4797,7 @@
* conversion has no side effects.
* @param name the name of the property being get
* @param flags call site flags
- * @param isMethod whether we're preferrably retrieving a function
+ * @param isMethod whether we're preferably retrieving a function
* @return the current method emitter
*/
MethodEmitter dynamicGet(final String name, final int flags, final boolean isMethod, final boolean isIndex) {
@@ -5230,7 +5229,7 @@
private Type returnValueType;
// If we are in the middle of an object literal initialization, we need to update the map
private PropertyMap objectLiteralMap;
- // Object literal stack depth for object literal - not necessarly top if property is a tree
+ // Object literal stack depth for object literal - not necessarily top if property is a tree
private int objectLiteralStackDepth = -1;
// The line number at the continuation point
private int lineNumber;
@@ -5395,7 +5394,7 @@
method.load(lvarTypes.get(slot), slot);
method.convert(stackTypes[i]);
// stack: s0=object literal being initialized
- // change map of s0 so that the property we are initilizing when we failed
+ // change map of s0 so that the property we are initializing when we failed
// is now ci.returnValueType
if (i == objectLiteralStackDepth) {
method.dup();
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CompilationPhase.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CompilationPhase.java Mon Sep 21 17:49:57 2015 +0200
@@ -591,8 +591,8 @@
Class<?> rootClass = null;
long length = 0L;
- final CodeInstaller<ScriptEnvironment> codeInstaller = compiler.getCodeInstaller();
- final Map<String, byte[]> bytecode = compiler.getBytecode();
+ final CodeInstaller codeInstaller = compiler.getCodeInstaller();
+ final Map<String, byte[]> bytecode = compiler.getBytecode();
for (final Entry<String, byte[]> entry : bytecode.entrySet()) {
final String className = entry.getKey();
@@ -745,7 +745,7 @@
abstract FunctionNode transform(final Compiler compiler, final CompilationPhases phases, final FunctionNode functionNode) throws CompilationException;
/**
- * Apply a transform to a function node, returning the transfored function node. If the transform is not
+ * Apply a transform to a function node, returning the transformed function node. If the transform is not
* applicable, an exception is thrown. Every transform requires the function to have a certain number of
* states to operate. It can have more states set, but not fewer. The state list, i.e. the constructor
* arguments to any of the CompilationPhase enum entries, is a set of REQUIRED states.
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Compiler.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Compiler.java Mon Sep 21 17:49:57 2015 +0200
@@ -101,7 +101,7 @@
private final ConstantData constantData;
- private final CodeInstaller<ScriptEnvironment> installer;
+ private final CodeInstaller installer;
/** logger for compiler, trampolines and related code generation events
* that affect classes */
@@ -352,47 +352,83 @@
private static final AtomicInteger COMPILATION_ID = new AtomicInteger(0);
/**
- * Constructor
+ * Creates a new compiler instance for initial compilation of a script.
*
- * @param context context
- * @param env script environment
* @param installer code installer
* @param source source to compile
* @param errors error manager
* @param isStrict is this a strict compilation
+ * @return a new compiler
*/
- public Compiler(
- final Context context,
- final ScriptEnvironment env,
- final CodeInstaller<ScriptEnvironment> installer,
+ public static Compiler forInitialCompilation(
+ final CodeInstaller installer,
final Source source,
final ErrorManager errors,
final boolean isStrict) {
- this(context, env, installer, source, errors, isStrict, false, null, null, null, null, null, null);
+ return new Compiler(installer.getContext(), installer, source, errors, isStrict);
}
/**
- * Constructor
+ * Creates a compiler without a code installer. It can only be used to compile code, not install the
+ * generated classes and as such it is useful only for implementation of {@code --compile-only} command
+ * line option.
+ * @param context the current context
+ * @param source source to compile
+ * @param isStrict is this a strict compilation
+ * @return a new compiler
+ */
+ public static Compiler forNoInstallerCompilation(
+ final Context context,
+ final Source source,
+ final boolean isStrict) {
+ return new Compiler(context, null, source, context.getErrorManager(), isStrict);
+ }
+
+ /**
+ * Creates a compiler for an on-demand compilation job.
*
- * @param context context
- * @param env script environment
* @param installer code installer
* @param source source to compile
- * @param errors error manager
* @param isStrict is this a strict compilation
- * @param isOnDemand is this an on demand compilation
* @param compiledFunction compiled function, if any
* @param types parameter and return value type information, if any is known
* @param invalidatedProgramPoints invalidated program points for recompilation
* @param typeInformationFile descriptor of the location where type information is persisted
* @param continuationEntryPoints continuation entry points for restof method
* @param runtimeScope runtime scope for recompilation type lookup in {@code TypeEvaluator}
+ * @return a new compiler
*/
- @SuppressWarnings("unused")
- public Compiler(
+ public static Compiler forOnDemandCompilation(
+ final CodeInstaller installer,
+ final Source source,
+ final boolean isStrict,
+ final RecompilableScriptFunctionData compiledFunction,
+ final TypeMap types,
+ final Map<Integer, Type> invalidatedProgramPoints,
+ final Object typeInformationFile,
+ final int[] continuationEntryPoints,
+ final ScriptObject runtimeScope) {
+ final Context context = installer.getContext();
+ return new Compiler(context, installer, source, context.getErrorManager(), isStrict, true,
+ compiledFunction, types, invalidatedProgramPoints, typeInformationFile,
+ continuationEntryPoints, runtimeScope);
+ }
+
+ /**
+ * Convenience constructor for non on-demand compiler instances.
+ */
+ private Compiler(
final Context context,
- final ScriptEnvironment env,
- final CodeInstaller<ScriptEnvironment> installer,
+ final CodeInstaller installer,
+ final Source source,
+ final ErrorManager errors,
+ final boolean isStrict) {
+ this(context, installer, source, errors, isStrict, false, null, null, null, null, null, null);
+ }
+
+ private Compiler(
+ final Context context,
+ final CodeInstaller installer,
final Source source,
final ErrorManager errors,
final boolean isStrict,
@@ -404,7 +440,7 @@
final int[] continuationEntryPoints,
final ScriptObject runtimeScope) {
this.context = context;
- this.env = env;
+ this.env = context.getEnv();
this.installer = installer;
this.constantData = new ConstantData();
this.compileUnits = CompileUnit.createCompileUnitSet();
@@ -416,7 +452,7 @@
this.onDemand = isOnDemand;
this.compiledFunction = compiledFunction;
this.types = types;
- this.invalidatedProgramPoints = invalidatedProgramPoints == null ? new HashMap<Integer, Type>() : invalidatedProgramPoints;
+ this.invalidatedProgramPoints = invalidatedProgramPoints == null ? new HashMap<>() : invalidatedProgramPoints;
this.typeInformationFile = typeInformationFile;
this.continuationEntryPoints = continuationEntryPoints == null ? null: continuationEntryPoints.clone();
this.typeEvaluator = new TypeEvaluator(this, runtimeScope);
@@ -426,7 +462,7 @@
this.optimistic = env._optimistic_types;
}
- private static String safeSourceName(final ScriptEnvironment env, final CodeInstaller<ScriptEnvironment> installer, final Source source) {
+ private String safeSourceName() {
String baseName = new File(source.getName()).getName();
final int index = baseName.lastIndexOf(".js");
@@ -485,7 +521,7 @@
sb.append('$');
}
- sb.append(Compiler.safeSourceName(env, installer, source));
+ sb.append(safeSourceName());
return sb.toString();
}
@@ -684,7 +720,7 @@
return constantData;
}
- CodeInstaller<ScriptEnvironment> getCodeInstaller() {
+ CodeInstaller getCodeInstaller() {
return installer;
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CompilerConstants.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CompilerConstants.java Mon Sep 21 17:49:57 2015 +0200
@@ -192,7 +192,7 @@
private static Set<String> symbolNames;
/**
- * Prefix used for internal methods generated in script clases.
+ * Prefix used for internal methods generated in script classes.
*/
private static final String INTERNAL_METHOD_PREFIX = ":";
@@ -225,7 +225,7 @@
}
/**
- * Check whether a name is that of a reserved compiler constnat
+ * Check whether a name is that of a reserved compiler constant
* @param name name
* @return true if compiler constant name
*/
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Label.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Label.java Mon Sep 21 17:49:57 2015 +0200
@@ -447,7 +447,7 @@
undefineLocalVariables(liveLocalCount, true);
// Temporaries are promoted
firstTemp = liveLocalCount;
- // No trailing undefineds
+ // No trailing undefined values
localVariableTypes.subList(firstTemp, localVariableTypes.size()).clear();
assert symbolBoundary.length() == firstTemp;
// Generalize all reference types to Object, and promote boolean to int
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Lower.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Lower.java Mon Sep 21 17:49:57 2015 +0200
@@ -521,7 +521,7 @@
}
/*
- * create a new trynode
+ * create a new try node
* if we have catches:
*
* try try
@@ -532,7 +532,7 @@
* catchall
* rethrow
*
- * otheriwse
+ * otherwise
*
* try try
* x x
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/MethodEmitter.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/MethodEmitter.java Mon Sep 21 17:49:57 2015 +0200
@@ -1158,7 +1158,7 @@
/**
* Pop a value from the stack and store it in a variable denoted by the given symbol. The variable should be either
* a local variable, or a function parameter (and not a scoped variable). For local variables, this method will also
- * do the bookeeping of the local variable table as well as mark values in all alternative slots for the symbol as
+ * do the bookkeeping of the local variable table as well as mark values in all alternative slots for the symbol as
* dead. In this regard it differs from {@link #storeHidden(Type, int)}.
*
* @param symbol the symbol to store into.
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ObjectClassGenerator.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ObjectClassGenerator.java Mon Sep 21 17:49:57 2015 +0200
@@ -786,7 +786,7 @@
* @param primitiveSetter primitive setter for the current type with an element of the current type
* @param objectSetter the object setter
*
- * @return method handle that checks if the element to be set is of the currenttype, even though it's boxed
+ * @return method handle that checks if the element to be set is of the current type, even though it's boxed
* and instead of using the generic object setter, that would blow up the type and invalidate the map,
* unbox it and call the primitive setter instead
*/
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/types/BytecodeOps.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/types/BytecodeOps.java Mon Sep 21 17:49:57 2015 +0200
@@ -36,7 +36,7 @@
* The bytecode ops are coupled to a MethodVisitor from ASM for
* byte code generation. They know nothing about our MethodGenerator,
* which is the abstraction for working with Nashorn JS types
- * For exmaple, anything like "two or one slots" for a type, which
+ * For example, anything like "two or one slots" for a type, which
* is represented in bytecode and ASM, is abstracted away in the
* MethodGenerator. There you just say "dup" or "store".
*
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/BlockLexicalContext.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/BlockLexicalContext.java Mon Sep 21 17:49:57 2015 +0200
@@ -34,7 +34,7 @@
* This is a subclass of lexical context used for filling
* blocks (and function nodes) with statements. When popping
* a block from the lexical context, any statements that have
- * been generated in it are commited to the block. This saves
+ * been generated in it are committed to the block. This saves
* unnecessary object mutations and lexical context replacement
*/
public class BlockLexicalContext extends LexicalContext {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/LiteralNode.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/LiteralNode.java Mon Sep 21 17:49:57 2015 +0200
@@ -452,7 +452,7 @@
*
* @param token token
* @param finish finish
- * @param value undefined value, passed only for polymorphisism discrimination
+ * @param value undefined value, passed only for polymorphism discrimination
*
* @return the new literal node
*/
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/RuntimeNode.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/RuntimeNode.java Mon Sep 21 17:49:57 2015 +0200
@@ -276,7 +276,7 @@
*
* @param request a request
*
- * @return the inverted rquest, or null if not applicable
+ * @return the inverted request, or null if not applicable
*/
public static Request invert(final Request request) {
switch (request) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/NashornClassReader.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/NashornClassReader.java Mon Sep 21 17:49:57 2015 +0200
@@ -36,7 +36,7 @@
import jdk.nashorn.internal.ir.debug.NashornTextifier.NashornLabel;
/**
- * Subclass of the ASM classs reader that retains more info, such
+ * Subclass of the ASM class reader that retains more info, such
* as bytecode offsets
*/
public class NashornClassReader extends ClassReader {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/ObjectSizeCalculator.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/debug/ObjectSizeCalculator.java Mon Sep 21 17:49:57 2015 +0200
@@ -193,7 +193,7 @@
}
/**
- * Get the class histograpm
+ * Get the class histogram
* @return class histogram element list
*/
public List<ClassHistogramElement> getClassHistogram() {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/ArrayBufferView.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/ArrayBufferView.java Mon Sep 21 17:49:57 2015 +0200
@@ -192,7 +192,7 @@
/**
* Factory method for array data
*
- * @param nb underlying nativebuffer
+ * @param nb underlying native buffer
* @param start start element
* @param end end element
*
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/BoundScriptFunctionImpl.java Tue Sep 22 14:24:31 2015 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package jdk.nashorn.internal.objects;
-
-import jdk.nashorn.internal.runtime.ScriptFunction;
-import jdk.nashorn.internal.runtime.ScriptFunctionData;
-import jdk.nashorn.internal.runtime.ScriptObject;
-import jdk.nashorn.internal.runtime.ScriptRuntime;
-
-/**
- * A {@code ScriptFunctionImpl} subclass for functions created using {@code Function.prototype.bind}. Such functions
- * must track their {@code [[TargetFunction]]} property for purposes of correctly implementing {@code [[HasInstance]]};
- * see {@link ScriptFunction#isInstance(ScriptObject)}.
- */
-final class BoundScriptFunctionImpl extends ScriptFunctionImpl {
- private final ScriptFunction targetFunction;
-
- BoundScriptFunctionImpl(final ScriptFunctionData data, final ScriptFunction targetFunction) {
- super(data, Global.instance());
- setPrototype(ScriptRuntime.UNDEFINED);
- this.targetFunction = targetFunction;
- }
-
- @Override
- protected ScriptFunction getTargetFunction() {
- return targetFunction;
- }
-}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java Mon Sep 21 17:49:57 2015 +0200
@@ -1583,7 +1583,11 @@
return ScriptFunction.getPrototype(builtinObject);
}
- ScriptObject getFunctionPrototype() {
+ /**
+ * Get the builtin Function prototype.
+ * @return the Function.prototype.
+ */
+ public ScriptObject getFunctionPrototype() {
return ScriptFunction.getPrototype(builtinFunction);
}
@@ -1768,7 +1772,12 @@
return ScriptFunction.getPrototype(getBuiltinFloat64Array());
}
- ScriptFunction getTypeErrorThrower() {
+ /**
+ * Return the function that throws TypeError unconditionally. Used as "poison" methods for certain Function properties.
+ *
+ * @return the TypeError throwing function
+ */
+ public ScriptFunction getTypeErrorThrower() {
return typeErrorThrower;
}
@@ -2157,7 +2166,7 @@
// We want to avoid adding our generic lexical scope switchpoint to global constant invocations,
// because those are invalidated per-key in the addBoundProperties method above.
- // We therefor check if the invocation does already have a switchpoint and the property is non-inherited,
+ // We therefore check if the invocation does already have a switchpoint and the property is non-inherited,
// assuming this only applies to global constants. If other non-inherited properties will
// start using switchpoints some time in the future we'll have to revisit this.
if (isScope && context.getEnv()._es6 && (invocation.getSwitchPoints() == null || !hasOwnProperty(name))) {
@@ -2202,10 +2211,10 @@
* Adds jjs shell interactive mode builtin functions to global scope.
*/
public void addShellBuiltins() {
- Object value = ScriptFunctionImpl.makeFunction("input", ShellFunctions.INPUT);
+ Object value = ScriptFunction.createBuiltin("input", ShellFunctions.INPUT);
addOwnProperty("input", Attribute.NOT_ENUMERABLE, value);
- value = ScriptFunctionImpl.makeFunction("evalinput", ShellFunctions.EVALINPUT);
+ value = ScriptFunction.createBuiltin("evalinput", ShellFunctions.EVALINPUT);
addOwnProperty("evalinput", Attribute.NOT_ENUMERABLE, value);
}
@@ -2251,35 +2260,35 @@
this.setInitialProto(getObjectPrototype());
// initialize global function properties
- this.eval = this.builtinEval = ScriptFunctionImpl.makeFunction("eval", EVAL);
-
- this.parseInt = ScriptFunctionImpl.makeFunction("parseInt", GlobalFunctions.PARSEINT,
+ this.eval = this.builtinEval = ScriptFunction.createBuiltin("eval", EVAL);
+
+ this.parseInt = ScriptFunction.createBuiltin("parseInt", GlobalFunctions.PARSEINT,
new Specialization[] {
new Specialization(GlobalFunctions.PARSEINT_Z),
new Specialization(GlobalFunctions.PARSEINT_I),
new Specialization(GlobalFunctions.PARSEINT_J),
new Specialization(GlobalFunctions.PARSEINT_OI),
new Specialization(GlobalFunctions.PARSEINT_O) });
- this.parseFloat = ScriptFunctionImpl.makeFunction("parseFloat", GlobalFunctions.PARSEFLOAT);
- this.isNaN = ScriptFunctionImpl.makeFunction("isNaN", GlobalFunctions.IS_NAN,
+ this.parseFloat = ScriptFunction.createBuiltin("parseFloat", GlobalFunctions.PARSEFLOAT);
+ this.isNaN = ScriptFunction.createBuiltin("isNaN", GlobalFunctions.IS_NAN,
new Specialization[] {
new Specialization(GlobalFunctions.IS_NAN_I),
new Specialization(GlobalFunctions.IS_NAN_J),
new Specialization(GlobalFunctions.IS_NAN_D) });
- this.parseFloat = ScriptFunctionImpl.makeFunction("parseFloat", GlobalFunctions.PARSEFLOAT);
- this.isNaN = ScriptFunctionImpl.makeFunction("isNaN", GlobalFunctions.IS_NAN);
- this.isFinite = ScriptFunctionImpl.makeFunction("isFinite", GlobalFunctions.IS_FINITE);
- this.encodeURI = ScriptFunctionImpl.makeFunction("encodeURI", GlobalFunctions.ENCODE_URI);
- this.encodeURIComponent = ScriptFunctionImpl.makeFunction("encodeURIComponent", GlobalFunctions.ENCODE_URICOMPONENT);
- this.decodeURI = ScriptFunctionImpl.makeFunction("decodeURI", GlobalFunctions.DECODE_URI);
- this.decodeURIComponent = ScriptFunctionImpl.makeFunction("decodeURIComponent", GlobalFunctions.DECODE_URICOMPONENT);
- this.escape = ScriptFunctionImpl.makeFunction("escape", GlobalFunctions.ESCAPE);
- this.unescape = ScriptFunctionImpl.makeFunction("unescape", GlobalFunctions.UNESCAPE);
- this.print = ScriptFunctionImpl.makeFunction("print", env._print_no_newline ? PRINT : PRINTLN);
- this.load = ScriptFunctionImpl.makeFunction("load", LOAD);
- this.loadWithNewGlobal = ScriptFunctionImpl.makeFunction("loadWithNewGlobal", LOAD_WITH_NEW_GLOBAL);
- this.exit = ScriptFunctionImpl.makeFunction("exit", EXIT);
- this.quit = ScriptFunctionImpl.makeFunction("quit", EXIT);
+ this.parseFloat = ScriptFunction.createBuiltin("parseFloat", GlobalFunctions.PARSEFLOAT);
+ this.isNaN = ScriptFunction.createBuiltin("isNaN", GlobalFunctions.IS_NAN);
+ this.isFinite = ScriptFunction.createBuiltin("isFinite", GlobalFunctions.IS_FINITE);
+ this.encodeURI = ScriptFunction.createBuiltin("encodeURI", GlobalFunctions.ENCODE_URI);
+ this.encodeURIComponent = ScriptFunction.createBuiltin("encodeURIComponent", GlobalFunctions.ENCODE_URICOMPONENT);
+ this.decodeURI = ScriptFunction.createBuiltin("decodeURI", GlobalFunctions.DECODE_URI);
+ this.decodeURIComponent = ScriptFunction.createBuiltin("decodeURIComponent", GlobalFunctions.DECODE_URICOMPONENT);
+ this.escape = ScriptFunction.createBuiltin("escape", GlobalFunctions.ESCAPE);
+ this.unescape = ScriptFunction.createBuiltin("unescape", GlobalFunctions.UNESCAPE);
+ this.print = ScriptFunction.createBuiltin("print", env._print_no_newline ? PRINT : PRINTLN);
+ this.load = ScriptFunction.createBuiltin("load", LOAD);
+ this.loadWithNewGlobal = ScriptFunction.createBuiltin("loadWithNewGlobal", LOAD_WITH_NEW_GLOBAL);
+ this.exit = ScriptFunction.createBuiltin("exit", EXIT);
+ this.quit = ScriptFunction.createBuiltin("quit", EXIT);
// built-in constructors
this.builtinArray = initConstructorAndSwitchPoint("Array", ScriptFunction.class);
@@ -2359,7 +2368,7 @@
// default file name
addOwnProperty(ScriptEngine.FILENAME, Attribute.NOT_ENUMERABLE, null);
// __noSuchProperty__ hook for ScriptContext search of missing variables
- final ScriptFunction noSuchProp = ScriptFunctionImpl.makeStrictFunction(NO_SUCH_PROPERTY_NAME, NO_SUCH_PROPERTY);
+ final ScriptFunction noSuchProp = ScriptFunction.createStrictBuiltin(NO_SUCH_PROPERTY_NAME, NO_SUCH_PROPERTY);
addOwnProperty(NO_SUCH_PROPERTY_NAME, Attribute.NOT_ENUMERABLE, noSuchProp);
}
}
@@ -2370,17 +2379,17 @@
final ScriptObject errorProto = getErrorPrototype();
// Nashorn specific accessors on Error.prototype - stack, lineNumber, columnNumber and fileName
- final ScriptFunction getStack = ScriptFunctionImpl.makeFunction("getStack", NativeError.GET_STACK);
- final ScriptFunction setStack = ScriptFunctionImpl.makeFunction("setStack", NativeError.SET_STACK);
+ final ScriptFunction getStack = ScriptFunction.createBuiltin("getStack", NativeError.GET_STACK);
+ final ScriptFunction setStack = ScriptFunction.createBuiltin("setStack", NativeError.SET_STACK);
errorProto.addOwnProperty("stack", Attribute.NOT_ENUMERABLE, getStack, setStack);
- final ScriptFunction getLineNumber = ScriptFunctionImpl.makeFunction("getLineNumber", NativeError.GET_LINENUMBER);
- final ScriptFunction setLineNumber = ScriptFunctionImpl.makeFunction("setLineNumber", NativeError.SET_LINENUMBER);
+ final ScriptFunction getLineNumber = ScriptFunction.createBuiltin("getLineNumber", NativeError.GET_LINENUMBER);
+ final ScriptFunction setLineNumber = ScriptFunction.createBuiltin("setLineNumber", NativeError.SET_LINENUMBER);
errorProto.addOwnProperty("lineNumber", Attribute.NOT_ENUMERABLE, getLineNumber, setLineNumber);
- final ScriptFunction getColumnNumber = ScriptFunctionImpl.makeFunction("getColumnNumber", NativeError.GET_COLUMNNUMBER);
- final ScriptFunction setColumnNumber = ScriptFunctionImpl.makeFunction("setColumnNumber", NativeError.SET_COLUMNNUMBER);
+ final ScriptFunction getColumnNumber = ScriptFunction.createBuiltin("getColumnNumber", NativeError.GET_COLUMNNUMBER);
+ final ScriptFunction setColumnNumber = ScriptFunction.createBuiltin("setColumnNumber", NativeError.SET_COLUMNNUMBER);
errorProto.addOwnProperty("columnNumber", Attribute.NOT_ENUMERABLE, getColumnNumber, setColumnNumber);
- final ScriptFunction getFileName = ScriptFunctionImpl.makeFunction("getFileName", NativeError.GET_FILENAME);
- final ScriptFunction setFileName = ScriptFunctionImpl.makeFunction("setFileName", NativeError.SET_FILENAME);
+ final ScriptFunction getFileName = ScriptFunction.createBuiltin("getFileName", NativeError.GET_FILENAME);
+ final ScriptFunction setFileName = ScriptFunction.createBuiltin("setFileName", NativeError.SET_FILENAME);
errorProto.addOwnProperty("fileName", Attribute.NOT_ENUMERABLE, getFileName, setFileName);
// ECMA 15.11.4.2 Error.prototype.name
@@ -2420,14 +2429,14 @@
private void initScripting(final ScriptEnvironment scriptEnv) {
ScriptObject value;
- value = ScriptFunctionImpl.makeFunction("readLine", ScriptingFunctions.READLINE);
+ value = ScriptFunction.createBuiltin("readLine", ScriptingFunctions.READLINE);
addOwnProperty("readLine", Attribute.NOT_ENUMERABLE, value);
- value = ScriptFunctionImpl.makeFunction("readFully", ScriptingFunctions.READFULLY);
+ value = ScriptFunction.createBuiltin("readFully", ScriptingFunctions.READFULLY);
addOwnProperty("readFully", Attribute.NOT_ENUMERABLE, value);
final String execName = ScriptingFunctions.EXEC_NAME;
- value = ScriptFunctionImpl.makeFunction(execName, ScriptingFunctions.EXEC);
+ value = ScriptFunction.createBuiltin(execName, ScriptingFunctions.EXEC);
value.addOwnProperty(ScriptingFunctions.THROW_ON_ERROR_NAME, Attribute.NOT_ENUMERABLE, false);
addOwnProperty(execName, Attribute.NOT_ENUMERABLE, value);
@@ -2610,7 +2619,7 @@
this.builtinFunction = initConstructor("Function", ScriptFunction.class);
// create global anonymous function
- final ScriptFunction anon = ScriptFunctionImpl.newAnonymousFunction();
+ final ScriptFunction anon = ScriptFunction.createAnonymous();
// need to copy over members of Function.prototype to anon function
anon.addBoundProperties(getFunctionPrototype());
@@ -2622,10 +2631,7 @@
anon.deleteOwnProperty(anon.getMap().findProperty("prototype"));
// use "getter" so that [[ThrowTypeError]] function's arity is 0 - as specified in step 10 of section 13.2.3
- this.typeErrorThrower = new ScriptFunctionImpl("TypeErrorThrower", Lookup.TYPE_ERROR_THROWER_GETTER, null, null, 0);
- typeErrorThrower.setPrototype(UNDEFINED);
- // Non-constructor built-in functions do not have "prototype" property
- typeErrorThrower.deleteOwnProperty(typeErrorThrower.getMap().findProperty("prototype"));
+ this.typeErrorThrower = ScriptFunction.createBuiltin("TypeErrorThrower", Lookup.TYPE_ERROR_THROWER_GETTER);
typeErrorThrower.preventExtensions();
// now initialize Object
@@ -2636,8 +2642,8 @@
// ES6 draft compliant __proto__ property of Object.prototype
// accessors on Object.prototype for "__proto__"
- final ScriptFunction getProto = ScriptFunctionImpl.makeFunction("getProto", NativeObject.GET__PROTO__);
- final ScriptFunction setProto = ScriptFunctionImpl.makeFunction("setProto", NativeObject.SET__PROTO__);
+ final ScriptFunction getProto = ScriptFunction.createBuiltin("getProto", NativeObject.GET__PROTO__);
+ final ScriptFunction setProto = ScriptFunction.createBuiltin("setProto", NativeObject.SET__PROTO__);
ObjectPrototype.addOwnProperty("__proto__", Attribute.NOT_ENUMERABLE, getProto, setProto);
// Function valued properties of Function.prototype were not properly
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeDebug.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeDebug.java Mon Sep 21 17:49:57 2015 +0200
@@ -26,6 +26,7 @@
package jdk.nashorn.internal.objects;
import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED;
+
import java.io.PrintWriter;
import java.util.LinkedList;
import java.util.Objects;
@@ -246,7 +247,7 @@
final PrintWriter out = Context.getCurrentErr();
out.println("ScriptObject count " + ScriptObject.getCount());
- out.println("Scope count " + Scope.getCount());
+ out.println("Scope count " + Scope.getScopeCount());
out.println("ScriptObject listeners added " + PropertyListeners.getListenersAdded());
out.println("ScriptObject listeners removed " + PropertyListeners.getListenersRemoved());
out.println("ScriptFunction constructor calls " + ScriptFunction.getConstructorCount());
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeError.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeError.java Mon Sep 21 17:49:57 2015 +0200
@@ -148,8 +148,8 @@
initException(sobj);
sobj.delete(STACK, false);
if (! sobj.has("stack")) {
- final ScriptFunction getStack = ScriptFunctionImpl.makeFunction("getStack", GET_STACK);
- final ScriptFunction setStack = ScriptFunctionImpl.makeFunction("setStack", SET_STACK);
+ final ScriptFunction getStack = ScriptFunction.createBuiltin("getStack", GET_STACK);
+ final ScriptFunction setStack = ScriptFunction.createBuiltin("setStack", SET_STACK);
sobj.addOwnProperty("stack", Attribute.NOT_ENUMERABLE, getStack, setStack);
}
return UNDEFINED;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeJSAdapter.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeJSAdapter.java Mon Sep 21 17:49:57 2015 +0200
@@ -621,11 +621,11 @@
if (find != null) {
final Object value = find.getObjectValue();
if (value instanceof ScriptFunction) {
- final ScriptFunctionImpl func = (ScriptFunctionImpl)value;
+ final ScriptFunction func = (ScriptFunction)value;
// TODO: It's a shame we need to produce a function bound to this and name, when we'd only need it bound
// to name. Probably not a big deal, but if we can ever make it leaner, it'd be nice.
return new GuardedInvocation(MH.dropArguments(MH.constant(Object.class,
- func.makeBoundFunction(this, new Object[] { name })), 0, Object.class),
+ func.createBound(this, new Object[] { name })), 0, Object.class),
testJSAdaptor(adaptee, null, null, null),
adaptee.getProtoSwitchPoint(__call__, find.getOwner()));
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeJava.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeJava.java Mon Sep 21 17:49:57 2015 +0200
@@ -96,7 +96,7 @@
@Function(name="synchronized", attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
public static Object synchronizedFunc(final Object self, final Object func, final Object obj) {
if (func instanceof ScriptFunction) {
- return ((ScriptFunction)func).makeSynchronizedFunction(obj);
+ return ((ScriptFunction)func).createSynchronized(obj);
}
throw typeError("not.a.function", ScriptRuntime.safeToString(func));
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeNumber.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeNumber.java Mon Sep 21 17:49:57 2015 +0200
@@ -33,6 +33,7 @@
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
+import java.math.RoundingMode;
import java.text.NumberFormat;
import java.util.Locale;
import jdk.internal.dynalink.linker.GuardedInvocation;
@@ -187,6 +188,7 @@
format.setMinimumFractionDigits(fractionDigits);
format.setMaximumFractionDigits(fractionDigits);
format.setGroupingUsed(false);
+ format.setRoundingMode(RoundingMode.HALF_UP);
return format.format(x);
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeRegExp.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeRegExp.java Mon Sep 21 17:49:57 2015 +0200
@@ -728,7 +728,7 @@
*
* $$ -> $
* $& -> the matched substring
- * $` -> the portion of string that preceeds matched substring
+ * $` -> the portion of string that precedes matched substring
* $' -> the portion of string that follows the matched substring
* $n -> the nth capture, where n is [1-9] and $n is NOT followed by a decimal digit
* $nn -> the nnth capture, where nn is a two digit decimal number [01-99].
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/PrototypeObject.java Tue Sep 22 14:24:31 2015 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,115 +0,0 @@
-/*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package jdk.nashorn.internal.objects;
-
-import static jdk.nashorn.internal.lookup.Lookup.MH;
-import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED;
-
-import java.lang.invoke.MethodHandle;
-import java.lang.invoke.MethodHandles;
-import java.util.ArrayList;
-import jdk.nashorn.internal.runtime.AccessorProperty;
-import jdk.nashorn.internal.runtime.Property;
-import jdk.nashorn.internal.runtime.PropertyMap;
-import jdk.nashorn.internal.runtime.ScriptFunction;
-import jdk.nashorn.internal.runtime.ScriptObject;
-
-/**
- * Instances of this class serve as "prototype" object for script functions.
- * The purpose is to expose "constructor" property from "prototype". Also, nasgen
- * generated prototype classes extend from this class.
- *
- */
-public class PrototypeObject extends ScriptObject {
- private static final PropertyMap map$;
-
- private Object constructor;
-
- private static final MethodHandle GET_CONSTRUCTOR = findOwnMH("getConstructor", Object.class, Object.class);
- private static final MethodHandle SET_CONSTRUCTOR = findOwnMH("setConstructor", void.class, Object.class, Object.class);
-
- static {
- final ArrayList<Property> properties = new ArrayList<>(1);
- properties.add(AccessorProperty.create("constructor", Property.NOT_ENUMERABLE, GET_CONSTRUCTOR, SET_CONSTRUCTOR));
- map$ = PropertyMap.newMap(properties);
- }
-
- private PrototypeObject(final Global global, final PropertyMap map) {
- super(global.getObjectPrototype(), map != map$? map.addAll(map$) : map$);
- }
-
- PrototypeObject() {
- this(Global.instance(), map$);
- }
-
- /**
- * PropertyObject constructor
- *
- * @param map property map
- */
- PrototypeObject(final PropertyMap map) {
- this(Global.instance(), map);
- }
-
- PrototypeObject(final ScriptFunction func) {
- this(Global.instance(), map$);
- this.constructor = func;
- }
-
- /**
- * Get the constructor for this {@code PrototypeObject}
- * @param self self reference
- * @return constructor, probably, but not necessarily, a {@link ScriptFunction}
- */
- static Object getConstructor(final Object self) {
- return (self instanceof PrototypeObject) ?
- ((PrototypeObject)self).getConstructor() :
- UNDEFINED;
- }
-
- /**
- * Reset the constructor for this {@code PrototypeObject}
- * @param self self reference
- * @param constructor constructor, probably, but not necessarily, a {@link ScriptFunction}
- */
- static void setConstructor(final Object self, final Object constructor) {
- if (self instanceof PrototypeObject) {
- ((PrototypeObject)self).setConstructor(constructor);
- }
- }
-
- private Object getConstructor() {
- return constructor;
- }
-
- private void setConstructor(final Object constructor) {
- this.constructor = constructor;
- }
-
- private static MethodHandle findOwnMH(final String name, final Class<?> rtype, final Class<?>... types) {
- return MH.findStatic(MethodHandles.lookup(), PrototypeObject.class, name, MH.type(rtype, types));
- }
-}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/ScriptFunctionImpl.java Tue Sep 22 14:24:31 2015 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,313 +0,0 @@
-/*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package jdk.nashorn.internal.objects;
-
-import static jdk.nashorn.internal.lookup.Lookup.MH;
-import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED;
-
-import java.lang.invoke.MethodHandle;
-import java.util.ArrayList;
-import jdk.nashorn.internal.runtime.AccessorProperty;
-import jdk.nashorn.internal.runtime.GlobalFunctions;
-import jdk.nashorn.internal.runtime.Property;
-import jdk.nashorn.internal.runtime.PropertyMap;
-import jdk.nashorn.internal.runtime.RecompilableScriptFunctionData;
-import jdk.nashorn.internal.runtime.ScriptFunction;
-import jdk.nashorn.internal.runtime.ScriptFunctionData;
-import jdk.nashorn.internal.runtime.ScriptObject;
-import jdk.nashorn.internal.runtime.Specialization;
-
-/**
- * Concrete implementation of ScriptFunction. This sets correct map for the
- * function objects -- to expose properties like "prototype", "length" etc.
- */
-public class ScriptFunctionImpl extends ScriptFunction {
-
- /** Reference to constructor prototype. */
- private Object prototype;
-
- // property map for strict mode functions
- private static final PropertyMap strictmodemap$;
- // property map for bound functions
- private static final PropertyMap boundfunctionmap$;
- // property map for non-strict, non-bound functions.
- private static final PropertyMap map$;
-
- // Marker object for lazily initialized prototype object
- private static final Object LAZY_PROTOTYPE = new Object();
-
- private ScriptFunctionImpl(final String name, final MethodHandle invokeHandle, final Specialization[] specs, final Global global) {
- super(name, invokeHandle, map$, null, specs, ScriptFunctionData.IS_BUILTIN_CONSTRUCTOR);
- init(global);
- }
-
- /**
- * Constructor called by Nasgen generated code, no membercount, use the default map.
- * Creates builtin functions only.
- *
- * @param name name of function
- * @param invokeHandle handle for invocation
- * @param specs specialized versions of this method, if available, null otherwise
- */
- ScriptFunctionImpl(final String name, final MethodHandle invokeHandle, final Specialization[] specs) {
- this(name, invokeHandle, specs, Global.instance());
- }
-
- private ScriptFunctionImpl(final String name, final MethodHandle invokeHandle, final PropertyMap map, final Specialization[] specs, final Global global) {
- super(name, invokeHandle, map.addAll(map$), null, specs, ScriptFunctionData.IS_BUILTIN_CONSTRUCTOR);
- init(global);
- }
-
- /**
- * Constructor called by Nasgen generated code, no membercount, use the map passed as argument.
- * Creates builtin functions only.
- *
- * @param name name of function
- * @param invokeHandle handle for invocation
- * @param map initial property map
- * @param specs specialized versions of this method, if available, null otherwise
- */
- ScriptFunctionImpl(final String name, final MethodHandle invokeHandle, final PropertyMap map, final Specialization[] specs) {
- this(name, invokeHandle, map, specs, Global.instance());
- }
-
- private ScriptFunctionImpl(final String name, final MethodHandle methodHandle, final ScriptObject scope, final Specialization[] specs, final int flags, final Global global) {
- super(name, methodHandle, getMap(isStrict(flags)), scope, specs, flags);
- init(global);
- }
-
- /**
- * Constructor called by Global.newScriptFunction (runtime).
- *
- * @param name name of function
- * @param methodHandle handle for invocation
- * @param scope scope object
- * @param specs specialized versions of this method, if available, null otherwise
- * @param flags {@link ScriptFunctionData} flags
- */
- ScriptFunctionImpl(final String name, final MethodHandle methodHandle, final ScriptObject scope, final Specialization[] specs, final int flags) {
- this(name, methodHandle, scope, specs, flags, Global.instance());
- }
-
- private ScriptFunctionImpl(final RecompilableScriptFunctionData data, final ScriptObject scope, final Global global) {
- super(data, getMap(data.isStrict()), scope);
- init(global);
- }
-
- /**
- * Factory method called by compiler generated code for functions that need parent scope.
- *
- * @param constants the generated class' constant array
- * @param index the index of the {@code RecompilableScriptFunctionData} object in the constants array.
- * @param scope the parent scope object
- * @return a newly created function object
- */
- public static ScriptFunction create(final Object[] constants, final int index, final ScriptObject scope) {
- return new ScriptFunctionImpl((RecompilableScriptFunctionData)constants[index], scope, Global.instance());
- }
-
- /**
- * Factory method called by compiler generated code for functions that don't need parent scope.
- *
- * @param constants the generated class' constant array
- * @param index the index of the {@code RecompilableScriptFunctionData} object in the constants array.
- * @return a newly created function object
- */
- public static ScriptFunction create(final Object[] constants, final int index) {
- return create(constants, index, null);
- }
-
- /**
- * Only invoked internally from {@link BoundScriptFunctionImpl} constructor.
- * @param data the script function data for the bound function.
- * @param global the global object
- */
- ScriptFunctionImpl(final ScriptFunctionData data, final Global global) {
- super(data, boundfunctionmap$, null);
- init(global);
- }
-
- static {
- final ArrayList<Property> properties = new ArrayList<>(3);
- properties.add(AccessorProperty.create("prototype", Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE, G$PROTOTYPE, S$PROTOTYPE));
- properties.add(AccessorProperty.create("length", Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE | Property.NOT_WRITABLE, G$LENGTH, null));
- properties.add(AccessorProperty.create("name", Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE | Property.NOT_WRITABLE, G$NAME, null));
- map$ = PropertyMap.newMap(properties);
- strictmodemap$ = createStrictModeMap(map$);
- boundfunctionmap$ = createBoundFunctionMap(strictmodemap$);
- }
-
- private static PropertyMap createStrictModeMap(final PropertyMap map) {
- final int flags = Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE;
- PropertyMap newMap = map;
- // Need to add properties directly to map since slots are assigned speculatively by newUserAccessors.
- newMap = newMap.addPropertyNoHistory(map.newUserAccessors("arguments", flags));
- newMap = newMap.addPropertyNoHistory(map.newUserAccessors("caller", flags));
- return newMap;
- }
-
- private static boolean isStrict(final int flags) {
- return (flags & ScriptFunctionData.IS_STRICT) != 0;
- }
-
- // Choose the map based on strict mode!
- private static PropertyMap getMap(final boolean strict) {
- return strict ? strictmodemap$ : map$;
- }
-
- private static PropertyMap createBoundFunctionMap(final PropertyMap strictModeMap) {
- // Bound function map is same as strict function map, but additionally lacks the "prototype" property, see
- // ECMAScript 5.1 section 15.3.4.5
- return strictModeMap.deleteProperty(strictModeMap.findProperty("prototype"));
- }
-
- // Instance of this class is used as global anonymous function which
- // serves as Function.prototype object.
- private static class AnonymousFunction extends ScriptFunctionImpl {
- private static final PropertyMap anonmap$ = PropertyMap.newMap();
-
- AnonymousFunction() {
- super("", GlobalFunctions.ANONYMOUS, anonmap$, null);
- }
- }
-
- static ScriptFunctionImpl newAnonymousFunction() {
- return new AnonymousFunction();
- }
-
- private static ScriptFunction makeFunction(final String name, final MethodHandle methodHandle, final Specialization[] specs, final int flags) {
- final ScriptFunctionImpl func = new ScriptFunctionImpl(name, methodHandle, null, specs, flags);
- func.setPrototype(UNDEFINED);
- // Non-constructor built-in functions do not have "prototype" property
- func.deleteOwnProperty(func.getMap().findProperty("prototype"));
-
- return func;
- }
-
- /**
- * Factory method for non-constructor built-in functions
- *
- * @param name function name
- * @param methodHandle handle for invocation
- * @param specs specialized versions of function if available, null otherwise
- * @return new ScriptFunction
- */
- static ScriptFunction makeFunction(final String name, final MethodHandle methodHandle, final Specialization[] specs) {
- return makeFunction(name, methodHandle, specs, ScriptFunctionData.IS_BUILTIN);
- }
-
- /**
- * Factory method for non-constructor built-in, strict functions
- *
- * @param name function name
- * @param methodHandle handle for invocation
- * @return new ScriptFunction
- */
- static ScriptFunction makeStrictFunction(final String name, final MethodHandle methodHandle) {
- return makeFunction(name, methodHandle, null, ScriptFunctionData.IS_BUILTIN | ScriptFunctionData.IS_STRICT );
- }
-
- /**
- * Factory method for non-constructor built-in functions
- *
- * @param name function name
- * @param methodHandle handle for invocation
- * @return new ScriptFunction
- */
- static ScriptFunction makeFunction(final String name, final MethodHandle methodHandle) {
- return makeFunction(name, methodHandle, null);
- }
-
- @Override
- public ScriptFunction makeSynchronizedFunction(final Object sync) {
- final MethodHandle mh = MH.insertArguments(ScriptFunction.INVOKE_SYNC, 0, this, sync);
- return makeFunction(getName(), mh);
- }
-
- /**
- * Same as {@link ScriptFunction#makeBoundFunction(Object, Object[])}. The only reason we override it is so that we
- * can expose it.
- * @param self the self to bind to this function. Can be null (in which case, null is bound as this).
- * @param args additional arguments to bind to this function. Can be null or empty to not bind additional arguments.
- * @return a function with the specified self and parameters bound.
- */
- @Override
- public ScriptFunction makeBoundFunction(final Object self, final Object[] args) {
- return super.makeBoundFunction(self, args);
- }
-
- /**
- * This method is used to create a bound function based on this function.
- *
- * @param data the {@code ScriptFunctionData} specifying the functions immutable portion.
- * @return a function initialized from the specified data. Its parent scope will be set to null, therefore the
- * passed in data should not expect a callee.
- */
- @Override
- protected ScriptFunction makeBoundFunction(final ScriptFunctionData data) {
- return new BoundScriptFunctionImpl(data, getTargetFunction());
- }
-
- // return Object.prototype - used by "allocate"
- @Override
- protected final ScriptObject getObjectPrototype() {
- return Global.objectPrototype();
- }
-
- @Override
- public final Object getPrototype() {
- if (prototype == LAZY_PROTOTYPE) {
- prototype = new PrototypeObject(this);
- }
- return prototype;
- }
-
- @Override
- public final void setPrototype(final Object newProto) {
- if (newProto instanceof ScriptObject && newProto != this.prototype && allocatorMap != null) {
- // Replace our current allocator map with one that is associated with the new prototype.
- allocatorMap = allocatorMap.changeProto((ScriptObject)newProto);
- }
- this.prototype = newProto;
- }
-
- // Internals below..
- private void init(final Global global) {
- this.setInitialProto(global.getFunctionPrototype());
- this.prototype = LAZY_PROTOTYPE;
-
- // We have to fill user accessor functions late as these are stored
- // in this object rather than in the PropertyMap of this object.
- assert objectSpill == null;
- final ScriptFunction typeErrorThrower = global.getTypeErrorThrower();
- if (findProperty("arguments", true) != null) {
- initUserAccessors("arguments", Property.NOT_CONFIGURABLE | Property.NOT_ENUMERABLE, typeErrorThrower, typeErrorThrower);
- }
- if (findProperty("caller", true) != null) {
- initUserAccessors("caller", Property.NOT_CONFIGURABLE | Property.NOT_ENUMERABLE, typeErrorThrower, typeErrorThrower);
- }
- }
-}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java Mon Sep 21 17:49:57 2015 +0200
@@ -808,7 +808,7 @@
if (!oldStrictMode && directiveStmts != null) {
// check that directives preceding this one do not violate strictness
for (final Node statement : directiveStmts) {
- // the get value will force unescape of preceeding
+ // the get value will force unescape of preceding
// escaped string directives
getValue(statement.getToken());
}
@@ -2507,7 +2507,7 @@
// run: function() { println("run"); }
// };
//
- // The object literal following the "new Constructor()" expresssion
+ // The object literal following the "new Constructor()" expression
// is passed as an additional (last) argument to the constructor.
if (!env._no_syntax_extensions && type == LBRACE) {
arguments.add(objectLiteral());
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/ParserContextBaseNode.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/ParserContextBaseNode.java Mon Sep 21 17:49:57 2015 +0200
@@ -90,7 +90,7 @@
}
/**
- * Adds a Statement at the end of the Statementlist
+ * Adds a statement at the end of the statement list
* @param statement The statement to add
*/
@Override
@@ -99,7 +99,7 @@
}
/**
- * Adds a statement at the begining of the statementlist
+ * Adds a statement at the beginning of the statement list
* @param statement The statement to add
*/
@Override
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/ParserContextNode.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/ParserContextNode.java Mon Sep 21 17:49:57 2015 +0200
@@ -53,13 +53,13 @@
public void setStatements(final List<Statement> statements);
/**
- * Adds a Statement at the end of the Statementlist
+ * Adds a statement at the end of the statement list
* @param statement The statement to add
*/
public void appendStatement(final Statement statement);
/**
- * Adds a statement at the begining of the statementlist
+ * Adds a statement at the beginning of the statement list
* @param statement The statement to add
*/
public void prependStatement(final Statement statement);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/CodeInstaller.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/CodeInstaller.java Mon Sep 21 17:49:57 2015 +0200
@@ -38,15 +38,14 @@
* The compiler still retains most of the state around code emission
* and management internally, so this is to avoid passing around any
* logic that isn't directly related to installing a class
- * @param <T> owner class type for this code installer
*
*/
-public interface CodeInstaller<T> {
+public interface CodeInstaller {
/**
- * Return the owner for the CodeInstaller, e.g. a {@link Context}
- * @return owner
+ * Return the {@link Context} associated with this code installer.
+ * @return the context.
*/
- public T getOwner();
+ public Context getContext();
/**
* Install a class.
@@ -106,7 +105,7 @@
* new, independent class loader.
* @return a new code installer with a new independent class loader.
*/
- public CodeInstaller<T> withNewLoader();
+ public CodeInstaller withNewLoader();
/**
* Returns true if this code installer is compatible with the other code installer. Compatibility is expected to be
@@ -115,6 +114,6 @@
* @param other the other code installer tested for compatibility with this code installer.
* @return true if this code installer is compatible with the other code installer.
*/
- public boolean isCompatibleWith(CodeInstaller<T> other);
+ public boolean isCompatibleWith(CodeInstaller other);
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/CompiledFunction.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/CompiledFunction.java Mon Sep 21 17:49:57 2015 +0200
@@ -102,7 +102,7 @@
/*
* An optimistic builtin with isOptimistic=true works like any optimistic generated function, i.e. it
* can throw unwarranted optimism exceptions. As native functions trivially can't have parts of them
- * regenerated as restof methods, this only works if the methods are atomic/functional in their behavior
+ * regenerated as "restOf" methods, this only works if the methods are atomic/functional in their behavior
* and doesn't modify state before an UOE can be thrown. If they aren't, we can reexecute a wider version
* of the same builtin in a recompilation handler for FinalScriptFunctionData. There are several
* candidate methods in Native* that would benefit from this, but I haven't had time to implement any
@@ -567,7 +567,7 @@
return handle;
}
- // Otherwise, we need a new level of indirection; need to introduce a mutable call site that can relink itslef
+ // Otherwise, we need a new level of indirection; need to introduce a mutable call site that can relink itself
// to the compiled function's changed target whenever the optimistic assumptions are invalidated.
final CallSite cs = new MutableCallSite(handle.type());
relinkComposableInvoker(cs, this, isConstructor);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Context.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Context.java Mon Sep 21 17:49:57 2015 +0200
@@ -153,7 +153,7 @@
* Currently we are conservative and associate the name of a builtin class with all
* its properties, so it's enough to invalidate a property to break all assumptions
* about a prototype. This can be changed to a more fine grained approach, but no one
- * ever needs this, given the very rare occurance of swapping out only parts of
+ * ever needs this, given the very rare occurrence of swapping out only parts of
* a builtin v.s. the entire builtin object
*/
private final Map<String, SwitchPoint> builtinSwitchPoints = new HashMap<>();
@@ -167,7 +167,7 @@
* ContextCodeInstaller that has the privilege of installing classes in the Context.
* Can only be instantiated from inside the context and is opaque to other classes
*/
- public static class ContextCodeInstaller implements CodeInstaller<ScriptEnvironment> {
+ public static class ContextCodeInstaller implements CodeInstaller {
private final Context context;
private final ScriptLoader loader;
private final CodeSource codeSource;
@@ -185,13 +185,9 @@
this.codeSource = codeSource;
}
- /**
- * Return the script environment for this installer
- * @return ScriptEnvironment
- */
@Override
- public ScriptEnvironment getOwner() {
- return context.env;
+ public Context getContext() {
+ return context;
}
@Override
@@ -254,7 +250,7 @@
}
@Override
- public CodeInstaller<ScriptEnvironment> withNewLoader() {
+ public CodeInstaller withNewLoader() {
// Reuse this installer if we're within our limits.
if (usageCount < MAX_USAGES && bytesDefined < MAX_BYTES_DEFINED) {
return this;
@@ -263,7 +259,7 @@
}
@Override
- public boolean isCompatibleWith(final CodeInstaller<ScriptEnvironment> other) {
+ public boolean isCompatibleWith(final CodeInstaller other) {
if (other instanceof ContextCodeInstaller) {
final ContextCodeInstaller cci = (ContextCodeInstaller)other;
return cci.context == context && cci.codeSource == codeSource;
@@ -1300,14 +1296,12 @@
final URL url = source.getURL();
final ScriptLoader loader = env._loader_per_compile ? createNewLoader() : scriptLoader;
final CodeSource cs = new CodeSource(url, (CodeSigner[])null);
- final CodeInstaller<ScriptEnvironment> installer = new ContextCodeInstaller(this, loader, cs);
+ final CodeInstaller installer = new ContextCodeInstaller(this, loader, cs);
if (storedScript == null) {
final CompilationPhases phases = Compiler.CompilationPhases.COMPILE_ALL;
- final Compiler compiler = new Compiler(
- this,
- env,
+ final Compiler compiler = Compiler.forInitialCompilation(
installer,
source,
errMan,
@@ -1481,7 +1475,7 @@
* @param level log level
* @param mh method handle
* @param paramStart first parameter to print
- * @param printReturnValue should we print the return vaulue?
+ * @param printReturnValue should we print the return value?
* @param text debug printout to add
*
* @return instrumented method handle, or null if logger not enabled
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/FindProperty.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/FindProperty.java Mon Sep 21 17:49:57 2015 +0200
@@ -297,4 +297,3 @@
}
}
-
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/GlobalConstants.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/GlobalConstants.java Mon Sep 21 17:49:57 2015 +0200
@@ -67,7 +67,7 @@
*
* Thus everything registered as a global constant gets an extra chance. Set once,
* reregister the switchpoint. Set twice or more - don't try again forever, or we'd
- * just end up relinking our way into megamorphisism.
+ * just end up relinking our way into megamorphism.
*
* Also it has to be noted that this kind of linking creates a coupling between a Global
* and the call sites in compiled code belonging to the Context. For this reason, the
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSONFunctions.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSONFunctions.java Mon Sep 21 17:49:57 2015 +0200
@@ -26,7 +26,6 @@
package jdk.nashorn.internal.runtime;
import java.lang.invoke.MethodHandle;
-import java.util.Iterator;
import java.util.concurrent.Callable;
import jdk.nashorn.internal.objects.Global;
import jdk.nashorn.internal.parser.JSONParser;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSType.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSType.java Mon Sep 21 17:49:57 2015 +0200
@@ -1967,7 +1967,7 @@
/**
* Get the unboxed (primitive) type for an object
* @param o object
- * @return primive type or Object.class if not primitive
+ * @return primitive type or Object.class if not primitive
*/
public static Class<?> unboxedFieldType(final Object o) {
if (o == null) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ParserException.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ParserException.java Mon Sep 21 17:49:57 2015 +0200
@@ -38,7 +38,7 @@
private final Source source;
// token responsible for this exception
private final long token;
- // if this is traslated as ECMA error, which type should be used?
+ // if this is translated as ECMA error, which type should be used?
private final JSErrorType errorType;
/**
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PropertyListeners.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PropertyListeners.java Mon Sep 21 17:49:57 2015 +0200
@@ -28,6 +28,7 @@
import java.util.Map;
import java.util.Set;
import java.util.WeakHashMap;
+import java.util.concurrent.atomic.LongAdder;
/**
* Helper class to manage property listeners and notification.
@@ -37,8 +38,15 @@
private Map<String, WeakPropertyMapSet> listeners;
// These counters are updated in debug mode
- private static int listenersAdded;
- private static int listenersRemoved;
+ private static LongAdder listenersAdded;
+ private static LongAdder listenersRemoved;
+
+ static {
+ if (Context.DEBUG) {
+ listenersAdded = new LongAdder();
+ listenersRemoved = new LongAdder();
+ }
+ }
/**
* Copy constructor
@@ -54,16 +62,16 @@
* Return aggregate listeners added to all PropertyListenerManagers
* @return the listenersAdded
*/
- public static int getListenersAdded() {
- return listenersAdded;
+ public static long getListenersAdded() {
+ return listenersAdded.longValue();
}
/**
* Return aggregate listeners removed from all PropertyListenerManagers
* @return the listenersRemoved
*/
- public static int getListenersRemoved() {
- return listenersRemoved;
+ public static long getListenersRemoved() {
+ return listenersRemoved.longValue();
}
/**
@@ -122,7 +130,7 @@
*/
synchronized final void addListener(final String key, final PropertyMap propertyMap) {
if (Context.DEBUG) {
- listenersAdded++;
+ listenersAdded.increment();
}
if (listeners == null) {
listeners = new WeakHashMap<>();
@@ -151,6 +159,9 @@
propertyMap.propertyAdded(prop);
}
listeners.remove(prop.getKey());
+ if (Context.DEBUG) {
+ listenersRemoved.increment();
+ }
}
}
}
@@ -168,6 +179,9 @@
propertyMap.propertyDeleted(prop);
}
listeners.remove(prop.getKey());
+ if (Context.DEBUG) {
+ listenersRemoved.increment();
+ }
}
}
}
@@ -187,6 +201,9 @@
propertyMap.propertyModified(oldProp, newProp);
}
listeners.remove(oldProp.getKey());
+ if (Context.DEBUG) {
+ listenersRemoved.increment();
+ }
}
}
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PropertyMap.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PropertyMap.java Mon Sep 21 17:49:57 2015 +0200
@@ -42,6 +42,7 @@
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.WeakHashMap;
+import java.util.concurrent.atomic.LongAdder;
import jdk.nashorn.internal.scripts.JO;
/**
@@ -114,7 +115,7 @@
}
if (Context.DEBUG) {
- count++;
+ count.increment();
}
}
@@ -135,8 +136,8 @@
this.freeSlots = propertyMap.freeSlots;
if (Context.DEBUG) {
- count++;
- clonedCount++;
+ count.increment();
+ clonedCount.increment();
}
}
@@ -328,7 +329,7 @@
if (sp != null) {
protoGetSwitches.remove(key);
if (Context.DEBUG) {
- protoInvalidations++;
+ protoInvalidations.increment();
}
SwitchPoint.invalidateAll(new SwitchPoint[] { sp });
}
@@ -343,7 +344,7 @@
final int size = protoGetSwitches.size();
if (size > 0) {
if (Context.DEBUG) {
- protoInvalidations += size;
+ protoInvalidations.add(size);
}
SwitchPoint.invalidateAll(protoGetSwitches.values().toArray(new SwitchPoint[size]));
protoGetSwitches.clear();
@@ -713,7 +714,7 @@
}
if (Context.DEBUG && cachedMap != null) {
- protoHistoryHit++;
+ protoHistoryHit.increment();
}
return cachedMap;
@@ -762,7 +763,7 @@
if (historicMap != null) {
if (Context.DEBUG) {
- historyHit++;
+ historyHit.increment();
}
return historicMap;
@@ -910,7 +911,7 @@
}
if (Context.DEBUG) {
- setProtoNewMapCount++;
+ setProtoNewMapCount.increment();
}
final PropertyMap newMap = new PropertyMap(this);
@@ -1030,52 +1031,62 @@
}
// counters updated only in debug mode
- private static int count;
- private static int clonedCount;
- private static int historyHit;
- private static int protoInvalidations;
- private static int protoHistoryHit;
- private static int setProtoNewMapCount;
+ private static LongAdder count;
+ private static LongAdder clonedCount;
+ private static LongAdder historyHit;
+ private static LongAdder protoInvalidations;
+ private static LongAdder protoHistoryHit;
+ private static LongAdder setProtoNewMapCount;
+ static {
+ if (Context.DEBUG) {
+ count = new LongAdder();
+ clonedCount = new LongAdder();
+ historyHit = new LongAdder();
+ protoInvalidations = new LongAdder();
+ protoHistoryHit = new LongAdder();
+ setProtoNewMapCount = new LongAdder();
+ }
+ }
/**
* @return Total number of maps.
*/
- public static int getCount() {
- return count;
+ public static long getCount() {
+ return count.longValue();
}
/**
* @return The number of maps that were cloned.
*/
- public static int getClonedCount() {
- return clonedCount;
+ public static long getClonedCount() {
+ return clonedCount.longValue();
}
/**
* @return The number of times history was successfully used.
*/
- public static int getHistoryHit() {
- return historyHit;
+ public static long getHistoryHit() {
+ return historyHit.longValue();
}
/**
* @return The number of times prototype changes caused invalidation.
*/
- public static int getProtoInvalidations() {
- return protoInvalidations;
+ public static long getProtoInvalidations() {
+ return protoInvalidations.longValue();
}
/**
* @return The number of times proto history was successfully used.
*/
- public static int getProtoHistoryHit() {
- return protoHistoryHit;
+ public static long getProtoHistoryHit() {
+ return protoHistoryHit.longValue();
}
/**
* @return The number of times prototypes were modified.
*/
- public static int getSetProtoNewMapCount() {
- return setProtoNewMapCount;
+ public static long getSetProtoNewMapCount() {
+ return setProtoNewMapCount.longValue();
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PrototypeObject.java Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.nashorn.internal.runtime;
+
+import static jdk.nashorn.internal.lookup.Lookup.MH;
+import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED;
+
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+import java.util.ArrayList;
+import jdk.nashorn.internal.objects.Global;
+
+/**
+ * Instances of this class serve as "prototype" object for script functions.
+ * The purpose is to expose "constructor" property from "prototype". Also, nasgen
+ * generated prototype classes extend from this class.
+ */
+public class PrototypeObject extends ScriptObject {
+ private static final PropertyMap map$;
+
+ private Object constructor;
+
+ private static final MethodHandle GET_CONSTRUCTOR = findOwnMH("getConstructor", Object.class, Object.class);
+ private static final MethodHandle SET_CONSTRUCTOR = findOwnMH("setConstructor", void.class, Object.class, Object.class);
+
+ static {
+ final ArrayList<Property> properties = new ArrayList<>(1);
+ properties.add(AccessorProperty.create("constructor", Property.NOT_ENUMERABLE, GET_CONSTRUCTOR, SET_CONSTRUCTOR));
+ map$ = PropertyMap.newMap(properties);
+ }
+
+ private PrototypeObject(final Global global, final PropertyMap map) {
+ super(global.getObjectPrototype(), map != map$? map.addAll(map$) : map$);
+ }
+
+ /**
+ * Prototype constructor
+ */
+ protected PrototypeObject() {
+ this(Global.instance(), map$);
+ }
+
+ /**
+ * PropertyObject constructor
+ *
+ * @param map property map
+ */
+ protected PrototypeObject(final PropertyMap map) {
+ this(Global.instance(), map);
+ }
+
+ /**
+ * PropertyObject constructor
+ *
+ * @param func constructor function
+ */
+ protected PrototypeObject(final ScriptFunction func) {
+ this(Global.instance(), map$);
+ this.constructor = func;
+ }
+
+ /**
+ * Get the constructor for this {@code PrototypeObject}
+ * @param self self reference
+ * @return constructor, probably, but not necessarily, a {@link ScriptFunction}
+ */
+ public static Object getConstructor(final Object self) {
+ return (self instanceof PrototypeObject) ?
+ ((PrototypeObject)self).getConstructor() :
+ UNDEFINED;
+ }
+
+ /**
+ * Reset the constructor for this {@code PrototypeObject}
+ * @param self self reference
+ * @param constructor constructor, probably, but not necessarily, a {@link ScriptFunction}
+ */
+ public static void setConstructor(final Object self, final Object constructor) {
+ if (self instanceof PrototypeObject) {
+ ((PrototypeObject)self).setConstructor(constructor);
+ }
+ }
+
+ private Object getConstructor() {
+ return constructor;
+ }
+
+ private void setConstructor(final Object constructor) {
+ this.constructor = constructor;
+ }
+
+ private static MethodHandle findOwnMH(final String name, final Class<?> rtype, final Class<?>... types) {
+ return MH.findStatic(MethodHandles.lookup(), PrototypeObject.class, name, MH.type(rtype, types));
+ }
+}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java Mon Sep 21 17:49:57 2015 +0200
@@ -119,7 +119,7 @@
private final Object endParserState;
/** Code installer used for all further recompilation/specialization of this ScriptFunction */
- private transient CodeInstaller<ScriptEnvironment> installer;
+ private transient CodeInstaller installer;
private final Map<Integer, RecompilableScriptFunctionData> nestedFunctions;
@@ -153,7 +153,7 @@
*/
public RecompilableScriptFunctionData(
final FunctionNode functionNode,
- final CodeInstaller<ScriptEnvironment> installer,
+ final CodeInstaller installer,
final AllocationStrategy allocationStrategy,
final Map<Integer, RecompilableScriptFunctionData> nestedFunctions,
final Map<String, Integer> externalScopeDepths,
@@ -285,7 +285,7 @@
* @param src source
* @param inst code installer
*/
- public void initTransients(final Source src, final CodeInstaller<ScriptEnvironment> inst) {
+ public void initTransients(final Source src, final CodeInstaller inst) {
if (this.source == null && this.installer == null) {
this.source = src;
this.installer = inst;
@@ -500,7 +500,7 @@
}
private FunctionNode deserialize(final byte[] serializedAst) {
- final ScriptEnvironment env = installer.getOwner();
+ final ScriptEnvironment env = installer.getContext().getEnv();
final Timing timing = env._timing;
final long t1 = System.nanoTime();
try {
@@ -647,8 +647,8 @@
* a new class loader with optimistic typing so that deoptimized code can get reclaimed by GC.
* @return a code installer for installing new code.
*/
- private CodeInstaller<ScriptEnvironment> getInstallerForNewCode() {
- final ScriptEnvironment env = installer.getOwner();
+ private CodeInstaller getInstallerForNewCode() {
+ final ScriptEnvironment env = installer.getContext().getEnv();
return env._optimistic_types || env._loader_per_compile ? installer.withNewLoader() : installer;
}
@@ -658,15 +658,10 @@
final TypeMap typeMap = typeMap(actualCallSiteType);
final Type[] paramTypes = typeMap == null ? null : typeMap.getParameterTypes(functionNodeId);
final Object typeInformationFile = OptimisticTypesPersistence.getLocationDescriptor(source, functionNodeId, paramTypes);
- final Context context = Context.getContextTrusted();
- return new Compiler(
- context,
- context.getEnv(),
+ return Compiler.forOnDemandCompilation(
getInstallerForNewCode(),
functionNode.getSource(), // source
- context.getErrorManager(),
isStrict() | functionNode.isStrict(), // is strict
- true, // is on demand
this, // compiledFunction, i.e. this RecompilableScriptFunctionData
typeMap, // type map
getEffectiveInvalidatedProgramPoints(invalidatedProgramPoints, typeInformationFile), // invalidated program points
@@ -709,7 +704,7 @@
final TypeMap typeMap = typeMap(actualCallSiteType);
final Type[] paramTypes = typeMap == null ? null : typeMap.getParameterTypes(functionNodeId);
cacheKey = CodeStore.getCacheKey(functionNodeId, paramTypes);
- final CodeInstaller<ScriptEnvironment> newInstaller = getInstallerForNewCode();
+ final CodeInstaller newInstaller = getInstallerForNewCode();
final StoredScript script = newInstaller.loadScript(source, cacheKey);
if (script != null) {
@@ -730,7 +725,7 @@
}
boolean usePersistentCodeCache() {
- return installer != null && installer.getOwner()._persistent_cache;
+ return installer != null && installer.getContext().getEnv()._persistent_cache;
}
private MethodType explicitParams(final MethodType callSiteType) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Scope.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Scope.java Mon Sep 21 17:49:57 2015 +0200
@@ -27,6 +27,7 @@
import static jdk.nashorn.internal.codegen.CompilerConstants.virtualCallNoLookup;
+import java.util.concurrent.atomic.LongAdder;
import jdk.nashorn.internal.codegen.CompilerConstants;
/**
@@ -38,7 +39,7 @@
private int splitState = -1;
/** This is updated only in debug mode - counts number of {@code ScriptObject} instances created that are scope */
- private static int count;
+ private static final LongAdder count = Context.DEBUG ? new LongAdder() : null;
/** Method handle that points to {@link Scope#getSplitState}. */
public static final CompilerConstants.Call GET_SPLIT_STATE = virtualCallNoLookup(Scope.class, "getSplitState", int.class);
@@ -52,9 +53,7 @@
*/
public Scope(final PropertyMap map) {
super(map);
- if (Context.DEBUG) {
- count++;
- }
+ incrementCount();
}
/**
@@ -65,9 +64,7 @@
*/
public Scope(final ScriptObject proto, final PropertyMap map) {
super(proto, map);
- if (Context.DEBUG) {
- count++;
- }
+ incrementCount();
}
/**
@@ -79,9 +76,7 @@
*/
public Scope(final PropertyMap map, final long[] primitiveSpill, final Object[] objectSpill) {
super(map, primitiveSpill, objectSpill);
- if (Context.DEBUG) {
- count++;
- }
+ incrementCount();
}
@Override
@@ -123,7 +118,13 @@
*
* @return number of scope ScriptObjects created
*/
- public static int getScopeCount() {
- return count;
+ public static long getScopeCount() {
+ return count != null ? count.sum() : 0;
+ }
+
+ private static void incrementCount() {
+ if (Context.DEBUG) {
+ count.increment();
+ }
}
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptFunction.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptFunction.java Mon Sep 21 17:49:57 2015 +0200
@@ -22,7 +22,6 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
-
package jdk.nashorn.internal.runtime;
import static jdk.nashorn.internal.codegen.CompilerConstants.virtualCallNoLookup;
@@ -40,6 +39,7 @@
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
+import java.util.concurrent.atomic.LongAdder;
import jdk.internal.dynalink.CallSiteDescriptor;
import jdk.internal.dynalink.linker.GuardedInvocation;
import jdk.internal.dynalink.linker.LinkRequest;
@@ -55,38 +55,54 @@
import jdk.nashorn.internal.runtime.logging.DebugLogger;
/**
- * Runtime representation of a JavaScript function.
+ * Runtime representation of a JavaScript function. This class has only private
+ * and protected constructors. There are no *public* constructors - but only
+ * factory methods that follow the naming pattern "createXYZ".
*/
-public abstract class ScriptFunction extends ScriptObject {
+public class ScriptFunction extends ScriptObject {
- /** Method handle for prototype getter for this ScriptFunction */
+ /**
+ * Method handle for prototype getter for this ScriptFunction
+ */
public static final MethodHandle G$PROTOTYPE = findOwnMH_S("G$prototype", Object.class, Object.class);
- /** Method handle for prototype setter for this ScriptFunction */
+ /**
+ * Method handle for prototype setter for this ScriptFunction
+ */
public static final MethodHandle S$PROTOTYPE = findOwnMH_S("S$prototype", void.class, Object.class, Object.class);
- /** Method handle for length getter for this ScriptFunction */
+ /**
+ * Method handle for length getter for this ScriptFunction
+ */
public static final MethodHandle G$LENGTH = findOwnMH_S("G$length", int.class, Object.class);
- /** Method handle for name getter for this ScriptFunction */
+ /**
+ * Method handle for name getter for this ScriptFunction
+ */
public static final MethodHandle G$NAME = findOwnMH_S("G$name", Object.class, Object.class);
- /** Method handle used for implementing sync() in mozilla_compat */
+ /**
+ * Method handle used for implementing sync() in mozilla_compat
+ */
public static final MethodHandle INVOKE_SYNC = findOwnMH_S("invokeSync", Object.class, ScriptFunction.class, Object.class, Object.class, Object[].class);
- /** Method handle for allocate function for this ScriptFunction */
+ /**
+ * Method handle for allocate function for this ScriptFunction
+ */
static final MethodHandle ALLOCATE = findOwnMH_V("allocate", Object.class);
private static final MethodHandle WRAPFILTER = findOwnMH_S("wrapFilter", Object.class, Object.class);
private static final MethodHandle SCRIPTFUNCTION_GLOBALFILTER = findOwnMH_S("globalFilter", Object.class, Object.class);
- /** method handle to scope getter for this ScriptFunction */
+ /**
+ * method handle to scope getter for this ScriptFunction
+ */
public static final Call GET_SCOPE = virtualCallNoLookup(ScriptFunction.class, "getScope", ScriptObject.class);
- private static final MethodHandle IS_FUNCTION_MH = findOwnMH_S("isFunctionMH", boolean.class, Object.class, ScriptFunctionData.class);
+ private static final MethodHandle IS_FUNCTION_MH = findOwnMH_S("isFunctionMH", boolean.class, Object.class, ScriptFunctionData.class);
- private static final MethodHandle IS_APPLY_FUNCTION = findOwnMH_S("isApplyFunction", boolean.class, boolean.class, Object.class, Object.class);
+ private static final MethodHandle IS_APPLY_FUNCTION = findOwnMH_S("isApplyFunction", boolean.class, boolean.class, Object.class, Object.class);
private static final MethodHandle IS_NONSTRICT_FUNCTION = findOwnMH_S("isNonStrictFunction", boolean.class, Object.class, Object.class, ScriptFunctionData.class);
@@ -94,55 +110,298 @@
private static final MethodHandle WRAP_THIS = MH.findStatic(MethodHandles.lookup(), ScriptFunctionData.class, "wrapThis", MH.type(Object.class, Object.class));
- /** The parent scope. */
+ // various property maps used for different kinds of functions
+ // property map for anonymous function that serves as Function.prototype
+ private static final PropertyMap anonmap$;
+ // property map for strict mode functions
+ private static final PropertyMap strictmodemap$;
+ // property map for bound functions
+ private static final PropertyMap boundfunctionmap$;
+ // property map for non-strict, non-bound functions.
+ private static final PropertyMap map$;
+
+ // Marker object for lazily initialized prototype object
+ private static final Object LAZY_PROTOTYPE = new Object();
+
+ private static PropertyMap createStrictModeMap(final PropertyMap map) {
+ final int flags = Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE;
+ PropertyMap newMap = map;
+ // Need to add properties directly to map since slots are assigned speculatively by newUserAccessors.
+ newMap = newMap.addPropertyNoHistory(map.newUserAccessors("arguments", flags));
+ newMap = newMap.addPropertyNoHistory(map.newUserAccessors("caller", flags));
+ return newMap;
+ }
+
+ private static PropertyMap createBoundFunctionMap(final PropertyMap strictModeMap) {
+ // Bound function map is same as strict function map, but additionally lacks the "prototype" property, see
+ // ECMAScript 5.1 section 15.3.4.5
+ return strictModeMap.deleteProperty(strictModeMap.findProperty("prototype"));
+ }
+
+ static {
+ anonmap$ = PropertyMap.newMap();
+ final ArrayList<Property> properties = new ArrayList<>(3);
+ properties.add(AccessorProperty.create("prototype", Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE, G$PROTOTYPE, S$PROTOTYPE));
+ properties.add(AccessorProperty.create("length", Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE | Property.NOT_WRITABLE, G$LENGTH, null));
+ properties.add(AccessorProperty.create("name", Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE | Property.NOT_WRITABLE, G$NAME, null));
+ map$ = PropertyMap.newMap(properties);
+ strictmodemap$ = createStrictModeMap(map$);
+ boundfunctionmap$ = createBoundFunctionMap(strictmodemap$);
+ }
+
+ private static boolean isStrict(final int flags) {
+ return (flags & ScriptFunctionData.IS_STRICT) != 0;
+ }
+
+ // Choose the map based on strict mode!
+ private static PropertyMap getMap(final boolean strict) {
+ return strict ? strictmodemap$ : map$;
+ }
+
+ /**
+ * The parent scope.
+ */
private final ScriptObject scope;
private final ScriptFunctionData data;
- /** The property map used for newly allocated object when function is used as constructor. */
+ /**
+ * The property map used for newly allocated object when function is used as
+ * constructor.
+ */
protected PropertyMap allocatorMap;
/**
+ * Reference to constructor prototype.
+ */
+ protected Object prototype;
+
+ /**
* Constructor
*
- * @param name function name
- * @param methodHandle method handle to function (if specializations are present, assumed to be most generic)
- * @param map property map
- * @param scope scope
- * @param specs specialized version of this function - other method handles
- * @param flags {@link ScriptFunctionData} flags
+ * @param data static function data
+ * @param map property map
+ * @param scope scope
*/
- protected ScriptFunction(
+ private ScriptFunction(
+ final ScriptFunctionData data,
+ final PropertyMap map,
+ final ScriptObject scope,
+ final Global global) {
+
+ super(map);
+
+ if (Context.DEBUG) {
+ constructorCount.increment();
+ }
+
+ this.data = data;
+ this.scope = scope;
+ this.setInitialProto(global.getFunctionPrototype());
+ this.prototype = LAZY_PROTOTYPE;
+
+ // We have to fill user accessor functions late as these are stored
+ // in this object rather than in the PropertyMap of this object.
+ assert objectSpill == null;
+ if (isStrict() || isBoundFunction()) {
+ final ScriptFunction typeErrorThrower = global.getTypeErrorThrower();
+ initUserAccessors("arguments", Property.NOT_CONFIGURABLE | Property.NOT_ENUMERABLE, typeErrorThrower, typeErrorThrower);
+ initUserAccessors("caller", Property.NOT_CONFIGURABLE | Property.NOT_ENUMERABLE, typeErrorThrower, typeErrorThrower);
+ }
+ }
+
+ /**
+ * Constructor
+ *
+ * @param name function name
+ * @param methodHandle method handle to function (if specializations are
+ * present, assumed to be most generic)
+ * @param map property map
+ * @param scope scope
+ * @param specs specialized version of this function - other method handles
+ * @param flags {@link ScriptFunctionData} flags
+ */
+ private ScriptFunction(
final String name,
final MethodHandle methodHandle,
final PropertyMap map,
final ScriptObject scope,
final Specialization[] specs,
- final int flags) {
-
- this(new FinalScriptFunctionData(name, methodHandle, specs, flags), map, scope);
+ final int flags,
+ final Global global) {
+ this(new FinalScriptFunctionData(name, methodHandle, specs, flags), map, scope, global);
}
/**
* Constructor
*
- * @param data static function data
- * @param map property map
- * @param scope scope
+ * @param name name of function
+ * @param methodHandle handle for invocation
+ * @param scope scope object
+ * @param specs specialized versions of this method, if available, null
+ * otherwise
+ * @param flags {@link ScriptFunctionData} flags
+ */
+ private ScriptFunction(
+ final String name,
+ final MethodHandle methodHandle,
+ final ScriptObject scope,
+ final Specialization[] specs,
+ final int flags) {
+ this(name, methodHandle, getMap(isStrict(flags)), scope, specs, flags, Global.instance());
+ }
+
+ /**
+ * Constructor called by Nasgen generated code, zero added members, use the
+ * default map. Creates builtin functions only.
+ *
+ * @param name name of function
+ * @param invokeHandle handle for invocation
+ * @param specs specialized versions of this method, if available, null
+ * otherwise
+ */
+ protected ScriptFunction(final String name, final MethodHandle invokeHandle, final Specialization[] specs) {
+ this(name, invokeHandle, map$, null, specs, ScriptFunctionData.IS_BUILTIN_CONSTRUCTOR, Global.instance());
+ }
+
+ /**
+ * Constructor called by Nasgen generated code, non zero member count, use
+ * the map passed as argument. Creates builtin functions only.
+ *
+ * @param name name of function
+ * @param invokeHandle handle for invocation
+ * @param map initial property map
+ * @param specs specialized versions of this method, if available, null
+ * otherwise
+ */
+ protected ScriptFunction(final String name, final MethodHandle invokeHandle, final PropertyMap map, final Specialization[] specs) {
+ this(name, invokeHandle, map.addAll(map$), null, specs, ScriptFunctionData.IS_BUILTIN_CONSTRUCTOR, Global.instance());
+ }
+
+ // Factory methods to create various functions
+ /**
+ * Factory method called by compiler generated code for functions that need
+ * parent scope.
+ *
+ * @param constants the generated class' constant array
+ * @param index the index of the {@code RecompilableScriptFunctionData}
+ * object in the constants array.
+ * @param scope the parent scope object
+ * @return a newly created function object
*/
- protected ScriptFunction(
- final ScriptFunctionData data,
- final PropertyMap map,
- final ScriptObject scope) {
+ public static ScriptFunction create(final Object[] constants, final int index, final ScriptObject scope) {
+ final RecompilableScriptFunctionData data = (RecompilableScriptFunctionData) constants[index];
+ return new ScriptFunction(data, getMap(data.isStrict()), scope, Global.instance());
+ }
+
+ /**
+ * Factory method called by compiler generated code for functions that don't
+ * need parent scope.
+ *
+ * @param constants the generated class' constant array
+ * @param index the index of the {@code RecompilableScriptFunctionData}
+ * object in the constants array.
+ * @return a newly created function object
+ */
+ public static ScriptFunction create(final Object[] constants, final int index) {
+ return create(constants, index, null);
+ }
+
+ /**
+ * Create anonymous function that serves as Function.prototype
+ *
+ * @return anonymous function object
+ */
+ public static ScriptFunction createAnonymous() {
+ return new ScriptFunction("", GlobalFunctions.ANONYMOUS, anonmap$, null);
+ }
+
+ // builtin function create helper factory
+ private static ScriptFunction createBuiltin(final String name, final MethodHandle methodHandle, final Specialization[] specs, final int flags) {
+ final ScriptFunction func = new ScriptFunction(name, methodHandle, null, specs, flags);
+ func.setPrototype(UNDEFINED);
+ // Non-constructor built-in functions do not have "prototype" property
+ func.deleteOwnProperty(func.getMap().findProperty("prototype"));
+
+ return func;
+ }
- super(map);
+ /**
+ * Factory method for non-constructor built-in functions
+ *
+ * @param name function name
+ * @param methodHandle handle for invocation
+ * @param specs specialized versions of function if available, null
+ * otherwise
+ * @return new ScriptFunction
+ */
+ public static ScriptFunction createBuiltin(final String name, final MethodHandle methodHandle, final Specialization[] specs) {
+ return ScriptFunction.createBuiltin(name, methodHandle, specs, ScriptFunctionData.IS_BUILTIN);
+ }
- if (Context.DEBUG) {
- constructorCount++;
+ /**
+ * Factory method for non-constructor built-in functions
+ *
+ * @param name function name
+ * @param methodHandle handle for invocation
+ * @return new ScriptFunction
+ */
+ public static ScriptFunction createBuiltin(final String name, final MethodHandle methodHandle) {
+ return ScriptFunction.createBuiltin(name, methodHandle, null);
+ }
+
+ /**
+ * Factory method for non-constructor built-in, strict functions
+ *
+ * @param name function name
+ * @param methodHandle handle for invocation
+ * @return new ScriptFunction
+ */
+ public static ScriptFunction createStrictBuiltin(final String name, final MethodHandle methodHandle) {
+ return ScriptFunction.createBuiltin(name, methodHandle, null, ScriptFunctionData.IS_BUILTIN | ScriptFunctionData.IS_STRICT);
+ }
+
+ // Subclass to represent bound functions
+ private static class Bound extends ScriptFunction {
+ private final ScriptFunction target;
+
+ Bound(final ScriptFunctionData boundData, final ScriptFunction target) {
+ super(boundData, boundfunctionmap$, null, Global.instance());
+ setPrototype(ScriptRuntime.UNDEFINED);
+ this.target = target;
}
- this.data = data;
- this.scope = scope;
+ @Override
+ protected ScriptFunction getTargetFunction() {
+ return target;
+ }
+ }
+
+ /**
+ * Creates a version of this function bound to a specific "self" and other
+ * arguments, as per {@code Function.prototype.bind} functionality in
+ * ECMAScript 5.1 section 15.3.4.5.
+ *
+ * @param self the self to bind to this function. Can be null (in which
+ * case, null is bound as this).
+ * @param args additional arguments to bind to this function. Can be null or
+ * empty to not bind additional arguments.
+ * @return a function with the specified self and parameters bound.
+ */
+ public final ScriptFunction createBound(final Object self, final Object[] args) {
+ return new Bound(data.makeBoundFunctionData(this, self, args), getTargetFunction());
+ }
+
+ /**
+ * Create a function that invokes this function synchronized on {@code sync}
+ * or the self object of the invocation.
+ *
+ * @param sync the Object to synchronize on, or undefined
+ * @return synchronized function
+ */
+ public final ScriptFunction createSynchronized(final Object sync) {
+ final MethodHandle mh = MH.insertArguments(ScriptFunction.INVOKE_SYNC, 0, this, sync);
+ return createBuiltin(getName(), mh);
}
@Override
@@ -151,8 +410,8 @@
}
/**
- * ECMA 15.3.5.3 [[HasInstance]] (V)
- * Step 3 if "prototype" value is not an Object, throw TypeError
+ * ECMA 15.3.5.3 [[HasInstance]] (V) Step 3 if "prototype" value is not an
+ * Object, throw TypeError
*/
@Override
public boolean isInstance(final ScriptObject instance) {
@@ -171,22 +430,25 @@
}
/**
- * Returns the target function for this function. If the function was not created using
- * {@link #makeBoundFunction(Object, Object[])}, its target function is itself. If it is bound, its target function
- * is the target function of the function it was made from (therefore, the target function is always the final,
- * unbound recipient of the calls).
+ * Returns the target function for this function. If the function was not
+ * created using {@link #createBound(Object, Object[])}, its target
+ * function is itself. If it is bound, its target function is the target
+ * function of the function it was made from (therefore, the target function
+ * is always the final, unbound recipient of the calls).
+ *
* @return the target function for this function.
*/
protected ScriptFunction getTargetFunction() {
return this;
}
- boolean isBoundFunction() {
+ final boolean isBoundFunction() {
return getTargetFunction() != this;
}
/**
* Set the arity of this ScriptFunction
+ *
* @param arity arity
*/
public final void setArity(final int arity) {
@@ -195,59 +457,66 @@
/**
* Is this a ECMAScript 'use strict' function?
+ *
* @return true if function is in strict mode
*/
- public boolean isStrict() {
+ public final boolean isStrict() {
return data.isStrict();
}
/**
- * Returns true if this is a non-strict, non-built-in function that requires non-primitive this argument
- * according to ECMA 10.4.3.
+ * Returns true if this is a non-strict, non-built-in function that requires
+ * non-primitive this argument according to ECMA 10.4.3.
+ *
* @return true if this argument must be an object
*/
- public boolean needsWrappedThis() {
+ public final boolean needsWrappedThis() {
return data.needsWrappedThis();
}
private static boolean needsWrappedThis(final Object fn) {
- return fn instanceof ScriptFunction ? ((ScriptFunction)fn).needsWrappedThis() : false;
+ return fn instanceof ScriptFunction ? ((ScriptFunction) fn).needsWrappedThis() : false;
}
/**
* Execute this script function.
- * @param self Target object.
- * @param arguments Call arguments.
+ *
+ * @param self Target object.
+ * @param arguments Call arguments.
* @return ScriptFunction result.
- * @throws Throwable if there is an exception/error with the invocation or thrown from it
+ * @throws Throwable if there is an exception/error with the invocation or
+ * thrown from it
*/
- Object invoke(final Object self, final Object... arguments) throws Throwable {
+ final Object invoke(final Object self, final Object... arguments) throws Throwable {
if (Context.DEBUG) {
- invokes++;
+ invokes.increment();
}
return data.invoke(this, self, arguments);
}
/**
* Execute this script function as a constructor.
- * @param arguments Call arguments.
+ *
+ * @param arguments Call arguments.
* @return Newly constructed result.
- * @throws Throwable if there is an exception/error with the invocation or thrown from it
+ * @throws Throwable if there is an exception/error with the invocation or
+ * thrown from it
*/
- Object construct(final Object... arguments) throws Throwable {
+ final Object construct(final Object... arguments) throws Throwable {
return data.construct(this, arguments);
}
/**
- * Allocate function. Called from generated {@link ScriptObject} code
- * for allocation as a factory method
+ * Allocate function. Called from generated {@link ScriptObject} code for
+ * allocation as a factory method
*
- * @return a new instance of the {@link ScriptObject} whose allocator this is
+ * @return a new instance of the {@link ScriptObject} whose allocator this
+ * is
*/
@SuppressWarnings("unused")
private Object allocate() {
if (Context.DEBUG) {
- allocations++;
+ allocations.increment();
}
assert !isBoundFunction(); // allocate never invoked on bound functions
@@ -257,7 +526,7 @@
if (object != null) {
final Object prototype = getPrototype();
if (prototype instanceof ScriptObject) {
- object.setInitialProto((ScriptObject)prototype);
+ object.setInitialProto((ScriptObject) prototype);
}
if (object.getProto() == null) {
@@ -277,43 +546,28 @@
/**
* Return Object.prototype - used by "allocate"
+ *
* @return Object.prototype
*/
- protected abstract ScriptObject getObjectPrototype();
-
- /**
- * Creates a version of this function bound to a specific "self" and other arguments, as per
- * {@code Function.prototype.bind} functionality in ECMAScript 5.1 section 15.3.4.5.
- * @param self the self to bind to this function. Can be null (in which case, null is bound as this).
- * @param args additional arguments to bind to this function. Can be null or empty to not bind additional arguments.
- * @return a function with the specified self and parameters bound.
- */
- protected ScriptFunction makeBoundFunction(final Object self, final Object[] args) {
- return makeBoundFunction(data.makeBoundFunctionData(this, self, args));
+ protected final ScriptObject getObjectPrototype() {
+ return Global.objectPrototype();
}
- /**
- * Create a version of this function as in {@link ScriptFunction#makeBoundFunction(Object, Object[])},
- * but using a {@link ScriptFunctionData} for the bound data.
- *
- * @param boundData ScriptFuntionData for the bound function
- * @return a function with the bindings performed according to the given data
- */
- protected abstract ScriptFunction makeBoundFunction(ScriptFunctionData boundData);
-
@Override
public final String safeToString() {
return toSource();
}
@Override
- public String toString() {
+ public final String toString() {
return data.toString();
}
/**
- * Get this function as a String containing its source code. If no source code
- * exists in this ScriptFunction, its contents will be displayed as {@code [native code]}
+ * Get this function as a String containing its source code. If no source
+ * code exists in this ScriptFunction, its contents will be displayed as
+ * {@code [native code]}
+ *
* @return string representation of this function's source
*/
public final String toSource() {
@@ -322,27 +576,32 @@
/**
* Get the prototype object for this function
+ *
* @return prototype
*/
- public abstract Object getPrototype();
+ public final Object getPrototype() {
+ if (prototype == LAZY_PROTOTYPE) {
+ prototype = new PrototypeObject(this);
+ }
+ return prototype;
+ }
/**
* Set the prototype object for this function
- * @param prototype new prototype object
+ *
+ * @param newPrototype new prototype object
*/
- public abstract void setPrototype(Object prototype);
+ public final void setPrototype(Object newPrototype) {
+ if (newPrototype instanceof ScriptObject && newPrototype != this.prototype && allocatorMap != null) {
+ // Replace our current allocator map with one that is associated with the new prototype.
+ allocatorMap = allocatorMap.changeProto((ScriptObject) newPrototype);
+ }
+ this.prototype = newPrototype;
+ }
/**
- * Create a function that invokes this function synchronized on {@code sync} or the self object
- * of the invocation.
- * @param sync the Object to synchronize on, or undefined
- * @return synchronized function
- */
- public abstract ScriptFunction makeSynchronizedFunction(Object sync);
-
- /**
- * Return the invoke handle bound to a given ScriptObject self reference.
- * If callee parameter is required result is rebound to this.
+ * Return the invoke handle bound to a given ScriptObject self reference. If
+ * callee parameter is required result is rebound to this.
*
* @param self self reference
* @return bound invoke handle
@@ -352,9 +611,12 @@
}
/**
- * Bind the method handle to this {@code ScriptFunction} instance if it needs a callee parameter. If this function's
- * method handles don't have a callee parameter, the handle is returned unchanged.
- * @param methodHandle the method handle to potentially bind to this function instance.
+ * Bind the method handle to this {@code ScriptFunction} instance if it
+ * needs a callee parameter. If this function's method handles don't have a
+ * callee parameter, the handle is returned unchanged.
+ *
+ * @param methodHandle the method handle to potentially bind to this
+ * function instance.
* @return the potentially bound method handle
*/
private MethodHandle bindToCalleeIfNeeded(final MethodHandle methodHandle) {
@@ -364,15 +626,16 @@
/**
* Get the name for this function
+ *
* @return the name
*/
public final String getName() {
return data.getName();
}
-
/**
* Get the scope for this function
+ *
* @return the scope
*/
public final ScriptObject getScope() {
@@ -383,36 +646,37 @@
* Prototype getter for this ScriptFunction - follows the naming convention
* used by Nasgen and the code generator
*
- * @param self self reference
+ * @param self self reference
* @return self's prototype
*/
public static Object G$prototype(final Object self) {
- return self instanceof ScriptFunction ?
- ((ScriptFunction)self).getPrototype() :
- UNDEFINED;
+ return self instanceof ScriptFunction
+ ? ((ScriptFunction) self).getPrototype()
+ : UNDEFINED;
}
/**
* Prototype setter for this ScriptFunction - follows the naming convention
* used by Nasgen and the code generator
*
- * @param self self reference
+ * @param self self reference
* @param prototype prototype to set
*/
public static void S$prototype(final Object self, final Object prototype) {
if (self instanceof ScriptFunction) {
- ((ScriptFunction)self).setPrototype(prototype);
+ ((ScriptFunction) self).setPrototype(prototype);
}
}
/**
* Length getter - ECMA 15.3.3.2: Function.length
+ *
* @param self self reference
* @return length
*/
public static int G$length(final Object self) {
if (self instanceof ScriptFunction) {
- return ((ScriptFunction)self).data.getArity();
+ return ((ScriptFunction) self).data.getArity();
}
return 0;
@@ -420,12 +684,13 @@
/**
* Name getter - ECMA Function.name
+ *
* @param self self refence
* @return the name, or undefined if none
*/
public static Object G$name(final Object self) {
if (self instanceof ScriptFunction) {
- return ((ScriptFunction)self).getName();
+ return ((ScriptFunction) self).getName();
}
return UNDEFINED;
@@ -433,6 +698,7 @@
/**
* Get the prototype for this ScriptFunction
+ *
* @param constructor constructor
* @return prototype, or null if given constructor is not a ScriptFunction
*/
@@ -440,7 +706,7 @@
if (constructor != null) {
final Object proto = constructor.getPrototype();
if (proto instanceof ScriptObject) {
- return (ScriptObject)proto;
+ return (ScriptObject) proto;
}
}
@@ -448,29 +714,37 @@
}
// These counters are updated only in debug mode.
- private static int constructorCount;
- private static int invokes;
- private static int allocations;
+ private static LongAdder constructorCount;
+ private static LongAdder invokes;
+ private static LongAdder allocations;
+
+ static {
+ if (Context.DEBUG) {
+ constructorCount = new LongAdder();
+ invokes = new LongAdder();
+ allocations = new LongAdder();
+ }
+ }
/**
* @return the constructorCount
*/
- public static int getConstructorCount() {
- return constructorCount;
+ public static long getConstructorCount() {
+ return constructorCount.longValue();
}
/**
* @return the invokes
*/
- public static int getInvokes() {
- return invokes;
+ public static long getInvokes() {
+ return invokes.longValue();
}
/**
* @return the allocations
*/
- public static int getAllocations() {
- return allocations;
+ public static long getAllocations() {
+ return allocations.longValue();
}
@Override
@@ -490,7 +764,6 @@
return Context.getGlobal().wrapAsObject(obj);
}
-
@SuppressWarnings("unused")
private static Object globalFilter(final Object object) {
// replace whatever we get with the current global object
@@ -498,14 +771,16 @@
}
/**
- * Some receivers are primitive, in that case, according to the Spec we create a new
- * native object per callsite with the wrap filter. We can only apply optimistic builtins
- * if there is no per instance state saved for these wrapped objects (e.g. currently NativeStrings),
- * otherwise we can't create optimistic versions
+ * Some receivers are primitive, in that case, according to the Spec we
+ * create a new native object per callsite with the wrap filter. We can only
+ * apply optimistic builtins if there is no per instance state saved for
+ * these wrapped objects (e.g. currently NativeStrings), otherwise we can't
+ * create optimistic versions
*
- * @param self receiver
- * @param linkLogicClass linkLogicClass, or null if no link logic exists
- * @return link logic instance, or null if one could not be constructed for this receiver
+ * @param self receiver
+ * @param linkLogicClass linkLogicClass, or null if no link logic exists
+ * @return link logic instance, or null if one could not be constructed for
+ * this receiver
*/
private static LinkLogic getLinkLogic(final Object self, final Class<? extends LinkLogic> linkLogicClass) {
if (linkLogicClass == null) {
@@ -518,25 +793,25 @@
final Object wrappedSelf = wrapFilter(self);
if (wrappedSelf instanceof OptimisticBuiltins) {
- if (wrappedSelf != self && ((OptimisticBuiltins)wrappedSelf).hasPerInstanceAssumptions()) {
+ if (wrappedSelf != self && ((OptimisticBuiltins) wrappedSelf).hasPerInstanceAssumptions()) {
return null; //pessimistic - we created a wrapped object different from the primitive, but the assumptions have instance state
}
- return ((OptimisticBuiltins)wrappedSelf).getLinkLogic(linkLogicClass);
+ return ((OptimisticBuiltins) wrappedSelf).getLinkLogic(linkLogicClass);
}
return null;
}
/**
- * dyn:call call site signature: (callee, thiz, [args...])
- * generated method signature: (callee, thiz, [args...])
+ * dyn:call call site signature: (callee, thiz, [args...]) generated method
+ * signature: (callee, thiz, [args...])
*
* cases:
* (a) method has callee parameter
- * (1) for local/scope calls, we just bind thiz and drop the second argument.
- * (2) for normal this-calls, we have to swap thiz and callee to get matching signatures.
+ * (1) for local/scope calls, we just bind thiz and drop the second argument.
+ * (2) for normal this-calls, we have to swap thiz and callee to get matching signatures.
* (b) method doesn't have callee parameter (builtin functions)
- * (3) for local/scope calls, bind thiz and drop both callee and thiz.
- * (4) for normal this-calls, drop callee.
+ * (3) for local/scope calls, bind thiz and drop both callee and thiz.
+ * (4) for normal this-calls, drop callee.
*
* @return guarded invocation for call
*/
@@ -544,11 +819,11 @@
protected GuardedInvocation findCallMethod(final CallSiteDescriptor desc, final LinkRequest request) {
final MethodType type = desc.getMethodType();
- final String name = getName();
+ final String name = getName();
final boolean isUnstable = request.isCallSiteUnstable();
- final boolean scopeCall = NashornCallSiteDescriptor.isScope(desc);
- final boolean isCall = !scopeCall && data.isBuiltin() && "call".equals(name);
- final boolean isApply = !scopeCall && data.isBuiltin() && "apply".equals(name);
+ final boolean scopeCall = NashornCallSiteDescriptor.isScope(desc);
+ final boolean isCall = !scopeCall && data.isBuiltin() && "call".equals(name);
+ final boolean isApply = !scopeCall && data.isBuiltin() && "apply".equals(name);
final boolean isApplyOrCall = isCall | isApply;
@@ -569,7 +844,7 @@
return new GuardedInvocation(
handle,
null,
- (SwitchPoint)null,
+ (SwitchPoint) null,
ClassCastException.class);
}
@@ -672,14 +947,14 @@
this,
cf.getFlags()) :
guard,
- spsArray,
+ spsArray,
exceptionGuard);
}
private GuardedInvocation createApplyOrCallCall(final boolean isApply, final CallSiteDescriptor desc, final LinkRequest request, final Object[] args) {
final MethodType descType = desc.getMethodType();
final int paramCount = descType.parameterCount();
- if(descType.parameterType(paramCount - 1).isArray()) {
+ if (descType.parameterType(paramCount - 1).isArray()) {
// This is vararg invocation of apply or call. This can normally only happen when we do a recursive
// invocation of createApplyOrCallCall (because we're doing apply-of-apply). In this case, create delegate
// linkage by unpacking the vararg invocation and use pairArguments to introduce the necessary spreader.
@@ -786,7 +1061,7 @@
inv = MH.filterArguments(inv, 2, NativeFunction.TO_APPLY_ARGS);
} else {
// If the original call site doesn't pass argArray, pass in an empty array
- inv = MH.insertArguments(inv, 2, (Object)ScriptRuntime.EMPTY_ARRAY);
+ inv = MH.insertArguments(inv, 2, (Object) ScriptRuntime.EMPTY_ARRAY);
}
}
@@ -851,7 +1126,7 @@
final LinkRequest request, final Object[] args) {
final MethodType descType = desc.getMethodType();
final int paramCount = descType.parameterCount();
- final Object[] varArgs = (Object[])args[paramCount - 1];
+ final Object[] varArgs = (Object[]) args[paramCount - 1];
// -1 'cause we're not passing the vararg array itself
final int copiedArgCount = args.length - 1;
final int varArgCount = varArgs.length;
@@ -893,7 +1168,7 @@
// If the last parameter type of the guard is an array, then it is already itself a guard for a vararg apply
// invocation. We must filter the last argument with toApplyArgs otherwise deeper levels of nesting will fail
// with ClassCastException of NativeArray to Object[].
- if(guardType.parameterType(guardParamCount - 1).isArray()) {
+ if (guardType.parameterType(guardParamCount - 1).isArray()) {
arrayConvertingGuard = MH.filterArguments(guard, guardParamCount - 1, NativeFunction.TO_APPLY_ARGS);
} else {
arrayConvertingGuard = guard;
@@ -903,19 +1178,20 @@
}
private static MethodHandle bindImplicitThis(final Object fn, final MethodHandle mh) {
- final MethodHandle bound;
- if(fn instanceof ScriptFunction && ((ScriptFunction)fn).needsWrappedThis()) {
- bound = MH.filterArguments(mh, 1, SCRIPTFUNCTION_GLOBALFILTER);
- } else {
- bound = mh;
- }
- return MH.insertArguments(bound, 1, ScriptRuntime.UNDEFINED);
- }
+ final MethodHandle bound;
+ if (fn instanceof ScriptFunction && ((ScriptFunction) fn).needsWrappedThis()) {
+ bound = MH.filterArguments(mh, 1, SCRIPTFUNCTION_GLOBALFILTER);
+ } else {
+ bound = mh;
+ }
+ return MH.insertArguments(bound, 1, ScriptRuntime.UNDEFINED);
+ }
/**
* Used for noSuchMethod/noSuchProperty and JSAdapter hooks.
*
- * These don't want a callee parameter, so bind that. Name binding is optional.
+ * These don't want a callee parameter, so bind that. Name binding is
+ * optional.
*/
MethodHandle getCallMethodHandle(final MethodType type, final String bindName) {
return pairArguments(bindToNameIfNeeded(bindToCalleeIfNeeded(data.getGenericInvoker(scope)), bindName), type);
@@ -939,10 +1215,11 @@
}
/**
- * Get the guard that checks if a {@link ScriptFunction} is equal to
- * a known ScriptFunction, using reference comparison
+ * Get the guard that checks if a {@link ScriptFunction} is equal to a known
+ * ScriptFunction, using reference comparison
*
- * @param function The ScriptFunction to check against. This will be bound to the guard method handle
+ * @param function The ScriptFunction to check against. This will be bound
+ * to the guard method handle
*
* @return method handle for guard
*/
@@ -957,11 +1234,12 @@
}
/**
- * Get a guard that checks if a {@link ScriptFunction} is equal to
- * a known ScriptFunction using reference comparison, and whether the type of
- * the second argument (this-object) is not a JavaScript primitive type.
+ * Get a guard that checks if a {@link ScriptFunction} is equal to a known
+ * ScriptFunction using reference comparison, and whether the type of the
+ * second argument (this-object) is not a JavaScript primitive type.
*
- * @param function The ScriptFunction to check against. This will be bound to the guard method handle
+ * @param function The ScriptFunction to check against. This will be bound
+ * to the guard method handle
*
* @return method handle for guard
*/
@@ -972,12 +1250,12 @@
@SuppressWarnings("unused")
private static boolean isFunctionMH(final Object self, final ScriptFunctionData data) {
- return self instanceof ScriptFunction && ((ScriptFunction)self).data == data;
+ return self instanceof ScriptFunction && ((ScriptFunction) self).data == data;
}
@SuppressWarnings("unused")
private static boolean isNonStrictFunction(final Object self, final Object arg, final ScriptFunctionData data) {
- return self instanceof ScriptFunction && ((ScriptFunction)self).data == data && arg instanceof ScriptObject;
+ return self instanceof ScriptFunction && ((ScriptFunction) self).data == data && arg instanceof ScriptObject;
}
//TODO this can probably be removed given that we have builtin switchpoints in the context
@@ -990,7 +1268,7 @@
@SuppressWarnings("unused")
private static Object[] addZerothElement(final Object[] args, final Object value) {
// extends input array with by adding new zeroth element
- final Object[] src = args == null? ScriptRuntime.EMPTY_ARRAY : args;
+ final Object[] src = args == null ? ScriptRuntime.EMPTY_ARRAY : args;
final Object[] result = new Object[src.length + 1];
System.arraycopy(src, 0, result, 1, src.length);
result[0] = value;
@@ -1014,4 +1292,3 @@
return MH.findVirtual(MethodHandles.lookup(), ScriptFunction.class, name, MH.type(rtype, types));
}
}
-
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptFunctionData.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptFunctionData.java Mon Sep 21 17:49:57 2015 +0200
@@ -151,7 +151,7 @@
* Is this a ScriptFunction generated with strict semantics?
* @return true if strict, false otherwise
*/
- public boolean isStrict() {
+ public final boolean isStrict() {
return (flags & IS_STRICT) != 0;
}
@@ -164,11 +164,11 @@
return getName();
}
- boolean isBuiltin() {
+ final boolean isBuiltin() {
return (flags & IS_BUILTIN) != 0;
}
- boolean isConstructor() {
+ final boolean isConstructor() {
return (flags & IS_CONSTRUCTOR) != 0;
}
@@ -179,7 +179,7 @@
* according to ECMA 10.4.3.
* @return true if this argument must be an object
*/
- boolean needsWrappedThis() {
+ final boolean needsWrappedThis() {
return (flags & USES_THIS) != 0 && (flags & IS_STRICT_OR_BUILTIN) == 0;
}
@@ -318,7 +318,7 @@
* Used to find an apply to call version that fits this callsite.
* We cannot just, as in the normal matcher case, return e.g. (Object, Object, int)
* for (Object, Object, int, int, int) or we will destroy the semantics and get
- * a function that, when padded with undefineds, behaves differently
+ * a function that, when padded with undefined values, behaves differently
* @param type actual call site type
* @return apply to call that perfectly fits this callsite or null if none found
*/
@@ -397,7 +397,7 @@
/**
* This method is used to create the immutable portion of a bound function.
- * See {@link ScriptFunction#makeBoundFunction(Object, Object[])}
+ * See {@link ScriptFunction#createBound(Object, Object[])}
*
* @param fn the original function being bound
* @param self this reference to bind. Can be null.
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java Mon Sep 21 17:49:57 2015 +0200
@@ -64,6 +64,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.atomic.LongAdder;
import jdk.internal.dynalink.CallSiteDescriptor;
import jdk.internal.dynalink.linker.GuardedInvocation;
import jdk.internal.dynalink.linker.LinkRequest;
@@ -211,7 +212,7 @@
*/
public ScriptObject(final PropertyMap map) {
if (Context.DEBUG) {
- ScriptObject.count++;
+ ScriptObject.count.increment();
}
this.arrayData = ArrayData.EMPTY_ARRAY;
this.setMap(map == null ? PropertyMap.newMap() : map);
@@ -2316,7 +2317,7 @@
MH.dropArguments(
MH.constant(
ScriptFunction.class,
- func.makeBoundFunction(thiz, new Object[] { name })),
+ func.createBound(thiz, new Object[] { name })),
0,
Object.class),
NashornGuards.combineGuards(
@@ -2422,7 +2423,7 @@
return UNDEFINED;
}
- return ((ScriptFunction)value).makeBoundFunction(this, new Object[] {name});
+ return ((ScriptFunction)value).createBound(this, new Object[] {name});
}
private GuardedInvocation createEmptyGetter(final CallSiteDescriptor desc, final boolean explicitInstanceOfCheck, final String name) {
@@ -3811,15 +3812,20 @@
}
/** This is updated only in debug mode - counts number of {@code ScriptObject} instances created */
- private static int count;
-
+ private static LongAdder count;
+
+ static {
+ if (Context.DEBUG) {
+ count = new LongAdder();
+ }
+ }
/**
* Get number of {@code ScriptObject} instances created. If not running in debug
* mode this is always 0
*
* @return number of ScriptObjects created
*/
- public static int getCount() {
- return count;
+ public static long getCount() {
+ return count.longValue();
}
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/StoredScript.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/StoredScript.java Mon Sep 21 17:49:57 2015 +0200
@@ -77,7 +77,7 @@
return compilationId;
}
- private Map<String, Class<?>> installClasses(final Source source, final CodeInstaller<ScriptEnvironment> installer) {
+ private Map<String, Class<?>> installClasses(final Source source, final CodeInstaller installer) {
final Map<String, Class<?>> installedClasses = new HashMap<>();
final byte[] mainClassBytes = classBytes.get(mainClassName);
final Class<?> mainClass = installer.install(mainClassName, mainClassBytes);
@@ -96,7 +96,7 @@
return installedClasses;
}
- FunctionInitializer installFunction(final RecompilableScriptFunctionData data, final CodeInstaller<ScriptEnvironment> installer) {
+ FunctionInitializer installFunction(final RecompilableScriptFunctionData data, final CodeInstaller installer) {
final Map<String, Class<?>> installedClasses = installClasses(data.getSource(), installer);
assert initializers != null;
@@ -124,7 +124,7 @@
* @param installer the installer
* @return main script class
*/
- Class<?> installScript(final Source source, final CodeInstaller<ScriptEnvironment> installer) {
+ Class<?> installScript(final Source source, final CodeInstaller installer) {
final Map<String, Class<?>> installedClasses = installClasses(source, installer);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/WithObject.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/WithObject.java Mon Sep 21 17:49:57 2015 +0200
@@ -352,7 +352,7 @@
}
private static Object bindToExpression(final ScriptFunction fn, final Object receiver) {
- return fn.makeBoundFunction(withFilterExpression(receiver), ScriptRuntime.EMPTY_ARRAY);
+ return fn.createBound(withFilterExpression(receiver), ScriptRuntime.EMPTY_ARRAY);
}
private MethodHandle expressionGuard(final String name, final ScriptObject owner) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/ContinuousArrayData.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/ContinuousArrayData.java Mon Sep 21 17:49:57 2015 +0200
@@ -191,7 +191,7 @@
/**
* Return element setter for a {@link ContinuousArrayData}
- * @param clazz clazz for exact type guard
+ * @param clazz class for exact type guard
* @param setHas set has guard
* @param elementType element type
* @return method handle for element setter
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/UndefinedArrayFilter.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/UndefinedArrayFilter.java Mon Sep 21 17:49:57 2015 +0200
@@ -34,7 +34,7 @@
* This filter handles the presence of undefined array elements.
*/
final class UndefinedArrayFilter extends ArrayFilter {
- /** Bit vector tracking undefines. */
+ /** Bit vector tracking undefined slots. */
private final BitVector undefined;
UndefinedArrayFilter(final ArrayData underlying) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/Bootstrap.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/Bootstrap.java Mon Sep 21 17:49:57 2015 +0200
@@ -49,7 +49,6 @@
import jdk.nashorn.internal.codegen.CompilerConstants.Call;
import jdk.nashorn.internal.lookup.MethodHandleFactory;
import jdk.nashorn.internal.lookup.MethodHandleFunctionality;
-import jdk.nashorn.internal.objects.ScriptFunctionImpl;
import jdk.nashorn.internal.runtime.ECMAException;
import jdk.nashorn.internal.runtime.JSType;
import jdk.nashorn.internal.runtime.OptimisticReturnFilters;
@@ -396,8 +395,8 @@
* @throws ECMAException with {@code TypeError} if the object is not a callable.
*/
public static Object bindCallable(final Object callable, final Object boundThis, final Object[] boundArgs) {
- if (callable instanceof ScriptFunctionImpl) {
- return ((ScriptFunctionImpl)callable).makeBoundFunction(boundThis, boundArgs);
+ if (callable instanceof ScriptFunction) {
+ return ((ScriptFunction)callable).createBound(boundThis, boundArgs);
} else if (callable instanceof BoundCallable) {
return ((BoundCallable)callable).bind(boundArgs);
} else if (isCallable(callable)) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/LinkerCallSite.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/LinkerCallSite.java Mon Sep 21 17:49:57 2015 +0200
@@ -43,6 +43,7 @@
import java.util.Random;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.LongAdder;
import jdk.internal.dynalink.ChainedCallSite;
import jdk.internal.dynalink.DynamicLinker;
import jdk.internal.dynalink.linker.GuardedInvocation;
@@ -70,7 +71,7 @@
LinkerCallSite(final NashornCallSiteDescriptor descriptor) {
super(descriptor);
if (Context.DEBUG) {
- LinkerCallSite.count++;
+ LinkerCallSite.count.increment();
}
}
@@ -173,7 +174,7 @@
* @return self reference
*/
public static Object increaseMissCount(final String desc, final Object self) {
- ++missCount;
+ missCount.increment();
if (r.nextInt(100) < missSamplingPercentage) {
final AtomicInteger i = missCounts.get(desc);
if (i == null) {
@@ -509,12 +510,19 @@
}
// counters updated in debug mode
- private static int count;
+ private static LongAdder count;
private static final HashMap<String, AtomicInteger> missCounts = new HashMap<>();
- private static int missCount;
+ private static LongAdder missCount;
private static final Random r = new Random();
private static final int missSamplingPercentage = Options.getIntProperty("nashorn.tcs.miss.samplePercent", 1);
+ static {
+ if (Context.DEBUG) {
+ count = new LongAdder();
+ missCount = new LongAdder();
+ }
+ }
+
@Override
protected int getMaxChainLength() {
return 8;
@@ -524,16 +532,16 @@
* Get the callsite count
* @return the count
*/
- public static int getCount() {
- return count;
+ public static long getCount() {
+ return count.longValue();
}
/**
* Get the callsite miss count
* @return the missCount
*/
- public static int getMissCount() {
- return missCount;
+ public static long getMissCount() {
+ return missCount.longValue();
}
/**
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornBeansLinker.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornBeansLinker.java Mon Sep 21 17:49:57 2015 +0200
@@ -26,7 +26,6 @@
package jdk.nashorn.internal.runtime.linker;
import static jdk.nashorn.internal.lookup.Lookup.MH;
-import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
@@ -42,13 +41,11 @@
import jdk.internal.dynalink.linker.LinkerServices;
import jdk.internal.dynalink.linker.MethodHandleTransformer;
import jdk.internal.dynalink.support.DefaultInternalObjectFilter;
-import jdk.internal.dynalink.support.Guards;
import jdk.internal.dynalink.support.Lookup;
import jdk.nashorn.api.scripting.ScriptUtils;
import jdk.nashorn.internal.runtime.ConsString;
import jdk.nashorn.internal.runtime.Context;
import jdk.nashorn.internal.runtime.ScriptObject;
-import jdk.nashorn.internal.runtime.ScriptRuntime;
import jdk.nashorn.internal.runtime.options.Options;
/**
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/Config.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/Config.java Mon Sep 21 17:49:57 2015 +0200
@@ -65,7 +65,7 @@
final boolean DONT_OPTIMIZE = false;
- final boolean USE_STRING_TEMPLATES = true; // use embeded string templates in Regex object as byte arrays instead of compiling them into int bytecode array
+ final boolean USE_STRING_TEMPLATES = true; // use embedded string templates in Regex object as byte arrays instead of compiling them into int bytecode array
final boolean NON_UNICODE_SDW = true;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/resources/parser.js Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/resources/parser.js Mon Sep 21 17:49:57 2015 +0200
@@ -55,7 +55,7 @@
// do not start with '/'. If regexp, then eval it to make RegExp object
return value.startsWith('/')? eval(value) : value.substring(1);
} else {
- // anythin else is returned "as is""
+ // anything else is returned "as is"
return value;
}
});
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/Shell.java Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/Shell.java Mon Sep 21 17:49:57 2015 +0200
@@ -42,8 +42,8 @@
import jdk.nashorn.api.scripting.NashornException;
import jdk.nashorn.internal.codegen.Compiler;
import jdk.nashorn.internal.codegen.Compiler.CompilationPhases;
+import jdk.nashorn.internal.ir.Expression;
import jdk.nashorn.internal.ir.FunctionNode;
-import jdk.nashorn.internal.ir.Expression;
import jdk.nashorn.internal.ir.debug.ASTWriter;
import jdk.nashorn.internal.ir.debug.PrintVisitor;
import jdk.nashorn.internal.objects.Global;
@@ -255,12 +255,9 @@
return COMPILATION_ERROR;
}
- new Compiler(
+ Compiler.forNoInstallerCompilation(
context,
- env,
- null, //null - pass no code installer - this is compile only
functionNode.getSource(),
- context.getErrorManager(),
env._strict | functionNode.isStrict()).
compile(functionNode, CompilationPhases.COMPILE_ALL_NO_INSTALL);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8134569.js Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,128 @@
+/*
+ * 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.
+ */
+
+/**
+ * JDK-8134569: Add tests for prototype callsites
+ *
+ * @test
+ * @run
+ */
+
+function create() {
+ function C() {
+ this.i1 = 1;
+ this.i2 = 2;
+ this.i3 = 3;
+ return this;
+ }
+ return new C();
+}
+
+function createEmpty() {
+ function C() {
+ return this;
+ }
+ return new C();
+}
+
+function createDeep() {
+ function C() {
+ this.i1 = 1;
+ this.i2 = 2;
+ this.i3 = 3;
+ return this;
+ }
+ function D() {
+ this.p1 = 1;
+ this.p2 = 2;
+ this.p3 = 3;
+ return this;
+ }
+ C.prototype = new D();
+ return new C();
+}
+
+function createEval() {
+ return eval("Object.create({})");
+}
+
+function p(o) { print(o.x) }
+
+var a, b;
+
+create();
+a = create();
+b = create();
+a.__proto__.x = 123;
+
+p(a);
+p(b);
+
+a = create();
+b = create();
+b.__proto__.x = 123;
+
+p(a);
+p(b);
+
+a = createEmpty();
+b = createEmpty();
+a.__proto__.x = 123;
+
+p(a);
+p(b);
+
+a = createEmpty();
+b = createEmpty();
+b.__proto__.x = 123;
+
+p(a);
+p(b);
+
+a = createDeep();
+b = createDeep();
+a.__proto__.__proto__.x = 123;
+
+p(a);
+p(b);
+
+a = createDeep();
+b = createDeep();
+b.__proto__.__proto__.x = 123;
+
+p(a);
+p(b);
+
+a = createEval();
+b = createEval();
+a.__proto__.x = 123;
+
+p(a);
+p(b);
+
+a = createEval();
+b = createEval();
+b.__proto__.x = 123;
+
+p(a);
+p(b);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8134569.js.EXPECTED Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,16 @@
+123
+undefined
+undefined
+123
+123
+undefined
+undefined
+123
+123
+undefined
+undefined
+123
+123
+undefined
+undefined
+123
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8135000.js Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,48 @@
+/*
+ * 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.
+ */
+
+/**
+ * JDK-8135000: Number.prototype.toFixed returns wrong string for 0.5 and -0.5
+ *
+ * @test
+ * @run
+ */
+
+print(-2.6.toFixed());
+print(-2.5.toFixed());
+print(-2.4.toFixed());
+print(-1.6.toFixed());
+print(-1.5.toFixed());
+print(-1.4.toFixed());
+print(-0.6.toFixed());
+print(-0.5.toFixed());
+print(-0.4.toFixed());
+print(0.4.toFixed());
+print(0.5.toFixed());
+print(0.6.toFixed());
+print(1.4.toFixed());
+print(1.5.toFixed());
+print(1.6.toFixed());
+print(2.4.toFixed());
+print(2.5.toFixed());
+print(2.6.toFixed());
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8135000.js.EXPECTED Mon Sep 21 17:49:57 2015 +0200
@@ -0,0 +1,18 @@
+-3
+-3
+-2
+-2
+-2
+-1
+-1
+-1
+0
+0
+1
+1
+1
+2
+2
+2
+3
+3
--- a/nashorn/test/script/trusted/JDK-8006529.js Tue Sep 22 14:24:31 2015 -0400
+++ b/nashorn/test/script/trusted/JDK-8006529.js Mon Sep 21 17:49:57 2015 +0200
@@ -120,7 +120,7 @@
var sourceForMethod = Source.class.getMethod("sourceFor", java.lang.String.class, java.lang.String.class)
var ParserConstructor = Parser.class.getConstructor(ScriptEnvironment.class, Source.class, ErrorManager.class)
-var CompilerConstructor = Compiler.class.getConstructor(Context.class, ScriptEnvironment.class, CodeInstaller.class, Source.class, ErrorManager.class, boolean.class);
+var CompilerConstructor = Compiler.class.getMethod("forNoInstallerCompilation", Context.class, Source.class, boolean.class);
// compile(script) -- compiles a script specified as a string with its
// source code, returns a jdk.nashorn.internal.ir.FunctionNode object
@@ -134,7 +134,7 @@
var parser = ParserConstructor.newInstance(env, source, ThrowErrorManager.class.newInstance());
var func = parseMethod.invoke(parser);
- var compiler = CompilerConstructor.newInstance(ctxt, env, null, source, null, false);
+ var compiler = CompilerConstructor.invoke(null, ctxt, source, false);
return compileMethod.invoke(compiler, func, phases);
};