--- a/.hgtags Thu Apr 23 16:58:16 2009 -0400
+++ b/.hgtags Mon Apr 27 12:33:57 2009 -0700
@@ -28,3 +28,5 @@
a25c5ec5e40e07733d1ff9898a0abe36159288ff jdk7-b51
7a90e89e36d103038f8667f6a7daae34ecfa1ad8 jdk7-b52
d52186ee770dac57950536cd00ccbfdef360b04c jdk7-b53
+15096652c4d48dfb9fc0b2cb135304db94c65ba0 jdk7-b54
+c8b275d62d6b0a980c510e839b70292245863e85 jdk7-b55
--- a/.hgtags-top-repo Thu Apr 23 16:58:16 2009 -0400
+++ b/.hgtags-top-repo Mon Apr 27 12:33:57 2009 -0700
@@ -28,3 +28,5 @@
0f0189d55ce4a1f7840da7582ac7d970b3b7ab15 jdk7-b51
4264c2fe66493e57c411045a1b61377796641e45 jdk7-b52
c235f4a8559d196879c56af80159f67ee5d0e720 jdk7-b53
+2ef382b1bbd58a68e668391c6145a4b2066c5b96 jdk7-b54
+aea0ace7a1e43619800931d42bbf69c579361c2d jdk7-b55
--- a/corba/.hgtags Thu Apr 23 16:58:16 2009 -0400
+++ b/corba/.hgtags Mon Apr 27 12:33:57 2009 -0700
@@ -28,3 +28,5 @@
3eb8f1047a7402a9a79937d1c39560e931e91da2 jdk7-b51
bec82237d694f9802b820fa11bbb4f7fa9bf8e77 jdk7-b52
3c4d73194f6f89f040ae3b2d257335dfa8a1b2b5 jdk7-b53
+8130ac858d6789d5853d23044ba4a992afda574a jdk7-b54
+7a869f16ba83060c34b77620406cfa89d1cd7084 jdk7-b55
--- a/hotspot/.hgignore Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/.hgignore Mon Apr 27 12:33:57 2009 -0700
@@ -1,7 +1,7 @@
^build/
^dist/
^nbproject/private/
-^src/share/tools/hsdis/bin/
+^src/share/tools/hsdis/build/
^src/share/tools/IdealGraphVisualizer/[a-zA-Z0-9]*/build/
^src/share/tools/IdealGraphVisualizer/build/
^src/share/tools/IdealGraphVisualizer/dist/
--- a/hotspot/.hgtags Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/.hgtags Mon Apr 27 12:33:57 2009 -0700
@@ -28,3 +28,5 @@
2581d90c6c9b2012da930eb4742add94a03069a0 jdk7-b51
1b1e8f1a4fe8cebc01c022484f78148e17b62a0d jdk7-b52
032c6af894dae8d939b3dd31d82042549e7793e0 jdk7-b53
+fafab5d5349c7c066d677538db67a1ee0fb33bd2 jdk7-b54
+f8e839c086152da70d6ec5913ba6f9f509282e8d jdk7-b55
--- a/hotspot/make/jprt.properties Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/make/jprt.properties Mon Apr 27 12:33:57 2009 -0700
@@ -46,24 +46,28 @@
jprt.my.solaris.sparc.jdk6=solaris_sparc_5.8
jprt.my.solaris.sparc.jdk6perf=solaris_sparc_5.8
jprt.my.solaris.sparc.jdk6u10=solaris_sparc_5.8
+jprt.my.solaris.sparc.jdk6u14=solaris_sparc_5.8
jprt.my.solaris.sparc=${jprt.my.solaris.sparc.${jprt.tools.default.release}}
jprt.my.solaris.sparcv9.jdk7=solaris_sparcv9_5.10
jprt.my.solaris.sparcv9.jdk6=solaris_sparcv9_5.8
jprt.my.solaris.sparcv9.jdk6perf=solaris_sparcv9_5.8
jprt.my.solaris.sparcv9.jdk6u10=solaris_sparcv9_5.8
+jprt.my.solaris.sparcv9.jdk6u14=solaris_sparcv9_5.8
jprt.my.solaris.sparcv9=${jprt.my.solaris.sparcv9.${jprt.tools.default.release}}
jprt.my.solaris.i586.jdk7=solaris_i586_5.10
jprt.my.solaris.i586.jdk6=solaris_i586_5.8
jprt.my.solaris.i586.jdk6perf=solaris_i586_5.8
jprt.my.solaris.i586.jdk6u10=solaris_i586_5.8
+jprt.my.solaris.i586.jdk6u14=solaris_i586_5.8
jprt.my.solaris.i586=${jprt.my.solaris.i586.${jprt.tools.default.release}}
jprt.my.solaris.x64.jdk7=solaris_x64_5.10
jprt.my.solaris.x64.jdk6=solaris_x64_5.10
jprt.my.solaris.x64.jdk6perf=solaris_x64_5.10
jprt.my.solaris.x64.jdk6u10=solaris_x64_5.10
+jprt.my.solaris.x64.jdk6u14=solaris_x64_5.10
jprt.my.solaris.x64=${jprt.my.solaris.x64.${jprt.tools.default.release}}
jprt.my.linux.i586=linux_i586
--- a/hotspot/make/solaris/makefiles/sparcWorks.make Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/make/solaris/makefiles/sparcWorks.make Mon Apr 27 12:33:57 2009 -0700
@@ -46,7 +46,7 @@
$(shell $(CC) -V 2>&1 | sed -n 's/^.*[ ,\t]C[ ,\t]\([1-9]\.[0-9][0-9]*\).*/\1/p')
# Pick which compiler is validated
-ifeq ($(JDK_MINOR_VERSION),6)
+ifeq ($(JRE_RELEASE_VER),1.6.0)
# Validated compiler for JDK6 is SS11 (5.8)
VALIDATED_COMPILER_REV := 5.8
VALIDATED_C_COMPILER_REV := 5.8
@@ -101,18 +101,9 @@
# New architecture options started in SS12 (5.9), we need both styles to build.
# The older arch options for SS11 (5.8) or older and also for /usr/ccs/bin/as.
-# Note: SS12 default for 32bit sparc is now the same as v8plus, so the
-# settings below have changed all SS12 32bit sparc builds to be v8plus.
-# The older SS11 (5.8) settings have remained as they always have been.
-ifeq ($(TYPE),COMPILER2)
- ARCHFLAG_OLD/sparc = -xarch=v8plus
-else
- ifeq ($(TYPE),TIERED)
- ARCHFLAG_OLD/sparc = -xarch=v8plus
- else
- ARCHFLAG_OLD/sparc = -xarch=v8
- endif
-endif
+# Note: default for 32bit sparc is now the same as v8plus, so the
+# settings below have changed all 32bit sparc builds to be v8plus.
+ARCHFLAG_OLD/sparc = -xarch=v8plus
ARCHFLAG_NEW/sparc = -m32 -xarch=sparc
ARCHFLAG_OLD/sparcv9 = -xarch=v9
ARCHFLAG_NEW/sparcv9 = -m64 -xarch=sparc
--- a/hotspot/make/windows/makefiles/vm.make Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/make/windows/makefiles/vm.make Mon Apr 27 12:33:57 2009 -0700
@@ -55,10 +55,16 @@
CPP_FLAGS=$(CPP_FLAGS) /D "COMPILER1" /D "COMPILER2"
!endif
+!if "$(BUILDARCH)" == "i486"
+HOTSPOT_LIB_ARCH=i386
+!else
+HOTSPOT_LIB_ARCH=$(BUILDARCH)
+!endif
+
# The following variables are defined in the generated local.make file.
CPP_FLAGS=$(CPP_FLAGS) /D "HOTSPOT_RELEASE_VERSION=\"$(HS_BUILD_VER)\""
CPP_FLAGS=$(CPP_FLAGS) /D "JRE_RELEASE_VERSION=\"$(JRE_RELEASE_VER)\""
-CPP_FLAGS=$(CPP_FLAGS) /D "HOTSPOT_LIB_ARCH=\"$(BUILDARCH)\""
+CPP_FLAGS=$(CPP_FLAGS) /D "HOTSPOT_LIB_ARCH=\"$(HOTSPOT_LIB_ARCH)\""
CPP_FLAGS=$(CPP_FLAGS) /D "HOTSPOT_BUILD_TARGET=\"$(BUILD_FLAVOR)\""
CPP_FLAGS=$(CPP_FLAGS) /D "HOTSPOT_BUILD_USER=\"$(BuildUser)\""
CPP_FLAGS=$(CPP_FLAGS) /D "HOTSPOT_VM_DISTRO=\"$(HOTSPOT_VM_DISTRO)\""
--- a/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -25,24 +25,36 @@
#include "incls/_precompiled.incl"
#include "incls/_assembler_sparc.cpp.incl"
-// Implementation of Address
-
-Address::Address( addr_type t, int which ) {
- switch (t) {
- case extra_in_argument:
- case extra_out_argument:
- _base = t == extra_in_argument ? FP : SP;
- _hi = 0;
-// Warning: In LP64 mode, _disp will occupy more than 10 bits.
-// This is inconsistent with the other constructors but op
-// codes such as ld or ldx, only access disp() to get their
-// simm13 argument.
- _disp = ((which - Argument::n_register_parameters + frame::memory_parameter_word_sp_offset) * BytesPerWord) + STACK_BIAS;
- break;
- default:
- ShouldNotReachHere();
- break;
+// Convert the raw encoding form into the form expected by the
+// constructor for Address.
+Address Address::make_raw(int base, int index, int scale, int disp, bool disp_is_oop) {
+ assert(scale == 0, "not supported");
+ RelocationHolder rspec;
+ if (disp_is_oop) {
+ rspec = Relocation::spec_simple(relocInfo::oop_type);
}
+
+ Register rindex = as_Register(index);
+ if (rindex != G0) {
+ Address madr(as_Register(base), rindex);
+ madr._rspec = rspec;
+ return madr;
+ } else {
+ Address madr(as_Register(base), disp);
+ madr._rspec = rspec;
+ return madr;
+ }
+}
+
+Address Argument::address_in_frame() const {
+ // Warning: In LP64 mode disp will occupy more than 10 bits, but
+ // op codes such as ld or ldx, only access disp() to get
+ // their simm13 argument.
+ int disp = ((_number - Argument::n_register_parameters + frame::memory_parameter_word_sp_offset) * BytesPerWord) + STACK_BIAS;
+ if (is_in())
+ return Address(FP, disp); // In argument.
+ else
+ return Address(SP, disp); // Out argument.
}
static const char* argumentNames[][2] = {
@@ -614,16 +626,17 @@
}
// This code sequence is relocatable to any address, even on LP64.
-void MacroAssembler::jumpl( Address& a, Register d, int offset, const char* file, int line ) {
+void MacroAssembler::jumpl(AddressLiteral& addrlit, Register temp, Register d, int offset, const char* file, int line) {
assert_not_delayed();
// Force fixed length sethi because NativeJump and NativeFarCall don't handle
// variable length instruction streams.
- sethi(a, /*ForceRelocatable=*/ true);
+ patchable_sethi(addrlit, temp);
+ Address a(temp, addrlit.low10() + offset); // Add the offset to the displacement.
if (TraceJumps) {
#ifndef PRODUCT
// Must do the add here so relocation can find the remainder of the
// value to be relocated.
- add(a.base(), a.disp() + offset, a.base(), a.rspec(offset));
+ add(a.base(), a.disp(), a.base(), addrlit.rspec(offset));
save_frame(0);
verify_thread();
ld(G2_thread, in_bytes(JavaThread::jmp_ring_index_offset()), O0);
@@ -652,15 +665,15 @@
restore();
jmpl(a.base(), G0, d);
#else
- jmpl(a, d, offset);
+ jmpl(a.base(), a.disp(), d);
#endif /* PRODUCT */
} else {
- jmpl(a, d, offset);
+ jmpl(a.base(), a.disp(), d);
}
}
-void MacroAssembler::jump( Address& a, int offset, const char* file, int line ) {
- jumpl( a, G0, offset, file, line );
+void MacroAssembler::jump(AddressLiteral& addrlit, Register temp, int offset, const char* file, int line) {
+ jumpl(addrlit, temp, G0, offset, file, line);
}
@@ -678,7 +691,8 @@
st_ptr(savePtr.as_register(), savePtr.address_in_frame());
}
// return the address of the first memory slot
- add(inArg.address_in_frame(), d);
+ Address a = inArg.address_in_frame();
+ add(a.base(), a.disp(), d);
}
// Conditional breakpoint (for assertion checks in assembly code)
@@ -702,7 +716,6 @@
// offset to write to within the page. This minimizes bus traffic
// due to cache line collision.
void MacroAssembler::serialize_memory(Register thread, Register tmp1, Register tmp2) {
- Address mem_serialize_page(tmp1, os::get_memory_serialize_page());
srl(thread, os::get_serialize_page_shift_count(), tmp2);
if (Assembler::is_simm13(os::vm_page_size())) {
and3(tmp2, (os::vm_page_size() - sizeof(int)), tmp2);
@@ -711,7 +724,7 @@
set((os::vm_page_size() - sizeof(int)), tmp1);
and3(tmp2, tmp1, tmp2);
}
- load_address(mem_serialize_page);
+ set(os::get_memory_serialize_page(), tmp1);
st(G0, tmp1, tmp2);
}
@@ -830,10 +843,10 @@
mov(G3, L2); // avoid clobbering G3 also
mov(G4, L5); // avoid clobbering G4
#ifdef ASSERT
- Address last_get_thread_addr(L3, (address)&last_get_thread);
- sethi(last_get_thread_addr);
+ AddressLiteral last_get_thread_addrlit(&last_get_thread);
+ set(last_get_thread_addrlit, L3);
inc(L4, get_pc(L4) + 2 * BytesPerInstWord); // skip getpc() code + inc + st_ptr to point L4 at call
- st_ptr(L4, last_get_thread_addr);
+ st_ptr(L4, L3, 0);
#endif
call(CAST_FROM_FN_PTR(address, reinitialize_thread), relocInfo::runtime_call_type);
delayed()->nop();
@@ -919,13 +932,9 @@
// %%% maybe get rid of [re]set_last_Java_frame
void MacroAssembler::set_last_Java_frame(Register last_java_sp, Register last_Java_pc) {
assert_not_delayed();
- Address flags(G2_thread,
- 0,
- in_bytes(JavaThread::frame_anchor_offset()) +
- in_bytes(JavaFrameAnchor::flags_offset()));
- Address pc_addr(G2_thread,
- 0,
- in_bytes(JavaThread::last_Java_pc_offset()));
+ Address flags(G2_thread, JavaThread::frame_anchor_offset() +
+ JavaFrameAnchor::flags_offset());
+ Address pc_addr(G2_thread, JavaThread::last_Java_pc_offset());
// Always set last_Java_pc and flags first because once last_Java_sp is visible
// has_last_Java_frame is true and users will look at the rest of the fields.
@@ -977,22 +986,18 @@
#endif // ASSERT
assert( last_java_sp != G4_scratch, "bad register usage in set_last_Java_frame");
add( last_java_sp, STACK_BIAS, G4_scratch );
- st_ptr(G4_scratch, Address(G2_thread, 0, in_bytes(JavaThread::last_Java_sp_offset())));
+ st_ptr(G4_scratch, G2_thread, JavaThread::last_Java_sp_offset());
#else
- st_ptr(last_java_sp, Address(G2_thread, 0, in_bytes(JavaThread::last_Java_sp_offset())));
+ st_ptr(last_java_sp, G2_thread, JavaThread::last_Java_sp_offset());
#endif // _LP64
}
void MacroAssembler::reset_last_Java_frame(void) {
assert_not_delayed();
- Address sp_addr(G2_thread, 0, in_bytes(JavaThread::last_Java_sp_offset()));
- Address pc_addr(G2_thread,
- 0,
- in_bytes(JavaThread::frame_anchor_offset()) + in_bytes(JavaFrameAnchor::last_Java_pc_offset()));
- Address flags(G2_thread,
- 0,
- in_bytes(JavaThread::frame_anchor_offset()) + in_bytes(JavaFrameAnchor::flags_offset()));
+ Address sp_addr(G2_thread, JavaThread::last_Java_sp_offset());
+ Address pc_addr(G2_thread, JavaThread::frame_anchor_offset() + JavaFrameAnchor::last_Java_pc_offset());
+ Address flags (G2_thread, JavaThread::frame_anchor_offset() + JavaFrameAnchor::flags_offset());
#ifdef ASSERT
// check that it WAS previously set
@@ -1063,7 +1068,7 @@
check_and_handle_popframe(scratch_reg);
check_and_handle_earlyret(scratch_reg);
- Address exception_addr(G2_thread, 0, in_bytes(Thread::pending_exception_offset()));
+ Address exception_addr(G2_thread, Thread::pending_exception_offset());
ld_ptr(exception_addr, scratch_reg);
br_null(scratch_reg,false,pt,L);
delayed()->nop();
@@ -1186,7 +1191,7 @@
void MacroAssembler::get_vm_result(Register oop_result) {
verify_thread();
- Address vm_result_addr(G2_thread, 0, in_bytes(JavaThread::vm_result_offset()));
+ Address vm_result_addr(G2_thread, JavaThread::vm_result_offset());
ld_ptr( vm_result_addr, oop_result);
st_ptr(G0, vm_result_addr);
verify_oop(oop_result);
@@ -1195,7 +1200,7 @@
void MacroAssembler::get_vm_result_2(Register oop_result) {
verify_thread();
- Address vm_result_addr_2(G2_thread, 0, in_bytes(JavaThread::vm_result_2_offset()));
+ Address vm_result_addr_2(G2_thread, JavaThread::vm_result_2_offset());
ld_ptr(vm_result_addr_2, oop_result);
st_ptr(G0, vm_result_addr_2);
verify_oop(oop_result);
@@ -1206,7 +1211,7 @@
// leave it undisturbed.
void MacroAssembler::set_vm_result(Register oop_result) {
verify_thread();
- Address vm_result_addr(G2_thread, 0, in_bytes(JavaThread::vm_result_offset()));
+ Address vm_result_addr(G2_thread, JavaThread::vm_result_offset());
verify_oop(oop_result);
# ifdef ASSERT
@@ -1234,81 +1239,78 @@
#else
srl(obj, CardTableModRefBS::card_shift, obj);
#endif
- assert( tmp != obj, "need separate temp reg");
- Address rs(tmp, (address)byte_map_base);
- load_address(rs);
- stb(G0, rs.base(), obj);
+ assert(tmp != obj, "need separate temp reg");
+ set((address) byte_map_base, tmp);
+ stb(G0, tmp, obj);
}
-// %%% Note: The following six instructions have been moved,
-// unchanged, from assembler_sparc.inline.hpp.
-// They will be refactored at a later date.
-
-void MacroAssembler::sethi(intptr_t imm22a,
- Register d,
- bool ForceRelocatable,
- RelocationHolder const& rspec) {
- Address adr( d, (address)imm22a, rspec );
- MacroAssembler::sethi( adr, ForceRelocatable );
-}
-
-
-void MacroAssembler::sethi(Address& a, bool ForceRelocatable) {
+
+void MacroAssembler::internal_sethi(const AddressLiteral& addrlit, Register d, bool ForceRelocatable) {
address save_pc;
int shiftcnt;
- // if addr of local, do not need to load it
- assert(a.base() != FP && a.base() != SP, "just use ld or st for locals");
#ifdef _LP64
# ifdef CHECK_DELAY
- assert_not_delayed( (char *)"cannot put two instructions in delay slot" );
+ assert_not_delayed((char*) "cannot put two instructions in delay slot");
# endif
v9_dep();
-// ForceRelocatable = 1;
save_pc = pc();
- if (a.hi32() == 0 && a.low32() >= 0) {
- Assembler::sethi(a.low32(), a.base(), a.rspec());
+
+ int msb32 = (int) (addrlit.value() >> 32);
+ int lsb32 = (int) (addrlit.value());
+
+ if (msb32 == 0 && lsb32 >= 0) {
+ Assembler::sethi(lsb32, d, addrlit.rspec());
}
- else if (a.hi32() == -1) {
- Assembler::sethi(~a.low32(), a.base(), a.rspec());
- xor3(a.base(), ~low10(~0), a.base());
+ else if (msb32 == -1) {
+ Assembler::sethi(~lsb32, d, addrlit.rspec());
+ xor3(d, ~low10(~0), d);
}
else {
- Assembler::sethi(a.hi32(), a.base(), a.rspec() ); // 22
- if ( a.hi32() & 0x3ff ) // Any bits?
- or3( a.base(), a.hi32() & 0x3ff ,a.base() ); // High 32 bits are now in low 32
- if ( a.low32() & 0xFFFFFC00 ) { // done?
- if( (a.low32() >> 20) & 0xfff ) { // Any bits set?
- sllx(a.base(), 12, a.base()); // Make room for next 12 bits
- or3( a.base(), (a.low32() >> 20) & 0xfff,a.base() ); // Or in next 12
- shiftcnt = 0; // We already shifted
+ Assembler::sethi(msb32, d, addrlit.rspec()); // msb 22-bits
+ if (msb32 & 0x3ff) // Any bits?
+ or3(d, msb32 & 0x3ff, d); // msb 32-bits are now in lsb 32
+ if (lsb32 & 0xFFFFFC00) { // done?
+ if ((lsb32 >> 20) & 0xfff) { // Any bits set?
+ sllx(d, 12, d); // Make room for next 12 bits
+ or3(d, (lsb32 >> 20) & 0xfff, d); // Or in next 12
+ shiftcnt = 0; // We already shifted
}
else
shiftcnt = 12;
- if( (a.low32() >> 10) & 0x3ff ) {
- sllx(a.base(), shiftcnt+10, a.base());// Make room for last 10 bits
- or3( a.base(), (a.low32() >> 10) & 0x3ff,a.base() ); // Or in next 10
+ if ((lsb32 >> 10) & 0x3ff) {
+ sllx(d, shiftcnt + 10, d); // Make room for last 10 bits
+ or3(d, (lsb32 >> 10) & 0x3ff, d); // Or in next 10
shiftcnt = 0;
}
else
shiftcnt = 10;
- sllx(a.base(), shiftcnt+10 , a.base()); // Shift leaving disp field 0'd
+ sllx(d, shiftcnt + 10, d); // Shift leaving disp field 0'd
}
else
- sllx( a.base(), 32, a.base() );
+ sllx(d, 32, d);
}
- // Pad out the instruction sequence so it can be
- // patched later.
- if ( ForceRelocatable || (a.rtype() != relocInfo::none &&
- a.rtype() != relocInfo::runtime_call_type) ) {
- while ( pc() < (save_pc + (7 * BytesPerInstWord )) )
+ // Pad out the instruction sequence so it can be patched later.
+ if (ForceRelocatable || (addrlit.rtype() != relocInfo::none &&
+ addrlit.rtype() != relocInfo::runtime_call_type)) {
+ while (pc() < (save_pc + (7 * BytesPerInstWord)))
nop();
}
#else
- Assembler::sethi(a.hi(), a.base(), a.rspec());
+ Assembler::sethi(addrlit.value(), d, addrlit.rspec());
#endif
-
+}
+
+
+void MacroAssembler::sethi(const AddressLiteral& addrlit, Register d) {
+ internal_sethi(addrlit, d, false);
}
+
+void MacroAssembler::patchable_sethi(const AddressLiteral& addrlit, Register d) {
+ internal_sethi(addrlit, d, true);
+}
+
+
int MacroAssembler::size_of_sethi(address a, bool worst_case) {
#ifdef _LP64
if (worst_case) return 7;
@@ -1339,61 +1341,50 @@
return size_of_sethi(NULL, true) + 1;
}
-void MacroAssembler::set(intptr_t value, Register d,
- RelocationHolder const& rspec) {
- Address val( d, (address)value, rspec);
-
- if ( rspec.type() == relocInfo::none ) {
+
+void MacroAssembler::internal_set(const AddressLiteral& addrlit, Register d, bool ForceRelocatable) {
+ intptr_t value = addrlit.value();
+
+ if (!ForceRelocatable && addrlit.rspec().type() == relocInfo::none) {
// can optimize
- if (-4096 <= value && value <= 4095) {
+ if (-4096 <= value && value <= 4095) {
or3(G0, value, d); // setsw (this leaves upper 32 bits sign-extended)
return;
}
if (inv_hi22(hi22(value)) == value) {
- sethi(val);
+ sethi(addrlit, d);
return;
}
}
- assert_not_delayed( (char *)"cannot put two instructions in delay slot" );
- sethi( val );
- if (rspec.type() != relocInfo::none || (value & 0x3ff) != 0) {
- add( d, value & 0x3ff, d, rspec);
+ assert_not_delayed((char*) "cannot put two instructions in delay slot");
+ internal_sethi(addrlit, d, ForceRelocatable);
+ if (ForceRelocatable || addrlit.rspec().type() != relocInfo::none || addrlit.low10() != 0) {
+ add(d, addrlit.low10(), d, addrlit.rspec());
}
}
-void MacroAssembler::setsw(int value, Register d,
- RelocationHolder const& rspec) {
- Address val( d, (address)value, rspec);
- if ( rspec.type() == relocInfo::none ) {
- // can optimize
- if (-4096 <= value && value <= 4095) {
- or3(G0, value, d);
- return;
- }
- if (inv_hi22(hi22(value)) == value) {
- sethi( val );
-#ifndef _LP64
- if ( value < 0 ) {
- assert_not_delayed();
- sra (d, G0, d);
- }
-#endif
- return;
- }
- }
- assert_not_delayed();
- sethi( val );
- add( d, value & 0x3ff, d, rspec);
-
- // (A negative value could be loaded in 2 insns with sethi/xor,
- // but it would take a more complex relocation.)
-#ifndef _LP64
- if ( value < 0)
- sra(d, G0, d);
-#endif
+void MacroAssembler::set(const AddressLiteral& al, Register d) {
+ internal_set(al, d, false);
+}
+
+void MacroAssembler::set(intptr_t value, Register d) {
+ AddressLiteral al(value);
+ internal_set(al, d, false);
}
-// %%% End of moved six set instructions.
+void MacroAssembler::set(address addr, Register d, RelocationHolder const& rspec) {
+ AddressLiteral al(addr, rspec);
+ internal_set(al, d, false);
+}
+
+void MacroAssembler::patchable_set(const AddressLiteral& al, Register d) {
+ internal_set(al, d, true);
+}
+
+void MacroAssembler::patchable_set(intptr_t value, Register d) {
+ AddressLiteral al(value);
+ internal_set(al, d, true);
+}
void MacroAssembler::set64(jlong value, Register d, Register tmp) {
@@ -1512,17 +1503,17 @@
}
-Address MacroAssembler::allocate_oop_address(jobject obj, Register d) {
+AddressLiteral MacroAssembler::allocate_oop_address(jobject obj) {
assert(oop_recorder() != NULL, "this assembler needs an OopRecorder");
int oop_index = oop_recorder()->allocate_index(obj);
- return Address(d, address(obj), oop_Relocation::spec(oop_index));
+ return AddressLiteral(obj, oop_Relocation::spec(oop_index));
}
-Address MacroAssembler::constant_oop_address(jobject obj, Register d) {
+AddressLiteral MacroAssembler::constant_oop_address(jobject obj) {
assert(oop_recorder() != NULL, "this assembler needs an OopRecorder");
int oop_index = oop_recorder()->find_index(obj);
- return Address(d, address(obj), oop_Relocation::spec(oop_index));
+ return AddressLiteral(obj, oop_Relocation::spec(oop_index));
}
void MacroAssembler::set_narrow_oop(jobject obj, Register d) {
@@ -1682,7 +1673,7 @@
sprintf(real_msg, "%s%s(%s:%d)", msg, buffer, file, line);
// Call indirectly to solve generation ordering problem
- Address a(O7, (address)StubRoutines::verify_oop_subroutine_entry_address());
+ AddressLiteral a(StubRoutines::verify_oop_subroutine_entry_address());
// Make some space on stack above the current register window.
// Enough to hold 8 64-bit registers.
@@ -1718,7 +1709,7 @@
sprintf(real_msg, "%s at SP+%d (%s:%d)", msg, addr.disp(), file, line);
// Call indirectly to solve generation ordering problem
- Address a(O7, (address)StubRoutines::verify_oop_subroutine_entry_address());
+ AddressLiteral a(StubRoutines::verify_oop_subroutine_entry_address());
// Make some space on stack above the current register window.
// Enough to hold 8 64-bit registers.
@@ -1772,11 +1763,7 @@
{ // count number of verifies
Register O2_adr = O2;
Register O3_accum = O3;
- Address count_addr( O2_adr, (address) StubRoutines::verify_oop_count_addr() );
- sethi(count_addr);
- ld(count_addr, O3_accum);
- inc(O3_accum);
- st(O3_accum, count_addr);
+ inc_counter(StubRoutines::verify_oop_count_addr(), O2_adr, O3_accum);
}
Register O2_mask = O2;
@@ -1870,8 +1857,8 @@
assert(StubRoutines::Sparc::stop_subroutine_entry_address(), "hasn't been generated yet");
// call indirectly to solve generation ordering problem
- Address a(O5, (address)StubRoutines::Sparc::stop_subroutine_entry_address());
- load_ptr_contents(a, O5);
+ AddressLiteral al(StubRoutines::Sparc::stop_subroutine_entry_address());
+ load_ptr_contents(al, O5);
jmpl(O5, 0, O7);
delayed()->nop();
}
@@ -1891,7 +1878,7 @@
assert(StubRoutines::Sparc::stop_subroutine_entry_address(), "hasn't been generated yet");
// call indirectly to solve generation ordering problem
- Address a(O5, (address)StubRoutines::Sparc::stop_subroutine_entry_address());
+ AddressLiteral a(StubRoutines::Sparc::stop_subroutine_entry_address());
load_ptr_contents(a, O5);
jmpl(O5, 0, O7);
delayed()->nop();
@@ -2003,7 +1990,7 @@
subcc( Rparam_words, Argument::n_register_parameters, Rresult); // how many mem words?
Label no_extras;
br( negative, true, pt, no_extras ); // if neg, clear reg
- delayed()->set( 0, Rresult); // annuled, so only if taken
+ delayed()->set(0, Rresult); // annuled, so only if taken
bind( no_extras );
}
@@ -2623,7 +2610,7 @@
return RegisterOrConstant(value + offset);
// load indirectly to solve generation ordering problem
- Address a(tmp, (address) delayed_value_addr);
+ AddressLiteral a(delayed_value_addr);
load_ptr_contents(a, tmp);
#ifdef ASSERT
@@ -3107,21 +3094,21 @@
delayed()->nop();
load_klass(obj_reg, temp_reg);
- ld_ptr(Address(temp_reg, 0, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()), temp_reg);
+ ld_ptr(Address(temp_reg, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()), temp_reg);
or3(G2_thread, temp_reg, temp_reg);
xor3(mark_reg, temp_reg, temp_reg);
andcc(temp_reg, ~((int) markOopDesc::age_mask_in_place), temp_reg);
if (counters != NULL) {
cond_inc(Assembler::equal, (address) counters->biased_lock_entry_count_addr(), mark_reg, temp_reg);
// Reload mark_reg as we may need it later
- ld_ptr(Address(obj_reg, 0, oopDesc::mark_offset_in_bytes()), mark_reg);
+ ld_ptr(Address(obj_reg, oopDesc::mark_offset_in_bytes()), mark_reg);
}
brx(Assembler::equal, true, Assembler::pt, done);
delayed()->nop();
Label try_revoke_bias;
Label try_rebias;
- Address mark_addr = Address(obj_reg, 0, oopDesc::mark_offset_in_bytes());
+ Address mark_addr = Address(obj_reg, oopDesc::mark_offset_in_bytes());
assert(mark_addr.disp() == 0, "cas must take a zero displacement");
// At this point we know that the header has the bias pattern and
@@ -3185,7 +3172,7 @@
// FIXME: due to a lack of registers we currently blow away the age
// bits in this situation. Should attempt to preserve them.
load_klass(obj_reg, temp_reg);
- ld_ptr(Address(temp_reg, 0, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()), temp_reg);
+ ld_ptr(Address(temp_reg, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()), temp_reg);
or3(G2_thread, temp_reg, temp_reg);
casn(mark_addr.base(), mark_reg, temp_reg);
// If the biasing toward our thread failed, this means that
@@ -3216,7 +3203,7 @@
// FIXME: due to a lack of registers we currently blow away the age
// bits in this situation. Should attempt to preserve them.
load_klass(obj_reg, temp_reg);
- ld_ptr(Address(temp_reg, 0, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()), temp_reg);
+ ld_ptr(Address(temp_reg, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()), temp_reg);
casn(mark_addr.base(), mark_reg, temp_reg);
// Fall through to the normal CAS-based lock, because no matter what
// the result of the above CAS, some thread must have succeeded in
@@ -3283,7 +3270,7 @@
Register Rbox, Register Rscratch,
BiasedLockingCounters* counters,
bool try_bias) {
- Address mark_addr(Roop, 0, oopDesc::mark_offset_in_bytes());
+ Address mark_addr(Roop, oopDesc::mark_offset_in_bytes());
verify_oop(Roop);
Label done ;
@@ -3386,7 +3373,7 @@
// If m->owner != null goto IsLocked
// Pessimistic form: Test-and-CAS vs CAS
// The optimistic form avoids RTS->RTO cache line upgrades.
- ld_ptr (Address (Rmark, 0, ObjectMonitor::owner_offset_in_bytes()-2), Rscratch) ;
+ ld_ptr (Rmark, ObjectMonitor::owner_offset_in_bytes() - 2, Rscratch);
andcc (Rscratch, Rscratch, G0) ;
brx (Assembler::notZero, false, Assembler::pn, done) ;
delayed()->nop() ;
@@ -3482,7 +3469,7 @@
// Test-and-CAS vs CAS
// Pessimistic form avoids futile (doomed) CAS attempts
// The optimistic form avoids RTS->RTO cache line upgrades.
- ld_ptr (Address (Rmark, 0, ObjectMonitor::owner_offset_in_bytes()-2), Rscratch) ;
+ ld_ptr (Rmark, ObjectMonitor::owner_offset_in_bytes() - 2, Rscratch);
andcc (Rscratch, Rscratch, G0) ;
brx (Assembler::notZero, false, Assembler::pn, done) ;
delayed()->nop() ;
@@ -3508,7 +3495,7 @@
void MacroAssembler::compiler_unlock_object(Register Roop, Register Rmark,
Register Rbox, Register Rscratch,
bool try_bias) {
- Address mark_addr(Roop, 0, oopDesc::mark_offset_in_bytes());
+ Address mark_addr(Roop, oopDesc::mark_offset_in_bytes());
Label done ;
@@ -3568,14 +3555,14 @@
// Note that we use 1-0 locking by default for the inflated case. We
// close the resultant (and rare) race by having contented threads in
// monitorenter periodically poll _owner.
- ld_ptr (Address(Rmark, 0, ObjectMonitor::owner_offset_in_bytes()-2), Rscratch) ;
- ld_ptr (Address(Rmark, 0, ObjectMonitor::recursions_offset_in_bytes()-2), Rbox) ;
+ ld_ptr (Rmark, ObjectMonitor::owner_offset_in_bytes() - 2, Rscratch);
+ ld_ptr (Rmark, ObjectMonitor::recursions_offset_in_bytes() - 2, Rbox);
xor3 (Rscratch, G2_thread, Rscratch) ;
orcc (Rbox, Rscratch, Rbox) ;
brx (Assembler::notZero, false, Assembler::pn, done) ;
delayed()->
- ld_ptr (Address (Rmark, 0, ObjectMonitor::EntryList_offset_in_bytes()-2), Rscratch) ;
- ld_ptr (Address (Rmark, 0, ObjectMonitor::cxq_offset_in_bytes()-2), Rbox) ;
+ ld_ptr (Rmark, ObjectMonitor::EntryList_offset_in_bytes() - 2, Rscratch);
+ ld_ptr (Rmark, ObjectMonitor::cxq_offset_in_bytes() - 2, Rbox);
orcc (Rbox, Rscratch, G0) ;
if (EmitSync & 65536) {
Label LSucc ;
@@ -3583,12 +3570,12 @@
delayed()->nop() ;
br (Assembler::always, false, Assembler::pt, done) ;
delayed()->
- st_ptr (G0, Address (Rmark, 0, ObjectMonitor::owner_offset_in_bytes()-2)) ;
+ st_ptr (G0, Rmark, ObjectMonitor::owner_offset_in_bytes() - 2);
bind (LSucc) ;
- st_ptr (G0, Address (Rmark, 0, ObjectMonitor::owner_offset_in_bytes()-2)) ;
+ st_ptr (G0, Rmark, ObjectMonitor::owner_offset_in_bytes() - 2);
if (os::is_MP()) { membar (StoreLoad) ; }
- ld_ptr (Address (Rmark, 0, ObjectMonitor::succ_offset_in_bytes()-2), Rscratch) ;
+ ld_ptr (Rmark, ObjectMonitor::succ_offset_in_bytes() - 2, Rscratch);
andcc (Rscratch, Rscratch, G0) ;
brx (Assembler::notZero, false, Assembler::pt, done) ;
delayed()-> andcc (G0, G0, G0) ;
@@ -3606,7 +3593,7 @@
delayed()->nop() ;
br (Assembler::always, false, Assembler::pt, done) ;
delayed()->
- st_ptr (G0, Address (Rmark, 0, ObjectMonitor::owner_offset_in_bytes()-2)) ;
+ st_ptr (G0, Rmark, ObjectMonitor::owner_offset_in_bytes() - 2);
}
bind (LStacked) ;
@@ -4005,20 +3992,26 @@
bind(L);
}
-void MacroAssembler::inc_counter(address counter_ptr, Register Rtmp1, Register Rtmp2) {
- Address counter_addr(Rtmp1, counter_ptr);
- load_contents(counter_addr, Rtmp2);
+void MacroAssembler::inc_counter(address counter_addr, Register Rtmp1, Register Rtmp2) {
+ AddressLiteral addrlit(counter_addr);
+ sethi(addrlit, Rtmp1); // Move hi22 bits into temporary register.
+ Address addr(Rtmp1, addrlit.low10()); // Build an address with low10 bits.
+ ld(addr, Rtmp2);
inc(Rtmp2);
- store_contents(Rtmp2, counter_addr);
+ st(Rtmp2, addr);
+}
+
+void MacroAssembler::inc_counter(int* counter_addr, Register Rtmp1, Register Rtmp2) {
+ inc_counter((address) counter_addr, Rtmp1, Rtmp2);
}
SkipIfEqual::SkipIfEqual(
MacroAssembler* masm, Register temp, const bool* flag_addr,
Assembler::Condition condition) {
_masm = masm;
- Address flag(temp, (address)flag_addr, relocInfo::none);
- _masm->sethi(flag);
- _masm->ldub(flag, temp);
+ AddressLiteral flag(flag_addr);
+ _masm->sethi(flag, temp);
+ _masm->ldub(temp, flag.low10(), temp);
_masm->tst(temp);
_masm->br(condition, false, Assembler::pt, _label);
_masm->delayed()->nop();
@@ -4333,8 +4326,8 @@
#else
masm.srl(O0, CardTableModRefBS::card_shift, O0);
#endif
- Address rs(O1, (address)byte_map_base);
- masm.load_address(rs); // O1 := <card table base>
+ AddressLiteral addrlit(byte_map_base);
+ masm.set(addrlit, O1); // O1 := <card table base>
masm.ldub(O0, O1, O2); // O2 := [O0 + O1]
masm.br_on_reg_cond(Assembler::rc_nz, /*annul*/false, Assembler::pt,
@@ -4494,10 +4487,9 @@
#else
post_filter_masm->srl(store_addr, CardTableModRefBS::card_shift, store_addr);
#endif
- assert( tmp != store_addr, "need separate temp reg");
- Address rs(tmp, (address)bs->byte_map_base);
- load_address(rs);
- stb(G0, rs.base(), store_addr);
+ assert(tmp != store_addr, "need separate temp reg");
+ set(bs->byte_map_base, tmp);
+ stb(G0, tmp, store_addr);
}
bind(filtered);
@@ -4516,24 +4508,6 @@
card_table_write(bs->byte_map_base, tmp, store_addr);
}
-// Loading values by size and signed-ness
-void MacroAssembler::load_sized_value(Register s1, RegisterOrConstant s2, Register d,
- int size_in_bytes, bool is_signed) {
- switch (size_in_bytes ^ (is_signed ? -1 : 0)) {
- case ~8: // fall through:
- case 8: ld_long( s1, s2, d ); break;
- case ~4: ldsw( s1, s2, d ); break;
- case 4: lduw( s1, s2, d ); break;
- case ~2: ldsh( s1, s2, d ); break;
- case 2: lduh( s1, s2, d ); break;
- case ~1: ldsb( s1, s2, d ); break;
- case 1: ldub( s1, s2, d ); break;
- default: ShouldNotReachHere();
- }
-}
-
-
-
void MacroAssembler::load_klass(Register src_oop, Register klass) {
// The number of bytes in this code is used by
// MachCallDynamicJavaNode::ret_addr_offset()
@@ -4563,12 +4537,12 @@
}
}
-void MacroAssembler::load_heap_oop(const Address& s, Register d, int offset) {
+void MacroAssembler::load_heap_oop(const Address& s, Register d) {
if (UseCompressedOops) {
- lduw(s, d, offset);
+ lduw(s, d);
decode_heap_oop(d);
} else {
- ld_ptr(s, d, offset);
+ ld_ptr(s, d);
}
}
@@ -4714,7 +4688,7 @@
void MacroAssembler::reinit_heapbase() {
if (UseCompressedOops) {
// call indirectly to solve generation ordering problem
- Address base(G6_heapbase, (address)Universe::narrow_oop_base_addr());
+ AddressLiteral base(Universe::narrow_oop_base_addr());
load_ptr_contents(base, G6_heapbase);
}
}
--- a/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -274,21 +274,90 @@
class Address VALUE_OBJ_CLASS_SPEC {
private:
- Register _base;
-#ifdef _LP64
- int _hi32; // bits 63::32
- int _low32; // bits 31::0
+ Register _base; // Base register.
+ RegisterOrConstant _index_or_disp; // Index register or constant displacement.
+ RelocationHolder _rspec;
+
+ public:
+ Address() : _base(noreg), _index_or_disp(noreg) {}
+
+ Address(Register base, RegisterOrConstant index_or_disp)
+ : _base(base),
+ _index_or_disp(index_or_disp) {
+ }
+
+ Address(Register base, Register index)
+ : _base(base),
+ _index_or_disp(index) {
+ }
+
+ Address(Register base, int disp)
+ : _base(base),
+ _index_or_disp(disp) {
+ }
+
+#ifdef ASSERT
+ // ByteSize is only a class when ASSERT is defined, otherwise it's an int.
+ Address(Register base, ByteSize disp)
+ : _base(base),
+ _index_or_disp(in_bytes(disp)) {
+ }
#endif
- int _hi;
- int _disp;
- RelocationHolder _rspec;
-
- RelocationHolder rspec_from_rtype(relocInfo::relocType rt, address a = NULL) {
- switch (rt) {
+
+ // accessors
+ Register base() const { return _base; }
+ Register index() const { return _index_or_disp.as_register(); }
+ int disp() const { return _index_or_disp.as_constant(); }
+
+ bool has_index() const { return _index_or_disp.is_register(); }
+ bool has_disp() const { return _index_or_disp.is_constant(); }
+
+ const relocInfo::relocType rtype() { return _rspec.type(); }
+ const RelocationHolder& rspec() { return _rspec; }
+
+ RelocationHolder rspec(int offset) const {
+ return offset == 0 ? _rspec : _rspec.plus(offset);
+ }
+
+ inline bool is_simm13(int offset = 0); // check disp+offset for overflow
+
+ Address plus_disp(int plusdisp) const { // bump disp by a small amount
+ assert(_index_or_disp.is_constant(), "must have a displacement");
+ Address a(base(), disp() + plusdisp);
+ return a;
+ }
+
+ Address after_save() const {
+ Address a = (*this);
+ a._base = a._base->after_save();
+ return a;
+ }
+
+ Address after_restore() const {
+ Address a = (*this);
+ a._base = a._base->after_restore();
+ return a;
+ }
+
+ // Convert the raw encoding form into the form expected by the
+ // constructor for Address.
+ static Address make_raw(int base, int index, int scale, int disp, bool disp_is_oop);
+
+ friend class Assembler;
+};
+
+
+class AddressLiteral VALUE_OBJ_CLASS_SPEC {
+ private:
+ address _address;
+ RelocationHolder _rspec;
+
+ RelocationHolder rspec_from_rtype(relocInfo::relocType rtype, address addr) {
+ switch (rtype) {
case relocInfo::external_word_type:
- return external_word_Relocation::spec(a);
+ return external_word_Relocation::spec(addr);
case relocInfo::internal_word_type:
- return internal_word_Relocation::spec(a);
+ return internal_word_Relocation::spec(addr);
#ifdef _LP64
case relocInfo::opt_virtual_call_type:
return opt_virtual_call_Relocation::spec();
@@ -305,127 +374,86 @@
}
}
+ protected:
+ // creation
+ AddressLiteral() : _address(NULL), _rspec(NULL) {}
+
public:
- Address(Register b, address a, relocInfo::relocType rt = relocInfo::none)
- : _rspec(rspec_from_rtype(rt, a))
- {
- _base = b;
-#ifdef _LP64
- _hi32 = (intptr_t)a >> 32; // top 32 bits in 64 bit word
- _low32 = (intptr_t)a & ~0; // low 32 bits in 64 bit word
-#endif
- _hi = (intptr_t)a & ~0x3ff; // top 22 bits in low word
- _disp = (intptr_t)a & 0x3ff; // bottom 10 bits
- }
-
- Address(Register b, address a, RelocationHolder const& rspec)
- : _rspec(rspec)
- {
- _base = b;
+ AddressLiteral(address addr, RelocationHolder const& rspec)
+ : _address(addr),
+ _rspec(rspec) {}
+
+ // Some constructors to avoid casting at the call site.
+ AddressLiteral(jobject obj, RelocationHolder const& rspec)
+ : _address((address) obj),
+ _rspec(rspec) {}
+
+ AddressLiteral(intptr_t value, RelocationHolder const& rspec)
+ : _address((address) value),
+ _rspec(rspec) {}
+
+ AddressLiteral(address addr, relocInfo::relocType rtype = relocInfo::none)
+ : _address((address) addr),
+ _rspec(rspec_from_rtype(rtype, (address) addr)) {}
+
+ // Some constructors to avoid casting at the call site.
+ AddressLiteral(address* addr, relocInfo::relocType rtype = relocInfo::none)
+ : _address((address) addr),
+ _rspec(rspec_from_rtype(rtype, (address) addr)) {}
+
+ AddressLiteral(bool* addr, relocInfo::relocType rtype = relocInfo::none)
+ : _address((address) addr),
+ _rspec(rspec_from_rtype(rtype, (address) addr)) {}
+
+ AddressLiteral(const bool* addr, relocInfo::relocType rtype = relocInfo::none)
+ : _address((address) addr),
+ _rspec(rspec_from_rtype(rtype, (address) addr)) {}
+
+ AddressLiteral(signed char* addr, relocInfo::relocType rtype = relocInfo::none)
+ : _address((address) addr),
+ _rspec(rspec_from_rtype(rtype, (address) addr)) {}
+
+ AddressLiteral(int* addr, relocInfo::relocType rtype = relocInfo::none)
+ : _address((address) addr),
+ _rspec(rspec_from_rtype(rtype, (address) addr)) {}
+
+ AddressLiteral(intptr_t addr, relocInfo::relocType rtype = relocInfo::none)
+ : _address((address) addr),
+ _rspec(rspec_from_rtype(rtype, (address) addr)) {}
+
#ifdef _LP64
- _hi32 = (intptr_t)a >> 32; // top 32 bits in 64 bit word
- _low32 = (intptr_t)a & ~0; // low 32 bits in 64 bit word
-#endif
- _hi = (intptr_t)a & ~0x3ff; // top 22 bits
- _disp = (intptr_t)a & 0x3ff; // bottom 10 bits
- }
-
- Address(Register b, intptr_t h, intptr_t d, RelocationHolder const& rspec = RelocationHolder())
- : _rspec(rspec)
- {
- _base = b;
-#ifdef _LP64
-// [RGV] Put in Assert to force me to check usage of this constructor
- assert( h == 0, "Check usage of this constructor" );
- _hi32 = h;
- _low32 = d;
- _hi = h;
- _disp = d;
-#else
- _hi = h;
- _disp = d;
+ // 32-bit complains about a multiple declaration for int*.
+ AddressLiteral(intptr_t* addr, relocInfo::relocType rtype = relocInfo::none)
+ : _address((address) addr),
+ _rspec(rspec_from_rtype(rtype, (address) addr)) {}
#endif
- }
-
- Address()
- : _rspec(RelocationHolder())
- {
- _base = G0;
-#ifdef _LP64
- _hi32 = 0;
- _low32 = 0;
-#endif
- _hi = 0;
- _disp = 0;
- }
-
- // fancier constructors
-
- enum addr_type {
- extra_in_argument, // in the In registers
- extra_out_argument // in the Outs
- };
-
- Address( addr_type, int );
-
- // accessors
-
- Register base() const { return _base; }
-#ifdef _LP64
- int hi32() const { return _hi32; }
- int low32() const { return _low32; }
-#endif
- int hi() const { return _hi; }
- int disp() const { return _disp; }
-#ifdef _LP64
- intptr_t value() const { return ((intptr_t)_hi32 << 32) |
- (intptr_t)(uint32_t)_low32; }
-#else
- int value() const { return _hi | _disp; }
-#endif
- const relocInfo::relocType rtype() { return _rspec.type(); }
- const RelocationHolder& rspec() { return _rspec; }
-
- RelocationHolder rspec(int offset) const {
+
+ AddressLiteral(oop addr, relocInfo::relocType rtype = relocInfo::none)
+ : _address((address) addr),
+ _rspec(rspec_from_rtype(rtype, (address) addr)) {}
+
+ AddressLiteral(float* addr, relocInfo::relocType rtype = relocInfo::none)
+ : _address((address) addr),
+ _rspec(rspec_from_rtype(rtype, (address) addr)) {}
+
+ AddressLiteral(double* addr, relocInfo::relocType rtype = relocInfo::none)
+ : _address((address) addr),
+ _rspec(rspec_from_rtype(rtype, (address) addr)) {}
+
+ intptr_t value() const { return (intptr_t) _address; }
+ int low10() const;
+
+ const relocInfo::relocType rtype() const { return _rspec.type(); }
+ const RelocationHolder& rspec() const { return _rspec; }
+
+ RelocationHolder rspec(int offset) const {
return offset == 0 ? _rspec : _rspec.plus(offset);
}
-
- inline bool is_simm13(int offset = 0); // check disp+offset for overflow
-
- Address plus_disp(int disp) const { // bump disp by a small amount
- Address a = (*this);
- a._disp += disp;
- return a;
- }
-
- Address split_disp() const { // deal with disp overflow
- Address a = (*this);
- int hi_disp = _disp & ~0x3ff;
- if (hi_disp != 0) {
- a._disp -= hi_disp;
- a._hi += hi_disp;
- }
- return a;
- }
-
- Address after_save() const {
- Address a = (*this);
- a._base = a._base->after_save();
- return a;
- }
-
- Address after_restore() const {
- Address a = (*this);
- a._base = a._base->after_restore();
- return a;
- }
-
- friend class Assembler;
};
inline Address RegisterImpl::address_in_saved_window() const {
- return (Address(SP, 0, (sp_offset_in_saved_window() * wordSize) + STACK_BIAS));
+ return (Address(SP, (sp_offset_in_saved_window() * wordSize) + STACK_BIAS));
}
@@ -495,11 +523,7 @@
// When applied to a register-based argument, give the corresponding address
// into the 6-word area "into which callee may store register arguments"
// (This is a different place than the corresponding register-save area location.)
- Address address_in_frame() const {
- return Address( is_in() ? Address::extra_in_argument
- : Address::extra_out_argument,
- _number );
- }
+ Address address_in_frame() const;
// debugging
const char* name() const;
@@ -521,6 +545,7 @@
friend class AbstractAssembler;
+ friend class AddressLiteral;
// code patchers need various routines like inv_wdisp()
friend class NativeInstruction;
@@ -1093,11 +1118,11 @@
// pp 135 (addc was addx in v8)
- inline void add( Register s1, Register s2, Register d );
- inline void add( Register s1, int simm13a, Register d, relocInfo::relocType rtype = relocInfo::none);
- inline void add( Register s1, int simm13a, Register d, RelocationHolder const& rspec);
- inline void add( Register s1, RegisterOrConstant s2, Register d, int offset = 0);
- inline void add( const Address& a, Register d, int offset = 0);
+ inline void add(Register s1, Register s2, Register d );
+ inline void add(Register s1, int simm13a, Register d, relocInfo::relocType rtype = relocInfo::none);
+ inline void add(Register s1, int simm13a, Register d, RelocationHolder const& rspec);
+ inline void add(Register s1, RegisterOrConstant s2, Register d, int offset = 0);
+ inline void add(const Address& a, Register d, int offset = 0) { add( a.base(), a.disp() + offset, d, a.rspec(offset)); }
void addcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(add_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
void addcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(add_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
@@ -1252,14 +1277,12 @@
void jmpl( Register s1, Register s2, Register d );
void jmpl( Register s1, int simm13a, Register d, RelocationHolder const& rspec = RelocationHolder() );
- inline void jmpl( Address& a, Register d, int offset = 0);
-
// 171
- inline void ldf( FloatRegisterImpl::Width w, Register s1, Register s2, FloatRegister d );
- inline void ldf( FloatRegisterImpl::Width w, Register s1, int simm13a, FloatRegister d );
-
- inline void ldf( FloatRegisterImpl::Width w, const Address& a, FloatRegister d, int offset = 0);
+ inline void ldf(FloatRegisterImpl::Width w, Register s1, Register s2, FloatRegister d);
+ inline void ldf(FloatRegisterImpl::Width w, Register s1, int simm13a, FloatRegister d, RelocationHolder const& rspec = RelocationHolder());
+
+ inline void ldf(FloatRegisterImpl::Width w, const Address& a, FloatRegister d, int offset = 0);
inline void ldfsr( Register s1, Register s2 );
@@ -1303,15 +1326,20 @@
inline void ldd( Register s1, Register s2, Register d );
inline void ldd( Register s1, int simm13a, Register d);
- inline void ldsb( const Address& a, Register d, int offset = 0 );
- inline void ldsh( const Address& a, Register d, int offset = 0 );
- inline void ldsw( const Address& a, Register d, int offset = 0 );
- inline void ldub( const Address& a, Register d, int offset = 0 );
- inline void lduh( const Address& a, Register d, int offset = 0 );
- inline void lduw( const Address& a, Register d, int offset = 0 );
- inline void ldx( const Address& a, Register d, int offset = 0 );
- inline void ld( const Address& a, Register d, int offset = 0 );
- inline void ldd( const Address& a, Register d, int offset = 0 );
+#ifdef ASSERT
+ // ByteSize is only a class when ASSERT is defined, otherwise it's an int.
+ inline void ld( Register s1, ByteSize simm13a, Register d);
+#endif
+
+ inline void ldsb(const Address& a, Register d, int offset = 0);
+ inline void ldsh(const Address& a, Register d, int offset = 0);
+ inline void ldsw(const Address& a, Register d, int offset = 0);
+ inline void ldub(const Address& a, Register d, int offset = 0);
+ inline void lduh(const Address& a, Register d, int offset = 0);
+ inline void lduw(const Address& a, Register d, int offset = 0);
+ inline void ldx( const Address& a, Register d, int offset = 0);
+ inline void ld( const Address& a, Register d, int offset = 0);
+ inline void ldd( const Address& a, Register d, int offset = 0);
inline void ldub( Register s1, RegisterOrConstant s2, Register d );
inline void ldsb( Register s1, RegisterOrConstant s2, Register d );
@@ -1536,6 +1564,11 @@
inline void std( Register d, Register s1, Register s2 );
inline void std( Register d, Register s1, int simm13a);
+#ifdef ASSERT
+ // ByteSize is only a class when ASSERT is defined, otherwise it's an int.
+ inline void st( Register d, Register s1, ByteSize simm13a);
+#endif
+
inline void stb( Register d, const Address& a, int offset = 0 );
inline void sth( Register d, const Address& a, int offset = 0 );
inline void stw( Register d, const Address& a, int offset = 0 );
@@ -1684,8 +1717,8 @@
#define JMP2(r1, r2) jmp(r1, r2, __FILE__, __LINE__)
#define JMP(r1, off) jmp(r1, off, __FILE__, __LINE__)
-#define JUMP(a, off) jump(a, off, __FILE__, __LINE__)
-#define JUMPL(a, d, off) jumpl(a, d, off, __FILE__, __LINE__)
+#define JUMP(a, temp, off) jump(a, temp, off, __FILE__, __LINE__)
+#define JUMPL(a, temp, d, off) jumpl(a, temp, d, off, __FILE__, __LINE__)
class MacroAssembler: public Assembler {
@@ -1830,17 +1863,26 @@
#endif
// sethi Macro handles optimizations and relocations
- void sethi( Address& a, bool ForceRelocatable = false );
- void sethi( intptr_t imm22a, Register d, bool ForceRelocatable = false, RelocationHolder const& rspec = RelocationHolder());
+private:
+ void internal_sethi(const AddressLiteral& addrlit, Register d, bool ForceRelocatable);
+public:
+ void sethi(const AddressLiteral& addrlit, Register d);
+ void patchable_sethi(const AddressLiteral& addrlit, Register d);
// compute the size of a sethi/set
static int size_of_sethi( address a, bool worst_case = false );
static int worst_case_size_of_set();
// set may be either setsw or setuw (high 32 bits may be zero or sign)
- void set( intptr_t value, Register d, RelocationHolder const& rspec = RelocationHolder() );
- void setsw( int value, Register d, RelocationHolder const& rspec = RelocationHolder() );
- void set64( jlong value, Register d, Register tmp);
+private:
+ void internal_set(const AddressLiteral& al, Register d, bool ForceRelocatable);
+public:
+ void set(const AddressLiteral& addrlit, Register d);
+ void set(intptr_t value, Register d);
+ void set(address addr, Register d, RelocationHolder const& rspec);
+ void patchable_set(const AddressLiteral& addrlit, Register d);
+ void patchable_set(intptr_t value, Register d);
+ void set64(jlong value, Register d, Register tmp);
// sign-extend 32 to 64
inline void signx( Register s, Register d ) { sra( s, G0, d); }
@@ -1930,24 +1972,22 @@
inline void mov( int simm13a, Register d) { or3( G0, simm13a, d); }
// address pseudos: make these names unlike instruction names to avoid confusion
- inline void split_disp( Address& a, Register temp );
inline intptr_t load_pc_address( Register reg, int bytes_to_skip );
- inline void load_address( Address& a, int offset = 0 );
- inline void load_contents( Address& a, Register d, int offset = 0 );
- inline void load_ptr_contents( Address& a, Register d, int offset = 0 );
- inline void store_contents( Register s, Address& a, int offset = 0 );
- inline void store_ptr_contents( Register s, Address& a, int offset = 0 );
- inline void jumpl_to( Address& a, Register d, int offset = 0 );
- inline void jump_to( Address& a, int offset = 0 );
- inline void jump_indirect_to( Address& a, Register temp, int ld_offset = 0, int jmp_offset = 0 );
+ inline void load_contents(AddressLiteral& addrlit, Register d, int offset = 0);
+ inline void load_ptr_contents(AddressLiteral& addrlit, Register d, int offset = 0);
+ inline void store_contents(Register s, AddressLiteral& addrlit, Register temp, int offset = 0);
+ inline void store_ptr_contents(Register s, AddressLiteral& addrlit, Register temp, int offset = 0);
+ inline void jumpl_to(AddressLiteral& addrlit, Register temp, Register d, int offset = 0);
+ inline void jump_to(AddressLiteral& addrlit, Register temp, int offset = 0);
+ inline void jump_indirect_to(Address& a, Register temp, int ld_offset = 0, int jmp_offset = 0);
// ring buffer traceable jumps
void jmp2( Register r1, Register r2, const char* file, int line );
void jmp ( Register r1, int offset, const char* file, int line );
- void jumpl( Address& a, Register d, int offset, const char* file, int line );
- void jump ( Address& a, int offset, const char* file, int line );
+ void jumpl(AddressLiteral& addrlit, Register temp, Register d, int offset, const char* file, int line);
+ void jump (AddressLiteral& addrlit, Register temp, int offset, const char* file, int line);
// argument pseudos:
@@ -1972,29 +2012,31 @@
// Functions for isolating 64 bit loads for LP64
// ld_ptr will perform ld for 32 bit VM's and ldx for 64 bit VM's
// st_ptr will perform st for 32 bit VM's and stx for 64 bit VM's
- inline void ld_ptr( Register s1, Register s2, Register d );
- inline void ld_ptr( Register s1, int simm13a, Register d);
- inline void ld_ptr( Register s1, RegisterOrConstant s2, Register d );
- inline void ld_ptr( const Address& a, Register d, int offset = 0 );
- inline void st_ptr( Register d, Register s1, Register s2 );
- inline void st_ptr( Register d, Register s1, int simm13a);
- inline void st_ptr( Register d, Register s1, RegisterOrConstant s2 );
- inline void st_ptr( Register d, const Address& a, int offset = 0 );
+ inline void ld_ptr(Register s1, Register s2, Register d);
+ inline void ld_ptr(Register s1, int simm13a, Register d);
+ inline void ld_ptr(Register s1, RegisterOrConstant s2, Register d);
+ inline void ld_ptr(const Address& a, Register d, int offset = 0);
+ inline void st_ptr(Register d, Register s1, Register s2);
+ inline void st_ptr(Register d, Register s1, int simm13a);
+ inline void st_ptr(Register d, Register s1, RegisterOrConstant s2);
+ inline void st_ptr(Register d, const Address& a, int offset = 0);
+
+#ifdef ASSERT
+ // ByteSize is only a class when ASSERT is defined, otherwise it's an int.
+ inline void ld_ptr(Register s1, ByteSize simm13a, Register d);
+ inline void st_ptr(Register d, Register s1, ByteSize simm13a);
+#endif
// ld_long will perform ld for 32 bit VM's and ldx for 64 bit VM's
// st_long will perform st for 32 bit VM's and stx for 64 bit VM's
- inline void ld_long( Register s1, Register s2, Register d );
- inline void ld_long( Register s1, int simm13a, Register d );
- inline void ld_long( Register s1, RegisterOrConstant s2, Register d );
- inline void ld_long( const Address& a, Register d, int offset = 0 );
- inline void st_long( Register d, Register s1, Register s2 );
- inline void st_long( Register d, Register s1, int simm13a );
- inline void st_long( Register d, Register s1, RegisterOrConstant s2 );
- inline void st_long( Register d, const Address& a, int offset = 0 );
-
- // Loading values by size and signed-ness
- void load_sized_value(Register s1, RegisterOrConstant s2, Register d,
- int size_in_bytes, bool is_signed);
+ inline void ld_long(Register s1, Register s2, Register d);
+ inline void ld_long(Register s1, int simm13a, Register d);
+ inline void ld_long(Register s1, RegisterOrConstant s2, Register d);
+ inline void ld_long(const Address& a, Register d, int offset = 0);
+ inline void st_long(Register d, Register s1, Register s2);
+ inline void st_long(Register d, Register s1, int simm13a);
+ inline void st_long(Register d, Register s1, RegisterOrConstant s2);
+ inline void st_long(Register d, const Address& a, int offset = 0);
// Helpers for address formation.
// They update the dest in place, whether it is a register or constant.
@@ -2049,8 +2091,8 @@
// These are idioms to flag the need for care with accessing bools but on
// this platform we assume byte size
- inline void stbool( Register d, const Address& a, int offset = 0 ) { stb(d, a, offset); }
- inline void ldbool( const Address& a, Register d, int offset = 0 ) { ldsb( a, d, offset ); }
+ inline void stbool(Register d, const Address& a) { stb(d, a); }
+ inline void ldbool(const Address& a, Register d) { ldsb(a, d); }
inline void tstbool( Register s ) { tst(s); }
inline void movbool( bool boolconst, Register d) { mov( (int) boolconst, d); }
@@ -2060,7 +2102,7 @@
void store_klass_gap(Register s, Register dst_oop);
// oop manipulations
- void load_heap_oop(const Address& s, Register d, int offset = 0);
+ void load_heap_oop(const Address& s, Register d);
void load_heap_oop(Register s1, Register s2, Register d);
void load_heap_oop(Register s1, int simm13a, Register d);
void store_heap_oop(Register d, Register s1, Register s2);
@@ -2190,11 +2232,11 @@
void print_CPU_state();
// oops in code
- Address allocate_oop_address( jobject obj, Register d ); // allocate_index
- Address constant_oop_address( jobject obj, Register d ); // find_index
- inline void set_oop ( jobject obj, Register d ); // uses allocate_oop_address
- inline void set_oop_constant( jobject obj, Register d ); // uses constant_oop_address
- inline void set_oop ( Address obj_addr ); // same as load_address
+ AddressLiteral allocate_oop_address(jobject obj); // allocate_index
+ AddressLiteral constant_oop_address(jobject obj); // find_index
+ inline void set_oop (jobject obj, Register d); // uses allocate_oop_address
+ inline void set_oop_constant (jobject obj, Register d); // uses constant_oop_address
+ inline void set_oop (AddressLiteral& obj_addr, Register d); // same as load_address
void set_narrow_oop( jobject obj, Register d );
@@ -2410,7 +2452,8 @@
// Conditionally (non-atomically) increments passed counter address, preserving condition codes.
void cond_inc(Condition cond, address counter_addr, Register Rtemp1, Register Rtemp2);
// Unconditional increment.
- void inc_counter(address counter_addr, Register Rtemp1, Register Rtemp2);
+ void inc_counter(address counter_addr, Register Rtmp1, Register Rtmp2);
+ void inc_counter(int* counter_addr, Register Rtmp1, Register Rtmp2);
#undef VIRTUAL
--- a/hotspot/src/cpu/sparc/vm/assembler_sparc.inline.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/sparc/vm/assembler_sparc.inline.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -38,6 +38,11 @@
inline bool Address::is_simm13(int offset) { return Assembler::is_simm13(disp() + offset); }
+inline int AddressLiteral::low10() const {
+ return Assembler::low10(value());
+}
+
+
// inlines for SPARC assembler -- dmu 5/97
inline void Assembler::check_delay() {
@@ -63,10 +68,9 @@
}
-inline void Assembler::add( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(add_op3) | rs1(s1) | rs2(s2) ); }
-inline void Assembler::add( Register s1, int simm13a, Register d, relocInfo::relocType rtype ) { emit_data( op(arith_op) | rd(d) | op3(add_op3) | rs1(s1) | immed(true) | simm(simm13a, 13), rtype ); }
-inline void Assembler::add( Register s1, int simm13a, Register d, RelocationHolder const& rspec ) { emit_data( op(arith_op) | rd(d) | op3(add_op3) | rs1(s1) | immed(true) | simm(simm13a, 13), rspec ); }
-inline void Assembler::add( const Address& a, Register d, int offset) { add( a.base(), a.disp() + offset, d, a.rspec(offset)); }
+inline void Assembler::add(Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(add_op3) | rs1(s1) | rs2(s2) ); }
+inline void Assembler::add(Register s1, int simm13a, Register d, relocInfo::relocType rtype ) { emit_data( op(arith_op) | rd(d) | op3(add_op3) | rs1(s1) | immed(true) | simm(simm13a, 13), rtype ); }
+inline void Assembler::add(Register s1, int simm13a, Register d, RelocationHolder const& rspec ) { emit_data( op(arith_op) | rd(d) | op3(add_op3) | rs1(s1) | immed(true) | simm(simm13a, 13), rspec ); }
inline void Assembler::bpr( RCondition c, bool a, Predict p, Register s1, address d, relocInfo::relocType rt ) { v9_only(); emit_data( op(branch_op) | annul(a) | cond(c) | op2(bpr_op2) | wdisp16(intptr_t(d), intptr_t(pc())) | predict(p) | rs1(s1), rt); has_delay_slot(); }
inline void Assembler::bpr( RCondition c, bool a, Predict p, Register s1, Label& L) { bpr( c, a, p, s1, target(L)); }
@@ -95,13 +99,10 @@
inline void Assembler::jmpl( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(jmpl_op3) | rs1(s1) | rs2(s2)); has_delay_slot(); }
inline void Assembler::jmpl( Register s1, int simm13a, Register d, RelocationHolder const& rspec ) { emit_data( op(arith_op) | rd(d) | op3(jmpl_op3) | rs1(s1) | immed(true) | simm(simm13a, 13), rspec); has_delay_slot(); }
-inline void Assembler::jmpl( Address& a, Register d, int offset) { jmpl( a.base(), a.disp() + offset, d, a.rspec(offset)); }
-
+inline void Assembler::ldf(FloatRegisterImpl::Width w, Register s1, Register s2, FloatRegister d) { emit_long( op(ldst_op) | fd(d, w) | alt_op3(ldf_op3, w) | rs1(s1) | rs2(s2) ); }
+inline void Assembler::ldf(FloatRegisterImpl::Width w, Register s1, int simm13a, FloatRegister d, RelocationHolder const& rspec) { emit_data( op(ldst_op) | fd(d, w) | alt_op3(ldf_op3, w) | rs1(s1) | immed(true) | simm(simm13a, 13), rspec); }
-inline void Assembler::ldf( FloatRegisterImpl::Width w, Register s1, Register s2, FloatRegister d) { emit_long( op(ldst_op) | fd(d, w) | alt_op3(ldf_op3, w) | rs1(s1) | rs2(s2) ); }
-inline void Assembler::ldf( FloatRegisterImpl::Width w, Register s1, int simm13a, FloatRegister d) { emit_data( op(ldst_op) | fd(d, w) | alt_op3(ldf_op3, w) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
-
-inline void Assembler::ldf( FloatRegisterImpl::Width w, const Address& a, FloatRegister d, int offset) { relocate(a.rspec(offset)); ldf( w, a.base(), a.disp() + offset, d); }
+inline void Assembler::ldf(FloatRegisterImpl::Width w, const Address& a, FloatRegister d, int offset) { relocate(a.rspec(offset)); ldf( w, a.base(), a.disp() + offset, d); }
inline void Assembler::ldfsr( Register s1, Register s2) { v9_dep(); emit_long( op(ldst_op) | op3(ldfsr_op3) | rs1(s1) | rs2(s2) ); }
inline void Assembler::ldfsr( Register s1, int simm13a) { v9_dep(); emit_data( op(ldst_op) | op3(ldfsr_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
@@ -136,49 +137,68 @@
#ifdef _LP64
// Make all 32 bit loads signed so 64 bit registers maintain proper sign
-inline void Assembler::ld( Register s1, Register s2, Register d) { ldsw( s1, s2, d); }
-inline void Assembler::ld( Register s1, int simm13a, Register d) { ldsw( s1, simm13a, d); }
+inline void Assembler::ld( Register s1, Register s2, Register d) { ldsw( s1, s2, d); }
+inline void Assembler::ld( Register s1, int simm13a, Register d) { ldsw( s1, simm13a, d); }
#else
-inline void Assembler::ld( Register s1, Register s2, Register d) { lduw( s1, s2, d); }
-inline void Assembler::ld( Register s1, int simm13a, Register d) { lduw( s1, simm13a, d); }
+inline void Assembler::ld( Register s1, Register s2, Register d) { lduw( s1, s2, d); }
+inline void Assembler::ld( Register s1, int simm13a, Register d) { lduw( s1, simm13a, d); }
+#endif
+
+#ifdef ASSERT
+ // ByteSize is only a class when ASSERT is defined, otherwise it's an int.
+# ifdef _LP64
+inline void Assembler::ld( Register s1, ByteSize simm13a, Register d) { ldsw( s1, in_bytes(simm13a), d); }
+# else
+inline void Assembler::ld( Register s1, ByteSize simm13a, Register d) { lduw( s1, in_bytes(simm13a), d); }
+# endif
#endif
-inline void Assembler::ldub( Register s1, RegisterOrConstant s2, Register d) {
- if (s2.is_register()) ldsb(s1, s2.as_register(), d);
- else ldsb(s1, s2.as_constant(), d);
+inline void Assembler::ld( const Address& a, Register d, int offset) {
+ if (a.has_index()) { assert(offset == 0, ""); ld( a.base(), a.index(), d); }
+ else { ld( a.base(), a.disp() + offset, d); }
}
-inline void Assembler::ldsb( Register s1, RegisterOrConstant s2, Register d) {
- if (s2.is_register()) ldsb(s1, s2.as_register(), d);
- else ldsb(s1, s2.as_constant(), d);
+inline void Assembler::ldsb(const Address& a, Register d, int offset) {
+ if (a.has_index()) { assert(offset == 0, ""); ldsb(a.base(), a.index(), d); }
+ else { ldsb(a.base(), a.disp() + offset, d); }
}
-inline void Assembler::lduh( Register s1, RegisterOrConstant s2, Register d) {
- if (s2.is_register()) ldsh(s1, s2.as_register(), d);
- else ldsh(s1, s2.as_constant(), d);
+inline void Assembler::ldsh(const Address& a, Register d, int offset) {
+ if (a.has_index()) { assert(offset == 0, ""); ldsh(a.base(), a.index(), d); }
+ else { ldsh(a.base(), a.disp() + offset, d); }
}
-inline void Assembler::ldsh( Register s1, RegisterOrConstant s2, Register d) {
- if (s2.is_register()) ldsh(s1, s2.as_register(), d);
- else ldsh(s1, s2.as_constant(), d);
+inline void Assembler::ldsw(const Address& a, Register d, int offset) {
+ if (a.has_index()) { assert(offset == 0, ""); ldsw(a.base(), a.index(), d); }
+ else { ldsw(a.base(), a.disp() + offset, d); }
+}
+inline void Assembler::ldub(const Address& a, Register d, int offset) {
+ if (a.has_index()) { assert(offset == 0, ""); ldub(a.base(), a.index(), d); }
+ else { ldub(a.base(), a.disp() + offset, d); }
}
-inline void Assembler::lduw( Register s1, RegisterOrConstant s2, Register d) {
- if (s2.is_register()) ldsw(s1, s2.as_register(), d);
- else ldsw(s1, s2.as_constant(), d);
+inline void Assembler::lduh(const Address& a, Register d, int offset) {
+ if (a.has_index()) { assert(offset == 0, ""); lduh(a.base(), a.index(), d); }
+ else { lduh(a.base(), a.disp() + offset, d); }
}
-inline void Assembler::ldsw( Register s1, RegisterOrConstant s2, Register d) {
- if (s2.is_register()) ldsw(s1, s2.as_register(), d);
- else ldsw(s1, s2.as_constant(), d);
+inline void Assembler::lduw(const Address& a, Register d, int offset) {
+ if (a.has_index()) { assert(offset == 0, ""); lduw(a.base(), a.index(), d); }
+ else { lduw(a.base(), a.disp() + offset, d); }
+}
+inline void Assembler::ldd( const Address& a, Register d, int offset) {
+ if (a.has_index()) { assert(offset == 0, ""); ldd( a.base(), a.index(), d); }
+ else { ldd( a.base(), a.disp() + offset, d); }
}
-inline void Assembler::ldx( Register s1, RegisterOrConstant s2, Register d) {
- if (s2.is_register()) ldx(s1, s2.as_register(), d);
- else ldx(s1, s2.as_constant(), d);
+inline void Assembler::ldx( const Address& a, Register d, int offset) {
+ if (a.has_index()) { assert(offset == 0, ""); ldx( a.base(), a.index(), d); }
+ else { ldx( a.base(), a.disp() + offset, d); }
}
-inline void Assembler::ld( Register s1, RegisterOrConstant s2, Register d) {
- if (s2.is_register()) ld(s1, s2.as_register(), d);
- else ld(s1, s2.as_constant(), d);
-}
-inline void Assembler::ldd( Register s1, RegisterOrConstant s2, Register d) {
- if (s2.is_register()) ldd(s1, s2.as_register(), d);
- else ldd(s1, s2.as_constant(), d);
-}
+
+inline void Assembler::ldub(Register s1, RegisterOrConstant s2, Register d) { ldub(Address(s1, s2), d); }
+inline void Assembler::ldsb(Register s1, RegisterOrConstant s2, Register d) { ldsb(Address(s1, s2), d); }
+inline void Assembler::lduh(Register s1, RegisterOrConstant s2, Register d) { lduh(Address(s1, s2), d); }
+inline void Assembler::ldsh(Register s1, RegisterOrConstant s2, Register d) { ldsh(Address(s1, s2), d); }
+inline void Assembler::lduw(Register s1, RegisterOrConstant s2, Register d) { lduw(Address(s1, s2), d); }
+inline void Assembler::ldsw(Register s1, RegisterOrConstant s2, Register d) { ldsw(Address(s1, s2), d); }
+inline void Assembler::ldx( Register s1, RegisterOrConstant s2, Register d) { ldx( Address(s1, s2), d); }
+inline void Assembler::ld( Register s1, RegisterOrConstant s2, Register d) { ld( Address(s1, s2), d); }
+inline void Assembler::ldd( Register s1, RegisterOrConstant s2, Register d) { ldd( Address(s1, s2), d); }
// form effective addresses this way:
inline void Assembler::add( Register s1, RegisterOrConstant s2, Register d, int offset) {
@@ -187,17 +207,6 @@
if (offset != 0) add(d, offset, d);
}
-inline void Assembler::ld( const Address& a, Register d, int offset ) { relocate(a.rspec(offset)); ld( a.base(), a.disp() + offset, d ); }
-inline void Assembler::ldsb( const Address& a, Register d, int offset ) { relocate(a.rspec(offset)); ldsb( a.base(), a.disp() + offset, d ); }
-inline void Assembler::ldsh( const Address& a, Register d, int offset ) { relocate(a.rspec(offset)); ldsh( a.base(), a.disp() + offset, d ); }
-inline void Assembler::ldsw( const Address& a, Register d, int offset ) { relocate(a.rspec(offset)); ldsw( a.base(), a.disp() + offset, d ); }
-inline void Assembler::ldub( const Address& a, Register d, int offset ) { relocate(a.rspec(offset)); ldub( a.base(), a.disp() + offset, d ); }
-inline void Assembler::lduh( const Address& a, Register d, int offset ) { relocate(a.rspec(offset)); lduh( a.base(), a.disp() + offset, d ); }
-inline void Assembler::lduw( const Address& a, Register d, int offset ) { relocate(a.rspec(offset)); lduw( a.base(), a.disp() + offset, d ); }
-inline void Assembler::ldd( const Address& a, Register d, int offset ) { relocate(a.rspec(offset)); ldd( a.base(), a.disp() + offset, d ); }
-inline void Assembler::ldx( const Address& a, Register d, int offset ) { relocate(a.rspec(offset)); ldx( a.base(), a.disp() + offset, d ); }
-
-
inline void Assembler::ldstub( Register s1, Register s2, Register d) { emit_long( op(ldst_op) | rd(d) | op3(ldstub_op3) | rs1(s1) | rs2(s2) ); }
inline void Assembler::ldstub( Register s1, int simm13a, Register d) { emit_data( op(ldst_op) | rd(d) | op3(ldstub_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
@@ -240,36 +249,44 @@
inline void Assembler::std( Register d, Register s1, Register s2) { v9_dep(); assert(d->is_even(), "not even"); emit_long( op(ldst_op) | rd(d) | op3(std_op3) | rs1(s1) | rs2(s2) ); }
inline void Assembler::std( Register d, Register s1, int simm13a) { v9_dep(); assert(d->is_even(), "not even"); emit_data( op(ldst_op) | rd(d) | op3(std_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
-inline void Assembler::st( Register d, Register s1, Register s2) { stw(d, s1, s2); }
-inline void Assembler::st( Register d, Register s1, int simm13a) { stw(d, s1, simm13a); }
+inline void Assembler::st( Register d, Register s1, Register s2) { stw(d, s1, s2); }
+inline void Assembler::st( Register d, Register s1, int simm13a) { stw(d, s1, simm13a); }
+
+#ifdef ASSERT
+// ByteSize is only a class when ASSERT is defined, otherwise it's an int.
+inline void Assembler::st( Register d, Register s1, ByteSize simm13a) { stw(d, s1, in_bytes(simm13a)); }
+#endif
-inline void Assembler::stb( Register d, Register s1, RegisterOrConstant s2) {
- if (s2.is_register()) stb(d, s1, s2.as_register());
- else stb(d, s1, s2.as_constant());
+inline void Assembler::stb(Register d, const Address& a, int offset) {
+ if (a.has_index()) { assert(offset == 0, ""); stb(d, a.base(), a.index() ); }
+ else { stb(d, a.base(), a.disp() + offset); }
}
-inline void Assembler::sth( Register d, Register s1, RegisterOrConstant s2) {
- if (s2.is_register()) sth(d, s1, s2.as_register());
- else sth(d, s1, s2.as_constant());
+inline void Assembler::sth(Register d, const Address& a, int offset) {
+ if (a.has_index()) { assert(offset == 0, ""); sth(d, a.base(), a.index() ); }
+ else { sth(d, a.base(), a.disp() + offset); }
}
-inline void Assembler::stx( Register d, Register s1, RegisterOrConstant s2) {
- if (s2.is_register()) stx(d, s1, s2.as_register());
- else stx(d, s1, s2.as_constant());
+inline void Assembler::stw(Register d, const Address& a, int offset) {
+ if (a.has_index()) { assert(offset == 0, ""); stw(d, a.base(), a.index() ); }
+ else { stw(d, a.base(), a.disp() + offset); }
+}
+inline void Assembler::st( Register d, const Address& a, int offset) {
+ if (a.has_index()) { assert(offset == 0, ""); st( d, a.base(), a.index() ); }
+ else { st( d, a.base(), a.disp() + offset); }
}
-inline void Assembler::std( Register d, Register s1, RegisterOrConstant s2) {
- if (s2.is_register()) std(d, s1, s2.as_register());
- else std(d, s1, s2.as_constant());
+inline void Assembler::std(Register d, const Address& a, int offset) {
+ if (a.has_index()) { assert(offset == 0, ""); std(d, a.base(), a.index() ); }
+ else { std(d, a.base(), a.disp() + offset); }
}
-inline void Assembler::st( Register d, Register s1, RegisterOrConstant s2) {
- if (s2.is_register()) st(d, s1, s2.as_register());
- else st(d, s1, s2.as_constant());
+inline void Assembler::stx(Register d, const Address& a, int offset) {
+ if (a.has_index()) { assert(offset == 0, ""); stx(d, a.base(), a.index() ); }
+ else { stx(d, a.base(), a.disp() + offset); }
}
-inline void Assembler::stb( Register d, const Address& a, int offset) { relocate(a.rspec(offset)); stb( d, a.base(), a.disp() + offset); }
-inline void Assembler::sth( Register d, const Address& a, int offset) { relocate(a.rspec(offset)); sth( d, a.base(), a.disp() + offset); }
-inline void Assembler::stw( Register d, const Address& a, int offset) { relocate(a.rspec(offset)); stw( d, a.base(), a.disp() + offset); }
-inline void Assembler::st( Register d, const Address& a, int offset) { relocate(a.rspec(offset)); st( d, a.base(), a.disp() + offset); }
-inline void Assembler::std( Register d, const Address& a, int offset) { relocate(a.rspec(offset)); std( d, a.base(), a.disp() + offset); }
-inline void Assembler::stx( Register d, const Address& a, int offset) { relocate(a.rspec(offset)); stx( d, a.base(), a.disp() + offset); }
+inline void Assembler::stb(Register d, Register s1, RegisterOrConstant s2) { stb(d, Address(s1, s2)); }
+inline void Assembler::sth(Register d, Register s1, RegisterOrConstant s2) { sth(d, Address(s1, s2)); }
+inline void Assembler::stx(Register d, Register s1, RegisterOrConstant s2) { stx(d, Address(s1, s2)); }
+inline void Assembler::std(Register d, Register s1, RegisterOrConstant s2) { std(d, Address(s1, s2)); }
+inline void Assembler::st( Register d, Register s1, RegisterOrConstant s2) { st( d, Address(s1, s2)); }
// v8 p 99
@@ -294,39 +311,46 @@
// Use the right loads/stores for the platform
inline void MacroAssembler::ld_ptr( Register s1, Register s2, Register d ) {
#ifdef _LP64
- Assembler::ldx( s1, s2, d);
+ Assembler::ldx(s1, s2, d);
#else
- Assembler::ld( s1, s2, d);
+ Assembler::ld( s1, s2, d);
#endif
}
inline void MacroAssembler::ld_ptr( Register s1, int simm13a, Register d ) {
#ifdef _LP64
- Assembler::ldx( s1, simm13a, d);
+ Assembler::ldx(s1, simm13a, d);
#else
- Assembler::ld( s1, simm13a, d);
+ Assembler::ld( s1, simm13a, d);
#endif
}
+#ifdef ASSERT
+// ByteSize is only a class when ASSERT is defined, otherwise it's an int.
+inline void MacroAssembler::ld_ptr( Register s1, ByteSize simm13a, Register d ) {
+ ld_ptr(s1, in_bytes(simm13a), d);
+}
+#endif
+
inline void MacroAssembler::ld_ptr( Register s1, RegisterOrConstant s2, Register d ) {
#ifdef _LP64
- Assembler::ldx( s1, s2, d);
+ Assembler::ldx(s1, s2, d);
#else
- Assembler::ld( s1, s2, d);
+ Assembler::ld( s1, s2, d);
#endif
}
-inline void MacroAssembler::ld_ptr( const Address& a, Register d, int offset ) {
+inline void MacroAssembler::ld_ptr(const Address& a, Register d, int offset) {
#ifdef _LP64
- Assembler::ldx( a, d, offset );
+ Assembler::ldx(a, d, offset);
#else
- Assembler::ld( a, d, offset );
+ Assembler::ld( a, d, offset);
#endif
}
inline void MacroAssembler::st_ptr( Register d, Register s1, Register s2 ) {
#ifdef _LP64
- Assembler::stx( d, s1, s2);
+ Assembler::stx(d, s1, s2);
#else
Assembler::st( d, s1, s2);
#endif
@@ -334,25 +358,32 @@
inline void MacroAssembler::st_ptr( Register d, Register s1, int simm13a ) {
#ifdef _LP64
- Assembler::stx( d, s1, simm13a);
+ Assembler::stx(d, s1, simm13a);
#else
Assembler::st( d, s1, simm13a);
#endif
}
+#ifdef ASSERT
+// ByteSize is only a class when ASSERT is defined, otherwise it's an int.
+inline void MacroAssembler::st_ptr( Register d, Register s1, ByteSize simm13a ) {
+ st_ptr(d, s1, in_bytes(simm13a));
+}
+#endif
+
inline void MacroAssembler::st_ptr( Register d, Register s1, RegisterOrConstant s2 ) {
#ifdef _LP64
- Assembler::stx( d, s1, s2);
+ Assembler::stx(d, s1, s2);
#else
Assembler::st( d, s1, s2);
#endif
}
-inline void MacroAssembler::st_ptr( Register d, const Address& a, int offset) {
+inline void MacroAssembler::st_ptr(Register d, const Address& a, int offset) {
#ifdef _LP64
- Assembler::stx( d, a, offset);
+ Assembler::stx(d, a, offset);
#else
- Assembler::st( d, a, offset);
+ Assembler::st( d, a, offset);
#endif
}
@@ -381,11 +412,11 @@
#endif
}
-inline void MacroAssembler::ld_long( const Address& a, Register d, int offset ) {
+inline void MacroAssembler::ld_long(const Address& a, Register d, int offset) {
#ifdef _LP64
- Assembler::ldx(a, d, offset );
+ Assembler::ldx(a, d, offset);
#else
- Assembler::ldd(a, d, offset );
+ Assembler::ldd(a, d, offset);
#endif
}
@@ -427,7 +458,7 @@
#ifdef _LP64
Assembler::sllx(s1, s2, d);
#else
- Assembler::sll(s1, s2, d);
+ Assembler::sll( s1, s2, d);
#endif
}
@@ -435,7 +466,7 @@
#ifdef _LP64
Assembler::sllx(s1, imm6a, d);
#else
- Assembler::sll(s1, imm6a, d);
+ Assembler::sll( s1, imm6a, d);
#endif
}
@@ -443,7 +474,7 @@
#ifdef _LP64
Assembler::srlx(s1, s2, d);
#else
- Assembler::srl(s1, s2, d);
+ Assembler::srl( s1, s2, d);
#endif
}
@@ -451,7 +482,7 @@
#ifdef _LP64
Assembler::srlx(s1, imm6a, d);
#else
- Assembler::srl(s1, imm6a, d);
+ Assembler::srl( s1, imm6a, d);
#endif
}
@@ -541,9 +572,8 @@
disp = (intptr_t)d - (intptr_t)pc();
if ( disp != (intptr_t)(int32_t)disp ) {
relocate(rt);
- Address dest(O7, (address)d);
- sethi(dest, /*ForceRelocatable=*/ true);
- jmpl(dest, O7);
+ AddressLiteral dest(d);
+ jumpl_to(dest, O7, O7);
}
else {
Assembler::call( d, rt );
@@ -603,96 +633,72 @@
return thepc;
}
-inline void MacroAssembler::load_address( Address& a, int offset ) {
+
+inline void MacroAssembler::load_contents(AddressLiteral& addrlit, Register d, int offset) {
assert_not_delayed();
-#ifdef _LP64
- sethi(a);
- add(a, a.base(), offset);
-#else
- if (a.hi() == 0 && a.rtype() == relocInfo::none) {
- set(a.disp() + offset, a.base());
- }
- else {
- sethi(a);
- add(a, a.base(), offset);
- }
-#endif
-}
-
-
-inline void MacroAssembler::split_disp( Address& a, Register temp ) {
- assert_not_delayed();
- a = a.split_disp();
- Assembler::sethi(a.hi(), temp, a.rspec());
- add(a.base(), temp, a.base());
+ sethi(addrlit, d);
+ ld(d, addrlit.low10() + offset, d);
}
-inline void MacroAssembler::load_contents( Address& a, Register d, int offset ) {
+inline void MacroAssembler::load_ptr_contents(AddressLiteral& addrlit, Register d, int offset) {
assert_not_delayed();
- sethi(a);
- ld(a, d, offset);
+ sethi(addrlit, d);
+ ld_ptr(d, addrlit.low10() + offset, d);
}
-inline void MacroAssembler::load_ptr_contents( Address& a, Register d, int offset ) {
+inline void MacroAssembler::store_contents(Register s, AddressLiteral& addrlit, Register temp, int offset) {
assert_not_delayed();
- sethi(a);
- ld_ptr(a, d, offset);
+ sethi(addrlit, temp);
+ st(s, temp, addrlit.low10() + offset);
}
-inline void MacroAssembler::store_contents( Register s, Address& a, int offset ) {
+inline void MacroAssembler::store_ptr_contents(Register s, AddressLiteral& addrlit, Register temp, int offset) {
assert_not_delayed();
- sethi(a);
- st(s, a, offset);
-}
-
-
-inline void MacroAssembler::store_ptr_contents( Register s, Address& a, int offset ) {
- assert_not_delayed();
- sethi(a);
- st_ptr(s, a, offset);
+ sethi(addrlit, temp);
+ st_ptr(s, temp, addrlit.low10() + offset);
}
// This code sequence is relocatable to any address, even on LP64.
-inline void MacroAssembler::jumpl_to( Address& a, Register d, int offset ) {
+inline void MacroAssembler::jumpl_to(AddressLiteral& addrlit, Register temp, Register d, int offset) {
assert_not_delayed();
// Force fixed length sethi because NativeJump and NativeFarCall don't handle
// variable length instruction streams.
- sethi(a, /*ForceRelocatable=*/ true);
- jmpl(a, d, offset);
+ patchable_sethi(addrlit, temp);
+ jmpl(temp, addrlit.low10() + offset, d);
}
-inline void MacroAssembler::jump_to( Address& a, int offset ) {
- jumpl_to( a, G0, offset );
+inline void MacroAssembler::jump_to(AddressLiteral& addrlit, Register temp, int offset) {
+ jumpl_to(addrlit, temp, G0, offset);
}
-inline void MacroAssembler::jump_indirect_to( Address& a, Register temp,
- int ld_offset, int jmp_offset ) {
+inline void MacroAssembler::jump_indirect_to(Address& a, Register temp,
+ int ld_offset, int jmp_offset) {
assert_not_delayed();
- //sethi(a); // sethi is caller responsibility for this one
+ //sethi(al); // sethi is caller responsibility for this one
ld_ptr(a, temp, ld_offset);
jmp(temp, jmp_offset);
}
-inline void MacroAssembler::set_oop( jobject obj, Register d ) {
- set_oop(allocate_oop_address(obj, d));
+inline void MacroAssembler::set_oop(jobject obj, Register d) {
+ set_oop(allocate_oop_address(obj), d);
}
-inline void MacroAssembler::set_oop_constant( jobject obj, Register d ) {
- set_oop(constant_oop_address(obj, d));
+inline void MacroAssembler::set_oop_constant(jobject obj, Register d) {
+ set_oop(constant_oop_address(obj), d);
}
-inline void MacroAssembler::set_oop( Address obj_addr ) {
- assert(obj_addr.rspec().type()==relocInfo::oop_type, "must be an oop reloc");
- load_address(obj_addr);
+inline void MacroAssembler::set_oop(AddressLiteral& obj_addr, Register d) {
+ assert(obj_addr.rspec().type() == relocInfo::oop_type, "must be an oop reloc");
+ set(obj_addr, d);
}
--- a/hotspot/src/cpu/sparc/vm/c1_CodeStubs_sparc.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/sparc/vm/c1_CodeStubs_sparc.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1999-2009 Sun Microsystems, Inc. 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
@@ -277,10 +277,11 @@
if (_id == load_klass_id) {
// produce a copy of the load klass instruction for use by the being initialized case
+#ifdef ASSERT
address start = __ pc();
- Address addr = Address(_obj, address(NULL), oop_Relocation::spec(_oop_index));
- __ sethi(addr, true);
- __ add(addr, _obj, 0);
+#endif
+ AddressLiteral addrlit(NULL, oop_Relocation::spec(_oop_index));
+ __ patchable_set(addrlit, _obj);
#ifdef ASSERT
for (int i = 0; i < _bytes_to_copy; i++) {
--- a/hotspot/src/cpu/sparc/vm/c1_FrameMap_sparc.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/sparc/vm/c1_FrameMap_sparc.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1999-2009 Sun Microsystems, Inc. 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
@@ -327,7 +327,7 @@
Address FrameMap::make_new_address(ByteSize sp_offset) const {
- return Address(SP, 0, STACK_BIAS + in_bytes(sp_offset));
+ return Address(SP, STACK_BIAS + in_bytes(sp_offset));
}
--- a/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -196,7 +196,7 @@
// verify the interpreter's monitor has a non-null object
{
Label L;
- __ ld_ptr(Address(OSR_buf, 0, slot_offset + BasicObjectLock::obj_offset_in_bytes()), O7);
+ __ ld_ptr(OSR_buf, slot_offset + BasicObjectLock::obj_offset_in_bytes(), O7);
__ cmp(G0, O7);
__ br(Assembler::notEqual, false, Assembler::pt, L);
__ delayed()->nop();
@@ -205,9 +205,9 @@
}
#endif // ASSERT
// Copy the lock field into the compiled activation.
- __ ld_ptr(Address(OSR_buf, 0, slot_offset + BasicObjectLock::lock_offset_in_bytes()), O7);
+ __ ld_ptr(OSR_buf, slot_offset + BasicObjectLock::lock_offset_in_bytes(), O7);
__ st_ptr(O7, frame_map()->address_for_monitor_lock(i));
- __ ld_ptr(Address(OSR_buf, 0, slot_offset + BasicObjectLock::obj_offset_in_bytes()), O7);
+ __ ld_ptr(OSR_buf, slot_offset + BasicObjectLock::obj_offset_in_bytes(), O7);
__ st_ptr(O7, frame_map()->address_for_monitor_object(i));
}
}
@@ -238,21 +238,21 @@
int offset_offset = java_lang_String::offset_offset_in_bytes(); // first character position
int count_offset = java_lang_String:: count_offset_in_bytes();
- __ ld_ptr(Address(str0, 0, value_offset), tmp0);
- __ ld(Address(str0, 0, offset_offset), tmp2);
+ __ ld_ptr(str0, value_offset, tmp0);
+ __ ld(str0, offset_offset, tmp2);
__ add(tmp0, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp0);
- __ ld(Address(str0, 0, count_offset), str0);
+ __ ld(str0, count_offset, str0);
__ sll(tmp2, exact_log2(sizeof(jchar)), tmp2);
// str1 may be null
add_debug_info_for_null_check_here(info);
- __ ld_ptr(Address(str1, 0, value_offset), tmp1);
+ __ ld_ptr(str1, value_offset, tmp1);
__ add(tmp0, tmp2, tmp0);
- __ ld(Address(str1, 0, offset_offset), tmp2);
+ __ ld(str1, offset_offset, tmp2);
__ add(tmp1, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp1);
- __ ld(Address(str1, 0, count_offset), str1);
+ __ ld(str1, count_offset, str1);
__ sll(tmp2, exact_log2(sizeof(jchar)), tmp2);
__ subcc(str0, str1, O7);
__ add(tmp1, tmp2, tmp1);
@@ -412,9 +412,9 @@
#endif // ASSERT
compilation()->offsets()->set_value(CodeOffsets::Deopt, code_offset());
- Address deopt_blob(G3_scratch, SharedRuntime::deopt_blob()->unpack());
-
- __ JUMP(deopt_blob, 0); // sethi;jmp
+ AddressLiteral deopt_blob(SharedRuntime::deopt_blob()->unpack());
+
+ __ JUMP(deopt_blob, G3_scratch, 0); // sethi;jmp
__ delayed()->nop();
assert(code_offset() - offset <= deopt_handler_size, "overflow");
@@ -441,13 +441,12 @@
int oop_index = __ oop_recorder()->allocate_index((jobject)NULL);
PatchingStub* patch = new PatchingStub(_masm, PatchingStub::load_klass_id, oop_index);
- Address addr = Address(reg, address(NULL), oop_Relocation::spec(oop_index));
- assert(addr.rspec().type() == relocInfo::oop_type, "must be an oop reloc");
+ AddressLiteral addrlit(NULL, oop_Relocation::spec(oop_index));
+ assert(addrlit.rspec().type() == relocInfo::oop_type, "must be an oop reloc");
// It may not seem necessary to use a sethi/add pair to load a NULL into dest, but the
// NULL will be dynamically patched later and the patched value may be large. We must
// therefore generate the sethi/add as a placeholders
- __ sethi(addr, true);
- __ add(addr, reg, 0);
+ __ patchable_set(addrlit, reg);
patching_epilog(patch, lir_patch_normal, reg, info);
}
@@ -706,7 +705,7 @@
void LIR_Assembler::vtable_call(int vtable_offset, CodeEmitInfo* info) {
add_debug_info_for_null_check_here(info);
- __ ld_ptr(Address(O0, 0, oopDesc::klass_offset_in_bytes()), G3_scratch);
+ __ ld_ptr(O0, oopDesc::klass_offset_in_bytes(), G3_scratch);
if (__ is_simm13(vtable_offset) ) {
__ ld_ptr(G3_scratch, vtable_offset, G5_method);
} else {
@@ -715,7 +714,7 @@
// ld_ptr, set_hi, set
__ ld_ptr(G3_scratch, G5_method, G5_method);
}
- __ ld_ptr(G5_method, in_bytes(methodOopDesc::from_compiled_offset()), G3_scratch);
+ __ ld_ptr(G5_method, methodOopDesc::from_compiled_offset(), G3_scratch);
__ callr(G3_scratch, G0);
// the peephole pass fills the delay slot
}
@@ -738,8 +737,7 @@
default : ShouldNotReachHere();
}
} else {
- __ sethi(disp & ~0x3ff, O7, true);
- __ add(O7, disp & 0x3ff, O7);
+ __ set(disp, O7);
if (info != NULL) add_debug_info_for_null_check_here(info);
load_offset = code_offset();
switch(ld_type) {
@@ -775,8 +773,7 @@
default : ShouldNotReachHere();
}
} else {
- __ sethi(offset & ~0x3ff, O7, true);
- __ add(O7, offset & 0x3ff, O7);
+ __ set(offset, O7);
if (info != NULL) add_debug_info_for_null_check_here(info);
switch (type) {
case T_BOOLEAN: // fall through
@@ -813,8 +810,7 @@
__ ldf(w, s, disp, d);
}
} else {
- __ sethi(disp & ~0x3ff, O7, true);
- __ add(O7, disp & 0x3ff, O7);
+ __ set(disp, O7);
if (info != NULL) add_debug_info_for_null_check_here(info);
__ ldf(w, s, O7, d);
}
@@ -839,8 +835,7 @@
__ stf(w, value, base, offset);
}
} else {
- __ sethi(offset & ~0x3ff, O7, true);
- __ add(O7, offset & 0x3ff, O7);
+ __ set(offset, O7);
if (info != NULL) add_debug_info_for_null_check_here(info);
__ stf(w, value, O7, base);
}
@@ -852,8 +847,7 @@
if (!Assembler::is_simm13(offset + (type == T_LONG) ? wordSize : 0)) {
assert(!unaligned, "can't handle this");
// for offsets larger than a simm13 we setup the offset in O7
- __ sethi(offset & ~0x3ff, O7, true);
- __ add(O7, offset & 0x3ff, O7);
+ __ set(offset, O7);
store_offset = store(from_reg, base, O7, type);
} else {
if (type == T_ARRAY || type == T_OBJECT) __ verify_oop(from_reg->as_register());
@@ -937,8 +931,7 @@
assert(base != O7, "destroying register");
assert(!unaligned, "can't handle this");
// for offsets larger than a simm13 we setup the offset in O7
- __ sethi(offset & ~0x3ff, O7, true);
- __ add(O7, offset & 0x3ff, O7);
+ __ set(offset, O7);
load_offset = load(base, O7, to_reg, type);
} else {
load_offset = code_offset();
@@ -1213,7 +1206,7 @@
assert(to_reg->is_single_fpu(), "wrong register kind");
__ set(con, O7);
- Address temp_slot(SP, 0, (frame::register_save_words * wordSize) + STACK_BIAS);
+ Address temp_slot(SP, (frame::register_save_words * wordSize) + STACK_BIAS);
__ st(O7, temp_slot);
__ ldf(FloatRegisterImpl::S, temp_slot, to_reg->as_float_reg());
}
@@ -1238,8 +1231,8 @@
} else {
ShouldNotReachHere();
assert(to_reg->is_double_fpu(), "wrong register kind");
- Address temp_slot_lo(SP, 0, ((frame::register_save_words ) * wordSize) + STACK_BIAS);
- Address temp_slot_hi(SP, 0, ((frame::register_save_words) * wordSize) + (longSize/2) + STACK_BIAS);
+ Address temp_slot_lo(SP, ((frame::register_save_words ) * wordSize) + STACK_BIAS);
+ Address temp_slot_hi(SP, ((frame::register_save_words) * wordSize) + (longSize/2) + STACK_BIAS);
__ set(low(con), O7);
__ st(O7, temp_slot_lo);
__ set(high(con), O7);
@@ -1267,17 +1260,16 @@
break;
}
RelocationHolder rspec = internal_word_Relocation::spec(const_addr);
+ AddressLiteral const_addrlit(const_addr, rspec);
if (to_reg->is_single_fpu()) {
- __ sethi( (intx)const_addr & ~0x3ff, O7, true, rspec);
+ __ patchable_sethi(const_addrlit, O7);
__ relocate(rspec);
-
- int offset = (intx)const_addr & 0x3ff;
- __ ldf (FloatRegisterImpl::S, O7, offset, to_reg->as_float_reg());
+ __ ldf(FloatRegisterImpl::S, O7, const_addrlit.low10(), to_reg->as_float_reg());
} else {
assert(to_reg->is_single_cpu(), "Must be a cpu register.");
- __ set((intx)const_addr, O7, rspec);
+ __ set(const_addrlit, O7);
load(O7, 0, to_reg->as_register(), T_INT);
}
}
@@ -1293,10 +1285,10 @@
RelocationHolder rspec = internal_word_Relocation::spec(const_addr);
if (to_reg->is_double_fpu()) {
- __ sethi( (intx)const_addr & ~0x3ff, O7, true, rspec);
- int offset = (intx)const_addr & 0x3ff;
+ AddressLiteral const_addrlit(const_addr, rspec);
+ __ patchable_sethi(const_addrlit, O7);
__ relocate(rspec);
- __ ldf (FloatRegisterImpl::D, O7, offset, to_reg->as_double_reg());
+ __ ldf (FloatRegisterImpl::D, O7, const_addrlit.low10(), to_reg->as_double_reg());
} else {
assert(to_reg->is_double_cpu(), "Must be a long register.");
#ifdef _LP64
@@ -1317,7 +1309,7 @@
Address LIR_Assembler::as_Address(LIR_Address* addr) {
Register reg = addr->base()->as_register();
- return Address(reg, 0, addr->disp());
+ return Address(reg, addr->disp());
}
@@ -1360,13 +1352,13 @@
Address LIR_Assembler::as_Address_hi(LIR_Address* addr) {
Address base = as_Address(addr);
- return Address(base.base(), 0, base.disp() + hi_word_offset_in_bytes);
+ return Address(base.base(), base.disp() + hi_word_offset_in_bytes);
}
Address LIR_Assembler::as_Address_lo(LIR_Address* addr) {
Address base = as_Address(addr);
- return Address(base.base(), 0, base.disp() + lo_word_offset_in_bytes);
+ return Address(base.base(), base.disp() + lo_word_offset_in_bytes);
}
@@ -1396,8 +1388,7 @@
if (addr->index()->is_illegal()) {
if (!Assembler::is_simm13(disp_value) && (!unaligned || Assembler::is_simm13(disp_value + 4))) {
if (needs_patching) {
- __ sethi(0, O7, true);
- __ add(O7, 0, O7);
+ __ patchable_set(0, O7);
} else {
__ set(disp_value, O7);
}
@@ -1544,8 +1535,7 @@
if (addr->index()->is_illegal()) {
if (!Assembler::is_simm13(disp_value) && (!unaligned || Assembler::is_simm13(disp_value + 4))) {
if (needs_patching) {
- __ sethi(0, O7, true);
- __ add(O7, 0, O7);
+ __ patchable_set(0, O7);
} else {
__ set(disp_value, O7);
}
@@ -1627,8 +1617,8 @@
__ set_oop(NULL, G5);
// must be set to -1 at code generation time
- Address a(G3, (address)-1);
- __ jump_to(a, 0);
+ AddressLiteral addrlit(-1);
+ __ jump_to(addrlit, G3);
__ delayed()->nop();
assert(__ offset() - start <= call_stub_size, "stub too big");
@@ -2063,7 +2053,7 @@
address pc_for_athrow = __ pc();
int pc_for_athrow_offset = __ offset();
RelocationHolder rspec = internal_word_Relocation::spec(pc_for_athrow);
- __ set((intptr_t)pc_for_athrow, Oissuing_pc, rspec);
+ __ set(pc_for_athrow, Oissuing_pc, rspec);
add_call_info(pc_for_athrow_offset, info); // for exception handler
__ call(Runtime1::entry_for(Runtime1::handle_exception_id), relocInfo::runtime_call_type);
@@ -2451,7 +2441,7 @@
}
- Address flags_addr(mdo, 0, md->byte_offset_of_slot(data, DataLayout::flags_offset()) - mdo_offset_bias);
+ Address flags_addr(mdo, md->byte_offset_of_slot(data, DataLayout::flags_offset()) - mdo_offset_bias);
__ ldub(flags_addr, data_val);
__ or3(data_val, BitData::null_seen_byte_constant(), data_val);
__ stb(data_val, flags_addr);
@@ -2738,7 +2728,7 @@
__ add(mdo, O7, mdo);
}
- Address counter_addr(mdo, 0, md->byte_offset_of_slot(data, CounterData::count_offset()) - mdo_offset_bias);
+ Address counter_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset()) - mdo_offset_bias);
__ lduw(counter_addr, tmp1);
__ add(tmp1, DataLayout::counter_increment, tmp1);
__ stw(tmp1, counter_addr);
@@ -2764,8 +2754,8 @@
for (i = 0; i < VirtualCallData::row_limit(); i++) {
ciKlass* receiver = vc_data->receiver(i);
if (known_klass->equals(receiver)) {
- Address data_addr(mdo, 0, md->byte_offset_of_slot(data,
- VirtualCallData::receiver_count_offset(i)) -
+ Address data_addr(mdo, md->byte_offset_of_slot(data,
+ VirtualCallData::receiver_count_offset(i)) -
mdo_offset_bias);
__ lduw(data_addr, tmp1);
__ add(tmp1, DataLayout::counter_increment, tmp1);
@@ -2782,11 +2772,11 @@
for (i = 0; i < VirtualCallData::row_limit(); i++) {
ciKlass* receiver = vc_data->receiver(i);
if (receiver == NULL) {
- Address recv_addr(mdo, 0, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) -
+ Address recv_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) -
mdo_offset_bias);
jobject2reg(known_klass->encoding(), tmp1);
__ st_ptr(tmp1, recv_addr);
- Address data_addr(mdo, 0, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) -
+ Address data_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) -
mdo_offset_bias);
__ lduw(data_addr, tmp1);
__ add(tmp1, DataLayout::counter_increment, tmp1);
@@ -2795,20 +2785,20 @@
}
}
} else {
- load(Address(recv, 0, oopDesc::klass_offset_in_bytes()), recv, T_OBJECT);
+ load(Address(recv, oopDesc::klass_offset_in_bytes()), recv, T_OBJECT);
Label update_done;
uint i;
for (i = 0; i < VirtualCallData::row_limit(); i++) {
Label next_test;
// See if the receiver is receiver[n].
- Address receiver_addr(mdo, 0, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) -
+ Address receiver_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) -
mdo_offset_bias);
__ ld_ptr(receiver_addr, tmp1);
__ verify_oop(tmp1);
__ cmp(recv, tmp1);
__ brx(Assembler::notEqual, false, Assembler::pt, next_test);
__ delayed()->nop();
- Address data_addr(mdo, 0, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) -
+ Address data_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) -
mdo_offset_bias);
__ lduw(data_addr, tmp1);
__ add(tmp1, DataLayout::counter_increment, tmp1);
@@ -2821,7 +2811,7 @@
// Didn't find receiver; find next empty slot and fill it in
for (i = 0; i < VirtualCallData::row_limit(); i++) {
Label next_test;
- Address recv_addr(mdo, 0, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) -
+ Address recv_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) -
mdo_offset_bias);
load(recv_addr, tmp1, T_OBJECT);
__ tst(tmp1);
@@ -2829,8 +2819,8 @@
__ delayed()->nop();
__ st_ptr(recv, recv_addr);
__ set(DataLayout::counter_increment, tmp1);
- __ st_ptr(tmp1, Address(mdo, 0, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) -
- mdo_offset_bias));
+ __ st_ptr(tmp1, mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) -
+ mdo_offset_bias);
if (i < (VirtualCallData::row_limit() - 1)) {
__ br(Assembler::always, false, Assembler::pt, update_done);
__ delayed()->nop();
--- a/hotspot/src/cpu/sparc/vm/c1_MacroAssembler_sparc.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/sparc/vm/c1_MacroAssembler_sparc.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1999-2009 Sun Microsystems, Inc. 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
@@ -29,13 +29,13 @@
Label L;
const Register temp_reg = G3_scratch;
// Note: needs more testing of out-of-line vs. inline slow case
- Address ic_miss(temp_reg, SharedRuntime::get_ic_miss_stub());
verify_oop(receiver);
ld_ptr(receiver, oopDesc::klass_offset_in_bytes(), temp_reg);
cmp(temp_reg, iCache);
brx(Assembler::equal, true, Assembler::pt, L);
delayed()->nop();
- jump_to(ic_miss, 0);
+ AddressLiteral ic_miss(SharedRuntime::get_ic_miss_stub());
+ jump_to(ic_miss, temp_reg);
delayed()->nop();
align(CodeEntryAlignment);
bind(L);
@@ -84,7 +84,7 @@
Label done;
- Address mark_addr(Roop, 0, oopDesc::mark_offset_in_bytes());
+ Address mark_addr(Roop, oopDesc::mark_offset_in_bytes());
// The following move must be the first instruction of emitted since debug
// information may be generated for it.
@@ -132,7 +132,7 @@
Label done;
- Address mark_addr(Roop, 0, oopDesc::mark_offset_in_bytes());
+ Address mark_addr(Roop, oopDesc::mark_offset_in_bytes());
assert(mark_addr.disp() == 0, "cas must take a zero displacement");
if (UseBiasedLocking) {
@@ -370,7 +370,7 @@
void C1_MacroAssembler::verify_stack_oop(int stack_offset) {
if (!VerifyOops) return;
- verify_oop_addr(Address(SP, 0, stack_offset + STACK_BIAS));
+ verify_oop_addr(Address(SP, stack_offset + STACK_BIAS));
}
void C1_MacroAssembler::verify_not_null_oop(Register r) {
--- a/hotspot/src/cpu/sparc/vm/c1_Runtime1_sparc.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/sparc/vm/c1_Runtime1_sparc.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1999-2009 Sun Microsystems, Inc. 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
@@ -57,13 +57,13 @@
// check for pending exceptions
{ Label L;
- Address exception_addr(G2_thread, 0, in_bytes(Thread::pending_exception_offset()));
+ Address exception_addr(G2_thread, Thread::pending_exception_offset());
ld_ptr(exception_addr, Gtemp);
br_null(Gtemp, false, pt, L);
delayed()->nop();
- Address vm_result_addr(G2_thread, 0, in_bytes(JavaThread::vm_result_offset()));
+ Address vm_result_addr(G2_thread, JavaThread::vm_result_offset());
st_ptr(G0, vm_result_addr);
- Address vm_result_addr_2(G2_thread, 0, in_bytes(JavaThread::vm_result_2_offset()));
+ Address vm_result_addr_2(G2_thread, JavaThread::vm_result_2_offset());
st_ptr(G0, vm_result_addr_2);
if (frame_size() == no_frame_size) {
@@ -73,8 +73,8 @@
} else if (_stub_id == Runtime1::forward_exception_id) {
should_not_reach_here();
} else {
- Address exc(G4, Runtime1::entry_for(Runtime1::forward_exception_id));
- jump_to(exc, 0);
+ AddressLiteral exc(Runtime1::entry_for(Runtime1::forward_exception_id));
+ jump_to(exc, G4);
delayed()->nop();
}
bind(L);
@@ -85,7 +85,7 @@
get_vm_result (oop_result1);
} else {
// be a little paranoid and clear the result
- Address vm_result_addr(G2_thread, 0, in_bytes(JavaThread::vm_result_offset()));
+ Address vm_result_addr(G2_thread, JavaThread::vm_result_offset());
st_ptr(G0, vm_result_addr);
}
@@ -93,7 +93,7 @@
get_vm_result_2(oop_result2);
} else {
// be a little paranoid and clear the result
- Address vm_result_addr_2(G2_thread, 0, in_bytes(JavaThread::vm_result_2_offset()));
+ Address vm_result_addr_2(G2_thread, JavaThread::vm_result_2_offset());
st_ptr(G0, vm_result_addr_2);
}
@@ -479,8 +479,8 @@
Register G4_length = G4; // Incoming
Register O0_obj = O0; // Outgoing
- Address klass_lh(G5_klass, 0, ((klassOopDesc::header_size() * HeapWordSize)
- + Klass::layout_helper_offset_in_bytes()));
+ Address klass_lh(G5_klass, ((klassOopDesc::header_size() * HeapWordSize)
+ + Klass::layout_helper_offset_in_bytes()));
assert(Klass::_lh_header_size_shift % BitsPerByte == 0, "bytewise");
assert(Klass::_lh_header_size_mask == 0xFF, "bytewise");
// Use this offset to pick out an individual byte of the layout_helper:
@@ -902,8 +902,8 @@
__ srl(addr, CardTableModRefBS::card_shift, addr);
#endif
- Address rs(cardtable, (address)byte_map_base);
- __ load_address(rs); // cardtable := <card table base>
+ AddressLiteral rs(byte_map_base);
+ __ set(rs, cardtable); // cardtable := <card table base>
__ ldub(addr, cardtable, tmp); // tmp := [addr + cardtable]
__ br_on_reg_cond(Assembler::rc_nz, /*annul*/false, Assembler::pt,
@@ -1022,8 +1022,8 @@
__ restore();
- Address exc(G4, Runtime1::entry_for(Runtime1::unwind_exception_id));
- __ jump_to(exc, 0);
+ AddressLiteral exc(Runtime1::entry_for(Runtime1::unwind_exception_id));
+ __ jump_to(exc, G4);
__ delayed()->nop();
--- a/hotspot/src/cpu/sparc/vm/dump_sparc.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/sparc/vm/dump_sparc.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2004-2009 Sun Microsystems, Inc. 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,8 +106,7 @@
__ and3(L0, 255, L4); // Isolate L3 = method offset;.
__ sll(L4, LogBytesPerWord, L4);
__ ld_ptr(L3, L4, L4); // Get address of correct virtual method
- Address method(L4, 0);
- __ jmpl(method, G0); // Jump to correct method.
+ __ jmpl(L4, 0, G0); // Jump to correct method.
__ delayed()->restore(); // Restore registers.
__ flush();
--- a/hotspot/src/cpu/sparc/vm/icBuffer_sparc.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/sparc/vm/icBuffer_sparc.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -46,14 +46,13 @@
// (1) the oop is old (i.e., doesn't matter for scavenges)
// (2) these ICStubs are removed *before* a GC happens, so the roots disappear
assert(cached_oop == NULL || cached_oop->is_perm(), "must be old oop");
- Address cached_oop_addr(G5_inline_cache_reg, address(cached_oop));
- // Force the sethi to generate the fixed sequence so next_instruction_address works
- masm->sethi(cached_oop_addr, true /* ForceRelocatable */ );
- masm->add(cached_oop_addr, G5_inline_cache_reg);
+ AddressLiteral cached_oop_addrlit(cached_oop, relocInfo::none);
+ // Force the set to generate the fixed sequence so next_instruction_address works
+ masm->patchable_set(cached_oop_addrlit, G5_inline_cache_reg);
assert(G3_scratch != G5_method, "Do not clobber the method oop in the transition stub");
assert(G3_scratch != G5_inline_cache_reg, "Do not clobber the inline cache register in the transition stub");
- Address entry(G3_scratch, entry_point);
- masm->JUMP(entry, 0);
+ AddressLiteral entry(entry_point);
+ masm->JUMP(entry, G3_scratch, 0);
masm->delayed()->nop();
masm->flush();
}
--- a/hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -35,8 +35,8 @@
// This file specializes the assember with interpreter-specific macros
-const Address InterpreterMacroAssembler::l_tmp( FP, 0, (frame::interpreter_frame_l_scratch_fp_offset * wordSize ) + STACK_BIAS);
-const Address InterpreterMacroAssembler::d_tmp( FP, 0, (frame::interpreter_frame_d_scratch_fp_offset * wordSize) + STACK_BIAS);
+const Address InterpreterMacroAssembler::l_tmp(FP, (frame::interpreter_frame_l_scratch_fp_offset * wordSize) + STACK_BIAS);
+const Address InterpreterMacroAssembler::d_tmp(FP, (frame::interpreter_frame_d_scratch_fp_offset * wordSize) + STACK_BIAS);
#else // CC_INTERP
#ifndef STATE
@@ -78,14 +78,12 @@
sll(Lbyte_code, LogBytesPerWord, Lbyte_code); // multiply by wordSize
ld_ptr(IdispatchTables, Lbyte_code, IdispatchAddress);// get entry addr
#else
- ldub( Lbcp, bcp_incr, Lbyte_code); // load next bytecode
+ ldub( Lbcp, bcp_incr, Lbyte_code); // load next bytecode
// dispatch table to use
- Address tbl(G3_scratch, (address)Interpreter::dispatch_table(state));
-
- sethi(tbl);
- sll(Lbyte_code, LogBytesPerWord, Lbyte_code); // multiply by wordSize
- add(tbl, tbl.base(), 0);
- ld_ptr( G3_scratch, Lbyte_code, IdispatchAddress); // get entry addr
+ AddressLiteral tbl(Interpreter::dispatch_table(state));
+ sll(Lbyte_code, LogBytesPerWord, Lbyte_code); // multiply by wordSize
+ set(tbl, G3_scratch); // compute addr of table
+ ld_ptr(G3_scratch, Lbyte_code, IdispatchAddress); // get entry addr
#endif
}
@@ -165,8 +163,7 @@
Label L;
// Check the "pending popframe condition" flag in the current thread
- Address popframe_condition_addr(G2_thread, 0, in_bytes(JavaThread::popframe_condition_offset()));
- ld(popframe_condition_addr, scratch_reg);
+ ld(G2_thread, JavaThread::popframe_condition_offset(), scratch_reg);
// Initiate popframe handling only if it is not already being processed. If the flag
// has the popframe_processing bit set, it means that this code is called *during* popframe
@@ -192,11 +189,10 @@
void InterpreterMacroAssembler::load_earlyret_value(TosState state) {
Register thr_state = G4_scratch;
- ld_ptr(Address(G2_thread, 0, in_bytes(JavaThread::jvmti_thread_state_offset())),
- thr_state);
- const Address tos_addr(thr_state, 0, in_bytes(JvmtiThreadState::earlyret_tos_offset()));
- const Address oop_addr(thr_state, 0, in_bytes(JvmtiThreadState::earlyret_oop_offset()));
- const Address val_addr(thr_state, 0, in_bytes(JvmtiThreadState::earlyret_value_offset()));
+ ld_ptr(G2_thread, JavaThread::jvmti_thread_state_offset(), thr_state);
+ const Address tos_addr(thr_state, JvmtiThreadState::earlyret_tos_offset());
+ const Address oop_addr(thr_state, JvmtiThreadState::earlyret_oop_offset());
+ const Address val_addr(thr_state, JvmtiThreadState::earlyret_value_offset());
switch (state) {
case ltos: ld_long(val_addr, Otos_l); break;
case atos: ld_ptr(oop_addr, Otos_l);
@@ -222,8 +218,7 @@
if (JvmtiExport::can_force_early_return()) {
Label L;
Register thr_state = G3_scratch;
- ld_ptr(Address(G2_thread, 0, in_bytes(JavaThread::jvmti_thread_state_offset())),
- thr_state);
+ ld_ptr(G2_thread, JavaThread::jvmti_thread_state_offset(), thr_state);
tst(thr_state);
br(zero, false, pt, L); // if (thread->jvmti_thread_state() == NULL) exit;
delayed()->nop();
@@ -231,16 +226,14 @@
// Initiate earlyret handling only if it is not already being processed.
// If the flag has the earlyret_processing bit set, it means that this code
// is called *during* earlyret handling - we don't want to reenter.
- ld(Address(thr_state, 0, in_bytes(JvmtiThreadState::earlyret_state_offset())),
- G4_scratch);
+ ld(thr_state, JvmtiThreadState::earlyret_state_offset(), G4_scratch);
cmp(G4_scratch, JvmtiThreadState::earlyret_pending);
br(Assembler::notEqual, false, pt, L);
delayed()->nop();
// Call Interpreter::remove_activation_early_entry() to get the address of the
// same-named entrypoint in the generated interpreter code
- Address tos_addr(thr_state, 0, in_bytes(JvmtiThreadState::earlyret_tos_offset()));
- ld(tos_addr, Otos_l1);
+ ld(thr_state, JvmtiThreadState::earlyret_tos_offset(), Otos_l1);
call_VM_leaf(noreg, CAST_FROM_FN_PTR(address, Interpreter::remove_activation_early_entry), Otos_l1);
// Jump to Interpreter::_remove_activation_early_entry
@@ -294,10 +287,9 @@
} else {
#endif
// dispatch table to use
- Address tbl(G3_scratch, (address)table);
-
+ AddressLiteral tbl(table);
sll(Lbyte_code, LogBytesPerWord, Lbyte_code); // multiply by wordSize
- load_address(tbl); // compute addr of table
+ set(tbl, G3_scratch); // compute addr of table
ld_ptr(G3_scratch, Lbyte_code, G3_scratch); // get entry addr
#ifdef FAST_DISPATCH
}
@@ -601,26 +593,17 @@
// Reset SP by subtracting more space from Lesp.
Label done;
-
- const Address max_stack (Lmethod, 0, in_bytes(methodOopDesc::max_stack_offset()));
- const Address access_flags(Lmethod, 0, in_bytes(methodOopDesc::access_flags_offset()));
-
verify_oop(Lmethod);
-
-
- assert( G4_scratch != Gframe_size,
- "Only you can prevent register aliasing!");
+ assert(G4_scratch != Gframe_size, "Only you can prevent register aliasing!");
// A native does not need to do this, since its callee does not change SP.
- ld(access_flags, Gframe_size);
+ ld(Lmethod, methodOopDesc::access_flags_offset(), Gframe_size); // Load access flags.
btst(JVM_ACC_NATIVE, Gframe_size);
br(Assembler::notZero, false, Assembler::pt, done);
delayed()->nop();
- //
// Compute max expression stack+register save area
- //
- lduh( max_stack, Gframe_size );
+ lduh(Lmethod, in_bytes(methodOopDesc::max_stack_offset()), Gframe_size); // Load max stack.
if (TaggedStackInterpreter) sll ( Gframe_size, 1, Gframe_size); // max_stack * 2 for TAGS
add( Gframe_size, frame::memory_parameter_word_sp_offset, Gframe_size );
@@ -721,8 +704,7 @@
verify_thread();
Label skip_compiled_code;
- const Address interp_only (G2_thread, 0, in_bytes(JavaThread::interp_only_mode_offset()));
-
+ const Address interp_only(G2_thread, JavaThread::interp_only_mode_offset());
ld(interp_only, scratch);
tst(scratch);
br(Assembler::notZero, true, Assembler::pn, skip_compiled_code);
@@ -916,8 +898,8 @@
Register Rscratch,
Label& ok ) {
assert(throw_entry_point != NULL, "entry point must be generated by now");
- Address dest(Rscratch, throw_entry_point);
- jump_to(dest);
+ AddressLiteral dest(throw_entry_point);
+ jump_to(dest, Rscratch);
delayed()->nop();
bind(ok);
}
@@ -1035,18 +1017,18 @@
Label unlocked, unlock, no_unlock;
// get the value of _do_not_unlock_if_synchronized into G1_scratch
- const Address do_not_unlock_if_synchronized(G2_thread, 0,
- in_bytes(JavaThread::do_not_unlock_if_synchronized_offset()));
+ const Address do_not_unlock_if_synchronized(G2_thread,
+ JavaThread::do_not_unlock_if_synchronized_offset());
ldbool(do_not_unlock_if_synchronized, G1_scratch);
stbool(G0, do_not_unlock_if_synchronized); // reset the flag
// check if synchronized method
- const Address access_flags(Lmethod, 0, in_bytes(methodOopDesc::access_flags_offset()));
+ const Address access_flags(Lmethod, methodOopDesc::access_flags_offset());
interp_verify_oop(Otos_i, state, __FILE__, __LINE__);
push(state); // save tos
- ld(access_flags, G3_scratch);
+ ld(access_flags, G3_scratch); // Load access flags.
btst(JVM_ACC_SYNCHRONIZED, G3_scratch);
- br( zero, false, pt, unlocked);
+ br(zero, false, pt, unlocked);
delayed()->nop();
// Don't unlock anything if the _do_not_unlock_if_synchronized flag
@@ -1236,8 +1218,8 @@
Register obj_reg = Object;
Register mark_reg = G4_scratch;
Register temp_reg = G1_scratch;
- Address lock_addr = Address(lock_reg, 0, BasicObjectLock::lock_offset_in_bytes());
- Address mark_addr = Address(obj_reg, 0, oopDesc::mark_offset_in_bytes());
+ Address lock_addr(lock_reg, BasicObjectLock::lock_offset_in_bytes());
+ Address mark_addr(obj_reg, oopDesc::mark_offset_in_bytes());
Label done;
Label slow_case;
@@ -1315,9 +1297,8 @@
Register obj_reg = G3_scratch;
Register mark_reg = G4_scratch;
Register displaced_header_reg = G1_scratch;
- Address lock_addr = Address(lock_reg, 0, BasicObjectLock::lock_offset_in_bytes());
- Address lockobj_addr = Address(lock_reg, 0, BasicObjectLock::obj_offset_in_bytes());
- Address mark_addr = Address(obj_reg, 0, oopDesc::mark_offset_in_bytes());
+ Address lockobj_addr(lock_reg, BasicObjectLock::obj_offset_in_bytes());
+ Address mark_addr(obj_reg, oopDesc::mark_offset_in_bytes());
Label done;
if (UseBiasedLocking) {
@@ -1328,7 +1309,8 @@
}
// Test first if we are in the fast recursive case
- ld_ptr(lock_addr, displaced_header_reg, BasicLock::displaced_header_offset_in_bytes());
+ Address lock_addr(lock_reg, BasicObjectLock::lock_offset_in_bytes() + BasicLock::displaced_header_offset_in_bytes());
+ ld_ptr(lock_addr, displaced_header_reg);
br_null(displaced_header_reg, true, Assembler::pn, done);
delayed()->st_ptr(G0, lockobj_addr); // free entry
@@ -1384,7 +1366,7 @@
Label zero_continue;
// Test MDO to avoid the call if it is NULL.
- ld_ptr(Lmethod, in_bytes(methodOopDesc::method_data_offset()), ImethodDataPtr);
+ ld_ptr(Lmethod, methodOopDesc::method_data_offset(), ImethodDataPtr);
test_method_data_pointer(zero_continue);
call_VM_leaf(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::bcp_to_di), Lmethod, Lbcp);
set_method_data_pointer_offset(O0);
@@ -1413,7 +1395,7 @@
// If the mdp is valid, it will point to a DataLayout header which is
// consistent with the bcp. The converse is highly probable also.
lduh(ImethodDataPtr, in_bytes(DataLayout::bci_offset()), G3_scratch);
- ld_ptr(Address(Lmethod, 0, in_bytes(methodOopDesc::const_offset())), O5);
+ ld_ptr(Lmethod, methodOopDesc::const_offset(), O5);
add(G3_scratch, in_bytes(constMethodOopDesc::codes_offset()), G3_scratch);
add(G3_scratch, O5, G3_scratch);
cmp(Lbcp, G3_scratch);
@@ -1424,7 +1406,7 @@
// %%% should use call_VM_leaf here?
//call_VM_leaf(noreg, ..., Lmethod, Lbcp, ImethodDataPtr);
save_frame_and_mov(sizeof(jdouble) / wordSize, Lmethod, O0, Lbcp, O1);
- Address d_save(FP, 0, -sizeof(jdouble) + STACK_BIAS);
+ Address d_save(FP, -sizeof(jdouble) + STACK_BIAS);
stf(FloatRegisterImpl::D, Ftos_d, d_save);
mov(temp_reg->after_save(), O2);
save_thread(L7_thread_cache);
@@ -1456,14 +1438,14 @@
#endif
// Test to see if we should create a method data oop
- Address profile_limit(Rtmp, (address)&InvocationCounter::InterpreterProfileLimit);
+ AddressLiteral profile_limit((address) &InvocationCounter::InterpreterProfileLimit);
#ifdef _LP64
delayed()->nop();
- sethi(profile_limit);
+ sethi(profile_limit, Rtmp);
#else
- delayed()->sethi(profile_limit);
+ delayed()->sethi(profile_limit, Rtmp);
#endif
- ld(profile_limit, Rtmp);
+ ld(Rtmp, profile_limit.low10(), Rtmp);
cmp(invocation_count, Rtmp);
br(Assembler::lessUnsigned, false, Assembler::pn, profile_continue);
delayed()->nop();
@@ -1521,7 +1503,7 @@
Register bumped_count,
bool decrement) {
// Locate the counter at a fixed offset from the mdp:
- Address counter(ImethodDataPtr, 0, constant);
+ Address counter(ImethodDataPtr, constant);
increment_mdp_data_at(counter, bumped_count, decrement);
}
@@ -1535,7 +1517,7 @@
bool decrement) {
// Add the constant to reg to get the offset.
add(ImethodDataPtr, reg, scratch2);
- Address counter(scratch2, 0, constant);
+ Address counter(scratch2, constant);
increment_mdp_data_at(counter, bumped_count, decrement);
}
@@ -2201,7 +2183,7 @@
Address InterpreterMacroAssembler::top_most_monitor() {
- return Address(FP, 0, top_most_monitor_byte_offset());
+ return Address(FP, top_most_monitor_byte_offset());
}
@@ -2214,15 +2196,15 @@
void InterpreterMacroAssembler::increment_invocation_counter( Register Rtmp, Register Rtmp2 ) {
assert(UseCompiler, "incrementing must be useful");
#ifdef CC_INTERP
- Address inv_counter(G5_method, 0, in_bytes(methodOopDesc::invocation_counter_offset()
- + InvocationCounter::counter_offset()));
- Address be_counter(G5_method, 0, in_bytes(methodOopDesc::backedge_counter_offset()
- + InvocationCounter::counter_offset()));
+ Address inv_counter(G5_method, methodOopDesc::invocation_counter_offset() +
+ InvocationCounter::counter_offset());
+ Address be_counter (G5_method, methodOopDesc::backedge_counter_offset() +
+ InvocationCounter::counter_offset());
#else
- Address inv_counter(Lmethod, 0, in_bytes(methodOopDesc::invocation_counter_offset()
- + InvocationCounter::counter_offset()));
- Address be_counter(Lmethod, 0, in_bytes(methodOopDesc::backedge_counter_offset()
- + InvocationCounter::counter_offset()));
+ Address inv_counter(Lmethod, methodOopDesc::invocation_counter_offset() +
+ InvocationCounter::counter_offset());
+ Address be_counter (Lmethod, methodOopDesc::backedge_counter_offset() +
+ InvocationCounter::counter_offset());
#endif /* CC_INTERP */
int delta = InvocationCounter::count_increment;
@@ -2250,15 +2232,15 @@
void InterpreterMacroAssembler::increment_backedge_counter( Register Rtmp, Register Rtmp2 ) {
assert(UseCompiler, "incrementing must be useful");
#ifdef CC_INTERP
- Address be_counter(G5_method, 0, in_bytes(methodOopDesc::backedge_counter_offset()
- + InvocationCounter::counter_offset()));
- Address inv_counter(G5_method, 0, in_bytes(methodOopDesc::invocation_counter_offset()
- + InvocationCounter::counter_offset()));
+ Address be_counter (G5_method, methodOopDesc::backedge_counter_offset() +
+ InvocationCounter::counter_offset());
+ Address inv_counter(G5_method, methodOopDesc::invocation_counter_offset() +
+ InvocationCounter::counter_offset());
#else
- Address be_counter(Lmethod, 0, in_bytes(methodOopDesc::backedge_counter_offset()
- + InvocationCounter::counter_offset()));
- Address inv_counter(Lmethod, 0, in_bytes(methodOopDesc::invocation_counter_offset()
- + InvocationCounter::counter_offset()));
+ Address be_counter (Lmethod, methodOopDesc::backedge_counter_offset() +
+ InvocationCounter::counter_offset());
+ Address inv_counter(Lmethod, methodOopDesc::invocation_counter_offset() +
+ InvocationCounter::counter_offset());
#endif /* CC_INTERP */
int delta = InvocationCounter::count_increment;
// Load each counter in a register
@@ -2289,7 +2271,7 @@
assert_different_registers(backedge_count, Rtmp, branch_bcp);
assert(UseOnStackReplacement,"Must UseOnStackReplacement to test_backedge_count_for_osr");
- Address limit(Rtmp, address(&InvocationCounter::InterpreterBackwardBranchLimit));
+ AddressLiteral limit(&InvocationCounter::InterpreterBackwardBranchLimit);
load_contents(limit, Rtmp);
cmp(backedge_count, Rtmp);
br(Assembler::lessUnsigned, false, Assembler::pt, did_not_overflow);
@@ -2435,9 +2417,7 @@
if (JvmtiExport::can_post_interpreter_events()) {
Label L;
Register temp_reg = O5;
-
- const Address interp_only (G2_thread, 0, in_bytes(JavaThread::interp_only_mode_offset()));
-
+ const Address interp_only(G2_thread, JavaThread::interp_only_mode_offset());
ld(interp_only, temp_reg);
tst(temp_reg);
br(zero, false, pt, L);
@@ -2489,9 +2469,7 @@
if (mode == NotifyJVMTI && JvmtiExport::can_post_interpreter_events()) {
Label L;
Register temp_reg = O5;
-
- const Address interp_only (G2_thread, 0, in_bytes(JavaThread::interp_only_mode_offset()));
-
+ const Address interp_only(G2_thread, JavaThread::interp_only_mode_offset());
ld(interp_only, temp_reg);
tst(temp_reg);
br(zero, false, pt, L);
--- a/hotspot/src/cpu/sparc/vm/interpreterRT_sparc.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/sparc/vm/interpreterRT_sparc.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1998-2009 Sun Microsystems, Inc. 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
@@ -105,7 +105,7 @@
// the handle for a receiver will never be null
bool do_NULL_check = offset() != 0 || is_static();
- Address h_arg = Address(Llocals, 0, Interpreter::local_offset_in_bytes(offset()));
+ Address h_arg = Address(Llocals, Interpreter::local_offset_in_bytes(offset()));
__ ld_ptr(h_arg, Rtmp1);
#ifdef ASSERT
if (TaggedStackInterpreter) {
@@ -120,14 +120,14 @@
}
#endif // ASSERT
if (!do_NULL_check) {
- __ add(h_arg, Rtmp2);
+ __ add(h_arg.base(), h_arg.disp(), Rtmp2);
} else {
if (Rtmp1 == Rtmp2)
__ tst(Rtmp1);
else __ addcc(G0, Rtmp1, Rtmp2); // optimize mov/test pair
Label L;
__ brx(Assembler::notZero, true, Assembler::pt, L);
- __ delayed()->add(h_arg, Rtmp2);
+ __ delayed()->add(h_arg.base(), h_arg.disp(), Rtmp2);
__ bind(L);
}
__ store_ptr_argument(Rtmp2, jni_arg); // this is often a no-op
@@ -140,10 +140,10 @@
iterate(fingerprint);
// return result handler
- Address result_handler(Lscratch, Interpreter::result_handler(method()->result_type()));
- __ sethi(result_handler);
+ AddressLiteral result_handler(Interpreter::result_handler(method()->result_type()));
+ __ sethi(result_handler, Lscratch);
__ retl();
- __ delayed()->add(result_handler, result_handler.base());
+ __ delayed()->add(Lscratch, result_handler.low10(), Lscratch);
__ flush();
}
--- a/hotspot/src/cpu/sparc/vm/jniFastGetField_sparc.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/sparc/vm/jniFastGetField_sparc.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2004-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2004-2009 Sun Microsystems, Inc. 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
@@ -57,10 +57,10 @@
Label label1, label2;
- address cnt_addr = SafepointSynchronize::safepoint_counter_addr();
- Address ca(O3, cnt_addr);
- __ sethi (ca);
- __ ld (ca, G4);
+ AddressLiteral cnt_addrlit(SafepointSynchronize::safepoint_counter_addr());
+ __ sethi (cnt_addrlit, O3);
+ Address cnt_addr(O3, cnt_addrlit.low10());
+ __ ld (cnt_addr, G4);
__ andcc (G4, 1, G0);
__ br (Assembler::notZero, false, Assembler::pn, label1);
__ delayed()->srl (O2, 2, O4);
@@ -77,7 +77,7 @@
default: ShouldNotReachHere();
}
- __ ld (ca, O5);
+ __ ld (cnt_addr, O5);
__ cmp (O5, G4);
__ br (Assembler::notEqual, false, Assembler::pn, label2);
__ delayed()->mov (O7, G1);
@@ -136,10 +136,10 @@
Label label1, label2;
- address cnt_addr = SafepointSynchronize::safepoint_counter_addr();
- Address ca(G3, cnt_addr);
- __ sethi (ca);
- __ ld (ca, G4);
+ AddressLiteral cnt_addrlit(SafepointSynchronize::safepoint_counter_addr());
+ __ sethi (cnt_addrlit, G3);
+ Address cnt_addr(G3, cnt_addrlit.low10());
+ __ ld (cnt_addr, G4);
__ andcc (G4, 1, G0);
__ br (Assembler::notZero, false, Assembler::pn, label1);
__ delayed()->srl (O2, 2, O4);
@@ -159,7 +159,7 @@
__ ldx (O5, 0, O3);
#endif
- __ ld (ca, G1);
+ __ ld (cnt_addr, G1);
__ cmp (G1, G4);
__ br (Assembler::notEqual, false, Assembler::pn, label2);
__ delayed()->mov (O7, G1);
@@ -208,10 +208,10 @@
Label label1, label2;
- address cnt_addr = SafepointSynchronize::safepoint_counter_addr();
- Address ca(O3, cnt_addr);
- __ sethi (ca);
- __ ld (ca, G4);
+ AddressLiteral cnt_addrlit(SafepointSynchronize::safepoint_counter_addr());
+ __ sethi (cnt_addrlit, O3);
+ Address cnt_addr(O3, cnt_addrlit.low10());
+ __ ld (cnt_addr, G4);
__ andcc (G4, 1, G0);
__ br (Assembler::notZero, false, Assembler::pn, label1);
__ delayed()->srl (O2, 2, O4);
@@ -225,7 +225,7 @@
default: ShouldNotReachHere();
}
- __ ld (ca, O5);
+ __ ld (cnt_addr, O5);
__ cmp (O5, G4);
__ br (Assembler::notEqual, false, Assembler::pn, label2);
__ delayed()->mov (O7, G1);
--- a/hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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,8 +38,7 @@
destreg = inv_rd(*(unsigned int *)instaddr);
// Generate a the new sequence
- Address dest( destreg, (address)x );
- _masm->sethi( dest, true );
+ _masm->patchable_sethi(x, destreg);
ICache::invalidate_range(instaddr, 7 * BytesPerInstWord);
}
@@ -227,8 +226,8 @@
CodeBuffer buf(addr_at(0), instruction_size + 1);
MacroAssembler* _masm = new MacroAssembler(&buf);
// Generate the new sequence
- Address(O7, dest);
- _masm->jumpl_to(dest, O7);
+ AddressLiteral(dest);
+ _masm->jumpl_to(dest, O7, O7);
ICache::invalidate_range(addr_at(0), instruction_size );
#endif
}
@@ -361,10 +360,12 @@
VM_Version::allow_all();
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none);
- a->add(I3, low10(0xaaaabbbb), I3);
- a->sethi(0xccccdddd, O2, true, RelocationHolder::none);
- a->add(O2, low10(0xccccdddd), O2);
+ AddressLiteral al1(0xaaaabbbb, relocInfo::external_word_type);
+ a->sethi(al1, I3);
+ a->add(I3, al1.low10(), I3);
+ AddressLiteral al2(0xccccdddd, relocInfo::external_word_type);
+ a->sethi(al2, O2);
+ a->add(O2, al2.low10(), O2);
nm = nativeMovConstReg_at( cb.code_begin() );
nm->print();
@@ -468,12 +469,14 @@
VM_Version::allow_all();
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none);
+ AddressLiteral al1(0xaaaabbbb, relocInfo::external_word_type);
+ a->sethi(al1, I3);
a->nop();
- a->add(I3, low10(0xaaaabbbb), I3);
- a->sethi(0xccccdddd, O2, true, RelocationHolder::none);
+ a->add(I3, al1.low10(), I3);
+ AddressLiteral al2(0xccccdddd, relocInfo::external_word_type);
+ a->sethi(al2, O2);
a->nop();
- a->add(O2, low10(0xccccdddd), O2);
+ a->add(O2, al2.low10(), O2);
nm = nativeMovConstRegPatching_at( cb.code_begin() );
nm->print();
@@ -562,51 +565,53 @@
VM_Version::allow_all();
- a->ldsw( G5, low10(0xffffffff), G4 ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->add(I3, low10(0xaaaabbbb), I3);
+ AddressLiteral al1(0xffffffff, relocInfo::external_word_type);
+ AddressLiteral al2(0xaaaabbbb, relocInfo::external_word_type);
+ a->ldsw( G5, al1.low10(), G4 ); idx++;
+ a->sethi(al2, I3); a->add(I3, al2.low10(), I3);
a->ldsw( G5, I3, G4 ); idx++;
- a->ldsb( G5, low10(0xffffffff), G4 ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->add(I3, low10(0xaaaabbbb), I3);
+ a->ldsb( G5, al1.low10(), G4 ); idx++;
+ a->sethi(al2, I3); a->add(I3, al2.low10(), I3);
a->ldsb( G5, I3, G4 ); idx++;
- a->ldsh( G5, low10(0xffffffff), G4 ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->add(I3, low10(0xaaaabbbb), I3);
+ a->ldsh( G5, al1.low10(), G4 ); idx++;
+ a->sethi(al2, I3); a->add(I3, al2.low10(), I3);
a->ldsh( G5, I3, G4 ); idx++;
- a->lduw( G5, low10(0xffffffff), G4 ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->add(I3, low10(0xaaaabbbb), I3);
+ a->lduw( G5, al1.low10(), G4 ); idx++;
+ a->sethi(al2, I3); a->add(I3, al2.low10(), I3);
a->lduw( G5, I3, G4 ); idx++;
- a->ldub( G5, low10(0xffffffff), G4 ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->add(I3, low10(0xaaaabbbb), I3);
+ a->ldub( G5, al1.low10(), G4 ); idx++;
+ a->sethi(al2, I3); a->add(I3, al2.low10(), I3);
a->ldub( G5, I3, G4 ); idx++;
- a->lduh( G5, low10(0xffffffff), G4 ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->add(I3, low10(0xaaaabbbb), I3);
+ a->lduh( G5, al1.low10(), G4 ); idx++;
+ a->sethi(al2, I3); a->add(I3, al2.low10(), I3);
a->lduh( G5, I3, G4 ); idx++;
- a->ldx( G5, low10(0xffffffff), G4 ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->add(I3, low10(0xaaaabbbb), I3);
+ a->ldx( G5, al1.low10(), G4 ); idx++;
+ a->sethi(al2, I3); a->add(I3, al2.low10(), I3);
a->ldx( G5, I3, G4 ); idx++;
- a->ldd( G5, low10(0xffffffff), G4 ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->add(I3, low10(0xaaaabbbb), I3);
+ a->ldd( G5, al1.low10(), G4 ); idx++;
+ a->sethi(al2, I3); a->add(I3, al2.low10(), I3);
a->ldd( G5, I3, G4 ); idx++;
a->ldf( FloatRegisterImpl::D, O2, -1, F14 ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->add(I3, low10(0xaaaabbbb), I3);
+ a->sethi(al2, I3); a->add(I3, al2.low10(), I3);
a->ldf( FloatRegisterImpl::S, O0, I3, F15 ); idx++;
- a->stw( G5, G4, low10(0xffffffff) ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->add(I3, low10(0xaaaabbbb), I3);
+ a->stw( G5, G4, al1.low10() ); idx++;
+ a->sethi(al2, I3); a->add(I3, al2.low10(), I3);
a->stw( G5, G4, I3 ); idx++;
- a->stb( G5, G4, low10(0xffffffff) ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->add(I3, low10(0xaaaabbbb), I3);
+ a->stb( G5, G4, al1.low10() ); idx++;
+ a->sethi(al2, I3); a->add(I3, al2.low10(), I3);
a->stb( G5, G4, I3 ); idx++;
- a->sth( G5, G4, low10(0xffffffff) ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->add(I3, low10(0xaaaabbbb), I3);
+ a->sth( G5, G4, al1.low10() ); idx++;
+ a->sethi(al2, I3); a->add(I3, al2.low10(), I3);
a->sth( G5, G4, I3 ); idx++;
- a->stx( G5, G4, low10(0xffffffff) ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->add(I3, low10(0xaaaabbbb), I3);
+ a->stx( G5, G4, al1.low10() ); idx++;
+ a->sethi(al2, I3); a->add(I3, al2.low10(), I3);
a->stx( G5, G4, I3 ); idx++;
- a->std( G5, G4, low10(0xffffffff) ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->add(I3, low10(0xaaaabbbb), I3);
+ a->std( G5, G4, al1.low10() ); idx++;
+ a->sethi(al2, I3); a->add(I3, al2.low10(), I3);
a->std( G5, G4, I3 ); idx++;
a->stf( FloatRegisterImpl::S, F18, O2, -1 ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->add(I3, low10(0xaaaabbbb), I3);
+ a->sethi(al2, I3); a->add(I3, al2.low10(), I3);
a->stf( FloatRegisterImpl::S, F15, O0, I3 ); idx++;
nm = nativeMovRegMem_at( cb.code_begin() );
@@ -705,51 +710,52 @@
VM_Version::allow_all();
- a->ldsw( G5, low10(0xffffffff), G4 ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->nop(); a->add(I3, low10(0xaaaabbbb), I3);
+ AddressLiteral al(0xffffffff, relocInfo::external_word_type);
+ a->ldsw( G5, al.low10(), G4); idx++;
+ a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
a->ldsw( G5, I3, G4 ); idx++;
- a->ldsb( G5, low10(0xffffffff), G4 ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->nop(); a->add(I3, low10(0xaaaabbbb), I3);
+ a->ldsb( G5, al.low10(), G4); idx++;
+ a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
a->ldsb( G5, I3, G4 ); idx++;
- a->ldsh( G5, low10(0xffffffff), G4 ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->nop(); a->add(I3, low10(0xaaaabbbb), I3);
+ a->ldsh( G5, al.low10(), G4); idx++;
+ a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
a->ldsh( G5, I3, G4 ); idx++;
- a->lduw( G5, low10(0xffffffff), G4 ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->nop(); a->add(I3, low10(0xaaaabbbb), I3);
+ a->lduw( G5, al.low10(), G4); idx++;
+ a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
a->lduw( G5, I3, G4 ); idx++;
- a->ldub( G5, low10(0xffffffff), G4 ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->nop(); a->add(I3, low10(0xaaaabbbb), I3);
+ a->ldub( G5, al.low10(), G4); idx++;
+ a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
a->ldub( G5, I3, G4 ); idx++;
- a->lduh( G5, low10(0xffffffff), G4 ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->nop(); a->add(I3, low10(0xaaaabbbb), I3);
+ a->lduh( G5, al.low10(), G4); idx++;
+ a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
a->lduh( G5, I3, G4 ); idx++;
- a->ldx( G5, low10(0xffffffff), G4 ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->nop(); a->add(I3, low10(0xaaaabbbb), I3);
- a->ldx( G5, I3, G4 ); idx++;
- a->ldd( G5, low10(0xffffffff), G4 ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->nop(); a->add(I3, low10(0xaaaabbbb), I3);
- a->ldd( G5, I3, G4 ); idx++;
- a->ldf( FloatRegisterImpl::D, O2, -1, F14 ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->nop(); a->add(I3, low10(0xaaaabbbb), I3);
- a->ldf( FloatRegisterImpl::S, O0, I3, F15 ); idx++;
+ a->ldx( G5, al.low10(), G4); idx++;
+ a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
+ a->ldx( G5, I3, G4 ); idx++;
+ a->ldd( G5, al.low10(), G4); idx++;
+ a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
+ a->ldd( G5, I3, G4 ); idx++;
+ a->ldf( FloatRegisterImpl::D, O2, -1, F14 ); idx++;
+ a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
+ a->ldf( FloatRegisterImpl::S, O0, I3, F15 ); idx++;
- a->stw( G5, G4, low10(0xffffffff) ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->nop(); a->add(I3, low10(0xaaaabbbb), I3);
+ a->stw( G5, G4, al.low10()); idx++;
+ a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
a->stw( G5, G4, I3 ); idx++;
- a->stb( G5, G4, low10(0xffffffff) ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->nop(); a->add(I3, low10(0xaaaabbbb), I3);
+ a->stb( G5, G4, al.low10()); idx++;
+ a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
a->stb( G5, G4, I3 ); idx++;
- a->sth( G5, G4, low10(0xffffffff) ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->nop(); a->add(I3, low10(0xaaaabbbb), I3);
+ a->sth( G5, G4, al.low10()); idx++;
+ a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
a->sth( G5, G4, I3 ); idx++;
- a->stx( G5, G4, low10(0xffffffff) ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->nop(); a->add(I3, low10(0xaaaabbbb), I3);
+ a->stx( G5, G4, al.low10()); idx++;
+ a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
a->stx( G5, G4, I3 ); idx++;
- a->std( G5, G4, low10(0xffffffff) ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->nop(); a->add(I3, low10(0xaaaabbbb), I3);
+ a->std( G5, G4, al.low10()); idx++;
+ a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
a->std( G5, G4, I3 ); idx++;
a->stf( FloatRegisterImpl::S, F18, O2, -1 ); idx++;
- a->sethi(0xaaaabbbb, I3, true, RelocationHolder::none); a->nop(); a->add(I3, low10(0xaaaabbbb), I3);
+ a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3);
a->stf( FloatRegisterImpl::S, F15, O0, I3 ); idx++;
nm = nativeMovRegMemPatching_at( cb.code_begin() );
@@ -833,11 +839,12 @@
VM_Version::allow_all();
- a->sethi(0x7fffbbbb, I3, true, RelocationHolder::none);
- a->jmpl(I3, low10(0x7fffbbbb), G0, RelocationHolder::none);
+ AddressLiteral al(0x7fffbbbb, relocInfo::external_word_type);
+ a->sethi(al, I3);
+ a->jmpl(I3, al.low10(), G0, RelocationHolder::none);
a->delayed()->nop();
- a->sethi(0x7fffbbbb, I3, true, RelocationHolder::none);
- a->jmpl(I3, low10(0x7fffbbbb), L3, RelocationHolder::none);
+ a->sethi(al, I3);
+ a->jmpl(I3, al.low10(), L3, RelocationHolder::none);
a->delayed()->nop();
nj = nativeJump_at( cb.code_begin() );
--- a/hotspot/src/cpu/sparc/vm/relocInfo_sparc.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/sparc/vm/relocInfo_sparc.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1998-2009 Sun Microsystems, Inc. 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
@@ -99,13 +99,6 @@
break;
}
ip->set_data64_sethi( ip->addr_at(0), (intptr_t)x );
-#ifdef COMPILER2
- // [RGV] Someone must have missed putting in a reloc entry for the
- // add in compiler2.
- inst2 = ip->long_at( NativeMovConstReg::add_offset );
- guarantee(Assembler::inv_op(inst2)==Assembler::arith_op, "arith op");
- ip->set_long_at(NativeMovConstReg::add_offset,ip->set_data32_simm13( inst2, (intptr_t)x+o));
-#endif
#else
guarantee(Assembler::inv_op2(inst)==Assembler::sethi_op2, "must be sethi");
inst &= ~Assembler::hi22( -1);
--- a/hotspot/src/cpu/sparc/vm/runtime_sparc.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/sparc/vm/runtime_sparc.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1998-2009 Sun Microsystems, Inc. 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
@@ -74,8 +74,8 @@
int start = __ offset();
__ verify_thread();
- __ st_ptr(Oexception, Address(G2_thread, 0, in_bytes(JavaThread::exception_oop_offset())));
- __ st_ptr(Oissuing_pc, Address(G2_thread, 0, in_bytes(JavaThread::exception_pc_offset())));
+ __ st_ptr(Oexception, G2_thread, JavaThread::exception_oop_offset());
+ __ st_ptr(Oissuing_pc, G2_thread, JavaThread::exception_pc_offset());
// This call does all the hard work. It checks if an exception catch
// exists in the method.
@@ -120,19 +120,19 @@
// Since this may be the deopt blob we must set O7 to look like we returned
// from the original pc that threw the exception
- __ ld_ptr(Address(G2_thread, 0, in_bytes(JavaThread::exception_pc_offset())), O7);
+ __ ld_ptr(G2_thread, JavaThread::exception_pc_offset(), O7);
__ sub(O7, frame::pc_return_offset, O7);
assert(Assembler::is_simm13(in_bytes(JavaThread::exception_oop_offset())), "exception offset overflows simm13, following ld instruction cannot be in delay slot");
- __ ld_ptr(Address(G2_thread, 0, in_bytes(JavaThread::exception_oop_offset())), Oexception); // O0
+ __ ld_ptr(G2_thread, JavaThread::exception_oop_offset(), Oexception); // O0
#ifdef ASSERT
- __ st_ptr(G0, Address(G2_thread, 0, in_bytes(JavaThread::exception_handler_pc_offset())));
- __ st_ptr(G0, Address(G2_thread, 0, in_bytes(JavaThread::exception_pc_offset())));
+ __ st_ptr(G0, G2_thread, JavaThread::exception_handler_pc_offset());
+ __ st_ptr(G0, G2_thread, JavaThread::exception_pc_offset());
#endif
__ JMP(G3_scratch, 0);
// Clear the exception oop so GC no longer processes it as a root.
- __ delayed()->st_ptr(G0, Address(G2_thread, 0, in_bytes(JavaThread::exception_oop_offset())));
+ __ delayed()->st_ptr(G0, G2_thread, JavaThread::exception_oop_offset());
// -------------
// make sure all code is generated
--- a/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -625,9 +625,9 @@
__ mov(I7, O1); // VM needs caller's callsite
// Must be a leaf call...
// can be very far once the blob has been relocated
- Address dest(O7, CAST_FROM_FN_PTR(address, SharedRuntime::fixup_callers_callsite));
+ AddressLiteral dest(CAST_FROM_FN_PTR(address, SharedRuntime::fixup_callers_callsite));
__ relocate(relocInfo::runtime_call_type);
- __ jumpl_to(dest, O7);
+ __ jumpl_to(dest, O7, O7);
__ delayed()->mov(G2_thread, L7_thread_cache);
__ mov(L7_thread_cache, G2_thread);
__ mov(L1, G1);
@@ -1152,7 +1152,7 @@
#ifndef _LP64
if (g3_crushed) {
// Rats load was wasted, at least it is in cache...
- __ ld_ptr(G5_method, in_bytes(methodOopDesc::from_compiled_offset()), G3);
+ __ ld_ptr(G5_method, methodOopDesc::from_compiled_offset(), G3);
}
#endif /* _LP64 */
@@ -1165,7 +1165,7 @@
// we try and find the callee by normal means a safepoint
// is possible. So we stash the desired callee in the thread
// and the vm will find there should this case occur.
- Address callee_target_addr(G2_thread, 0, in_bytes(JavaThread::callee_target_offset()));
+ Address callee_target_addr(G2_thread, JavaThread::callee_target_offset());
__ st_ptr(G5_method, callee_target_addr);
if (StressNonEntrant) {
@@ -1218,7 +1218,7 @@
Register R_temp = G1; // another scratch register
#endif
- Address ic_miss(G3_scratch, SharedRuntime::get_ic_miss_stub());
+ AddressLiteral ic_miss(SharedRuntime::get_ic_miss_stub());
__ verify_oop(O0);
__ verify_oop(G5_method);
@@ -1240,7 +1240,7 @@
Label ok, ok2;
__ brx(Assembler::equal, false, Assembler::pt, ok);
__ delayed()->ld_ptr(G5_method, compiledICHolderOopDesc::holder_method_offset(), G5_method);
- __ jump_to(ic_miss);
+ __ jump_to(ic_miss, G3_scratch);
__ delayed()->nop();
__ bind(ok);
@@ -1251,7 +1251,7 @@
__ bind(ok2);
__ br_null(G3_scratch, false, __ pt, skip_fixup);
__ delayed()->ld_ptr(G5_method, in_bytes(methodOopDesc::interpreter_entry_offset()), G3_scratch);
- __ jump_to(ic_miss);
+ __ jump_to(ic_miss, G3_scratch);
__ delayed()->nop();
}
@@ -1444,8 +1444,8 @@
// without calling into the VM: it's the empty function. Just pop this
// frame and then jump to forward_exception_entry; O7 will contain the
// native caller's return PC.
- Address exception_entry(G3_scratch, StubRoutines::forward_exception_entry());
- __ jump_to(exception_entry);
+ AddressLiteral exception_entry(StubRoutines::forward_exception_entry());
+ __ jump_to(exception_entry, G3_scratch);
__ delayed()->restore(); // Pop this frame off.
__ bind(L);
}
@@ -1822,14 +1822,14 @@
{
Label L;
const Register temp_reg = G3_scratch;
- Address ic_miss(temp_reg, SharedRuntime::get_ic_miss_stub());
+ AddressLiteral ic_miss(SharedRuntime::get_ic_miss_stub());
__ verify_oop(O0);
__ load_klass(O0, temp_reg);
__ cmp(temp_reg, G5_inline_cache_reg);
__ brx(Assembler::equal, true, Assembler::pt, L);
__ delayed()->nop();
- __ jump_to(ic_miss, 0);
+ __ jump_to(ic_miss, temp_reg);
__ delayed()->nop();
__ align(CodeEntryAlignment);
__ bind(L);
@@ -2261,21 +2261,19 @@
// Transition from _thread_in_Java to _thread_in_native.
__ set(_thread_in_native, G3_scratch);
- __ st(G3_scratch, G2_thread, in_bytes(JavaThread::thread_state_offset()));
+ __ st(G3_scratch, G2_thread, JavaThread::thread_state_offset());
// We flushed the windows ages ago now mark them as flushed
// mark windows as flushed
__ set(JavaFrameAnchor::flushed, G3_scratch);
- Address flags(G2_thread,
- 0,
- in_bytes(JavaThread::frame_anchor_offset()) + in_bytes(JavaFrameAnchor::flags_offset()));
+ Address flags(G2_thread, JavaThread::frame_anchor_offset() + JavaFrameAnchor::flags_offset());
#ifdef _LP64
- Address dest(O7, method->native_function());
+ AddressLiteral dest(method->native_function());
__ relocate(relocInfo::runtime_call_type);
- __ jumpl_to(dest, O7);
+ __ jumpl_to(dest, O7, O7);
#else
__ call(method->native_function(), relocInfo::runtime_call_type);
#endif
@@ -2316,7 +2314,7 @@
// Block, if necessary, before resuming in _thread_in_Java state.
// In order for GC to work, don't clear the last_Java_sp until after blocking.
{ Label no_block;
- Address sync_state(G3_scratch, SafepointSynchronize::address_of_state());
+ AddressLiteral sync_state(SafepointSynchronize::address_of_state());
// Switch thread to "native transition" state before reading the synchronization state.
// This additional state is necessary because reading and testing the synchronization
@@ -2326,7 +2324,7 @@
// Thread A is resumed to finish this native method, but doesn't block here since it
// didn't see any synchronization is progress, and escapes.
__ set(_thread_in_native_trans, G3_scratch);
- __ st(G3_scratch, G2_thread, in_bytes(JavaThread::thread_state_offset()));
+ __ st(G3_scratch, G2_thread, JavaThread::thread_state_offset());
if(os::is_MP()) {
if (UseMembar) {
// Force this write out before the read below
@@ -2343,10 +2341,9 @@
__ cmp(G3_scratch, SafepointSynchronize::_not_synchronized);
Label L;
- Address suspend_state(G2_thread, 0, in_bytes(JavaThread::suspend_flags_offset()));
+ Address suspend_state(G2_thread, JavaThread::suspend_flags_offset());
__ br(Assembler::notEqual, false, Assembler::pn, L);
- __ delayed()->
- ld(suspend_state, G3_scratch);
+ __ delayed()->ld(suspend_state, G3_scratch);
__ cmp(G3_scratch, 0);
__ br(Assembler::equal, false, Assembler::pt, no_block);
__ delayed()->nop();
@@ -2372,11 +2369,11 @@
__ set(_thread_in_Java, G3_scratch);
- __ st(G3_scratch, G2_thread, in_bytes(JavaThread::thread_state_offset()));
+ __ st(G3_scratch, G2_thread, JavaThread::thread_state_offset());
Label no_reguard;
- __ ld(G2_thread, in_bytes(JavaThread::stack_guard_state_offset()), G3_scratch);
+ __ ld(G2_thread, JavaThread::stack_guard_state_offset(), G3_scratch);
__ cmp(G3_scratch, JavaThread::stack_guard_yellow_disabled);
__ br(Assembler::notEqual, false, Assembler::pt, no_reguard);
__ delayed()->nop();
@@ -2684,14 +2681,14 @@
{
Label L;
const Register temp_reg = G3_scratch;
- Address ic_miss(temp_reg, SharedRuntime::get_ic_miss_stub());
+ AddressLiteral ic_miss(SharedRuntime::get_ic_miss_stub());
__ verify_oop(O0);
__ ld_ptr(O0, oopDesc::klass_offset_in_bytes(), temp_reg);
__ cmp(temp_reg, G5_inline_cache_reg);
__ brx(Assembler::equal, true, Assembler::pt, L);
__ delayed()->nop();
- __ jump_to(ic_miss, 0);
+ __ jump_to(ic_miss, temp_reg);
__ delayed()->nop();
__ align(CodeEntryAlignment);
__ bind(L);
@@ -3155,15 +3152,13 @@
// Do this after the caller's return address is on top of stack
if (UseStackBanging) {
// Get total frame size for interpreted frames
- __ ld(Address(O2UnrollBlock, 0,
- Deoptimization::UnrollBlock::total_frame_sizes_offset_in_bytes()), O4);
+ __ ld(O2UnrollBlock, Deoptimization::UnrollBlock::total_frame_sizes_offset_in_bytes(), O4);
__ bang_stack_size(O4, O3, G3_scratch);
}
- __ ld(Address(O2UnrollBlock, 0, Deoptimization::UnrollBlock::number_of_frames_offset_in_bytes()), O4array_size);
- __ ld_ptr(Address(O2UnrollBlock, 0, Deoptimization::UnrollBlock::frame_pcs_offset_in_bytes()), G3pcs);
-
- __ ld_ptr(Address(O2UnrollBlock, 0, Deoptimization::UnrollBlock::frame_sizes_offset_in_bytes()), O3array);
+ __ ld(O2UnrollBlock, Deoptimization::UnrollBlock::number_of_frames_offset_in_bytes(), O4array_size);
+ __ ld_ptr(O2UnrollBlock, Deoptimization::UnrollBlock::frame_pcs_offset_in_bytes(), G3pcs);
+ __ ld_ptr(O2UnrollBlock, Deoptimization::UnrollBlock::frame_sizes_offset_in_bytes(), O3array);
// Adjust old interpreter frame to make space for new frame's extra java locals
//
@@ -3176,7 +3171,7 @@
// for each frame we create and keep up the illusion every where.
//
- __ ld(Address(O2UnrollBlock, 0, Deoptimization::UnrollBlock::caller_adjustment_offset_in_bytes()), O7);
+ __ ld(O2UnrollBlock, Deoptimization::UnrollBlock::caller_adjustment_offset_in_bytes(), O7);
__ mov(SP, O5_savedSP); // remember initial sender's original sp before adjustment
__ sub(SP, O7, SP);
@@ -3225,9 +3220,9 @@
Register I5exception_tmp = I5;
Register G4exception_tmp = G4_scratch;
int frame_size_words;
- Address saved_Freturn0_addr(FP, 0, -sizeof(double) + STACK_BIAS);
+ Address saved_Freturn0_addr(FP, -sizeof(double) + STACK_BIAS);
#if !defined(_LP64) && defined(COMPILER2)
- Address saved_Greturn1_addr(FP, 0, -sizeof(double) -sizeof(jlong) + STACK_BIAS);
+ Address saved_Greturn1_addr(FP, -sizeof(double) -sizeof(jlong) + STACK_BIAS);
#endif
Label cont;
@@ -3289,7 +3284,7 @@
// save exception oop in JavaThread and fall through into the
// exception_in_tls case since they are handled in same way except
// for where the pending exception is kept.
- __ st_ptr(Oexception, G2_thread, in_bytes(JavaThread::exception_oop_offset()));
+ __ st_ptr(Oexception, G2_thread, JavaThread::exception_oop_offset());
//
// Vanilla deoptimization with an exception pending in exception_oop
@@ -3306,7 +3301,7 @@
{
// verify that there is really an exception oop in exception_oop
Label has_exception;
- __ ld_ptr(G2_thread, in_bytes(JavaThread::exception_oop_offset()), Oexception);
+ __ ld_ptr(G2_thread, JavaThread::exception_oop_offset(), Oexception);
__ br_notnull(Oexception, false, Assembler::pt, has_exception);
__ delayed()-> nop();
__ stop("no exception in thread");
@@ -3314,7 +3309,7 @@
// verify that there is no pending exception
Label no_pending_exception;
- Address exception_addr(G2_thread, 0, in_bytes(Thread::pending_exception_offset()));
+ Address exception_addr(G2_thread, Thread::pending_exception_offset());
__ ld_ptr(exception_addr, Oexception);
__ br_null(Oexception, false, Assembler::pt, no_pending_exception);
__ delayed()->nop();
--- a/hotspot/src/cpu/sparc/vm/sparc.ad Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/sparc/vm/sparc.ad Mon Apr 27 12:33:57 2009 -0700
@@ -980,8 +980,8 @@
// This code sequence is relocatable to any address, even on LP64.
if ( force_far_call ) {
__ relocate(rtype);
- Address dest(O7, (address)entry_point);
- __ jumpl_to(dest, O7);
+ AddressLiteral dest(entry_point);
+ __ jumpl_to(dest, O7, O7);
}
else
#endif
@@ -1031,17 +1031,6 @@
void emit_lo(CodeBuffer &cbuf, int val) { }
void emit_hi(CodeBuffer &cbuf, int val) { }
-void emit_ptr(CodeBuffer &cbuf, intptr_t val, Register reg, bool ForceRelocatable) {
- MacroAssembler _masm(&cbuf);
- if (ForceRelocatable) {
- Address addr(reg, (address)val);
- __ sethi(addr, ForceRelocatable);
- __ add(addr, reg);
- } else {
- __ set(val, reg);
- }
-}
-
//=============================================================================
@@ -1149,8 +1138,8 @@
// If this does safepoint polling, then do it here
if( do_polling() && ra_->C->is_method_compilation() ) {
- Address polling_page(L0, (address)os::get_polling_page());
- __ sethi(polling_page, false);
+ AddressLiteral polling_page(os::get_polling_page());
+ __ sethi(polling_page, L0);
__ relocate(relocInfo::poll_return_type);
__ ld_ptr( L0, 0, G0 );
}
@@ -1576,8 +1565,8 @@
__ set_oop(NULL, reg_to_register_object(Matcher::inline_cache_reg_encode()));
__ set_inst_mark();
- Address a(G3, (address)-1);
- __ JUMP(a, 0);
+ AddressLiteral addrlit(-1);
+ __ JUMP(addrlit, G3, 0);
__ delayed()->nop();
@@ -1662,7 +1651,7 @@
// Emit exception handler code.
int emit_exception_handler(CodeBuffer& cbuf) {
Register temp_reg = G3;
- Address exception_blob(temp_reg, OptoRuntime::exception_blob()->instructions_begin());
+ AddressLiteral exception_blob(OptoRuntime::exception_blob()->instructions_begin());
MacroAssembler _masm(&cbuf);
address base =
@@ -1671,7 +1660,7 @@
int offset = __ offset();
- __ JUMP(exception_blob, 0); // sethi;jmp
+ __ JUMP(exception_blob, temp_reg, 0); // sethi;jmp
__ delayed()->nop();
assert(__ offset() - offset <= (int) size_exception_handler(), "overflow");
@@ -1685,7 +1674,7 @@
// Can't use any of the current frame's registers as we may have deopted
// at a poll and everything (including G3) can be live.
Register temp_reg = L0;
- Address deopt_blob(temp_reg, SharedRuntime::deopt_blob()->unpack());
+ AddressLiteral deopt_blob(SharedRuntime::deopt_blob()->unpack());
MacroAssembler _masm(&cbuf);
address base =
@@ -1694,7 +1683,7 @@
int offset = __ offset();
__ save_frame(0);
- __ JUMP(deopt_blob, 0); // sethi;jmp
+ __ JUMP(deopt_blob, temp_reg, 0); // sethi;jmp
__ delayed()->restore();
assert(__ offset() - offset <= (int) size_deopt_handler(), "overflow");
@@ -2261,9 +2250,8 @@
address table_base = __ address_table_constant(_index2label);
RelocationHolder rspec = internal_word_Relocation::spec(table_base);
- // Load table address
- Address the_pc(table_reg, table_base, rspec);
- __ load_address(the_pc);
+ // Move table address into a register.
+ __ set(table_base, table_reg, rspec);
// Jump to base address + switch value
__ ld_ptr(table_reg, switch_reg, table_reg);
@@ -2402,13 +2390,13 @@
// The 64 bit pointer is stored in the generated code stream
enc_class SetPtr( immP src, iRegP rd ) %{
Register dest = reg_to_register_object($rd$$reg);
+ MacroAssembler _masm(&cbuf);
// [RGV] This next line should be generated from ADLC
if ( _opnds[1]->constant_is_oop() ) {
intptr_t val = $src$$constant;
- MacroAssembler _masm(&cbuf);
__ set_oop_constant((jobject)val, dest);
} else { // non-oop pointers, e.g. card mark base, heap top
- emit_ptr(cbuf, $src$$constant, dest, /*ForceRelocatable=*/ false);
+ __ set($src$$constant, dest);
}
%}
@@ -2789,46 +2777,6 @@
__ set64( $src$$constant, dest, temp );
%}
- enc_class LdImmF(immF src, regF dst, o7RegP tmp) %{ // Load Immediate
- address float_address = MacroAssembler(&cbuf).float_constant($src$$constant);
- RelocationHolder rspec = internal_word_Relocation::spec(float_address);
-#ifdef _LP64
- Register tmp_reg = reg_to_register_object($tmp$$reg);
- cbuf.relocate(cbuf.code_end(), rspec, 0);
- emit_ptr(cbuf, (intptr_t)float_address, tmp_reg, /*ForceRelocatable=*/ true);
- emit3_simm10( cbuf, Assembler::ldst_op, $dst$$reg, Assembler::ldf_op3, $tmp$$reg, 0 );
-#else // _LP64
- uint *code;
- int tmp_reg = $tmp$$reg;
-
- cbuf.relocate(cbuf.code_end(), rspec, 0);
- emit2_22( cbuf, Assembler::branch_op, tmp_reg, Assembler::sethi_op2, (intptr_t) float_address );
-
- cbuf.relocate(cbuf.code_end(), rspec, 0);
- emit3_simm10( cbuf, Assembler::ldst_op, $dst$$reg, Assembler::ldf_op3, tmp_reg, (intptr_t) float_address );
-#endif // _LP64
- %}
-
- enc_class LdImmD(immD src, regD dst, o7RegP tmp) %{ // Load Immediate
- address double_address = MacroAssembler(&cbuf).double_constant($src$$constant);
- RelocationHolder rspec = internal_word_Relocation::spec(double_address);
-#ifdef _LP64
- Register tmp_reg = reg_to_register_object($tmp$$reg);
- cbuf.relocate(cbuf.code_end(), rspec, 0);
- emit_ptr(cbuf, (intptr_t)double_address, tmp_reg, /*ForceRelocatable=*/ true);
- emit3_simm10( cbuf, Assembler::ldst_op, $dst$$reg, Assembler::lddf_op3, $tmp$$reg, 0 );
-#else // _LP64
- uint *code;
- int tmp_reg = $tmp$$reg;
-
- cbuf.relocate(cbuf.code_end(), rspec, 0);
- emit2_22( cbuf, Assembler::branch_op, tmp_reg, Assembler::sethi_op2, (intptr_t) double_address );
-
- cbuf.relocate(cbuf.code_end(), rspec, 0);
- emit3_simm10( cbuf, Assembler::ldst_op, $dst$$reg, Assembler::lddf_op3, tmp_reg, (intptr_t) double_address );
-#endif // _LP64
- %}
-
enc_class LdReplImmI(immI src, regD dst, o7RegP tmp, int count, int width) %{
// Load a constant replicated "count" times with width "width"
int bit_width = $width$$constant * 8;
@@ -2840,28 +2788,15 @@
val |= elt_val;
}
jdouble dval = *(jdouble*)&val; // coerce to double type
- address double_address = MacroAssembler(&cbuf).double_constant(dval);
+ MacroAssembler _masm(&cbuf);
+ address double_address = __ double_constant(dval);
RelocationHolder rspec = internal_word_Relocation::spec(double_address);
-#ifdef _LP64
- Register tmp_reg = reg_to_register_object($tmp$$reg);
- cbuf.relocate(cbuf.code_end(), rspec, 0);
- emit_ptr(cbuf, (intptr_t)double_address, tmp_reg, /*ForceRelocatable=*/ true);
- emit3_simm10( cbuf, Assembler::ldst_op, $dst$$reg, Assembler::lddf_op3, $tmp$$reg, 0 );
-#else // _LP64
- uint *code;
- int tmp_reg = $tmp$$reg;
-
- cbuf.relocate(cbuf.code_end(), rspec, 0);
- emit2_22( cbuf, Assembler::branch_op, tmp_reg, Assembler::sethi_op2, (intptr_t) double_address );
-
- cbuf.relocate(cbuf.code_end(), rspec, 0);
- emit3_simm10( cbuf, Assembler::ldst_op, $dst$$reg, Assembler::lddf_op3, tmp_reg, (intptr_t) double_address );
-#endif // _LP64
- %}
-
-
- enc_class ShouldNotEncodeThis ( ) %{
- ShouldNotCallThis();
+ AddressLiteral addrlit(double_address, rspec);
+
+ __ sethi(addrlit, $tmp$$Register);
+ // XXX This is a quick fix for 6833573.
+ //__ ldf(FloatRegisterImpl::D, $tmp$$Register, addrlit.low10(), $dst$$FloatRegister, rspec);
+ __ ldf(FloatRegisterImpl::D, $tmp$$Register, addrlit.low10(), as_DoubleFloatRegister($dst$$reg), rspec);
%}
// Compiler ensures base is doubleword aligned and cnt is count of doublewords
@@ -2901,19 +2836,19 @@
int count_offset = java_lang_String:: count_offset_in_bytes();
// load str1 (jchar*) base address into tmp1_reg
- __ load_heap_oop(Address(str1_reg, 0, value_offset), tmp1_reg);
- __ ld(Address(str1_reg, 0, offset_offset), result_reg);
+ __ load_heap_oop(str1_reg, value_offset, tmp1_reg);
+ __ ld(str1_reg, offset_offset, result_reg);
__ add(tmp1_reg, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp1_reg);
- __ ld(Address(str1_reg, 0, count_offset), str1_reg); // hoisted
+ __ ld(str1_reg, count_offset, str1_reg); // hoisted
__ sll(result_reg, exact_log2(sizeof(jchar)), result_reg);
- __ load_heap_oop(Address(str2_reg, 0, value_offset), tmp2_reg); // hoisted
+ __ load_heap_oop(str2_reg, value_offset, tmp2_reg); // hoisted
__ add(result_reg, tmp1_reg, tmp1_reg);
// load str2 (jchar*) base address into tmp2_reg
- // __ ld_ptr(Address(str2_reg, 0, value_offset), tmp2_reg); // hoisted
- __ ld(Address(str2_reg, 0, offset_offset), result_reg);
+ // __ ld_ptr(str2_reg, value_offset, tmp2_reg); // hoisted
+ __ ld(str2_reg, offset_offset, result_reg);
__ add(tmp2_reg, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp2_reg);
- __ ld(Address(str2_reg, 0, count_offset), str2_reg); // hoisted
+ __ ld(str2_reg, count_offset, str2_reg); // hoisted
__ sll(result_reg, exact_log2(sizeof(jchar)), result_reg);
__ subcc(str1_reg, str2_reg, O7); // hoisted
__ add(result_reg, tmp2_reg, tmp2_reg);
@@ -2922,8 +2857,8 @@
// difference of the string lengths (stack)
// discard string base pointers, after loading up the lengths
- // __ ld(Address(str1_reg, 0, count_offset), str1_reg); // hoisted
- // __ ld(Address(str2_reg, 0, count_offset), str2_reg); // hoisted
+ // __ ld(str1_reg, count_offset, str1_reg); // hoisted
+ // __ ld(str2_reg, count_offset, str2_reg); // hoisted
// See if the lengths are different, and calculate min in str1_reg.
// Stash diff in O7 in case we need it for a tie-breaker.
@@ -3020,19 +2955,19 @@
int count_offset = java_lang_String:: count_offset_in_bytes();
// load str1 (jchar*) base address into tmp1_reg
- __ load_heap_oop(Address(str1_reg, 0, value_offset), tmp1_reg);
- __ ld(Address(str1_reg, 0, offset_offset), result_reg);
+ __ load_heap_oop(Address(str1_reg, value_offset), tmp1_reg);
+ __ ld(Address(str1_reg, offset_offset), result_reg);
__ add(tmp1_reg, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp1_reg);
- __ ld(Address(str1_reg, 0, count_offset), str1_reg); // hoisted
+ __ ld(Address(str1_reg, count_offset), str1_reg); // hoisted
__ sll(result_reg, exact_log2(sizeof(jchar)), result_reg);
- __ load_heap_oop(Address(str2_reg, 0, value_offset), tmp2_reg); // hoisted
+ __ load_heap_oop(Address(str2_reg, value_offset), tmp2_reg); // hoisted
__ add(result_reg, tmp1_reg, tmp1_reg);
// load str2 (jchar*) base address into tmp2_reg
- // __ ld_ptr(Address(str2_reg, 0, value_offset), tmp2_reg); // hoisted
- __ ld(Address(str2_reg, 0, offset_offset), result_reg);
+ // __ ld_ptr(Address(str2_reg, value_offset), tmp2_reg); // hoisted
+ __ ld(Address(str2_reg, offset_offset), result_reg);
__ add(tmp2_reg, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp2_reg);
- __ ld(Address(str2_reg, 0, count_offset), str2_reg); // hoisted
+ __ ld(Address(str2_reg, count_offset), str2_reg); // hoisted
__ sll(result_reg, exact_log2(sizeof(jchar)), result_reg);
__ cmp(str1_reg, str2_reg); // hoisted
__ add(result_reg, tmp2_reg, tmp2_reg);
@@ -3139,8 +3074,8 @@
__ delayed()->mov(G0, result_reg); // not equal
//load the lengths of arrays
- __ ld(Address(ary1_reg, 0, length_offset), tmp1_reg);
- __ ld(Address(ary2_reg, 0, length_offset), tmp2_reg);
+ __ ld(Address(ary1_reg, length_offset), tmp1_reg);
+ __ ld(Address(ary2_reg, length_offset), tmp2_reg);
// return false if the two arrays are not equal length
__ cmp(tmp1_reg, tmp2_reg);
@@ -3202,19 +3137,20 @@
enc_class enc_rethrow() %{
cbuf.set_inst_mark();
Register temp_reg = G3;
- Address rethrow_stub(temp_reg, OptoRuntime::rethrow_stub());
+ AddressLiteral rethrow_stub(OptoRuntime::rethrow_stub());
assert(temp_reg != reg_to_register_object(R_I0_num), "temp must not break oop_reg");
MacroAssembler _masm(&cbuf);
#ifdef ASSERT
__ save_frame(0);
- Address last_rethrow_addr(L1, (address)&last_rethrow);
- __ sethi(last_rethrow_addr);
+ AddressLiteral last_rethrow_addrlit(&last_rethrow);
+ __ sethi(last_rethrow_addrlit, L1);
+ Address addr(L1, last_rethrow_addrlit.low10());
__ get_pc(L2);
__ inc(L2, 3 * BytesPerInstWord); // skip this & 2 more insns to point at jump_to
- __ st_ptr(L2, last_rethrow_addr);
+ __ st_ptr(L2, addr);
__ restore();
#endif
- __ JUMP(rethrow_stub, 0); // sethi;jmp
+ __ JUMP(rethrow_stub, temp_reg, 0); // sethi;jmp
__ delayed()->nop();
%}
@@ -5493,8 +5429,9 @@
size(4);
format %{ "LDSB $mem,$dst\t! byte" %}
- opcode(Assembler::ldsb_op3);
- ins_encode(simple_form3_mem_reg( mem, dst ) );
+ ins_encode %{
+ __ ldsb($mem$$Address, $dst$$Register);
+ %}
ins_pipe(iload_mask_mem);
%}
@@ -5505,8 +5442,9 @@
size(4);
format %{ "LDSB $mem,$dst\t! byte -> long" %}
- opcode(Assembler::ldsb_op3);
- ins_encode(simple_form3_mem_reg( mem, dst ) );
+ ins_encode %{
+ __ ldsb($mem$$Address, $dst$$Register);
+ %}
ins_pipe(iload_mask_mem);
%}
@@ -5517,8 +5455,9 @@
size(4);
format %{ "LDUB $mem,$dst\t! ubyte" %}
- opcode(Assembler::ldub_op3);
- ins_encode(simple_form3_mem_reg( mem, dst ) );
+ ins_encode %{
+ __ ldub($mem$$Address, $dst$$Register);
+ %}
ins_pipe(iload_mask_mem);
%}
@@ -5529,8 +5468,9 @@
size(4);
format %{ "LDUB $mem,$dst\t! ubyte -> long" %}
- opcode(Assembler::ldub_op3);
- ins_encode(simple_form3_mem_reg( mem, dst ) );
+ ins_encode %{
+ __ ldub($mem$$Address, $dst$$Register);
+ %}
ins_pipe(iload_mask_mem);
%}
@@ -5541,8 +5481,9 @@
size(4);
format %{ "LDSH $mem,$dst\t! short" %}
- opcode(Assembler::ldsh_op3);
- ins_encode(simple_form3_mem_reg( mem, dst ) );
+ ins_encode %{
+ __ ldsh($mem$$Address, $dst$$Register);
+ %}
ins_pipe(iload_mask_mem);
%}
@@ -5553,8 +5494,9 @@
size(4);
format %{ "LDSH $mem,$dst\t! short -> long" %}
- opcode(Assembler::ldsh_op3);
- ins_encode(simple_form3_mem_reg( mem, dst ) );
+ ins_encode %{
+ __ ldsh($mem$$Address, $dst$$Register);
+ %}
ins_pipe(iload_mask_mem);
%}
@@ -5565,8 +5507,9 @@
size(4);
format %{ "LDUH $mem,$dst\t! ushort/char" %}
- opcode(Assembler::lduh_op3);
- ins_encode(simple_form3_mem_reg( mem, dst ) );
+ ins_encode %{
+ __ lduh($mem$$Address, $dst$$Register);
+ %}
ins_pipe(iload_mask_mem);
%}
@@ -5577,8 +5520,9 @@
size(4);
format %{ "LDUH $mem,$dst\t! ushort/char -> long" %}
- opcode(Assembler::lduh_op3);
- ins_encode(simple_form3_mem_reg( mem, dst ) );
+ ins_encode %{
+ __ lduh($mem$$Address, $dst$$Register);
+ %}
ins_pipe(iload_mask_mem);
%}
@@ -5589,8 +5533,9 @@
size(4);
format %{ "LDUW $mem,$dst\t! int" %}
- opcode(Assembler::lduw_op3);
- ins_encode(simple_form3_mem_reg( mem, dst ) );
+ ins_encode %{
+ __ lduw($mem$$Address, $dst$$Register);
+ %}
ins_pipe(iload_mem);
%}
@@ -5601,8 +5546,9 @@
size(4);
format %{ "LDSW $mem,$dst\t! int -> long" %}
- opcode(Assembler::ldsw_op3);
- ins_encode(simple_form3_mem_reg( mem, dst ) );
+ ins_encode %{
+ __ ldsw($mem$$Address, $dst$$Register);
+ %}
ins_pipe(iload_mem);
%}
@@ -5613,8 +5559,9 @@
size(4);
format %{ "LDUW $mem,$dst\t! uint -> long" %}
- opcode(Assembler::lduw_op3);
- ins_encode(simple_form3_mem_reg( mem, dst ) );
+ ins_encode %{
+ __ lduw($mem$$Address, $dst$$Register);
+ %}
ins_pipe(iload_mem);
%}
@@ -5625,8 +5572,9 @@
size(4);
format %{ "LDX $mem,$dst\t! long" %}
- opcode(Assembler::ldx_op3);
- ins_encode(simple_form3_mem_reg( mem, dst ) );
+ ins_encode %{
+ __ ldx($mem$$Address, $dst$$Register);
+ %}
ins_pipe(iload_mem);
%}
@@ -5721,31 +5669,29 @@
#ifndef _LP64
format %{ "LDUW $mem,$dst\t! ptr" %}
- opcode(Assembler::lduw_op3, 0, REGP_OP);
+ ins_encode %{
+ __ lduw($mem$$Address, $dst$$Register);
+ %}
#else
format %{ "LDX $mem,$dst\t! ptr" %}
- opcode(Assembler::ldx_op3, 0, REGP_OP);
+ ins_encode %{
+ __ ldx($mem$$Address, $dst$$Register);
+ %}
#endif
- ins_encode( form3_mem_reg( mem, dst ) );
ins_pipe(iload_mem);
%}
// Load Compressed Pointer
instruct loadN(iRegN dst, memory mem) %{
- match(Set dst (LoadN mem));
- ins_cost(MEMORY_REF_COST);
- size(4);
-
- format %{ "LDUW $mem,$dst\t! compressed ptr" %}
- ins_encode %{
- Register index = $mem$$index$$Register;
- if (index != G0) {
- __ lduw($mem$$base$$Register, index, $dst$$Register);
- } else {
- __ lduw($mem$$base$$Register, $mem$$disp, $dst$$Register);
- }
- %}
- ins_pipe(iload_mem);
+ match(Set dst (LoadN mem));
+ ins_cost(MEMORY_REF_COST);
+ size(4);
+
+ format %{ "LDUW $mem,$dst\t! compressed ptr" %}
+ ins_encode %{
+ __ lduw($mem$$Address, $dst$$Register);
+ %}
+ ins_pipe(iload_mem);
%}
// Load Klass Pointer
@@ -5756,12 +5702,15 @@
#ifndef _LP64
format %{ "LDUW $mem,$dst\t! klass ptr" %}
- opcode(Assembler::lduw_op3, 0, REGP_OP);
+ ins_encode %{
+ __ lduw($mem$$Address, $dst$$Register);
+ %}
#else
format %{ "LDX $mem,$dst\t! klass ptr" %}
- opcode(Assembler::ldx_op3, 0, REGP_OP);
+ ins_encode %{
+ __ ldx($mem$$Address, $dst$$Register);
+ %}
#endif
- ins_encode( form3_mem_reg( mem, dst ) );
ins_pipe(iload_mem);
%}
@@ -5772,16 +5721,8 @@
size(4);
format %{ "LDUW $mem,$dst\t! compressed klass ptr" %}
-
ins_encode %{
- Register base = as_Register($mem$$base);
- Register index = as_Register($mem$$index);
- Register dst = $dst$$Register;
- if (index != G0) {
- __ lduw(base, index, dst);
- } else {
- __ lduw(base, $mem$$disp, dst);
- }
+ __ lduw($mem$$Address, $dst$$Register);
%}
ins_pipe(iload_mem);
%}
@@ -5867,8 +5808,8 @@
ins_cost(DEFAULT_COST);
format %{ "SET $src,$dst\t!ptr" %}
ins_encode %{
- Address polling_page(reg_to_register_object($dst$$reg), (address)os::get_polling_page());
- __ sethi(polling_page, false );
+ AddressLiteral polling_page(os::get_polling_page());
+ __ sethi(polling_page, reg_to_register_object($dst$$reg));
%}
ins_pipe(loadConP_poll);
%}
@@ -5927,14 +5868,21 @@
effect(KILL tmp);
#ifdef _LP64
- size(36);
+ size(8*4);
#else
- size(8);
+ size(2*4);
#endif
format %{ "SETHI hi(&$src),$tmp\t!get float $src from table\n\t"
"LDF [$tmp+lo(&$src)],$dst" %}
- ins_encode( LdImmF(src, dst, tmp) );
+ ins_encode %{
+ address float_address = __ float_constant($src$$constant);
+ RelocationHolder rspec = internal_word_Relocation::spec(float_address);
+ AddressLiteral addrlit(float_address, rspec);
+
+ __ sethi(addrlit, $tmp$$Register);
+ __ ldf(FloatRegisterImpl::S, $tmp$$Register, addrlit.low10(), $dst$$FloatRegister, rspec);
+ %}
ins_pipe(loadConFD);
%}
@@ -5943,14 +5891,23 @@
effect(KILL tmp);
#ifdef _LP64
- size(36);
+ size(8*4);
#else
- size(8);
+ size(2*4);
#endif
format %{ "SETHI hi(&$src),$tmp\t!get double $src from table\n\t"
"LDDF [$tmp+lo(&$src)],$dst" %}
- ins_encode( LdImmD(src, dst, tmp) );
+ ins_encode %{
+ address double_address = __ double_constant($src$$constant);
+ RelocationHolder rspec = internal_word_Relocation::spec(double_address);
+ AddressLiteral addrlit(double_address, rspec);
+
+ __ sethi(addrlit, $tmp$$Register);
+ // XXX This is a quick fix for 6833573.
+ //__ ldf(FloatRegisterImpl::D, $tmp$$Register, addrlit.low10(), $dst$$FloatRegister, rspec);
+ __ ldf(FloatRegisterImpl::D, $tmp$$Register, addrlit.low10(), as_DoubleFloatRegister($dst$$reg), rspec);
+ %}
ins_pipe(loadConFD);
%}
--- a/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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,16 +68,9 @@
#ifdef PRODUCT
#define inc_counter_np(a,b,c) (0)
#else
- void inc_counter_np_(int& counter, Register t1, Register t2) {
- Address counter_addr(t2, (address) &counter);
- __ sethi(counter_addr);
- __ ld(counter_addr, t1);
- __ inc(t1);
- __ st(t1, counter_addr);
- }
#define inc_counter_np(counter, t1, t2) \
BLOCK_COMMENT("inc_counter " #counter); \
- inc_counter_np_(counter, t1, t2);
+ __ inc_counter(&counter, t1, t2);
#endif
//----------------------------------------------------------------------------------------------------
@@ -325,9 +318,9 @@
__ verify_thread();
const Register& temp_reg = Gtemp;
- Address pending_exception_addr (G2_thread, 0, in_bytes(Thread::pending_exception_offset()));
- Address exception_file_offset_addr(G2_thread, 0, in_bytes(Thread::exception_file_offset ()));
- Address exception_line_offset_addr(G2_thread, 0, in_bytes(Thread::exception_line_offset ()));
+ Address pending_exception_addr (G2_thread, Thread::pending_exception_offset());
+ Address exception_file_offset_addr(G2_thread, Thread::exception_file_offset ());
+ Address exception_line_offset_addr(G2_thread, Thread::exception_line_offset ());
// set pending exception
__ verify_oop(Oexception);
@@ -340,8 +333,8 @@
// complete return to VM
assert(StubRoutines::_call_stub_return_address != NULL, "must have been generated before");
- Address stub_ret(temp_reg, StubRoutines::_call_stub_return_address);
- __ jump_to(stub_ret);
+ AddressLiteral stub_ret(StubRoutines::_call_stub_return_address);
+ __ jump_to(stub_ret, temp_reg);
__ delayed()->nop();
return start;
@@ -366,7 +359,7 @@
const Register& handler_reg = Gtemp;
- Address exception_addr (G2_thread, 0, in_bytes(Thread::pending_exception_offset()));
+ Address exception_addr(G2_thread, Thread::pending_exception_offset());
#ifdef ASSERT
// make sure that this code is only executed if there is a pending exception
@@ -456,8 +449,7 @@
int frame_complete = __ offset();
if (restore_saved_exception_pc) {
- Address saved_exception_pc(G2_thread, 0, in_bytes(JavaThread::saved_exception_pc_offset()));
- __ ld_ptr(saved_exception_pc, I7);
+ __ ld_ptr(G2_thread, JavaThread::saved_exception_pc_offset(), I7);
__ sub(I7, frame::pc_return_offset, I7);
}
@@ -481,7 +473,7 @@
#ifdef ASSERT
Label L;
- Address exception_addr(G2_thread, 0, in_bytes(Thread::pending_exception_offset()));
+ Address exception_addr(G2_thread, Thread::pending_exception_offset());
Register scratch_reg = Gtemp;
__ ld_ptr(exception_addr, scratch_reg);
__ br_notnull(scratch_reg, false, Assembler::pt, L);
@@ -835,7 +827,7 @@
address start = __ pc();
const int preserve_register_words = (64 * 2);
- Address preserve_addr(FP, 0, (-preserve_register_words * wordSize) + STACK_BIAS);
+ Address preserve_addr(FP, (-preserve_register_words * wordSize) + STACK_BIAS);
Register Lthread = L7_thread_cache;
int i;
@@ -1106,21 +1098,19 @@
__ srl_ptr(addr, CardTableModRefBS::card_shift, addr);
__ srl_ptr(count, CardTableModRefBS::card_shift, count);
__ sub(count, addr, count);
- Address rs(tmp, (address)ct->byte_map_base);
- __ load_address(rs);
+ AddressLiteral rs(ct->byte_map_base);
+ __ set(rs, tmp);
__ BIND(L_loop);
- __ stb(G0, rs.base(), addr);
+ __ stb(G0, tmp, addr);
__ subcc(count, 1, count);
__ brx(Assembler::greaterEqual, false, Assembler::pt, L_loop);
__ delayed()->add(addr, 1, addr);
-
- }
+ }
break;
case BarrierSet::ModRef:
break;
- default :
+ default:
ShouldNotReachHere();
-
}
}
--- a/hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -87,8 +87,8 @@
}
// throw exception
assert(Interpreter::throw_exception_entry() != NULL, "generate it first");
- Address thrower(G3_scratch, Interpreter::throw_exception_entry());
- __ jump_to (thrower);
+ AddressLiteral thrower(Interpreter::throw_exception_entry());
+ __ jump_to(thrower, G3_scratch);
__ delayed()->nop();
return entry;
}
@@ -150,7 +150,8 @@
}
-address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step) {
+address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step, bool unbox) {
+ assert(!unbox, "NYI");//6815692//
address compiled_entry = __ pc();
Label cont;
@@ -186,8 +187,8 @@
const Register cache = G3_scratch;
const Register size = G1_scratch;
__ get_cache_and_index_at_bcp(cache, G1_scratch, 1);
- __ ld_ptr(Address(cache, 0, in_bytes(constantPoolCacheOopDesc::base_offset()) +
- in_bytes(ConstantPoolCacheEntry::flags_offset())), size);
+ __ ld_ptr(cache, constantPoolCacheOopDesc::base_offset() +
+ ConstantPoolCacheEntry::flags_offset(), size);
__ and3(size, 0xFF, size); // argument size in words
__ sll(size, Interpreter::logStackElementSize(), size); // each argument size in bytes
__ add(Lesp, size, Lesp); // pop arguments
@@ -201,9 +202,8 @@
address entry = __ pc();
__ get_constant_pool_cache(LcpoolCache); // load LcpoolCache
{ Label L;
- Address exception_addr (G2_thread, 0, in_bytes(Thread::pending_exception_offset()));
-
- __ ld_ptr(exception_addr, Gtemp);
+ Address exception_addr(G2_thread, Thread::pending_exception_offset());
+ __ ld_ptr(exception_addr, Gtemp); // Load pending exception.
__ tst(Gtemp);
__ brx(Assembler::equal, false, Assembler::pt, L);
__ delayed()->nop();
@@ -282,7 +282,7 @@
// Update standard invocation counters
__ increment_invocation_counter(O0, G3_scratch);
if (ProfileInterpreter) { // %%% Merge this into methodDataOop
- Address interpreter_invocation_counter(Lmethod, 0, in_bytes(methodOopDesc::interpreter_invocation_counter_offset()));
+ Address interpreter_invocation_counter(Lmethod, methodOopDesc::interpreter_invocation_counter_offset());
__ ld(interpreter_invocation_counter, G3_scratch);
__ inc(G3_scratch);
__ st(G3_scratch, interpreter_invocation_counter);
@@ -290,9 +290,9 @@
if (ProfileInterpreter && profile_method != NULL) {
// Test to see if we should create a method data oop
- Address profile_limit(G3_scratch, (address)&InvocationCounter::InterpreterProfileLimit);
- __ sethi(profile_limit);
- __ ld(profile_limit, G3_scratch);
+ AddressLiteral profile_limit(&InvocationCounter::InterpreterProfileLimit);
+ __ sethi(profile_limit, G3_scratch);
+ __ ld(G3_scratch, profile_limit.low10(), G3_scratch);
__ cmp(O0, G3_scratch);
__ br(Assembler::lessUnsigned, false, Assembler::pn, *profile_method_continue);
__ delayed()->nop();
@@ -301,9 +301,9 @@
__ test_method_data_pointer(*profile_method);
}
- Address invocation_limit(G3_scratch, (address)&InvocationCounter::InterpreterInvocationLimit);
- __ sethi(invocation_limit);
- __ ld(invocation_limit, G3_scratch);
+ AddressLiteral invocation_limit(&InvocationCounter::InterpreterInvocationLimit);
+ __ sethi(invocation_limit, G3_scratch);
+ __ ld(G3_scratch, invocation_limit.low10(), G3_scratch);
__ cmp(O0, G3_scratch);
__ br(Assembler::greaterEqualUnsigned, false, Assembler::pn, *overflow);
__ delayed()->nop();
@@ -314,8 +314,7 @@
// ebx - methodOop
//
void InterpreterGenerator::lock_method(void) {
- const Address access_flags (Lmethod, 0, in_bytes(methodOopDesc::access_flags_offset()));
- __ ld(access_flags, O0);
+ __ ld(Lmethod, in_bytes(methodOopDesc::access_flags_offset()), O0); // Load access flags.
#ifdef ASSERT
{ Label ok;
@@ -359,8 +358,7 @@
Register Rscratch,
Register Rscratch2) {
const int page_size = os::vm_page_size();
- Address saved_exception_pc(G2_thread, 0,
- in_bytes(JavaThread::saved_exception_pc_offset()));
+ Address saved_exception_pc(G2_thread, JavaThread::saved_exception_pc_offset());
Label after_frame_check;
assert_different_registers(Rframe_size, Rscratch, Rscratch2);
@@ -372,7 +370,7 @@
__ delayed()->nop();
// get the stack base, and in debug, verify it is non-zero
- __ ld_ptr( G2_thread, in_bytes(Thread::stack_base_offset()), Rscratch );
+ __ ld_ptr( G2_thread, Thread::stack_base_offset(), Rscratch );
#ifdef ASSERT
Label base_not_zero;
__ cmp( Rscratch, G0 );
@@ -384,7 +382,7 @@
// get the stack size, and in debug, verify it is non-zero
assert( sizeof(size_t) == sizeof(intptr_t), "wrong load size" );
- __ ld_ptr( G2_thread, in_bytes(Thread::stack_size_offset()), Rscratch2 );
+ __ ld_ptr( G2_thread, Thread::stack_size_offset(), Rscratch2 );
#ifdef ASSERT
Label size_not_zero;
__ cmp( Rscratch2, G0 );
@@ -459,9 +457,9 @@
// (gri - 2/25/2000)
- const Address size_of_parameters(G5_method, 0, in_bytes(methodOopDesc::size_of_parameters_offset()));
- const Address size_of_locals (G5_method, 0, in_bytes(methodOopDesc::size_of_locals_offset()));
- const Address max_stack (G5_method, 0, in_bytes(methodOopDesc::max_stack_offset()));
+ const Address size_of_parameters(G5_method, methodOopDesc::size_of_parameters_offset());
+ const Address size_of_locals (G5_method, methodOopDesc::size_of_locals_offset());
+ const Address max_stack (G5_method, methodOopDesc::max_stack_offset());
int rounded_vm_local_words = round_to( frame::interpreter_frame_vm_local_words, WordsPerLong );
const int extra_space =
@@ -538,8 +536,8 @@
if (native_call) {
__ mov(G0, Lbcp);
} else {
- __ ld_ptr(Address(G5_method, 0, in_bytes(methodOopDesc::const_offset())), Lbcp );
- __ add(Address(Lbcp, 0, in_bytes(constMethodOopDesc::codes_offset())), Lbcp );
+ __ ld_ptr(G5_method, methodOopDesc::const_offset(), Lbcp);
+ __ add(Lbcp, in_bytes(constMethodOopDesc::codes_offset()), Lbcp);
}
__ mov( G5_method, Lmethod); // set Lmethod
__ get_constant_pool_cache( LcpoolCache ); // set LcpoolCache
@@ -577,8 +575,8 @@
// do nothing for empty methods (do not even increment invocation counter)
if ( UseFastEmptyMethods) {
// If we need a safepoint check, generate full interpreter entry.
- Address sync_state(G3_scratch, SafepointSynchronize::address_of_state());
- __ load_contents(sync_state, G3_scratch);
+ AddressLiteral sync_state(SafepointSynchronize::address_of_state());
+ __ set(sync_state, G3_scratch);
__ cmp(G3_scratch, SafepointSynchronize::_not_synchronized);
__ br(Assembler::notEqual, false, Assembler::pn, slow_path);
__ delayed()->nop();
@@ -616,7 +614,7 @@
if ( UseFastAccessorMethods && !UseCompressedOops ) {
// Check if we need to reach a safepoint and generate full interpreter
// frame if so.
- Address sync_state(G3_scratch, SafepointSynchronize::address_of_state());
+ AddressLiteral sync_state(SafepointSynchronize::address_of_state());
__ load_contents(sync_state, G3_scratch);
__ cmp(G3_scratch, SafepointSynchronize::_not_synchronized);
__ br(Assembler::notEqual, false, Assembler::pn, slow_path);
@@ -631,8 +629,8 @@
// read first instruction word and extract bytecode @ 1 and index @ 2
// get first 4 bytes of the bytecodes (big endian!)
- __ ld_ptr(Address(G5_method, 0, in_bytes(methodOopDesc::const_offset())), G1_scratch);
- __ ld(Address(G1_scratch, 0, in_bytes(constMethodOopDesc::codes_offset())), G1_scratch);
+ __ ld_ptr(G5_method, methodOopDesc::const_offset(), G1_scratch);
+ __ ld(G1_scratch, constMethodOopDesc::codes_offset(), G1_scratch);
// move index @ 2 far left then to the right most two bytes.
__ sll(G1_scratch, 2*BitsPerByte, G1_scratch);
@@ -640,7 +638,7 @@
ConstantPoolCacheEntry::size()) * BytesPerWord), G1_scratch);
// get constant pool cache
- __ ld_ptr(G5_method, in_bytes(methodOopDesc::constants_offset()), G3_scratch);
+ __ ld_ptr(G5_method, methodOopDesc::constants_offset(), G3_scratch);
__ ld_ptr(G3_scratch, constantPoolOopDesc::cache_offset_in_bytes(), G3_scratch);
// get specific constant pool cache entry
@@ -649,7 +647,7 @@
// Check the constant Pool cache entry to see if it has been resolved.
// If not, need the slow path.
ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
- __ ld_ptr(G3_scratch, in_bytes(cp_base_offset + ConstantPoolCacheEntry::indices_offset()), G1_scratch);
+ __ ld_ptr(G3_scratch, cp_base_offset + ConstantPoolCacheEntry::indices_offset(), G1_scratch);
__ srl(G1_scratch, 2*BitsPerByte, G1_scratch);
__ and3(G1_scratch, 0xFF, G1_scratch);
__ cmp(G1_scratch, Bytecodes::_getfield);
@@ -657,8 +655,8 @@
__ delayed()->nop();
// Get the type and return field offset from the constant pool cache
- __ ld_ptr(G3_scratch, in_bytes(cp_base_offset + ConstantPoolCacheEntry::flags_offset()), G1_scratch);
- __ ld_ptr(G3_scratch, in_bytes(cp_base_offset + ConstantPoolCacheEntry::f2_offset()), G3_scratch);
+ __ ld_ptr(G3_scratch, cp_base_offset + ConstantPoolCacheEntry::flags_offset(), G1_scratch);
+ __ ld_ptr(G3_scratch, cp_base_offset + ConstantPoolCacheEntry::f2_offset(), G3_scratch);
Label xreturn_path;
// Need to differentiate between igetfield, agetfield, bgetfield etc.
@@ -717,7 +715,7 @@
// make sure registers are different!
assert_different_registers(G2_thread, G5_method, Gargs, Gtmp1, Gtmp2);
- const Address Laccess_flags (Lmethod, 0, in_bytes(methodOopDesc::access_flags_offset()));
+ const Address Laccess_flags(Lmethod, methodOopDesc::access_flags_offset());
__ verify_oop(G5_method);
@@ -727,7 +725,7 @@
// make sure method is native & not abstract
// rethink these assertions - they can be simplified and shared (gri 2/25/2000)
#ifdef ASSERT
- __ ld(G5_method, in_bytes(methodOopDesc::access_flags_offset()), Gtmp1);
+ __ ld(G5_method, methodOopDesc::access_flags_offset(), Gtmp1);
{
Label L;
__ btst(JVM_ACC_NATIVE, Gtmp1);
@@ -754,10 +752,10 @@
// this slot will be set later, we initialize it to null here just in
// case we get a GC before the actual value is stored later
- __ st_ptr(G0, Address(FP, 0, (frame::interpreter_frame_oop_temp_offset*wordSize) + STACK_BIAS));
+ __ st_ptr(G0, FP, (frame::interpreter_frame_oop_temp_offset * wordSize) + STACK_BIAS);
- const Address do_not_unlock_if_synchronized(G2_thread, 0,
- in_bytes(JavaThread::do_not_unlock_if_synchronized_offset()));
+ const Address do_not_unlock_if_synchronized(G2_thread,
+ JavaThread::do_not_unlock_if_synchronized_offset());
// Since at this point in the method invocation the exception handler
// would try to exit the monitor of synchronized methods which hasn't
// been entered yet, we set the thread local variable
@@ -824,12 +822,13 @@
// get signature handler
{ Label L;
- __ ld_ptr(Address(Lmethod, 0, in_bytes(methodOopDesc::signature_handler_offset())), G3_scratch);
+ Address signature_handler(Lmethod, methodOopDesc::signature_handler_offset());
+ __ ld_ptr(signature_handler, G3_scratch);
__ tst(G3_scratch);
__ brx(Assembler::notZero, false, Assembler::pt, L);
__ delayed()->nop();
__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::prepare_native_call), Lmethod);
- __ ld_ptr(Address(Lmethod, 0, in_bytes(methodOopDesc::signature_handler_offset())), G3_scratch);
+ __ ld_ptr(signature_handler, G3_scratch);
__ bind(L);
}
@@ -842,10 +841,9 @@
// Flush the method pointer to the register save area
__ st_ptr(Lmethod, SP, (Lmethod->sp_offset_in_saved_window() * wordSize) + STACK_BIAS);
__ mov(Llocals, O1);
+
// calculate where the mirror handle body is allocated in the interpreter frame:
-
- Address mirror(FP, 0, (frame::interpreter_frame_oop_temp_offset*wordSize) + STACK_BIAS);
- __ add(mirror, O2);
+ __ add(FP, (frame::interpreter_frame_oop_temp_offset * wordSize) + STACK_BIAS, O2);
// Calculate current frame size
__ sub(SP, FP, O3); // Calculate negative of current frame size
@@ -882,14 +880,13 @@
__ ld(Laccess_flags, O0);
__ btst(JVM_ACC_STATIC, O0);
__ br( Assembler::zero, false, Assembler::pt, not_static);
- __ delayed()->
- // get native function entry point(O0 is a good temp until the very end)
- ld_ptr(Address(Lmethod, 0, in_bytes(methodOopDesc::native_function_offset())), O0);
+ // get native function entry point(O0 is a good temp until the very end)
+ __ delayed()->ld_ptr(Lmethod, in_bytes(methodOopDesc::native_function_offset()), O0);
// for static methods insert the mirror argument
const int mirror_offset = klassOopDesc::klass_part_offset_in_bytes() + Klass::java_mirror_offset_in_bytes();
- __ ld_ptr(Address(Lmethod, 0, in_bytes(methodOopDesc:: constants_offset())), O1);
- __ ld_ptr(Address(O1, 0, constantPoolOopDesc::pool_holder_offset_in_bytes()), O1);
+ __ ld_ptr(Lmethod, methodOopDesc:: constants_offset(), O1);
+ __ ld_ptr(O1, constantPoolOopDesc::pool_holder_offset_in_bytes(), O1);
__ ld_ptr(O1, mirror_offset, O1);
#ifdef ASSERT
if (!PrintSignatureHandlers) // do not dirty the output with this
@@ -944,15 +941,13 @@
__ flush_windows();
// mark windows as flushed
- Address flags(G2_thread,
- 0,
- in_bytes(JavaThread::frame_anchor_offset()) + in_bytes(JavaFrameAnchor::flags_offset()));
+ Address flags(G2_thread, JavaThread::frame_anchor_offset() + JavaFrameAnchor::flags_offset());
__ set(JavaFrameAnchor::flushed, G3_scratch);
__ st(G3_scratch, flags);
// Transition from _thread_in_Java to _thread_in_native. We are already safepoint ready.
- Address thread_state(G2_thread, 0, in_bytes(JavaThread::thread_state_offset()));
+ Address thread_state(G2_thread, JavaThread::thread_state_offset());
#ifdef ASSERT
{ Label L;
__ ld(thread_state, G3_scratch);
@@ -982,7 +977,7 @@
// Block, if necessary, before resuming in _thread_in_Java state.
// In order for GC to work, don't clear the last_Java_sp until after blocking.
{ Label no_block;
- Address sync_state(G3_scratch, SafepointSynchronize::address_of_state());
+ AddressLiteral sync_state(SafepointSynchronize::address_of_state());
// Switch thread to "native transition" state before reading the synchronization state.
// This additional state is necessary because reading and testing the synchronization
@@ -1009,10 +1004,8 @@
__ cmp(G3_scratch, SafepointSynchronize::_not_synchronized);
Label L;
- Address suspend_state(G2_thread, 0, in_bytes(JavaThread::suspend_flags_offset()));
__ br(Assembler::notEqual, false, Assembler::pn, L);
- __ delayed()->
- ld(suspend_state, G3_scratch);
+ __ delayed()->ld(G2_thread, JavaThread::suspend_flags_offset(), G3_scratch);
__ cmp(G3_scratch, 0);
__ br(Assembler::equal, false, Assembler::pt, no_block);
__ delayed()->nop();
@@ -1054,7 +1047,7 @@
__ st(G3_scratch, thread_state);
// reset handle block
- __ ld_ptr(G2_thread, in_bytes(JavaThread::active_handles_offset()), G3_scratch);
+ __ ld_ptr(G2_thread, JavaThread::active_handles_offset(), G3_scratch);
__ st_ptr(G0, G3_scratch, JNIHandleBlock::top_offset_in_bytes());
// If we have an oop result store it where it will be safe for any further gc
@@ -1083,8 +1076,7 @@
// handle exceptions (exception handling will handle unlocking!)
{ Label L;
- Address exception_addr (G2_thread, 0, in_bytes(Thread::pending_exception_offset()));
-
+ Address exception_addr(G2_thread, Thread::pending_exception_offset());
__ ld_ptr(exception_addr, Gtemp);
__ tst(Gtemp);
__ brx(Assembler::equal, false, Assembler::pt, L);
@@ -1170,11 +1162,11 @@
// make sure registers are different!
assert_different_registers(G2_thread, G5_method, Gargs, Gtmp1, Gtmp2);
- const Address size_of_parameters(G5_method, 0, in_bytes(methodOopDesc::size_of_parameters_offset()));
- const Address size_of_locals (G5_method, 0, in_bytes(methodOopDesc::size_of_locals_offset()));
+ const Address size_of_parameters(G5_method, methodOopDesc::size_of_parameters_offset());
+ const Address size_of_locals (G5_method, methodOopDesc::size_of_locals_offset());
// Seems like G5_method is live at the point this is used. So we could make this look consistent
// and use in the asserts.
- const Address access_flags (Lmethod, 0, in_bytes(methodOopDesc::access_flags_offset()));
+ const Address access_flags (Lmethod, methodOopDesc::access_flags_offset());
__ verify_oop(G5_method);
@@ -1184,7 +1176,7 @@
// make sure method is not native & not abstract
// rethink these assertions - they can be simplified and shared (gri 2/25/2000)
#ifdef ASSERT
- __ ld(G5_method, in_bytes(methodOopDesc::access_flags_offset()), Gtmp1);
+ __ ld(G5_method, methodOopDesc::access_flags_offset(), Gtmp1);
{
Label L;
__ btst(JVM_ACC_NATIVE, Gtmp1);
@@ -1239,8 +1231,8 @@
__ brx( Assembler::lessEqualUnsigned, true, Assembler::pt, clear_loop );
__ delayed()->st_ptr( init_value, O2, 0 );
- const Address do_not_unlock_if_synchronized(G2_thread, 0,
- in_bytes(JavaThread::do_not_unlock_if_synchronized_offset()));
+ const Address do_not_unlock_if_synchronized(G2_thread,
+ JavaThread::do_not_unlock_if_synchronized_offset());
// Since at this point in the method invocation the exception handler
// would try to exit the monitor of synchronized methods which hasn't
// been entered yet, we set the thread local variable
@@ -1716,7 +1708,7 @@
//
Interpreter::_remove_activation_preserving_args_entry = __ pc();
- Address popframe_condition_addr (G2_thread, 0, in_bytes(JavaThread::popframe_condition_offset()));
+ Address popframe_condition_addr(G2_thread, JavaThread::popframe_condition_offset());
// Set the popframe_processing bit in popframe_condition indicating that we are
// currently handling popframe, so that call_VMs that may happen later do not trigger new
// popframe handling cycles.
@@ -1758,7 +1750,7 @@
__ call_VM_leaf(L7_thread_cache, CAST_FROM_FN_PTR(address, Deoptimization::popframe_preserve_args), G2_thread, Gtmp1, Gtmp2);
// Inform deoptimization that it is responsible for restoring these arguments
__ set(JavaThread::popframe_force_deopt_reexecution_bit, Gtmp1);
- Address popframe_condition_addr(G2_thread, 0, in_bytes(JavaThread::popframe_condition_offset()));
+ Address popframe_condition_addr(G2_thread, JavaThread::popframe_condition_offset());
__ st(Gtmp1, popframe_condition_addr);
// Return from the current method
@@ -1807,7 +1799,7 @@
__ verify_oop(Oexception);
const int return_reg_adjustment = frame::pc_return_offset;
- Address issuing_pc_addr(I7, 0, return_reg_adjustment);
+ Address issuing_pc_addr(I7, return_reg_adjustment);
// We are done with this activation frame; find out where to go next.
// The continuation point will be an exception handler, which expects
@@ -1853,8 +1845,8 @@
__ empty_expression_stack();
__ load_earlyret_value(state);
- __ ld_ptr(Address(G2_thread, 0, in_bytes(JavaThread::jvmti_thread_state_offset())), G3_scratch);
- Address cond_addr(G3_scratch, 0, in_bytes(JvmtiThreadState::earlyret_state_offset()));
+ __ ld_ptr(G2_thread, JavaThread::jvmti_thread_state_offset(), G3_scratch);
+ Address cond_addr(G3_scratch, JvmtiThreadState::earlyret_state_offset());
// Clear the earlyret state
__ stw(G0 /* JvmtiThreadState::earlyret_inactive */, cond_addr);
@@ -1921,43 +1913,33 @@
// helpers for generate_and_dispatch
void TemplateInterpreterGenerator::count_bytecode() {
- Address c(G3_scratch, (address)&BytecodeCounter::_counter_value);
- __ load_contents(c, G4_scratch);
- __ inc(G4_scratch);
- __ st(G4_scratch, c);
+ __ inc_counter(&BytecodeCounter::_counter_value, G3_scratch, G4_scratch);
}
void TemplateInterpreterGenerator::histogram_bytecode(Template* t) {
- Address bucket( G3_scratch, (address) &BytecodeHistogram::_counters[t->bytecode()] );
- __ load_contents(bucket, G4_scratch);
- __ inc(G4_scratch);
- __ st(G4_scratch, bucket);
+ __ inc_counter(&BytecodeHistogram::_counters[t->bytecode()], G3_scratch, G4_scratch);
}
void TemplateInterpreterGenerator::histogram_bytecode_pair(Template* t) {
- address index_addr = (address)&BytecodePairHistogram::_index;
- Address index(G3_scratch, index_addr);
-
- address counters_addr = (address)&BytecodePairHistogram::_counters;
- Address counters(G3_scratch, counters_addr);
+ AddressLiteral index (&BytecodePairHistogram::_index);
+ AddressLiteral counters((address) &BytecodePairHistogram::_counters);
// get index, shift out old bytecode, bring in new bytecode, and store it
// _index = (_index >> log2_number_of_codes) |
// (bytecode << log2_number_of_codes);
-
- __ load_contents( index, G4_scratch );
+ __ load_contents(index, G4_scratch);
__ srl( G4_scratch, BytecodePairHistogram::log2_number_of_codes, G4_scratch );
__ set( ((int)t->bytecode()) << BytecodePairHistogram::log2_number_of_codes, G3_scratch );
__ or3( G3_scratch, G4_scratch, G4_scratch );
- __ store_contents( G4_scratch, index );
+ __ store_contents(G4_scratch, index, G3_scratch);
// bump bucket contents
// _counters[_index] ++;
- __ load_address( counters ); // loads into G3_scratch
+ __ set(counters, G3_scratch); // loads into G3_scratch
__ sll( G4_scratch, LogBytesPerWord, G4_scratch ); // Index is word address
__ add (G3_scratch, G4_scratch, G3_scratch); // Add in index
__ ld (G3_scratch, 0, G4_scratch);
@@ -1978,9 +1960,9 @@
void TemplateInterpreterGenerator::stop_interpreter_at() {
- Address counter(G3_scratch , (address)&BytecodeCounter::_counter_value);
- __ load_contents (counter, G3_scratch );
- Address stop_at(G4_scratch, (address)&StopInterpreterAt);
+ AddressLiteral counter(&BytecodeCounter::_counter_value);
+ __ load_contents(counter, G3_scratch);
+ AddressLiteral stop_at(&StopInterpreterAt);
__ load_ptr_contents(stop_at, G4_scratch);
__ cmp(G3_scratch, G4_scratch);
__ breakpoint_trap(Assembler::equal);
--- a/hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -131,7 +131,7 @@
Address TemplateTable::at_bcp(int offset) {
assert(_desc->uses_bcp(), "inconsistent uses_bcp information");
- return Address( Lbcp, 0, offset);
+ return Address(Lbcp, offset);
}
@@ -217,9 +217,9 @@
case 1: p = &one; break;
case 2: p = &two; break;
}
- Address a(G3_scratch, (address)p);
- __ sethi(a);
- __ ldf(FloatRegisterImpl::S, a, Ftos_f);
+ AddressLiteral a(p);
+ __ sethi(a, G3_scratch);
+ __ ldf(FloatRegisterImpl::S, G3_scratch, a.low10(), Ftos_f);
}
@@ -232,9 +232,9 @@
case 0: p = &zero; break;
case 1: p = &one; break;
}
- Address a(G3_scratch, (address)p);
- __ sethi(a);
- __ ldf(FloatRegisterImpl::D, a, Ftos_d);
+ AddressLiteral a(p);
+ __ sethi(a, G3_scratch);
+ __ ldf(FloatRegisterImpl::D, G3_scratch, a.low10(), Ftos_d);
}
@@ -1548,7 +1548,7 @@
// non-JSR normal-branch stuff occurring below.
if( is_jsr ) {
// compute return address as bci in Otos_i
- __ ld_ptr(Address(Lmethod, 0, in_bytes(methodOopDesc::const_offset())), G3_scratch);
+ __ ld_ptr(Lmethod, methodOopDesc::const_offset(), G3_scratch);
__ sub(Lbcp, G3_scratch, G3_scratch);
__ sub(G3_scratch, in_bytes(constMethodOopDesc::codes_offset()) - (is_wide ? 5 : 3), Otos_i);
@@ -1665,7 +1665,7 @@
__ profile_ret(vtos, Otos_i, G4_scratch);
- __ ld_ptr(Address(Lmethod, 0, in_bytes(methodOopDesc::const_offset())), G3_scratch);
+ __ ld_ptr(Lmethod, methodOopDesc::const_offset(), G3_scratch);
__ add(G3_scratch, Otos_i, G3_scratch);
__ add(G3_scratch, in_bytes(constMethodOopDesc::codes_offset()), Lbcp);
__ dispatch_next(vtos);
@@ -1680,7 +1680,7 @@
__ profile_ret(vtos, Otos_i, G4_scratch);
- __ ld_ptr(Address(Lmethod, 0, in_bytes(methodOopDesc::const_offset())), G3_scratch);
+ __ ld_ptr(Lmethod, methodOopDesc::const_offset(), G3_scratch);
__ add(G3_scratch, Otos_i, G3_scratch);
__ add(G3_scratch, in_bytes(constMethodOopDesc::codes_offset()), Lbcp);
__ dispatch_next(vtos);
@@ -1968,8 +1968,8 @@
Label resolved;
__ get_cache_and_index_at_bcp(Rcache, index, 1);
- __ ld_ptr(Address(Rcache, 0, in_bytes(constantPoolCacheOopDesc::base_offset() +
- ConstantPoolCacheEntry::indices_offset())), Lbyte_code);
+ __ ld_ptr(Rcache, constantPoolCacheOopDesc::base_offset() +
+ ConstantPoolCacheEntry::indices_offset(), Lbyte_code);
__ srl( Lbyte_code, shift_count, Lbyte_code );
__ and3( Lbyte_code, 0xFF, Lbyte_code );
@@ -2029,11 +2029,11 @@
resolve_cache_and_index(byte_no, Rcache, Rscratch);
}
- __ ld_ptr(Address(Rcache, 0, method_offset), Rmethod);
+ __ ld_ptr(Rcache, method_offset, Rmethod);
if (Ritable_index != noreg) {
- __ ld_ptr(Address(Rcache, 0, index_offset), Ritable_index);
+ __ ld_ptr(Rcache, index_offset, Ritable_index);
}
- __ ld_ptr(Address(Rcache, 0, flags_offset), Rflags);
+ __ ld_ptr(Rcache, flags_offset, Rflags);
}
// The Rcache register must be set before call
@@ -2047,13 +2047,10 @@
ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
- __ ld_ptr(Address(Rcache, 0, in_bytes(cp_base_offset +
- ConstantPoolCacheEntry::flags_offset())), Rflags);
- __ ld_ptr(Address(Rcache, 0, in_bytes(cp_base_offset +
- ConstantPoolCacheEntry::f2_offset())), Roffset);
+ __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::flags_offset(), Rflags);
+ __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::f2_offset(), Roffset);
if (is_static) {
- __ ld_ptr(Address(Rcache, 0, in_bytes(cp_base_offset +
- ConstantPoolCacheEntry::f1_offset())), Robj);
+ __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::f1_offset(), Robj);
}
}
@@ -2070,9 +2067,7 @@
// the time to call into the VM.
Label Label1;
assert_different_registers(Rcache, index, G1_scratch);
- Address get_field_access_count_addr(G1_scratch,
- (address)JvmtiExport::get_field_access_count_addr(),
- relocInfo::none);
+ AddressLiteral get_field_access_count_addr(JvmtiExport::get_field_access_count_addr());
__ load_contents(get_field_access_count_addr, G1_scratch);
__ tst(G1_scratch);
__ br(Assembler::zero, false, Assembler::pt, Label1);
@@ -2293,7 +2288,7 @@
__ get_cache_and_index_at_bcp(Rcache, index, 1);
jvmti_post_field_access(Rcache, index, /*is_static*/false, /*has_tos*/true);
- __ ld_ptr(Address(Rcache, 0, in_bytes(cp_base_offset + ConstantPoolCacheEntry::f2_offset())), Roffset);
+ __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::f2_offset(), Roffset);
__ null_check(Otos_i);
__ verify_oop(Otos_i);
@@ -2304,7 +2299,7 @@
Assembler::Membar_mask_bits(Assembler::LoadLoad | Assembler::LoadStore);
if (__ membar_has_effect(membar_bits)) {
// Get volatile flag
- __ ld_ptr(Address(Rcache, 0, in_bytes(cp_base_offset + ConstantPoolCacheEntry::f2_offset())), Rflags);
+ __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::f2_offset(), Rflags);
__ set((1 << ConstantPoolCacheEntry::volatileField), Lscratch);
}
@@ -2355,7 +2350,7 @@
// Check to see if a field modification watch has been set before we take
// the time to call into the VM.
Label done;
- Address get_field_modification_count_addr(G4_scratch, (address)JvmtiExport::get_field_modification_count_addr(), relocInfo::none);
+ AddressLiteral get_field_modification_count_addr(JvmtiExport::get_field_modification_count_addr());
__ load_contents(get_field_modification_count_addr, G4_scratch);
__ tst(G4_scratch);
__ br(Assembler::zero, false, Assembler::pt, done);
@@ -2408,9 +2403,7 @@
// the time to call into the VM.
Label Label1;
assert_different_registers(Rcache, index, G1_scratch);
- Address get_field_modification_count_addr(G1_scratch,
- (address)JvmtiExport::get_field_modification_count_addr(),
- relocInfo::none);
+ AddressLiteral get_field_modification_count_addr(JvmtiExport::get_field_modification_count_addr());
__ load_contents(get_field_modification_count_addr, G1_scratch);
__ tst(G1_scratch);
__ br(Assembler::zero, false, Assembler::pt, Label1);
@@ -2433,7 +2426,7 @@
// the type to determine where the object is.
Label two_word, valsizeknown;
- __ ld_ptr(Address(G1_scratch, 0, in_bytes(cp_base_offset + ConstantPoolCacheEntry::flags_offset())), Rflags);
+ __ ld_ptr(G1_scratch, cp_base_offset + ConstantPoolCacheEntry::flags_offset(), Rflags);
__ mov(Lesp, G4_scratch);
__ srl(Rflags, ConstantPoolCacheEntry::tosBits, Rflags);
// Make sure we don't need to mask Rflags for tosBits after the above shift
@@ -2689,8 +2682,7 @@
Label notVolatile, checkVolatile, exit;
if (__ membar_has_effect(read_bits) || __ membar_has_effect(write_bits)) {
- __ ld_ptr(Address(Rcache, 0, in_bytes(cp_base_offset +
- ConstantPoolCacheEntry::flags_offset())), Rflags);
+ __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::flags_offset(), Rflags);
__ set((1 << ConstantPoolCacheEntry::volatileField), Lscratch);
__ and3(Rflags, Lscratch, Lscratch);
if (__ membar_has_effect(read_bits)) {
@@ -2702,8 +2694,7 @@
}
}
- __ ld_ptr(Address(Rcache, 0, in_bytes(cp_base_offset +
- ConstantPoolCacheEntry::f2_offset())), Roffset);
+ __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::f2_offset(), Roffset);
pop_and_check_object(Rclass);
switch (bytecode()) {
@@ -2755,7 +2746,7 @@
// access constant pool cache (is resolved)
__ get_cache_and_index_at_bcp(Rcache, G4_scratch, 2);
- __ ld_ptr(Address(Rcache, 0, in_bytes(constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::f2_offset())), Roffset);
+ __ ld_ptr(Rcache, constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::f2_offset(), Roffset);
__ add(Lbcp, 1, Lbcp); // needed to report exception at the correct bcp
__ verify_oop(Rreceiver);
@@ -2775,7 +2766,7 @@
if (__ membar_has_effect(membar_bits)) {
// Get is_volatile value in Rflags and check if membar is needed
- __ ld_ptr(Address(Rcache, 0, in_bytes(constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::flags_offset())), Rflags);
+ __ ld_ptr(Rcache, constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::flags_offset(), Rflags);
// Test volatile
Label notVolatile;
@@ -2853,8 +2844,8 @@
__ verify_oop(O0);
// get return address
- Address table(Rtemp, (address)Interpreter::return_3_addrs_by_index_table());
- __ load_address(table);
+ AddressLiteral table(Interpreter::return_3_addrs_by_index_table());
+ __ set(table, Rtemp);
__ srl(Rret, ConstantPoolCacheEntry::tosBits, Rret); // get return type
// Make sure we don't need to mask Rret for tosBits after the above shift
ConstantPoolCacheEntry::verify_tosBits();
@@ -2886,7 +2877,7 @@
__ verify_oop(G5_method);
// Load receiver from stack slot
- __ lduh(Address(G5_method, 0, in_bytes(methodOopDesc::size_of_parameters_offset())), G4_scratch);
+ __ lduh(G5_method, in_bytes(methodOopDesc::size_of_parameters_offset()), G4_scratch);
__ load_receiver(G4_scratch, O0);
// receiver NULL check
@@ -2895,8 +2886,8 @@
__ profile_final_call(O4);
// get return address
- Address table(Rtemp, (address)Interpreter::return_3_addrs_by_index_table());
- __ load_address(table);
+ AddressLiteral table(Interpreter::return_3_addrs_by_index_table());
+ __ set(table, Rtemp);
__ srl(Rret, ConstantPoolCacheEntry::tosBits, Rret); // get return type
// Make sure we don't need to mask Rret for tosBits after the above shift
ConstantPoolCacheEntry::verify_tosBits();
@@ -2920,7 +2911,7 @@
__ verify_oop(G5_method);
- __ lduh(Address(G5_method, 0, in_bytes(methodOopDesc::size_of_parameters_offset())), G4_scratch);
+ __ lduh(G5_method, in_bytes(methodOopDesc::size_of_parameters_offset()), G4_scratch);
__ load_receiver(G4_scratch, O0);
// receiver NULL check
@@ -2929,8 +2920,8 @@
__ profile_call(O4);
// get return address
- Address table(Rtemp, (address)Interpreter::return_3_addrs_by_index_table());
- __ load_address(table);
+ AddressLiteral table(Interpreter::return_3_addrs_by_index_table());
+ __ set(table, Rtemp);
__ srl(Rret, ConstantPoolCacheEntry::tosBits, Rret); // get return type
// Make sure we don't need to mask Rret for tosBits after the above shift
ConstantPoolCacheEntry::verify_tosBits();
@@ -2956,8 +2947,8 @@
__ profile_call(O4);
// get return address
- Address table(Rtemp, (address)Interpreter::return_3_addrs_by_index_table());
- __ load_address(table);
+ AddressLiteral table(Interpreter::return_3_addrs_by_index_table());
+ __ set(table, Rtemp);
__ srl(Rret, ConstantPoolCacheEntry::tosBits, Rret); // get return type
// Make sure we don't need to mask Rret for tosBits after the above shift
ConstantPoolCacheEntry::verify_tosBits();
@@ -3021,8 +3012,8 @@
__ mov(Rflags, Rret);
// get return address
- Address table(Rscratch, (address)Interpreter::return_5_addrs_by_index_table());
- __ load_address(table);
+ AddressLiteral table(Interpreter::return_5_addrs_by_index_table());
+ __ set(table, Rscratch);
__ srl(Rret, ConstantPoolCacheEntry::tosBits, Rret); // get return type
// Make sure we don't need to mask Rret for tosBits after the above shift
ConstantPoolCacheEntry::verify_tosBits();
@@ -3059,7 +3050,7 @@
Label search;
Register Rtemp = Rflags;
- __ ld(Address(RklassOop, 0, instanceKlass::vtable_length_offset() * wordSize), Rtemp);
+ __ ld(RklassOop, instanceKlass::vtable_length_offset() * wordSize, Rtemp);
if (align_object_offset(1) > 1) {
__ round_to(Rtemp, align_object_offset(1));
}
@@ -3125,6 +3116,24 @@
}
+void TemplateTable::invokedynamic(int byte_no) {
+ transition(vtos, vtos);
+
+ if (!EnableInvokeDynamic) {
+ // We should not encounter this bytecode if !EnableInvokeDynamic.
+ // The verifier will stop it. However, if we get past the verifier,
+ // this will stop the thread in a reasonable way, without crashing the JVM.
+ __ call_VM(noreg, CAST_FROM_FN_PTR(address,
+ InterpreterRuntime::throw_IncompatibleClassChangeError));
+ // the call_VM checks for exception, so we should never return here.
+ __ should_not_reach_here();
+ return;
+ }
+
+ __ stop("invokedynamic NYI");//6815692//
+}
+
+
//----------------------------------------------------------------------------------------------------
// Allocation
@@ -3624,9 +3633,9 @@
transition(vtos, vtos);
__ ldub(Lbcp, 1, G3_scratch);// get next bc
__ sll(G3_scratch, LogBytesPerWord, G3_scratch);
- Address ep(G4_scratch, (address)Interpreter::_wentry_point);
- __ load_address(ep);
- __ ld_ptr(ep.base(), G3_scratch, G3_scratch);
+ AddressLiteral ep(Interpreter::_wentry_point);
+ __ set(ep, G4_scratch);
+ __ ld_ptr(G4_scratch, G3_scratch, G3_scratch);
__ jmp(G3_scratch, G0);
__ delayed()->nop();
// Note: the Lbcp increment step is part of the individual wide bytecode implementations
--- a/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -48,11 +48,7 @@
#ifndef PRODUCT
if (CountCompiledCalls) {
- Address ctr(G5, SharedRuntime::nof_megamorphic_calls_addr());
- __ sethi(ctr);
- __ ld(ctr, G3_scratch);
- __ inc(G3_scratch);
- __ st(G3_scratch, ctr);
+ __ inc_counter(SharedRuntime::nof_megamorphic_calls_addr(), G5, G3_scratch);
}
#endif /* PRODUCT */
@@ -154,11 +150,7 @@
#ifndef PRODUCT
if (CountCompiledCalls) {
- Address ctr(L0, SharedRuntime::nof_megamorphic_calls_addr());
- __ sethi(ctr);
- __ ld(ctr, L1);
- __ inc(L1);
- __ st(L1, ctr);
+ __ inc_counter(SharedRuntime::nof_megamorphic_calls_addr(), L0, L1);
}
#endif /* PRODUCT */
@@ -198,8 +190,8 @@
__ delayed()->nop();
__ bind(throw_icce);
- Address icce(G3_scratch, StubRoutines::throw_IncompatibleClassChangeError_entry());
- __ jump_to(icce, 0);
+ AddressLiteral icce(StubRoutines::throw_IncompatibleClassChangeError_entry());
+ __ jump_to(icce, G3_scratch);
__ delayed()->restore();
masm->flush();
--- a/hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -189,20 +189,33 @@
}
-void InterpreterMacroAssembler::get_cache_and_index_at_bcp(Register cache, Register index, int bcp_offset) {
+void InterpreterMacroAssembler::get_cache_index_at_bcp(Register reg, int bcp_offset, bool giant_index) {
assert(bcp_offset > 0, "bcp is still pointing to start of bytecode");
+ if (!giant_index) {
+ load_unsigned_short(reg, Address(rsi, bcp_offset));
+ } else {
+ assert(EnableInvokeDynamic, "giant index used only for EnableInvokeDynamic");
+ movl(reg, Address(rsi, bcp_offset));
+ assert(constantPoolCacheOopDesc::decode_secondary_index(~123) == 123, "else change next line");
+ notl(reg); // convert to plain index
+ }
+}
+
+
+void InterpreterMacroAssembler::get_cache_and_index_at_bcp(Register cache, Register index,
+ int bcp_offset, bool giant_index) {
assert(cache != index, "must use different registers");
- load_unsigned_short(index, Address(rsi, bcp_offset));
+ get_cache_index_at_bcp(index, bcp_offset, giant_index);
movptr(cache, Address(rbp, frame::interpreter_frame_cache_offset * wordSize));
assert(sizeof(ConstantPoolCacheEntry) == 4*wordSize, "adjust code below");
shlptr(index, 2); // convert from field index to ConstantPoolCacheEntry index
}
-void InterpreterMacroAssembler::get_cache_entry_pointer_at_bcp(Register cache, Register tmp, int bcp_offset) {
- assert(bcp_offset > 0, "bcp is still pointing to start of bytecode");
+void InterpreterMacroAssembler::get_cache_entry_pointer_at_bcp(Register cache, Register tmp,
+ int bcp_offset, bool giant_index) {
assert(cache != tmp, "must use different register");
- load_unsigned_short(tmp, Address(rsi, bcp_offset));
+ get_cache_index_at_bcp(tmp, bcp_offset, giant_index);
assert(sizeof(ConstantPoolCacheEntry) == 4*wordSize, "adjust code below");
// convert from field index to ConstantPoolCacheEntry index
// and from word offset to byte offset
@@ -1214,7 +1227,9 @@
}
-void InterpreterMacroAssembler::profile_virtual_call(Register receiver, Register mdp, Register reg2) {
+void InterpreterMacroAssembler::profile_virtual_call(Register receiver, Register mdp,
+ Register reg2,
+ bool receiver_can_be_null) {
if (ProfileInterpreter) {
Label profile_continue;
@@ -1224,8 +1239,15 @@
// We are making a call. Increment the count.
increment_mdp_data_at(mdp, in_bytes(CounterData::count_offset()));
+ Label skip_receiver_profile;
+ if (receiver_can_be_null) {
+ testptr(receiver, receiver);
+ jcc(Assembler::zero, skip_receiver_profile);
+ }
+
// Record the receiver type.
record_klass_in_profile(receiver, mdp, reg2);
+ bind(skip_receiver_profile);
// The method data pointer needs to be updated to reflect the new target.
update_mdp_by_constant(mdp,
--- a/hotspot/src/cpu/x86/vm/interp_masm_x86_32.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/x86/vm/interp_masm_x86_32.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -76,8 +76,9 @@
void get_cpool_and_tags(Register cpool, Register tags) { get_constant_pool(cpool); movptr(tags, Address(cpool, constantPoolOopDesc::tags_offset_in_bytes()));
}
void get_unsigned_2_byte_index_at_bcp(Register reg, int bcp_offset);
- void get_cache_and_index_at_bcp(Register cache, Register index, int bcp_offset);
- void get_cache_entry_pointer_at_bcp(Register cache, Register tmp, int bcp_offset);
+ void get_cache_and_index_at_bcp(Register cache, Register index, int bcp_offset, bool giant_index = false);
+ void get_cache_entry_pointer_at_bcp(Register cache, Register tmp, int bcp_offset, bool giant_index = false);
+ void get_cache_index_at_bcp(Register index, int bcp_offset, bool giant_index = false);
// Expression stack
void f2ieee(); // truncate ftos to 32bits
@@ -226,7 +227,8 @@
void profile_not_taken_branch(Register mdp);
void profile_call(Register mdp);
void profile_final_call(Register mdp);
- void profile_virtual_call(Register receiver, Register mdp, Register scratch2);
+ void profile_virtual_call(Register receiver, Register mdp, Register scratch2,
+ bool receiver_can_be_null = false);
void profile_ret(Register return_bci, Register mdp);
void profile_null_seen(Register mdp);
void profile_typecheck(Register mdp, Register klass, Register scratch);
--- a/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -156,13 +156,22 @@
}
-address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step) {
+address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step, bool unbox) {
+ TosState incoming_state = state;
+ if (EnableInvokeDynamic) {
+ if (unbox) {
+ incoming_state = atos;
+ }
+ } else {
+ assert(!unbox, "old behavior");
+ }
+
Label interpreter_entry;
address compiled_entry = __ pc();
#ifdef COMPILER2
// The FPU stack is clean if UseSSE >= 2 but must be cleaned in other cases
- if ((state == ftos && UseSSE < 1) || (state == dtos && UseSSE < 2)) {
+ if ((incoming_state == ftos && UseSSE < 1) || (incoming_state == dtos && UseSSE < 2)) {
for (int i = 1; i < 8; i++) {
__ ffree(i);
}
@@ -170,7 +179,7 @@
__ empty_FPU_stack();
}
#endif
- if ((state == ftos && UseSSE < 1) || (state == dtos && UseSSE < 2)) {
+ if ((incoming_state == ftos && UseSSE < 1) || (incoming_state == dtos && UseSSE < 2)) {
__ MacroAssembler::verify_FPU(1, "generate_return_entry_for compiled");
} else {
__ MacroAssembler::verify_FPU(0, "generate_return_entry_for compiled");
@@ -186,12 +195,12 @@
// In SSE mode, interpreter returns FP results in xmm0 but they need
// to end up back on the FPU so it can operate on them.
- if (state == ftos && UseSSE >= 1) {
+ if (incoming_state == ftos && UseSSE >= 1) {
__ subptr(rsp, wordSize);
__ movflt(Address(rsp, 0), xmm0);
__ fld_s(Address(rsp, 0));
__ addptr(rsp, wordSize);
- } else if (state == dtos && UseSSE >= 2) {
+ } else if (incoming_state == dtos && UseSSE >= 2) {
__ subptr(rsp, 2*wordSize);
__ movdbl(Address(rsp, 0), xmm0);
__ fld_d(Address(rsp, 0));
@@ -207,13 +216,102 @@
__ restore_bcp();
__ restore_locals();
- __ get_cache_and_index_at_bcp(rbx, rcx, 1);
+
+ Label L_fail;
+
+ if (unbox && state != atos) {
+ // cast and unbox
+ BasicType type = as_BasicType(state);
+ if (type == T_BYTE) type = T_BOOLEAN; // FIXME
+ KlassHandle boxk = SystemDictionaryHandles::box_klass(type);
+ __ mov32(rbx, ExternalAddress((address) boxk.raw_value()));
+ __ testl(rax, rax);
+ Label L_got_value, L_get_value;
+ // convert nulls to zeroes (avoid NPEs here)
+ if (!(type == T_FLOAT || type == T_DOUBLE)) {
+ // if rax already contains zero bits, forge ahead
+ __ jcc(Assembler::zero, L_got_value);
+ } else {
+ __ jcc(Assembler::notZero, L_get_value);
+ __ fldz();
+ __ jmp(L_got_value);
+ }
+ __ bind(L_get_value);
+ __ cmp32(rbx, Address(rax, oopDesc::klass_offset_in_bytes()));
+ __ jcc(Assembler::notEqual, L_fail);
+ int offset = java_lang_boxing_object::value_offset_in_bytes(type);
+ // Cf. TemplateTable::getfield_or_static
+ switch (type) {
+ case T_BYTE: // fall through:
+ case T_BOOLEAN: __ load_signed_byte(rax, Address(rax, offset)); break;
+ case T_CHAR: __ load_unsigned_short(rax, Address(rax, offset)); break;
+ case T_SHORT: __ load_signed_short(rax, Address(rax, offset)); break;
+ case T_INT: __ movl(rax, Address(rax, offset)); break;
+ case T_FLOAT: __ fld_s(Address(rax, offset)); break;
+ case T_DOUBLE: __ fld_d(Address(rax, offset)); break;
+ // Access to java.lang.Double.value does not need to be atomic:
+ case T_LONG: { __ movl(rdx, Address(rax, offset + 4));
+ __ movl(rax, Address(rax, offset + 0)); } break;
+ default: ShouldNotReachHere();
+ }
+ __ bind(L_got_value);
+ }
+
+ Label L_got_cache, L_giant_index;
+ if (EnableInvokeDynamic) {
+ __ cmpb(Address(rsi, 0), Bytecodes::_invokedynamic);
+ __ jcc(Assembler::equal, L_giant_index);
+ }
+ __ get_cache_and_index_at_bcp(rbx, rcx, 1, false);
+ __ bind(L_got_cache);
+ if (unbox && state == atos) {
+ // insert a casting conversion, to keep verifier sane
+ Label L_ok, L_ok_pops;
+ __ testl(rax, rax);
+ __ jcc(Assembler::zero, L_ok);
+ __ push(rax); // save the object to check
+ __ push(rbx); // save CP cache reference
+ __ movl(rdx, Address(rax, oopDesc::klass_offset_in_bytes()));
+ __ movl(rbx, Address(rbx, rcx,
+ Address::times_4, constantPoolCacheOopDesc::base_offset() +
+ ConstantPoolCacheEntry::f1_offset()));
+ __ movl(rbx, Address(rbx, __ delayed_value(sun_dyn_CallSiteImpl::type_offset_in_bytes, rcx)));
+ __ movl(rbx, Address(rbx, __ delayed_value(java_dyn_MethodType::rtype_offset_in_bytes, rcx)));
+ __ movl(rax, Address(rbx, __ delayed_value(java_lang_Class::klass_offset_in_bytes, rcx)));
+ __ check_klass_subtype(rdx, rax, rbx, L_ok_pops);
+ __ pop(rcx); // pop and discard CP cache
+ __ mov(rbx, rax); // target supertype into rbx for L_fail
+ __ pop(rax); // failed object into rax for L_fail
+ __ jmp(L_fail);
+
+ __ bind(L_ok_pops);
+ // restore pushed temp regs:
+ __ pop(rbx);
+ __ pop(rax);
+ __ bind(L_ok);
+ }
__ movl(rbx, Address(rbx, rcx,
Address::times_ptr, constantPoolCacheOopDesc::base_offset() +
ConstantPoolCacheEntry::flags_offset()));
__ andptr(rbx, 0xFF);
__ lea(rsp, Address(rsp, rbx, Interpreter::stackElementScale()));
__ dispatch_next(state, step);
+
+ // out of the main line of code...
+ if (EnableInvokeDynamic) {
+ __ bind(L_giant_index);
+ __ get_cache_and_index_at_bcp(rbx, rcx, 1, true);
+ __ jmp(L_got_cache);
+
+ if (unbox) {
+ __ bind(L_fail);
+ __ push(rbx); // missed klass (required)
+ __ push(rax); // bad object (actual)
+ __ movptr(rdx, ExternalAddress((address) &Interpreter::_throw_WrongMethodType_entry));
+ __ call(rdx);
+ }
+ }
+
return entry;
}
--- a/hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -166,7 +166,8 @@
address TemplateInterpreterGenerator::generate_return_entry_for(TosState state,
- int step) {
+ int step, bool unbox) {
+ assert(!unbox, "NYI");//6815692//
// amd64 doesn't need to do anything special about compiled returns
// to the interpreter so the code that exists on x86 to place a sentinel
--- a/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -206,12 +206,12 @@
__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::set_original_bytecode_at), scratch, rsi, bc);
#ifndef ASSERT
__ jmpb(patch_done);
+#else
+ __ jmp(patch_done);
+#endif
__ bind(fast_patch);
}
-#else
- __ jmp(patch_done);
- __ bind(fast_patch);
- }
+#ifdef ASSERT
Label okay;
__ load_unsigned_byte(scratch, at_bcp(0));
__ cmpl(scratch, (int)Bytecodes::java_code(bytecode));
@@ -2105,6 +2105,7 @@
void TemplateTable::resolve_cache_and_index(int byte_no, Register Rcache, Register index) {
assert(byte_no == 1 || byte_no == 2, "byte_no out of range");
+ bool is_invokedynamic = (bytecode() == Bytecodes::_invokedynamic);
Register temp = rbx;
@@ -2112,16 +2113,19 @@
const int shift_count = (1 + byte_no)*BitsPerByte;
Label resolved;
- __ get_cache_and_index_at_bcp(Rcache, index, 1);
- __ movl(temp, Address(Rcache,
- index,
- Address::times_ptr,
- constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::indices_offset()));
- __ shrl(temp, shift_count);
- // have we resolved this bytecode?
- __ andptr(temp, 0xFF);
- __ cmpl(temp, (int)bytecode());
- __ jcc(Assembler::equal, resolved);
+ __ get_cache_and_index_at_bcp(Rcache, index, 1, is_invokedynamic);
+ if (is_invokedynamic) {
+ // we are resolved if the f1 field contains a non-null CallSite object
+ __ cmpptr(Address(Rcache, index, Address::times_ptr, constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::f1_offset()), (int32_t) NULL_WORD);
+ __ jcc(Assembler::notEqual, resolved);
+ } else {
+ __ movl(temp, Address(Rcache, index, Address::times_4, constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::indices_offset()));
+ __ shrl(temp, shift_count);
+ // have we resolved this bytecode?
+ __ andl(temp, 0xFF);
+ __ cmpl(temp, (int)bytecode());
+ __ jcc(Assembler::equal, resolved);
+ }
// resolve first time through
address entry;
@@ -2134,12 +2138,13 @@
case Bytecodes::_invokespecial : // fall through
case Bytecodes::_invokestatic : // fall through
case Bytecodes::_invokeinterface: entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invoke); break;
+ case Bytecodes::_invokedynamic : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invokedynamic); break;
default : ShouldNotReachHere(); break;
}
__ movl(temp, (int)bytecode());
__ call_VM(noreg, entry, temp);
// Update registers with resolved info
- __ get_cache_and_index_at_bcp(Rcache, index, 1);
+ __ get_cache_and_index_at_bcp(Rcache, index, 1, is_invokedynamic);
__ bind(resolved);
}
@@ -2884,12 +2889,17 @@
}
-void TemplateTable::prepare_invoke(Register method, Register index, int byte_no, Bytecodes::Code code) {
+void TemplateTable::prepare_invoke(Register method, Register index, int byte_no) {
+ bool is_invdyn_bootstrap = (byte_no < 0);
+ if (is_invdyn_bootstrap) byte_no = -byte_no;
+
// determine flags
+ Bytecodes::Code code = bytecode();
const bool is_invokeinterface = code == Bytecodes::_invokeinterface;
+ const bool is_invokedynamic = code == Bytecodes::_invokedynamic;
const bool is_invokevirtual = code == Bytecodes::_invokevirtual;
const bool is_invokespecial = code == Bytecodes::_invokespecial;
- const bool load_receiver = code != Bytecodes::_invokestatic;
+ const bool load_receiver = (code != Bytecodes::_invokestatic && code != Bytecodes::_invokedynamic);
const bool receiver_null_check = is_invokespecial;
const bool save_flags = is_invokeinterface || is_invokevirtual;
// setup registers & access constant pool cache
@@ -2897,6 +2907,8 @@
const Register flags = rdx;
assert_different_registers(method, index, recv, flags);
+ assert(!is_invdyn_bootstrap || is_invokedynamic, "byte_no<0 hack only for invdyn");
+
// save 'interpreter return address'
__ save_bcp();
@@ -2907,8 +2919,13 @@
__ movl(recv, flags);
__ andl(recv, 0xFF);
// recv count is 0 based?
- __ movptr(recv, Address(rsp, recv, Interpreter::stackElementScale(), -Interpreter::expr_offset_in_bytes(1)));
- __ verify_oop(recv);
+ Address recv_addr(rsp, recv, Interpreter::stackElementScale(), -Interpreter::expr_offset_in_bytes(1));
+ if (is_invokedynamic) {
+ __ lea(recv, recv_addr);
+ } else {
+ __ movptr(recv, recv_addr);
+ __ verify_oop(recv);
+ }
}
// do null check if needed
@@ -2926,8 +2943,14 @@
ConstantPoolCacheEntry::verify_tosBits();
// load return address
{
- ExternalAddress table(is_invokeinterface ? (address)Interpreter::return_5_addrs_by_index_table() :
- (address)Interpreter::return_3_addrs_by_index_table());
+ address table_addr;
+ if (is_invdyn_bootstrap)
+ table_addr = (address)Interpreter::return_5_unbox_addrs_by_index_table();
+ else if (is_invokeinterface || is_invokedynamic)
+ table_addr = (address)Interpreter::return_5_addrs_by_index_table();
+ else
+ table_addr = (address)Interpreter::return_3_addrs_by_index_table();
+ ExternalAddress table(table_addr);
__ movptr(flags, ArrayAddress(table, Address(noreg, flags, Address::times_ptr)));
}
@@ -2990,7 +3013,7 @@
void TemplateTable::invokevirtual(int byte_no) {
transition(vtos, vtos);
- prepare_invoke(rbx, noreg, byte_no, bytecode());
+ prepare_invoke(rbx, noreg, byte_no);
// rbx,: index
// rcx: receiver
@@ -3002,7 +3025,7 @@
void TemplateTable::invokespecial(int byte_no) {
transition(vtos, vtos);
- prepare_invoke(rbx, noreg, byte_no, bytecode());
+ prepare_invoke(rbx, noreg, byte_no);
// do the call
__ verify_oop(rbx);
__ profile_call(rax);
@@ -3012,7 +3035,7 @@
void TemplateTable::invokestatic(int byte_no) {
transition(vtos, vtos);
- prepare_invoke(rbx, noreg, byte_no, bytecode());
+ prepare_invoke(rbx, noreg, byte_no);
// do the call
__ verify_oop(rbx);
__ profile_call(rax);
@@ -3028,7 +3051,7 @@
void TemplateTable::invokeinterface(int byte_no) {
transition(vtos, vtos);
- prepare_invoke(rax, rbx, byte_no, bytecode());
+ prepare_invoke(rax, rbx, byte_no);
// rax,: Interface
// rbx,: index
@@ -3102,6 +3125,84 @@
__ should_not_reach_here();
}
+void TemplateTable::invokedynamic(int byte_no) {
+ transition(vtos, vtos);
+
+ if (!EnableInvokeDynamic) {
+ // We should not encounter this bytecode if !EnableInvokeDynamic.
+ // The verifier will stop it. However, if we get past the verifier,
+ // this will stop the thread in a reasonable way, without crashing the JVM.
+ __ call_VM(noreg, CAST_FROM_FN_PTR(address,
+ InterpreterRuntime::throw_IncompatibleClassChangeError));
+ // the call_VM checks for exception, so we should never return here.
+ __ should_not_reach_here();
+ return;
+ }
+
+ prepare_invoke(rax, rbx, byte_no);
+
+ // rax: CallSite object (f1)
+ // rbx: unused (f2)
+ // rcx: receiver address
+ // rdx: flags (unused)
+
+ if (ProfileInterpreter) {
+ Label L;
+ // %%% should make a type profile for any invokedynamic that takes a ref argument
+ // profile this call
+ __ profile_call(rsi);
+ }
+
+ Label handle_unlinked_site;
+ __ movptr(rcx, Address(rax, __ delayed_value(sun_dyn_CallSiteImpl::target_offset_in_bytes, rcx)));
+ __ testptr(rcx, rcx);
+ __ jcc(Assembler::zero, handle_unlinked_site);
+
+ __ prepare_to_jump_from_interpreted();
+ __ jump_to_method_handle_entry(rcx, rdx);
+
+ // Initial calls come here...
+ __ bind(handle_unlinked_site);
+ __ pop(rcx); // remove return address pushed by prepare_invoke
+
+ // box stacked arguments into an array for the bootstrap method
+ address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::bootstrap_invokedynamic);
+ __ restore_bcp(); // rsi must be correct for call_VM
+ __ call_VM(rax, entry, rax);
+ __ movl(rdi, rax); // protect bootstrap MH from prepare_invoke
+
+ // recompute return address
+ __ restore_bcp(); // rsi must be correct for prepare_invoke
+ prepare_invoke(rax, rbx, -byte_no); // smashes rcx, rdx
+ // rax: CallSite object (f1)
+ // rbx: unused (f2)
+ // rdi: bootstrap MH
+ // rdx: flags
+
+ // now load up the arglist, which has been neatly boxed
+ __ get_thread(rcx);
+ __ movptr(rdx, Address(rcx, JavaThread::vm_result_2_offset()));
+ __ movptr(Address(rcx, JavaThread::vm_result_2_offset()), NULL_WORD);
+ __ verify_oop(rdx);
+ // rdx = arglist
+
+ // save SP now, before we add the bootstrap call to the stack
+ // We must preserve a fiction that the original arguments are outgoing,
+ // because the return sequence will reset the stack to this point
+ // and then pop all those arguments. It seems error-prone to use
+ // a different argument list size just for bootstrapping.
+ __ prepare_to_jump_from_interpreted();
+
+ // Now let's play adapter, pushing the real arguments on the stack.
+ __ pop(rbx); // return PC
+ __ push(rdi); // boot MH
+ __ push(rax); // call site
+ __ push(rdx); // arglist
+ __ push(rbx); // return PC, again
+ __ mov(rcx, rdi);
+ __ jump_to_method_handle_entry(rcx, rdx);
+}
+
//----------------------------------------------------------------------------------------------------
// Allocation
--- a/hotspot/src/cpu/x86/vm/templateTable_x86_32.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/x86/vm/templateTable_x86_32.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -22,8 +22,7 @@
*
*/
- static void prepare_invoke(Register method, Register index, int byte_no,
- Bytecodes::Code code);
+ static void prepare_invoke(Register method, Register index, int byte_no);
static void invokevirtual_helper(Register index, Register recv,
Register flags);
static void volatile_barrier(Assembler::Membar_mask_bits order_constraint );
--- a/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -3058,6 +3058,23 @@
return;
}
+void TemplateTable::invokedynamic(int byte_no) {
+ transition(vtos, vtos);
+
+ if (!EnableInvokeDynamic) {
+ // We should not encounter this bytecode if !EnableInvokeDynamic.
+ // The verifier will stop it. However, if we get past the verifier,
+ // this will stop the thread in a reasonable way, without crashing the JVM.
+ __ call_VM(noreg, CAST_FROM_FN_PTR(address,
+ InterpreterRuntime::throw_IncompatibleClassChangeError));
+ // the call_VM checks for exception, so we should never return here.
+ __ should_not_reach_here();
+ return;
+ }
+
+ __ stop("invokedynamic NYI");//6815692//
+}
+
//-----------------------------------------------------------------------------
// Allocation
--- a/hotspot/src/os/windows/vm/os_windows.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/os/windows/vm/os_windows.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -2632,6 +2632,8 @@
char* os::reserve_memory_special(size_t bytes, char* addr, bool exec) {
+ const DWORD prot = exec ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE;
+
if (UseLargePagesIndividualAllocation) {
if (TracePageSizes && Verbose) {
tty->print_cr("Reserving large pages individually.");
@@ -2694,13 +2696,7 @@
p_new = (char *) VirtualAlloc(next_alloc_addr,
bytes_to_rq,
MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES,
- PAGE_READWRITE);
- if (p_new != NULL && exec) {
- DWORD oldprot;
- // Windows doc says to use VirtualProtect to get execute permissions
- VirtualProtect(next_alloc_addr, bytes_to_rq,
- PAGE_EXECUTE_READWRITE, &oldprot);
- }
+ prot);
}
if (p_new == NULL) {
@@ -2729,12 +2725,7 @@
} else {
// normal policy just allocate it all at once
DWORD flag = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES;
- char * res = (char *)VirtualAlloc(NULL, bytes, flag, PAGE_READWRITE);
- if (res != NULL && exec) {
- DWORD oldprot;
- // Windows doc says to use VirtualProtect to get execute permissions
- VirtualProtect(res, bytes, PAGE_EXECUTE_READWRITE, &oldprot);
- }
+ char * res = (char *)VirtualAlloc(NULL, bytes, flag, prot);
return res;
}
}
--- a/hotspot/src/os_cpu/solaris_x86/vm/globals_solaris_x86.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/os_cpu/solaris_x86/vm/globals_solaris_x86.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -39,7 +39,7 @@
// ThreadStackSize 320 allows TaggedStackInterpreter and a couple of test cases
// to run while keeping the number of threads that can be created high.
define_pd_global(intx, ThreadStackSize, 320);
-define_pd_global(intx, VMThreadStackSize, 256);
+define_pd_global(intx, VMThreadStackSize, 512);
define_pd_global(intx, SurvivorRatio, 8);
define_pd_global(uintx, JVMInvokeMethodSlack, 10*K);
#endif // AMD64
--- a/hotspot/src/share/tools/MakeDeps/BuildConfig.java Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/tools/MakeDeps/BuildConfig.java Mon Apr 27 12:33:57 2009 -0700
@@ -247,7 +247,7 @@
sysDefines.add("HOTSPOT_BUILD_USER="+System.getProperty("user.name"));
sysDefines.add("HOTSPOT_BUILD_TARGET=\\\""+get("Build")+"\\\"");
sysDefines.add("_JNI_IMPLEMENTATION_");
- sysDefines.add("HOTSPOT_LIB_ARCH=\\\"i486\\\"");
+ sysDefines.add("HOTSPOT_LIB_ARCH=\\\"i386\\\"");
sysDefines.addAll(defines);
--- a/hotspot/src/share/tools/hsdis/Makefile Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/tools/hsdis/Makefile Mon Apr 27 12:33:57 2009 -0700
@@ -22,61 +22,75 @@
#
#
-# Single gnu makefile for solaris, linux and windows (windows requires mks or
-# cygwin).
-
-ifeq ($(BINUTILS),)
-# Pop all the way out of the workspace to look for binutils.
-# ...You probably want to override this setting.
-BINUTILS = $(shell cd ../../../../..;pwd)/binutils-2.17-$(LIBARCH)
-endif
+# Single gnu makefile for solaris, linux and windows (windows requires cygwin and mingw)
# Default arch; it is changed below as needed.
ARCH = i386
OS = $(shell uname)
-CPPFLAGS += -I$(BINUTILS)/include -I$(BINUTILS)/bfd
-CPPFLAGS += -DHOTSPOT_LIB_ARCH=\"$(LIBARCH)\" -DLIBARCH_$(LIBARCH)
-CPPFLAGS += -DHOTSPOT_OS=\"$(OS)\" -DOS_$(OS)
-
## OS = SunOS ##
ifeq ($(OS),SunOS)
-ARCH = $(shell uname -p)
+CPU = $(shell uname -p)
+ARCH1=$(CPU:i586=i386)
+ARCH=$(ARCH1:i686=i386)
OS = solaris
CC = cc
-CCFLAGS += -Kpic -g
-CCFLAGS/amd64 += -xarch=amd64
-CCFLAGS/sparcv9 += -xarch=v9
-CCFLAGS += $(CCFLAGS/$(LIBARCH))
+CFLAGS += -KPIC
+ifdef LP64
+ifeq ($(ARCH),sparc)
+ARCH = sparcv9
+endif
+ifeq ($(ARCH),i386)
+ARCH = amd64
+endif
+endif
+CFLAGS/sparcv9 += -xarch=v9
+CFLAGS/amd64 += -m64
+CFLAGS += $(CFLAGS/$(ARCH))
DLDFLAGS += -G
+LDFLAGS += -ldl
OUTFLAGS += -o $@
LIB_EXT = .so
else
## OS = Linux ##
ifeq ($(OS),Linux)
-CPU = $(shell uname -m)
-ifeq ($(CPU),ia64)
-ARCH = ia64
+ifneq ($(MINGW),)
+LIB_EXT = .dll
+CPPFLAGS += -I$(TARGET_DIR)/include
+LDFLAGS += -L$(TARGET_DIR)/lib
+OS=windows
+ifneq ($(findstring x86_64-,$(MINGW)),)
+ARCH=amd64
+else
+ARCH=i386
+endif
+CC = $(MINGW)-gcc
+CONFIGURE_ARGS= --host=$(MINGW) --target=$(MINGW)
else
-ifeq ($(CPU),x86_64)
-CCFLAGS += -fPIC
-endif # x86_64
-endif # ia64
+CPU = $(shell uname -m)
+ARCH1=$(CPU:x86_64=amd64)
+ARCH=$(ARCH1:i686=i386)
+CFLAGS/i386 += -m32
+CFLAGS/sparc += -m32
+CFLAGS/sparcv9 += -m64
+CFLAGS/amd64 += -m64
+CFLAGS += $(CFLAGS/$(ARCH))
+CFLAGS += -fPIC
OS = linux
+LIB_EXT = .so
CC = gcc
-CCFLAGS += -O
+endif
+CFLAGS += -O
DLDFLAGS += -shared
+LDFLAGS += -ldl
OUTFLAGS += -o $@
-LIB_EXT = .so
-CPPFLAGS += -Iinclude -Iinclude/$(OS)_$(ARCH)/
## OS = Windows ##
else # !SunOS, !Linux => Windows
-OS = win
-CC = cl
+OS = windows
+CC = gcc
#CPPFLAGS += /D"WIN32" /D"_WINDOWS" /D"DEBUG" /D"NDEBUG"
-CCFLAGS += /nologo /MD /W3 /WX /O2 /Fo$(@:.dll=.obj) /Gi-
-CCFLAGS += -Iinclude -Iinclude/gnu -Iinclude/$(OS)_$(ARCH)
-CCFLAGS += /D"HOTSPOT_LIB_ARCH=\"$(LIBARCH)\""
+CFLAGS += /nologo /MD /W3 /WX /O2 /Fo$(@:.dll=.obj) /Gi-
+CFLAGS += LIBARCH=\"$(LIBARCH)\""
DLDFLAGS += /dll /subsystem:windows /incremental:no \
/export:decode_instruction
OUTFLAGS += /link /out:$@
@@ -94,21 +108,34 @@
endif # LIBARCH64/$(ARCH)
endif # LP64
-TARGET_DIR = bin/$(OS)
+JDKARCH=$(LIBARCH:i386=i586)
+
+ifeq ($(BINUTILS),)
+# Pop all the way out of the workspace to look for binutils.
+# ...You probably want to override this setting.
+BINUTILSDIR = $(shell cd build/binutils;pwd)
+else
+BINUTILSDIR = $(shell cd $(BINUTILS);pwd)
+endif
+
+CPPFLAGS += -I$(BINUTILSDIR)/include -I$(BINUTILS)/bfd -I$(TARGET_DIR)/bfd
+CPPFLAGS += -DLIBARCH_$(LIBARCH) -DLIBARCH=\"$(LIBARCH)\" -DLIB_EXT=\"$(LIB_EXT)\"
+
+TARGET_DIR = build/$(OS)-$(JDKARCH)
TARGET = $(TARGET_DIR)/hsdis-$(LIBARCH)$(LIB_EXT)
SOURCE = hsdis.c
-LIBRARIES = $(BINUTILS)/bfd/libbfd.a \
- $(BINUTILS)/opcodes/libopcodes.a \
- $(BINUTILS)/libiberty/libiberty.a
+LIBRARIES = $(TARGET_DIR)/bfd/libbfd.a \
+ $(TARGET_DIR)/opcodes/libopcodes.a \
+ $(TARGET_DIR)/libiberty/libiberty.a
-DEMO_TARGET = $(TARGET_DIR)/hsdis-demo-$(LIBARCH)
+DEMO_TARGET = $(TARGET_DIR)/hsdis-demo
DEMO_SOURCE = hsdis-demo.c
.PHONY: all clean demo both
-all: $(TARGET) demo
+all: $(TARGET)
both: all all64
@@ -117,16 +144,17 @@
demo: $(TARGET) $(DEMO_TARGET)
-$(LIBRARIES):
- @echo "*** Please build binutils first; see ./README: ***"
- @sed < ./README '1,/__________/d' | head -20
- @echo "..."; exit 1
+$(LIBRARIES): $(TARGET_DIR) $(TARGET_DIR)/Makefile
+ if [ ! -f $@ ]; then cd $(TARGET_DIR); make all-opcodes; fi
+
+$(TARGET_DIR)/Makefile:
+ (cd $(TARGET_DIR); CC=$(CC) CFLAGS="$(CFLAGS)" $(BINUTILSDIR)/configure --disable-nls $(CONFIGURE_ARGS))
$(TARGET): $(SOURCE) $(LIBS) $(LIBRARIES) $(TARGET_DIR)
- $(CC) $(OUTFLAGS) $(CPPFLAGS) $(CCFLAGS) $(SOURCE) $(DLDFLAGS) $(LIBRARIES)
+ $(CC) $(OUTFLAGS) $(CPPFLAGS) $(CFLAGS) $(SOURCE) $(DLDFLAGS) $(LIBRARIES)
$(DEMO_TARGET): $(DEMO_SOURCE) $(TARGET) $(TARGET_DIR)
- $(CC) $(OUTFLAGS) $(CPPFLAGS) $(CCFLAGS) $(DEMO_SOURCE) $(LDFLAGS)
+ $(CC) $(OUTFLAGS) -DTARGET_DIR=\"$(TARGET_DIR)\" $(CPPFLAGS) -g $(CFLAGS/$(ARCH)) $(DEMO_SOURCE) $(LDFLAGS)
$(TARGET_DIR):
[ -d $@ ] || mkdir -p $@
--- a/hotspot/src/share/tools/hsdis/README Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/tools/hsdis/README Mon Apr 27 12:33:57 2009 -0700
@@ -32,61 +32,55 @@
* Building
-To build this project you need a build of Gnu binutils to link against.
-It is known to work with binutils 2.17.
-
-The makefile looks for this build in $BINUTILS, or (if that is not set),
-in .../binutils-2.17-$LIBARCH, where LIBARCH (as in HotSpot) is one of
-the jre subdirectory keywords i386, amd64, sparc, sparcv9, etc.
-
-To build Gnu binutils, first download a copy of the software:
- http://directory.fsf.org/project/binutils/
+To build this project you a copy of GNU binutils to build against. It
+is known to work with binutils 2.17 and binutils 2.19.1. Download a
+copy of the software from http://directory.fsf.org/project/binutils or
+one of it's mirrors. Builds targetting windows should use at least
+2.19 and currently requires the use of a cross compiler.
-Unpack the binutils tarball into an empty directory:
- chdir ../../../../..
- tar -xzf - < ../binutils-2.17.tar.gz
- mv binutils-2.17 binutils-2.17-i386 #or binutils-2.17-sparc
- cd binutils-2.17-i386
+The makefile looks for the sources in build/binutils or you can
+specify it's location to the makefile using BINTUILS=path. It will
+configure binutils and build it first and then build and link the
+disasembly adapter. Make all will build the default target for your
+platform. If you platform support both 32 and 64 simultaneously then
+"make both" will build them both at once. "make all64" will
+explicitly build the 64 bit version. By default this will build the
+disassembler library only. If you build demo it will build a demo
+program that attempts to exercise the library.
-From inside that directory, run configure and make:
- ( export CFLAGS='-fPIC'
- ./configure i386-pc-elf )
- gnumake
-
-(Leave out or change the argument to configure if not on an i386 system.)
+Windows
-Next, untar again into another empty directory for the LP64 version:
- chdir ..
- tar -xzf - < ../binutils-2.17.tar.gz
- mv binutils-2.17 binutils-2.17-amd64 #or binutils-2.17-sparcv9
- cd binutils-2.17-amd64
-
-From inside that directory, run configure for LP64 and make:
- ( export ac_cv_c_bigendian=no CFLAGS='-m64 -fPIC' LDFLAGS=-m64
- ./configure amd64-pc-elf )
- gnumake
+In theory this should be buildable on Windows but getting a working
+GNU build environment on Windows has proven difficult. MINGW should
+be able to do it but at the time of this writing I was unable to get
+this working. Instead you can use the mingw cross compiler on linux
+to produce the windows binaries. For 32-bit windows you can install
+mingw32 using your package manager and it will be added to your path
+automatically. For 64-bit you need to download the 64 bit mingw from
+http://sourceforge.net/projects/mingw-w64. Grab a copy of the
+complete toolchain and unpack it somewhere. Put the bin directory of
+the toolchain in your path. The mingw installs contain cross compile
+versions of gcc that are named with a prefix to indicate what they are
+targetting and you must tell the Makefile which one to use. This
+should either be i586-mingw32msvc or x86_64-pc-mingw32 depending on
+which on you are targetting and there should be a version of gcc in
+your path named i586-mingw32msvc-gcc or x86_64-pc-mingw32-gcc. Tell
+the makefile what prefix to use to find the mingw tools by using
+MINGW=. For example:
-The -fPIC option is needed because the generated code will be
-linked into the hsdid-$LIBARCH.so binary. If you miss the
-option, the JVM will fail to load the disassembler.
+make MINGW=i586-mingw32msvc BINTUILS=build/binutils-2.19.1
-You probably want two builds, one for 32 and one for 64 bits.
-To build the 64-bit variation of a platforn, add LP64=1 to
-the make command line for hsdis.
-
-So, go back to the hsdis project and build:
- chdir .../hsdis
- gnumake
- gnumake LP64=1
+will build the Win32 cross compiled version of hsdis based on 2.19.1.
* Installing
-Products are named like bin/$OS/hsdis-$LIBARCH.so.
-You can install them on your LD_LIBRARY_PATH,
-or inside of your JRE next to $LIBARCH/libjvm.so.
+Products are named like build/$OS-$LIBARCH/hsdis-$LIBARCH.so. You can
+install them on your LD_LIBRARY_PATH, or inside of your JRE next to
+$LIBARCH/libjvm.so.
Now test:
- export LD_LIBRARY_PATH .../hsdis/bin/solaris:$LD_LIBRARY_PATH
+
+ export LD_LIBRARY_PATH .../hsdis/build/$OS-$LIBARCH:$LD_LIBRARY_PATH
dargs='-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly'
dargs=$dargs' -XX:PrintAssemblyOptions=hsdis-print-bytes'
java $dargs -Xbatch CompileCommand=print,*String.hashCode HelloWorld
--- a/hotspot/src/share/tools/hsdis/hsdis-demo.c Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/tools/hsdis/hsdis-demo.c Mon Apr 27 12:33:57 2009 -0700
@@ -53,7 +53,7 @@
else if (!strncmp(arg, "-options=", 9))
options = arg+9;
else
- { printf("Usage: %s [-xml] [name...]\n"); exit(2); }
+ { printf("Usage: %s [-xml] [name...]\n", av[0]); exit(2); }
continue;
}
greet(arg);
@@ -76,26 +76,14 @@
#include "dlfcn.h"
-#ifdef HOTSPOT_LIB_ARCH
-#define LIBARCH HOTSPOT_LIB_ARCH
-#endif
-#ifdef HOTSPOT_OS
-#define OS HOTSPOT_OS
-#endif
-
#define DECODE_INSTRUCTIONS_NAME "decode_instructions"
#define HSDIS_NAME "hsdis"
static void* decode_instructions_pv = 0;
static const char* hsdis_path[] = {
- HSDIS_NAME".so",
-#ifdef OS
- "bin/"OS"/"HSDIS_NAME".so",
-#endif
-#ifdef LIBARCH
- HSDIS_NAME"-"LIBARCH".so",
-#ifdef OS
- "bin/"OS"/"HSDIS_NAME"-"LIBARCH".so",
-#endif
+ HSDIS_NAME"-"LIBARCH LIB_EXT,
+ "./" HSDIS_NAME"-"LIBARCH LIB_EXT,
+#ifdef TARGET_DIR
+ TARGET_DIR"/"HSDIS_NAME"-"LIBARCH LIB_EXT,
#endif
NULL
};
@@ -112,7 +100,7 @@
for (dllib = NULL; dllib == NULL; ) {
const char* next_lib = (*next_in_path++);
if (next_lib == NULL)
- return "cannot find plugin "HSDIS_NAME".so";
+ return "cannot find plugin "HSDIS_NAME LIB_EXT;
dllib = dlopen(next_lib, RTLD_LAZY);
}
}
--- a/hotspot/src/share/tools/hsdis/hsdis.c Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/tools/hsdis/hsdis.c Mon Apr 27 12:33:57 2009 -0700
@@ -33,6 +33,7 @@
#include <libiberty.h>
#include <bfd.h>
#include <dis-asm.h>
+#include <inttypes.h>
#ifndef bool
#define bool int
@@ -404,21 +405,21 @@
}
static const char* native_arch_name() {
- const char* res = HOTSPOT_LIB_ARCH;
+ const char* res = NULL;
+#ifdef LIBARCH_i386
+ res = "i386";
+#endif
#ifdef LIBARCH_amd64
res = "i386:x86-64";
#endif
#ifdef LIBARCH_sparc
res = "sparc:v8plusb";
#endif
-#ifdef LIBARCH_sparc
- res = "sparc:v8plusb";
-#endif
#ifdef LIBARCH_sparcv9
res = "sparc:v9b";
#endif
if (res == NULL)
- res = "HOTSPOT_LIB_ARCH is not set in Makefile!";
+ res = "architecture not set in Makefile!";
return res;
}
--- a/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1524,6 +1524,11 @@
code = Bytecodes::_invokespecial;
}
+ if (code == Bytecodes::_invokedynamic) {
+ BAILOUT("invokedynamic NYI"); // FIXME
+ return;
+ }
+
// NEEDS_CLEANUP
// I've added the target-is_loaded() test below but I don't really understand
// how klass->is_loaded() can be true and yet target->is_loaded() is false.
@@ -2431,8 +2436,8 @@
case Bytecodes::_invokevirtual : // fall through
case Bytecodes::_invokespecial : // fall through
case Bytecodes::_invokestatic : // fall through
+ case Bytecodes::_invokedynamic : // fall through
case Bytecodes::_invokeinterface: invoke(code); break;
- case Bytecodes::_xxxunusedxxx : ShouldNotReachHere(); break;
case Bytecodes::_new : new_instance(s.get_index_big()); break;
case Bytecodes::_newarray : new_type_array(); break;
case Bytecodes::_anewarray : new_object_array(); break;
@@ -2571,6 +2576,7 @@
, Bytecodes::_invokevirtual
, Bytecodes::_invokespecial
, Bytecodes::_invokestatic
+ , Bytecodes::_invokedynamic
, Bytecodes::_invokeinterface
, Bytecodes::_new
, Bytecodes::_newarray
--- a/hotspot/src/share/vm/c1/c1_LinearScan.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/c1/c1_LinearScan.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -2956,9 +2956,11 @@
NOT_PRODUCT(print_intervals("After Register Allocation"));
NOT_PRODUCT(print_lir(2, "LIR after register allocation:"));
- DEBUG_ONLY(verify());
sort_intervals_after_allocation();
+
+ DEBUG_ONLY(verify());
+
eliminate_spill_moves();
assign_reg_num();
CHECK_BAILOUT();
@@ -3147,6 +3149,16 @@
void LinearScan::verify_no_oops_in_fixed_intervals() {
+ Interval* fixed_intervals;
+ Interval* other_intervals;
+ create_unhandled_lists(&fixed_intervals, &other_intervals, is_precolored_cpu_interval, NULL);
+
+ // to ensure a walking until the last instruction id, add a dummy interval
+ // with a high operation id
+ other_intervals = new Interval(any_reg);
+ other_intervals->add_range(max_jint - 2, max_jint - 1);
+ IntervalWalker* iw = new IntervalWalker(this, fixed_intervals, other_intervals);
+
LIR_OpVisitState visitor;
for (int i = 0; i < block_count(); i++) {
BlockBegin* block = block_at(i);
@@ -3159,6 +3171,54 @@
visitor.visit(op);
+ if (visitor.info_count() > 0) {
+ iw->walk_before(op->id());
+ bool check_live = true;
+ if (op->code() == lir_move) {
+ LIR_Op1* move = (LIR_Op1*)op;
+ check_live = (move->patch_code() == lir_patch_none);
+ }
+ LIR_OpBranch* branch = op->as_OpBranch();
+ if (branch != NULL && branch->stub() != NULL && branch->stub()->is_exception_throw_stub()) {
+ // Don't bother checking the stub in this case since the
+ // exception stub will never return to normal control flow.
+ check_live = false;
+ }
+
+ // Make sure none of the fixed registers is live across an
+ // oopmap since we can't handle that correctly.
+ if (check_live) {
+ for (Interval* interval = iw->active_first(fixedKind);
+ interval != Interval::end();
+ interval = interval->next()) {
+ if (interval->current_to() > op->id() + 1) {
+ // This interval is live out of this op so make sure
+ // that this interval represents some value that's
+ // referenced by this op either as an input or output.
+ bool ok = false;
+ for_each_visitor_mode(mode) {
+ int n = visitor.opr_count(mode);
+ for (int k = 0; k < n; k++) {
+ LIR_Opr opr = visitor.opr_at(mode, k);
+ if (opr->is_fixed_cpu()) {
+ if (interval_at(reg_num(opr)) == interval) {
+ ok = true;
+ break;
+ }
+ int hi = reg_numHi(opr);
+ if (hi != -1 && interval_at(hi) == interval) {
+ ok = true;
+ break;
+ }
+ }
+ }
+ }
+ assert(ok, "fixed intervals should never be live across an oopmap point");
+ }
+ }
+ }
+ }
+
// oop-maps at calls do not contain registers, so check is not needed
if (!visitor.has_call()) {
--- a/hotspot/src/share/vm/ci/bcEscapeAnalyzer.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/ci/bcEscapeAnalyzer.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -833,6 +833,7 @@
case Bytecodes::_invokevirtual:
case Bytecodes::_invokespecial:
case Bytecodes::_invokestatic:
+ case Bytecodes::_invokedynamic:
case Bytecodes::_invokeinterface:
{ bool will_link;
ciMethod* target = s.get_method(will_link);
@@ -848,9 +849,6 @@
}
}
break;
- case Bytecodes::_xxxunusedxxx:
- ShouldNotReachHere();
- break;
case Bytecodes::_new:
state.apush(allocated_obj);
break;
--- a/hotspot/src/share/vm/ci/ciStreams.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/ci/ciStreams.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -301,17 +301,19 @@
// If this is a method invocation bytecode, get the constant pool
// index of the invoked method.
int ciBytecodeStream::get_method_index() {
+#ifdef ASSERT
switch (cur_bc()) {
case Bytecodes::_invokeinterface:
- return Bytes::get_Java_u2(_pc-4);
case Bytecodes::_invokevirtual:
case Bytecodes::_invokespecial:
case Bytecodes::_invokestatic:
- return get_index_big();
+ case Bytecodes::_invokedynamic:
+ break;
default:
ShouldNotReachHere();
- return 0;
}
+#endif
+ return get_index_int();
}
// ------------------------------------------------------------------
@@ -337,6 +339,9 @@
// for checking linkability when retrieving the associated method.
ciKlass* ciBytecodeStream::get_declared_method_holder() {
bool ignore;
+ // report as Dynamic for invokedynamic, which is syntactically classless
+ if (cur_bc() == Bytecodes::_invokedynamic)
+ return CURRENT_ENV->get_klass_by_name(_holder, ciSymbol::java_dyn_Dynamic(), false);
return CURRENT_ENV->get_klass_by_index(_holder, get_method_holder_index(), ignore);
}
--- a/hotspot/src/share/vm/ci/ciStreams.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/ci/ciStreams.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -91,9 +91,10 @@
_end = _start + max;
}
- address cur_bcp() { return _bc_start; } // Returns bcp to current instruction
+ address cur_bcp() const { return _bc_start; } // Returns bcp to current instruction
int next_bci() const { return _pc -_start; }
int cur_bci() const { return _bc_start - _start; }
+ int instruction_size() const { return _pc - _bc_start; }
Bytecodes::Code cur_bc() const{ return check_java(_bc); }
Bytecodes::Code next_bc() { return Bytecodes::java_code((Bytecodes::Code)* _pc); }
@@ -121,34 +122,39 @@
return check_java(_bc);
}
- bool is_wide() { return ( _pc == _was_wide ); }
+ bool is_wide() const { return ( _pc == _was_wide ); }
// Get a byte index following this bytecode.
// If prefixed with a wide bytecode, get a wide index.
int get_index() const {
+ assert_index_size(is_wide() ? 2 : 1);
return (_pc == _was_wide) // was widened?
? Bytes::get_Java_u2(_bc_start+2) // yes, return wide index
: _bc_start[1]; // no, return narrow index
}
- // Set a byte index following this bytecode.
- // If prefixed with a wide bytecode, get a wide index.
- void put_index(int idx) {
- if (_pc == _was_wide) // was widened?
- Bytes::put_Java_u2(_bc_start+2,idx); // yes, set wide index
- else
- _bc_start[1]=idx; // no, set narrow index
+ // Get 2-byte index (getfield/putstatic/etc)
+ int get_index_big() const {
+ assert_index_size(2);
+ return Bytes::get_Java_u2(_bc_start+1);
}
- // Get 2-byte index (getfield/putstatic/etc)
- int get_index_big() const { return Bytes::get_Java_u2(_bc_start+1); }
+ // Get 2-byte index (or 4-byte, for invokedynamic)
+ int get_index_int() const {
+ return has_giant_index() ? get_index_giant() : get_index_big();
+ }
+
+ // Get 4-byte index, for invokedynamic.
+ int get_index_giant() const {
+ assert_index_size(4);
+ return Bytes::get_native_u4(_bc_start+1);
+ }
+
+ bool has_giant_index() const { return (cur_bc() == Bytecodes::_invokedynamic); }
// Get dimensions byte (multinewarray)
int get_dimensions() const { return *(unsigned char*)(_pc-1); }
- // Get unsigned index fast
- int get_index_fast() const { return Bytes::get_native_u2(_pc-2); }
-
// Sign-extended index byte/short, no widening
int get_byte() const { return (int8_t)(_pc[-1]); }
int get_short() const { return (int16_t)Bytes::get_Java_u2(_pc-2); }
@@ -225,6 +231,22 @@
ciKlass* get_declared_method_holder();
int get_method_holder_index();
int get_method_signature_index();
+
+ private:
+ void assert_index_size(int required_size) const {
+#ifdef ASSERT
+ int isize = instruction_size() - (is_wide() ? 1 : 0) - 1;
+ if (isize == 2 && cur_bc() == Bytecodes::_iinc)
+ isize = 1;
+ else if (isize <= 2)
+ ; // no change
+ else if (has_giant_index())
+ isize = 4;
+ else
+ isize = 2;
+ assert(isize = required_size, "wrong index size");
+#endif
+ }
};
--- a/hotspot/src/share/vm/classfile/classLoader.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/classfile/classLoader.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1217,31 +1217,34 @@
// valid class file. The class loader will check everything else.
if (strchr(buffer, '.') == NULL) {
_compile_the_world_counter++;
- if (_compile_the_world_counter >= CompileTheWorldStartAt && _compile_the_world_counter <= CompileTheWorldStopAt) {
- // Construct name without extension
- symbolHandle sym = oopFactory::new_symbol_handle(buffer, CHECK);
- // Use loader to load and initialize class
- klassOop ik = SystemDictionary::resolve_or_null(sym, loader, Handle(), THREAD);
- instanceKlassHandle k (THREAD, ik);
- if (k.not_null() && !HAS_PENDING_EXCEPTION) {
- k->initialize(THREAD);
+ if (_compile_the_world_counter > CompileTheWorldStopAt) return;
+
+ // Construct name without extension
+ symbolHandle sym = oopFactory::new_symbol_handle(buffer, CHECK);
+ // Use loader to load and initialize class
+ klassOop ik = SystemDictionary::resolve_or_null(sym, loader, Handle(), THREAD);
+ instanceKlassHandle k (THREAD, ik);
+ if (k.not_null() && !HAS_PENDING_EXCEPTION) {
+ k->initialize(THREAD);
+ }
+ bool exception_occurred = HAS_PENDING_EXCEPTION;
+ CLEAR_PENDING_EXCEPTION;
+ if (CompileTheWorldPreloadClasses && k.not_null()) {
+ constantPoolKlass::preload_and_initialize_all_classes(k->constants(), THREAD);
+ if (HAS_PENDING_EXCEPTION) {
+ // If something went wrong in preloading we just ignore it
+ CLEAR_PENDING_EXCEPTION;
+ tty->print_cr("Preloading failed for (%d) %s", _compile_the_world_counter, buffer);
}
- bool exception_occurred = HAS_PENDING_EXCEPTION;
- CLEAR_PENDING_EXCEPTION;
+ }
+
+ if (_compile_the_world_counter >= CompileTheWorldStartAt) {
if (k.is_null() || (exception_occurred && !CompileTheWorldIgnoreInitErrors)) {
// If something went wrong (e.g. ExceptionInInitializerError) we skip this class
tty->print_cr("CompileTheWorld (%d) : Skipping %s", _compile_the_world_counter, buffer);
} else {
tty->print_cr("CompileTheWorld (%d) : %s", _compile_the_world_counter, buffer);
// Preload all classes to get around uncommon traps
- if (CompileTheWorldPreloadClasses) {
- constantPoolKlass::preload_and_initialize_all_classes(k->constants(), THREAD);
- if (HAS_PENDING_EXCEPTION) {
- // If something went wrong in preloading we just ignore it
- CLEAR_PENDING_EXCEPTION;
- tty->print_cr("Preloading failed for (%d) %s", _compile_the_world_counter, buffer);
- }
- }
// Iterate over all methods in class
for (int n = 0; n < k->methods()->length(); n++) {
methodHandle m (THREAD, methodOop(k->methods()->obj_at(n)));
@@ -1253,16 +1256,28 @@
CLEAR_PENDING_EXCEPTION;
tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_counter, m->name()->as_C_string());
}
- if (TieredCompilation) {
- // Clobber the first compile and force second tier compilation
- m->clear_code();
- CompileBroker::compile_method(m, InvocationEntryBci,
- methodHandle(), 0, "CTW", THREAD);
- if (HAS_PENDING_EXCEPTION) {
- CLEAR_PENDING_EXCEPTION;
- tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_counter, m->name()->as_C_string());
+ if (TieredCompilation) {
+ // Clobber the first compile and force second tier compilation
+ nmethod* nm = m->code();
+ if (nm != NULL) {
+ // Throw out the code so that the code cache doesn't fill up
+ nm->make_not_entrant();
+ m->clear_code();
+ }
+ CompileBroker::compile_method(m, InvocationEntryBci,
+ methodHandle(), 0, "CTW", THREAD);
+ if (HAS_PENDING_EXCEPTION) {
+ CLEAR_PENDING_EXCEPTION;
+ tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_counter, m->name()->as_C_string());
+ }
}
}
+
+ nmethod* nm = m->code();
+ if (nm != NULL) {
+ // Throw out the code so that the code cache doesn't fill up
+ nm->make_not_entrant();
+ m->clear_code();
}
}
}
--- a/hotspot/src/share/vm/classfile/javaClasses.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/classfile/javaClasses.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -2430,6 +2430,41 @@
}
+// Support for sun_dyn_CallSiteImpl
+
+int sun_dyn_CallSiteImpl::_type_offset;
+int sun_dyn_CallSiteImpl::_target_offset;
+int sun_dyn_CallSiteImpl::_vmmethod_offset;
+
+void sun_dyn_CallSiteImpl::compute_offsets() {
+ if (!EnableInvokeDynamic) return;
+ klassOop k = SystemDictionary::CallSiteImpl_klass();
+ if (k != NULL) {
+ compute_offset(_type_offset, k, vmSymbols::type_name(), vmSymbols::java_dyn_MethodType_signature(), true);
+ compute_offset(_target_offset, k, vmSymbols::target_name(), vmSymbols::java_dyn_MethodHandle_signature(), true);
+ compute_offset(_vmmethod_offset, k, vmSymbols::vmmethod_name(), vmSymbols::object_signature(), true);
+ }
+}
+
+oop sun_dyn_CallSiteImpl::type(oop site) {
+ return site->obj_field(_type_offset);
+}
+
+oop sun_dyn_CallSiteImpl::target(oop site) {
+ return site->obj_field(_target_offset);
+}
+
+void sun_dyn_CallSiteImpl::set_target(oop site, oop target) {
+ site->obj_field_put(_target_offset, target);
+}
+
+oop sun_dyn_CallSiteImpl::vmmethod(oop site) {
+ return site->obj_field(_vmmethod_offset);
+}
+
+void sun_dyn_CallSiteImpl::set_vmmethod(oop site, oop ref) {
+ site->obj_field_put(_vmmethod_offset, ref);
+}
// Support for java_security_AccessControlContext
@@ -2775,6 +2810,9 @@
java_dyn_MethodType::compute_offsets();
java_dyn_MethodTypeForm::compute_offsets();
}
+ if (EnableInvokeDynamic) {
+ sun_dyn_CallSiteImpl::compute_offsets();
+ }
java_security_AccessControlContext::compute_offsets();
// Initialize reflection classes. The layouts of these classes
// changed with the new reflection implementation in JDK 1.4, and
--- a/hotspot/src/share/vm/classfile/javaClasses.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/classfile/javaClasses.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -1060,6 +1060,33 @@
};
+// Interface to sun.dyn.CallSiteImpl objects
+
+class sun_dyn_CallSiteImpl: AllStatic {
+ friend class JavaClasses;
+
+private:
+ static int _type_offset;
+ static int _target_offset;
+ static int _vmmethod_offset;
+
+ static void compute_offsets();
+
+public:
+ // Accessors
+ static oop type(oop site);
+
+ static oop target(oop site);
+ static void set_target(oop site, oop target);
+
+ static oop vmmethod(oop site);
+ static void set_vmmethod(oop site, oop ref);
+
+ // Accessors for code generation:
+ static int target_offset_in_bytes() { return _target_offset; }
+ static int type_offset_in_bytes() { return _type_offset; }
+ static int vmmethod_offset_in_bytes() { return _vmmethod_offset; }
+};
// Interface to java.security.AccessControlContext objects
--- a/hotspot/src/share/vm/classfile/systemDictionary.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1951,6 +1951,16 @@
// Skip the rest of the method handle classes, if MethodHandle is not loaded.
scan = WKID(meth_group_end+1);
}
+ WKID indy_group_start = WK_KLASS_ENUM_NAME(Linkage_klass);
+ WKID indy_group_end = WK_KLASS_ENUM_NAME(Dynamic_klass);
+ initialize_wk_klasses_until(indy_group_start, scan, CHECK);
+ if (EnableInvokeDynamic) {
+ initialize_wk_klasses_through(indy_group_start, scan, CHECK);
+ }
+ if (_well_known_klasses[indy_group_start] == NULL) {
+ // Skip the rest of the dynamic typing classes, if Linkage is not loaded.
+ scan = WKID(indy_group_end+1);
+ }
initialize_wk_klasses_until(WKID_LIMIT, scan, CHECK);
@@ -2367,6 +2377,76 @@
}
+// Ask Java code to find or construct a java.dyn.CallSite for the given
+// name and signature, as interpreted relative to the given class loader.
+Handle SystemDictionary::make_dynamic_call_site(KlassHandle caller,
+ int caller_method_idnum,
+ int caller_bci,
+ symbolHandle name,
+ methodHandle mh_invdyn,
+ TRAPS) {
+ Handle empty;
+ // call sun.dyn.CallSiteImpl::makeSite(caller, name, mtype, cmid, cbci)
+ oop name_str_oop = StringTable::intern(name(), CHECK_(empty)); // not a handle!
+ JavaCallArguments args(Handle(THREAD, caller->java_mirror()));
+ args.push_oop(name_str_oop);
+ args.push_oop(mh_invdyn->method_handle_type());
+ args.push_int(caller_method_idnum);
+ args.push_int(caller_bci);
+ JavaValue result(T_OBJECT);
+ JavaCalls::call_static(&result,
+ SystemDictionary::CallSiteImpl_klass(),
+ vmSymbols::makeSite_name(), vmSymbols::makeSite_signature(),
+ &args, CHECK_(empty));
+ oop call_site_oop = (oop) result.get_jobject();
+ sun_dyn_CallSiteImpl::set_vmmethod(call_site_oop, mh_invdyn());
+ if (TraceMethodHandles) {
+ tty->print_cr("Linked invokedynamic bci=%d site="INTPTR_FORMAT":", caller_bci, call_site_oop);
+ call_site_oop->print();
+ tty->cr();
+ }
+ return call_site_oop;
+}
+
+Handle SystemDictionary::find_bootstrap_method(KlassHandle caller,
+ KlassHandle search_bootstrap_klass,
+ TRAPS) {
+ Handle empty;
+ if (!caller->oop_is_instance()) return empty;
+
+ instanceKlassHandle ik(THREAD, caller());
+
+ if (ik->bootstrap_method() != NULL) {
+ return Handle(THREAD, ik->bootstrap_method());
+ }
+
+ // call java.dyn.Linkage::findBootstrapMethod(caller, sbk)
+ JavaCallArguments args(Handle(THREAD, ik->java_mirror()));
+ if (search_bootstrap_klass.is_null())
+ args.push_oop(Handle());
+ else
+ args.push_oop(search_bootstrap_klass->java_mirror());
+ JavaValue result(T_OBJECT);
+ JavaCalls::call_static(&result,
+ SystemDictionary::Linkage_klass(),
+ vmSymbols::findBootstrapMethod_name(),
+ vmSymbols::findBootstrapMethod_signature(),
+ &args, CHECK_(empty));
+ oop boot_method_oop = (oop) result.get_jobject();
+
+ if (boot_method_oop != NULL) {
+ // probably no race conditions, but let's be careful:
+ if (Atomic::cmpxchg_ptr(boot_method_oop, ik->adr_bootstrap_method(), NULL) == NULL)
+ ik->set_bootstrap_method(boot_method_oop);
+ else
+ boot_method_oop = ik->bootstrap_method();
+ } else {
+ boot_method_oop = ik->bootstrap_method();
+ }
+
+ return Handle(THREAD, boot_method_oop);
+}
+
// Since the identity hash code for symbols changes when the symbols are
// moved from the regular perm gen (hash in the mark word) to the shared
// spaces (hash is the address), the classes loaded into the dictionary
--- a/hotspot/src/share/vm/classfile/systemDictionary.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/classfile/systemDictionary.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -142,6 +142,12 @@
template(MethodType_klass, java_dyn_MethodType, Opt) \
template(MethodTypeForm_klass, java_dyn_MethodTypeForm, Opt) \
template(WrongMethodTypeException_klass, java_dyn_WrongMethodTypeException, Opt) \
+ template(Linkage_klass, java_dyn_Linkage, Opt) \
+ template(CallSite_klass, java_dyn_CallSite, Opt) \
+ template(CallSiteImpl_klass, sun_dyn_CallSiteImpl, Opt) \
+ template(Dynamic_klass, java_dyn_Dynamic, Opt) \
+ /* Note: MethodHandle must be first, and Dynamic last in group */ \
+ \
template(vector_klass, java_util_Vector, Pre) \
template(hashtable_klass, java_util_Hashtable, Pre) \
template(stringBuffer_klass, java_lang_StringBuffer, Pre) \
@@ -466,6 +472,21 @@
Handle class_loader,
Handle protection_domain,
TRAPS);
+ // ask Java to create a dynamic call site, while linking an invokedynamic op
+ static Handle make_dynamic_call_site(KlassHandle caller,
+ int caller_method_idnum,
+ int caller_bci,
+ symbolHandle name,
+ methodHandle mh_invoke,
+ TRAPS);
+
+ // coordinate with Java about bootstrap methods
+ static Handle find_bootstrap_method(KlassHandle caller,
+ // This argument is non-null only when a
+ // classfile attribute has been found:
+ KlassHandle search_bootstrap_klass,
+ TRAPS);
+
// Utility for printing loader "name" as part of tracing constraints
static const char* loader_name(oop loader) {
return ((loader) == NULL ? "<bootloader>" :
--- a/hotspot/src/share/vm/classfile/verifier.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/classfile/verifier.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1174,6 +1174,7 @@
&this_uninit, return_type, cp, CHECK_VERIFY(this));
no_control_flow = false; break;
case Bytecodes::_invokeinterface :
+ case Bytecodes::_invokedynamic :
verify_invoke_instructions(
&bcs, code_length, ¤t_frame,
&this_uninit, return_type, cp, CHECK_VERIFY(this));
@@ -1895,12 +1896,23 @@
Bytecodes::Code opcode = bcs->code();
unsigned int types = (opcode == Bytecodes::_invokeinterface
? 1 << JVM_CONSTANT_InterfaceMethodref
+ : opcode == Bytecodes::_invokedynamic
+ ? 1 << JVM_CONSTANT_NameAndType
: 1 << JVM_CONSTANT_Methodref);
verify_cp_type(index, cp, types, CHECK_VERIFY(this));
// Get method name and signature
- symbolHandle method_name(THREAD, cp->name_ref_at(index));
- symbolHandle method_sig(THREAD, cp->signature_ref_at(index));
+ symbolHandle method_name;
+ symbolHandle method_sig;
+ if (opcode == Bytecodes::_invokedynamic) {
+ int name_index = cp->name_ref_index_at(index);
+ int sig_index = cp->signature_ref_index_at(index);
+ method_name = symbolHandle(THREAD, cp->symbol_at(name_index));
+ method_sig = symbolHandle(THREAD, cp->symbol_at(sig_index));
+ } else {
+ method_name = symbolHandle(THREAD, cp->name_ref_at(index));
+ method_sig = symbolHandle(THREAD, cp->signature_ref_at(index));
+ }
if (!SignatureVerifier::is_valid_method_signature(method_sig)) {
class_format_error(
@@ -1910,8 +1922,17 @@
}
// Get referenced class type
- VerificationType ref_class_type = cp_ref_index_to_type(
- index, cp, CHECK_VERIFY(this));
+ VerificationType ref_class_type;
+ if (opcode == Bytecodes::_invokedynamic) {
+ if (!EnableInvokeDynamic) {
+ class_format_error(
+ "invokedynamic instructions not enabled on this JVM",
+ _klass->external_name());
+ return;
+ }
+ } else {
+ ref_class_type = cp_ref_index_to_type(index, cp, CHECK_VERIFY(this));
+ }
// For a small signature length, we just allocate 128 bytes instead
// of parsing the signature once to find its size.
@@ -1970,6 +1991,14 @@
}
}
+ if (opcode == Bytecodes::_invokedynamic) {
+ address bcp = bcs->bcp();
+ if (*(bcp+3) != 0 || *(bcp+4) != 0) {
+ verify_error(bci, "Third and fourth operand bytes of invokedynamic must be zero");
+ return;
+ }
+ }
+
if (method_name->byte_at(0) == '<') {
// Make sure <init> can only be invoked by invokespecial
if (opcode != Bytecodes::_invokespecial ||
@@ -1994,7 +2023,8 @@
current_frame->pop_stack(sig_types[i], CHECK_VERIFY(this));
}
// Check objectref on operand stack
- if (opcode != Bytecodes::_invokestatic) {
+ if (opcode != Bytecodes::_invokestatic &&
+ opcode != Bytecodes::_invokedynamic) {
if (method_name() == vmSymbols::object_initializer_name()) { // <init> method
verify_invoke_init(bcs, ref_class_type, current_frame,
code_length, this_uninit, cp, CHECK_VERIFY(this));
--- a/hotspot/src/share/vm/classfile/vmSymbols.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -217,6 +217,9 @@
template(base_name, "base") \
\
/* Support for JSR 292 & invokedynamic (JDK 1.7 and above) */ \
+ template(java_dyn_Dynamic, "java/dyn/Dynamic") \
+ template(java_dyn_Linkage, "java/dyn/Linkage") \
+ template(java_dyn_CallSite, "java/dyn/CallSite") \
template(java_dyn_MethodHandle, "java/dyn/MethodHandle") \
template(java_dyn_MethodType, "java/dyn/MethodType") \
template(java_dyn_WrongMethodTypeException, "java/dyn/WrongMethodTypeException") \
@@ -230,8 +233,13 @@
template(sun_dyn_AdapterMethodHandle, "sun/dyn/AdapterMethodHandle") \
template(sun_dyn_BoundMethodHandle, "sun/dyn/BoundMethodHandle") \
template(sun_dyn_DirectMethodHandle, "sun/dyn/DirectMethodHandle") \
+ template(sun_dyn_CallSiteImpl, "sun/dyn/CallSiteImpl") \
template(makeImpl_name, "makeImpl") /*MethodType::makeImpl*/ \
template(makeImpl_signature, "(Ljava/lang/Class;[Ljava/lang/Class;ZZ)Ljava/dyn/MethodType;") \
+ template(makeSite_name, "makeSite") /*CallSiteImpl::makeImpl*/ \
+ template(makeSite_signature, "(Ljava/lang/Class;Ljava/lang/String;Ljava/dyn/MethodType;II)Ljava/dyn/CallSite;") \
+ template(findBootstrapMethod_name, "findBootstrapMethod") \
+ template(findBootstrapMethod_signature, "(Ljava/lang/Class;Ljava/lang/Class;)Ljava/dyn/MethodHandle;") \
NOT_LP64( do_alias(machine_word_signature, int_signature) ) \
LP64_ONLY( do_alias(machine_word_signature, long_signature) ) \
\
@@ -308,9 +316,11 @@
template(bitCount_name, "bitCount") \
template(profile_name, "profile") \
template(equals_name, "equals") \
+ template(target_name, "target") \
template(toString_name, "toString") \
template(values_name, "values") \
template(receiver_name, "receiver") \
+ template(vmmethod_name, "vmmethod") \
template(vmtarget_name, "vmtarget") \
template(vmentry_name, "vmentry") \
template(vmslots_name, "vmslots") \
--- a/hotspot/src/share/vm/includeDB_compiler1 Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/includeDB_compiler1 Mon Apr 27 12:33:57 2009 -0700
@@ -270,6 +270,7 @@
c1_LinearScan.cpp bitMap.inline.hpp
c1_LinearScan.cpp c1_CFGPrinter.hpp
+c1_LinearScan.cpp c1_CodeStubs.hpp
c1_LinearScan.cpp c1_Compilation.hpp
c1_LinearScan.cpp c1_FrameMap.hpp
c1_LinearScan.cpp c1_IR.hpp
--- a/hotspot/src/share/vm/includeDB_core Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/includeDB_core Mon Apr 27 12:33:57 2009 -0700
@@ -4102,6 +4102,7 @@
templateTable_<arch_model>.cpp interpreterRuntime.hpp
templateTable_<arch_model>.cpp interpreter.hpp
templateTable_<arch_model>.cpp methodDataOop.hpp
+templateTable_<arch_model>.cpp methodHandles.hpp
templateTable_<arch_model>.cpp objArrayKlass.hpp
templateTable_<arch_model>.cpp oop.inline.hpp
templateTable_<arch_model>.cpp sharedRuntime.hpp
--- a/hotspot/src/share/vm/includeDB_gc_parallel Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/includeDB_gc_parallel Mon Apr 27 12:33:57 2009 -0700
@@ -42,6 +42,12 @@
constantPoolKlass.cpp psScavenge.inline.hpp
constantPoolKlass.cpp parOopClosures.inline.hpp
+cpCacheKlass.cpp cardTableRS.hpp
+cpCacheKlass.cpp oop.pcgc.inline.hpp
+cpCacheKlass.cpp psPromotionManager.inline.hpp
+cpCacheKlass.cpp psScavenge.inline.hpp
+cpCacheKlass.cpp parOopClosures.inline.hpp
+
genCollectedHeap.cpp concurrentMarkSweepThread.hpp
genCollectedHeap.cpp vmCMSOperations.hpp
--- a/hotspot/src/share/vm/includeDB_jvmti Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/includeDB_jvmti Mon Apr 27 12:33:57 2009 -0700
@@ -28,6 +28,7 @@
jvmtiClassFileReconstituter.cpp bytes_<arch>.hpp
jvmtiClassFileReconstituter.cpp jvmtiClassFileReconstituter.hpp
jvmtiClassFileReconstituter.cpp symbolTable.hpp
+jvmtiClassFileReconstituter.cpp signature.hpp
jvmtiClassFileReconstituter.hpp jvmtiEnv.hpp
--- a/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -217,6 +217,73 @@
stackElementSize()) + tag_offset_in_bytes();
}
+ // access to stacked values according to type:
+ static oop* oop_addr_in_slot(intptr_t* slot_addr) {
+ return (oop*) slot_addr;
+ }
+ static jint* int_addr_in_slot(intptr_t* slot_addr) {
+ if ((int) sizeof(jint) < wordSize && !Bytes::is_Java_byte_ordering_different())
+ // big-endian LP64
+ return (jint*)(slot_addr + 1) - 1;
+ else
+ return (jint*) slot_addr;
+ }
+ static jlong long_in_slot(intptr_t* slot_addr) {
+ if (sizeof(intptr_t) >= sizeof(jlong)) {
+ return *(jlong*) slot_addr;
+ } else if (!TaggedStackInterpreter) {
+ return Bytes::get_native_u8((address)slot_addr);
+ } else {
+ assert(sizeof(intptr_t) * 2 == sizeof(jlong), "ILP32");
+ // assemble the long in memory order (not arithmetic order)
+ union { jlong j; jint i[2]; } u;
+ u.i[0] = (jint) slot_addr[0*stackElementSize()];
+ u.i[1] = (jint) slot_addr[1*stackElementSize()];
+ return u.j;
+ }
+ }
+ static void set_long_in_slot(intptr_t* slot_addr, jlong value) {
+ if (sizeof(intptr_t) >= sizeof(jlong)) {
+ *(jlong*) slot_addr = value;
+ } else if (!TaggedStackInterpreter) {
+ Bytes::put_native_u8((address)slot_addr, value);
+ } else {
+ assert(sizeof(intptr_t) * 2 == sizeof(jlong), "ILP32");
+ // assemble the long in memory order (not arithmetic order)
+ union { jlong j; jint i[2]; } u;
+ u.j = value;
+ slot_addr[0*stackElementSize()] = (intptr_t) u.i[0];
+ slot_addr[1*stackElementSize()] = (intptr_t) u.i[1];
+ }
+ }
+ static void get_jvalue_in_slot(intptr_t* slot_addr, BasicType type, jvalue* value) {
+ switch (type) {
+ case T_BOOLEAN: value->z = *int_addr_in_slot(slot_addr); break;
+ case T_CHAR: value->c = *int_addr_in_slot(slot_addr); break;
+ case T_BYTE: value->b = *int_addr_in_slot(slot_addr); break;
+ case T_SHORT: value->s = *int_addr_in_slot(slot_addr); break;
+ case T_INT: value->i = *int_addr_in_slot(slot_addr); break;
+ case T_LONG: value->j = long_in_slot(slot_addr); break;
+ case T_FLOAT: value->f = *(jfloat*)int_addr_in_slot(slot_addr); break;
+ case T_DOUBLE: value->d = jdouble_cast(long_in_slot(slot_addr)); break;
+ case T_OBJECT: value->l = (jobject)*oop_addr_in_slot(slot_addr); break;
+ default: ShouldNotReachHere();
+ }
+ }
+ static void set_jvalue_in_slot(intptr_t* slot_addr, BasicType type, jvalue* value) {
+ switch (type) {
+ case T_BOOLEAN: *int_addr_in_slot(slot_addr) = (value->z != 0); break;
+ case T_CHAR: *int_addr_in_slot(slot_addr) = value->c; break;
+ case T_BYTE: *int_addr_in_slot(slot_addr) = value->b; break;
+ case T_SHORT: *int_addr_in_slot(slot_addr) = value->s; break;
+ case T_INT: *int_addr_in_slot(slot_addr) = value->i; break;
+ case T_LONG: set_long_in_slot(slot_addr, value->j); break;
+ case T_FLOAT: *(jfloat*)int_addr_in_slot(slot_addr) = value->f; break;
+ case T_DOUBLE: set_long_in_slot(slot_addr, jlong_cast(value->d)); break;
+ case T_OBJECT: *oop_addr_in_slot(slot_addr) = (oop) value->l; break;
+ default: ShouldNotReachHere();
+ }
+ }
};
//------------------------------------------------------------------------------------------------------------------------
--- a/hotspot/src/share/vm/interpreter/bytecode.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/interpreter/bytecode.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -34,12 +34,6 @@
}
-void Bytecode::set_fast_index(int i) {
- assert(0 <= i && i < 0x10000, "illegal index value");
- Bytes::put_native_u2(addr_at(1), (jushort)i);
-}
-
-
bool Bytecode::check_must_rewrite() const {
assert(Bytecodes::can_rewrite(code()), "post-check only");
@@ -118,7 +112,12 @@
int Bytecode_invoke::index() const {
- return Bytes::get_Java_u2(bcp() + 1);
+ // Note: Rewriter::rewrite changes the Java_u2 of an invokedynamic to a native_u4,
+ // at the same time it allocates per-call-site CP cache entries.
+ if (has_giant_index())
+ return Bytes::get_native_u4(bcp() + 1);
+ else
+ return Bytes::get_Java_u2(bcp() + 1);
}
--- a/hotspot/src/share/vm/interpreter/bytecode.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/interpreter/bytecode.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -65,14 +65,6 @@
// The base class for different kinds of bytecode abstractions.
// Provides the primitive operations to manipulate code relative
// to an objects 'this' pointer.
-//
-// Note: Even though it seems that the fast_index & set_fast_index
-// functions are machine specific, they're not. They only use
-// the natural way to store a 16bit index on a given machine,
-// independent of the particular byte ordering. Since all other
-// places in the system that refer to these indices use the
-// same method (the natural byte ordering on the platform)
-// this will always work and be machine-independent).
class Bytecode: public ThisRelativeObj {
protected:
@@ -83,24 +75,40 @@
// Attributes
address bcp() const { return addr_at(0); }
address next_bcp() const { return addr_at(0) + Bytecodes::length_at(bcp()); }
+ int instruction_size() const { return Bytecodes::length_at(bcp()); }
Bytecodes::Code code() const { return Bytecodes::code_at(addr_at(0)); }
Bytecodes::Code java_code() const { return Bytecodes::java_code(code()); }
bool must_rewrite() const { return Bytecodes::can_rewrite(code()) && check_must_rewrite(); }
bool is_active_breakpoint() const { return Bytecodes::is_active_breakpoint_at(bcp()); }
- int one_byte_index() const { return byte_at(1); }
- int two_byte_index() const { return (byte_at(1) << 8) + byte_at(2); }
+ int one_byte_index() const { assert_index_size(1); return byte_at(1); }
+ int two_byte_index() const { assert_index_size(2); return (byte_at(1) << 8) + byte_at(2); }
+
int offset() const { return (two_byte_index() << 16) >> 16; }
address destination() const { return bcp() + offset(); }
- int fast_index() const { return Bytes::get_native_u2(addr_at(1)); }
// Attribute modification
void set_code(Bytecodes::Code code);
- void set_fast_index(int i);
// Creation
inline friend Bytecode* Bytecode_at(address bcp);
+
+ private:
+ void assert_index_size(int required_size) const {
+#ifdef ASSERT
+ int isize = instruction_size() - 1;
+ if (isize == 2 && code() == Bytecodes::_iinc)
+ isize = 1;
+ else if (isize <= 2)
+ ; // no change
+ else if (code() == Bytecodes::_invokedynamic)
+ isize = 4;
+ else
+ isize = 2;
+ assert(isize = required_size, "wrong index size");
+#endif
+ }
};
inline Bytecode* Bytecode_at(address bcp) {
@@ -195,6 +203,9 @@
bool is_invokevirtual() const { return adjusted_invoke_code() == Bytecodes::_invokevirtual; }
bool is_invokestatic() const { return adjusted_invoke_code() == Bytecodes::_invokestatic; }
bool is_invokespecial() const { return adjusted_invoke_code() == Bytecodes::_invokespecial; }
+ bool is_invokedynamic() const { return adjusted_invoke_code() == Bytecodes::_invokedynamic; }
+
+ bool has_giant_index() const { return is_invokedynamic(); }
bool is_valid() const { return is_invokeinterface() ||
is_invokevirtual() ||
--- a/hotspot/src/share/vm/interpreter/bytecodeStream.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/interpreter/bytecodeStream.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -109,6 +109,7 @@
Bytecodes::Code code() const { return _code; }
bool is_wide() const { return _is_wide; }
+ int instruction_size() const { return (_next_bci - _bci); }
bool is_last_bytecode() const { return _next_bci >= _end_bci; }
address bcp() const { return method()->code_base() + _bci; }
@@ -122,8 +123,29 @@
int dest_w() const { return bci() + (int )Bytes::get_Java_u4(bcp() + 1); }
// Unsigned indices, widening
- int get_index() const { return (is_wide()) ? Bytes::get_Java_u2(bcp() + 2) : bcp()[1]; }
- int get_index_big() const { return (int)Bytes::get_Java_u2(bcp() + 1); }
+ int get_index() const { assert_index_size(is_wide() ? 2 : 1);
+ return (is_wide()) ? Bytes::get_Java_u2(bcp() + 2) : bcp()[1]; }
+ int get_index_big() const { assert_index_size(2);
+ return (int)Bytes::get_Java_u2(bcp() + 1); }
+ int get_index_int() const { return has_giant_index() ? get_index_giant() : get_index_big(); }
+ int get_index_giant() const { assert_index_size(4); return Bytes::get_native_u4(bcp() + 1); }
+ int has_giant_index() const { return (code() == Bytecodes::_invokedynamic); }
+
+ private:
+ void assert_index_size(int required_size) const {
+#ifdef ASSERT
+ int isize = instruction_size() - (int)_is_wide - 1;
+ if (isize == 2 && code() == Bytecodes::_iinc)
+ isize = 1;
+ else if (isize <= 2)
+ ; // no change
+ else if (has_giant_index())
+ isize = 4;
+ else
+ isize = 2;
+ assert(isize = required_size, "wrong index size");
+#endif
+ }
};
// In BytecodeStream, non-java bytecodes will be translated into the
--- a/hotspot/src/share/vm/interpreter/bytecodeTracer.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/interpreter/bytecodeTracer.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -48,12 +48,15 @@
int get_index() { return *(address)_next_pc++; }
int get_big_index() { int i=Bytes::get_Java_u2(_next_pc); _next_pc+=2; return i; }
+ int get_giant_index() { int i=Bytes::get_native_u4(_next_pc); _next_pc+=4; return i; }
int get_index_special() { return (is_wide()) ? get_big_index() : get_index(); }
methodOop method() { return _current_method; }
bool is_wide() { return _is_wide; }
+ bool check_index(int i, bool in_cp_cache, int& cp_index, outputStream* st = tty);
void print_constant(int i, outputStream* st = tty);
+ void print_field_or_method(int i, outputStream* st = tty);
void print_attributes(Bytecodes::Code code, int bci, outputStream* st = tty);
void bytecode_epilog(int bci, outputStream* st = tty);
@@ -182,7 +185,71 @@
}
}
+bool BytecodePrinter::check_index(int i, bool in_cp_cache, int& cp_index, outputStream* st) {
+ constantPoolOop constants = method()->constants();
+ int ilimit = constants->length(), climit = 0;
+
+ constantPoolCacheOop cache = NULL;
+ if (in_cp_cache) {
+ cache = constants->cache();
+ if (cache != NULL) {
+ //climit = cache->length(); // %%% private!
+ size_t size = cache->size() * HeapWordSize;
+ size -= sizeof(constantPoolCacheOopDesc);
+ size /= sizeof(ConstantPoolCacheEntry);
+ climit = (int) size;
+ }
+ }
+
+ if (in_cp_cache && constantPoolCacheOopDesc::is_secondary_index(i)) {
+ i = constantPoolCacheOopDesc::decode_secondary_index(i);
+ st->print(" secondary cache[%d] of", i);
+ if (i >= 0 && i < climit) {
+ if (!cache->entry_at(i)->is_secondary_entry()) {
+ st->print_cr(" not secondary entry?", i);
+ return false;
+ }
+ i = cache->entry_at(i)->main_entry_index();
+ goto check_cache_index;
+ } else {
+ st->print_cr(" not in cache[*]?", i);
+ return false;
+ }
+ }
+
+ if (cache != NULL) {
+ i = Bytes::swap_u2(i);
+ if (WizardMode) st->print(" (swap=%d)", i);
+ goto check_cache_index;
+ }
+
+ check_cp_index:
+ if (i >= 0 && i < ilimit) {
+ if (WizardMode) st->print(" cp[%d]", i);
+ cp_index = i;
+ return true;
+ }
+
+ st->print_cr(" CP[%d] not in CP", i);
+ return false;
+
+ check_cache_index:
+ if (i >= 0 && i < climit) {
+ if (cache->entry_at(i)->is_secondary_entry()) {
+ st->print_cr(" secondary entry?");
+ return false;
+ }
+ i = cache->entry_at(i)->constant_pool_index();
+ goto check_cp_index;
+ }
+ st->print_cr(" not in CP[*]?", i);
+ return false;
+}
+
void BytecodePrinter::print_constant(int i, outputStream* st) {
+ int orig_i = i;
+ if (!check_index(orig_i, false, i, st)) return;
+
constantPoolOop constants = method()->constants();
constantTag tag = constants->tag_at(i);
@@ -203,13 +270,36 @@
st->print_cr(" %s", constants->resolved_klass_at(i)->klass_part()->external_name());
} else if (tag.is_unresolved_klass()) {
st->print_cr(" <unresolved klass at %d>", i);
- } else ShouldNotReachHere();
+ } else {
+ st->print_cr(" bad tag=%d at %d", tag.value(), i);
+ }
+}
+
+void BytecodePrinter::print_field_or_method(int i, outputStream* st) {
+ int orig_i = i;
+ if (!check_index(orig_i, true, i, st)) return;
+
+ constantPoolOop constants = method()->constants();
+ constantTag tag = constants->tag_at(i);
+
+ switch (tag.value()) {
+ case JVM_CONSTANT_InterfaceMethodref:
+ case JVM_CONSTANT_Methodref:
+ case JVM_CONSTANT_Fieldref:
+ break;
+ default:
+ st->print_cr(" bad tag=%d at %d", tag.value(), i);
+ return;
+ }
+
+ symbolOop name = constants->name_ref_at(orig_i);
+ symbolOop signature = constants->signature_ref_at(orig_i);
+ st->print_cr(" %d <%s> <%s> ", i, name->as_C_string(), signature->as_C_string());
}
void BytecodePrinter::print_attributes(Bytecodes::Code code, int bci, outputStream* st) {
// Show attributes of pre-rewritten codes
- code = Bytecodes::java_code(code);
// If the code doesn't have any fields there's nothing to print.
// note this is ==1 because the tableswitch and lookupswitch are
// zero size (for some reason) and we want to print stuff out for them.
@@ -354,36 +444,28 @@
case Bytecodes::_putstatic:
case Bytecodes::_getstatic:
case Bytecodes::_putfield:
- case Bytecodes::_getfield: {
- int i = get_big_index();
- constantPoolOop constants = method()->constants();
- symbolOop field = constants->name_ref_at(i);
- st->print_cr(" %d <%s>", i, field->as_C_string());
- }
+ case Bytecodes::_getfield:
+ print_field_or_method(get_big_index(), st);
break;
case Bytecodes::_invokevirtual:
case Bytecodes::_invokespecial:
case Bytecodes::_invokestatic:
- { int i = get_big_index();
- constantPoolOop constants = method()->constants();
- symbolOop name = constants->name_ref_at(i);
- symbolOop signature = constants->signature_ref_at(i);
- st->print_cr(" %d <%s> <%s> ", i, name->as_C_string(), signature->as_C_string());
- }
+ print_field_or_method(get_big_index(), st);
break;
case Bytecodes::_invokeinterface:
{ int i = get_big_index();
int n = get_index();
- get_index();
- constantPoolOop constants = method()->constants();
- symbolOop name = constants->name_ref_at(i);
- symbolOop signature = constants->signature_ref_at(i);
- st->print_cr(" %d <%s> <%s> %d", i, name->as_C_string(), signature->as_C_string(), n);
+ get_index(); // ignore zero byte
+ print_field_or_method(i, st);
}
break;
+ case Bytecodes::_invokedynamic:
+ print_field_or_method(get_giant_index(), st);
+ break;
+
case Bytecodes::_new:
case Bytecodes::_checkcast:
case Bytecodes::_instanceof:
--- a/hotspot/src/share/vm/interpreter/bytecodes.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/interpreter/bytecodes.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -357,7 +357,7 @@
def(_invokespecial , "invokespecial" , "bjj" , NULL , T_ILLEGAL, -1, true);
def(_invokestatic , "invokestatic" , "bjj" , NULL , T_ILLEGAL, 0, true);
def(_invokeinterface , "invokeinterface" , "bjj__", NULL , T_ILLEGAL, -1, true);
- def(_xxxunusedxxx , "xxxunusedxxx" , NULL , NULL , T_VOID , 0, false);
+ def(_invokedynamic , "invokedynamic" , "bjjjj", NULL , T_ILLEGAL, -1, true );
def(_new , "new" , "bii" , NULL , T_OBJECT , 1, true );
def(_newarray , "newarray" , "bc" , NULL , T_OBJECT , 0, true );
def(_anewarray , "anewarray" , "bii" , NULL , T_OBJECT , 0, true );
--- a/hotspot/src/share/vm/interpreter/bytecodes.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/interpreter/bytecodes.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -218,7 +218,7 @@
_invokespecial = 183, // 0xb7
_invokestatic = 184, // 0xb8
_invokeinterface = 185, // 0xb9
- _xxxunusedxxx = 186, // 0xba
+ _invokedynamic = 186, // 0xba // if EnableInvokeDynamic
_new = 187, // 0xbb
_newarray = 188, // 0xbc
_anewarray = 189, // 0xbd
--- a/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -681,6 +681,133 @@
IRT_END
+// First time execution: Resolve symbols, create a permanent CallSiteImpl object.
+IRT_ENTRY(void, InterpreterRuntime::resolve_invokedynamic(JavaThread* thread)) {
+ ResourceMark rm(thread);
+
+ assert(EnableInvokeDynamic, "");
+
+ const Bytecodes::Code bytecode = Bytecodes::_invokedynamic;
+
+ methodHandle caller_method(thread, method(thread));
+
+ // first determine if there is a bootstrap method
+ {
+ KlassHandle caller_klass(thread, caller_method->method_holder());
+ Handle bootm = SystemDictionary::find_bootstrap_method(caller_klass, KlassHandle(), CHECK);
+ if (bootm.is_null()) {
+ // If there is no bootstrap method, throw IncompatibleClassChangeError.
+ // This is a valid generic error type for resolution (JLS 12.3.3).
+ char buf[200];
+ jio_snprintf(buf, sizeof(buf), "Class %s has not declared a bootstrap method for invokedynamic",
+ (Klass::cast(caller_klass()))->external_name());
+ THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
+ }
+ }
+
+ constantPoolHandle pool(thread, caller_method->constants());
+ pool->set_invokedynamic(); // mark header to flag active call sites
+
+ int raw_index = four_byte_index(thread);
+ assert(constantPoolCacheOopDesc::is_secondary_index(raw_index), "invokedynamic indexes marked specially");
+
+ // there are two CPC entries that are of interest:
+ int site_index = constantPoolCacheOopDesc::decode_secondary_index(raw_index);
+ int main_index = pool->cache()->entry_at(site_index)->main_entry_index();
+ // and there is one CP entry, a NameAndType:
+ int nt_index = pool->map_instruction_operand_to_index(raw_index);
+
+ // first resolve the signature to a MH.invoke methodOop
+ if (!pool->cache()->entry_at(main_index)->is_resolved(bytecode)) {
+ JvmtiHideSingleStepping jhss(thread);
+ CallInfo info;
+ LinkResolver::resolve_invoke(info, Handle(), pool,
+ raw_index, bytecode, CHECK);
+ // The main entry corresponds to a JVM_CONSTANT_NameAndType, and serves
+ // as a common reference point for all invokedynamic call sites with
+ // that exact call descriptor. We will link it in the CP cache exactly
+ // as if it were an invokevirtual of MethodHandle.invoke.
+ pool->cache()->entry_at(main_index)->set_method(
+ bytecode,
+ info.resolved_method(),
+ info.vtable_index());
+ assert(pool->cache()->entry_at(main_index)->is_vfinal(), "f2 must be a methodOop");
+ }
+
+ // The method (f2 entry) of the main entry is the MH.invoke for the
+ // invokedynamic target call signature.
+ intptr_t f2_value = pool->cache()->entry_at(main_index)->f2();
+ methodHandle mh_invdyn(THREAD, (methodOop) f2_value);
+ assert(mh_invdyn.not_null() && mh_invdyn->is_method() && mh_invdyn->is_method_handle_invoke(),
+ "correct result from LinkResolver::resolve_invokedynamic");
+
+ symbolHandle call_site_name(THREAD, pool->nt_name_ref_at(nt_index));
+ Handle call_site
+ = SystemDictionary::make_dynamic_call_site(caller_method->method_holder(),
+ caller_method->method_idnum(),
+ caller_method->bci_from(bcp(thread)),
+ call_site_name,
+ mh_invdyn,
+ CHECK);
+
+ // In the secondary entry, the f1 field is the call site, and the f2 (index)
+ // field is some data about the invoke site.
+ int extra_data = 0;
+ pool->cache()->entry_at(site_index)->set_dynamic_call(call_site(), extra_data);
+}
+IRT_END
+
+
+// Called on first time execution, and also whenever the CallSite.target is null.
+// FIXME: Do more of this in Java code.
+IRT_ENTRY(void, InterpreterRuntime::bootstrap_invokedynamic(JavaThread* thread, oopDesc* call_site)) {
+ methodHandle mh_invdyn(thread, (methodOop) sun_dyn_CallSiteImpl::vmmethod(call_site));
+ Handle mh_type(thread, mh_invdyn->method_handle_type());
+ objArrayHandle mh_ptypes(thread, java_dyn_MethodType::ptypes(mh_type()));
+
+ // squish the arguments down to a single array
+ int nargs = mh_ptypes->length();
+ objArrayHandle arg_array;
+ {
+ objArrayOop aaoop = oopFactory::new_objArray(SystemDictionary::object_klass(), nargs, CHECK);
+ arg_array = objArrayHandle(thread, aaoop);
+ }
+ frame fr = thread->last_frame();
+ assert(fr.interpreter_frame_bcp() != NULL, "sanity");
+ int tos_offset = 0;
+ for (int i = nargs; --i >= 0; ) {
+ intptr_t* slot_addr = fr.interpreter_frame_tos_at(tos_offset++);
+ oop ptype = mh_ptypes->obj_at(i);
+ oop arg = NULL;
+ if (!java_lang_Class::is_primitive(ptype)) {
+ arg = *(oop*) slot_addr;
+ } else {
+ BasicType bt = java_lang_Class::primitive_type(ptype);
+ assert(frame::interpreter_frame_expression_stack_direction() < 0, "else reconsider this code");
+ jvalue value;
+ Interpreter::get_jvalue_in_slot(slot_addr, bt, &value);
+ tos_offset += type2size[bt]-1;
+ arg = java_lang_boxing_object::create(bt, &value, CHECK);
+ // FIXME: These boxing objects are not canonicalized under
+ // the Java autoboxing rules. They should be...
+ // The best approach would be to push the arglist creation into Java.
+ // The JVM should use a lower-level interface to communicate argument lists.
+ }
+ arg_array->obj_at_put(i, arg);
+ }
+
+ // now find the bootstrap method
+ oop bootstrap_mh_oop = instanceKlass::cast(fr.interpreter_frame_method()->method_holder())->bootstrap_method();
+ assert(bootstrap_mh_oop != NULL, "resolve_invokedynamic ensures a BSM");
+
+ // return the bootstrap method and argument array via vm_result/_2
+ thread->set_vm_result(bootstrap_mh_oop);
+ thread->set_vm_result_2(arg_array());
+}
+IRT_END
+
+
+
//------------------------------------------------------------------------------------------------------------------------
// Miscellaneous
--- a/hotspot/src/share/vm/interpreter/interpreterRuntime.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/interpreter/interpreterRuntime.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -42,8 +42,11 @@
static bool already_resolved(JavaThread *thread) { return cache_entry(thread)->is_resolved(code(thread)); }
static int one_byte_index(JavaThread *thread) { return bcp(thread)[1]; }
static int two_byte_index(JavaThread *thread) { return Bytes::get_Java_u2(bcp(thread) + 1); }
+ static int four_byte_index(JavaThread *thread) { return Bytes::get_native_u4(bcp(thread) + 1); }
static int number_of_dimensions(JavaThread *thread) { return bcp(thread)[3]; }
- static ConstantPoolCacheEntry* cache_entry(JavaThread *thread) { return method(thread)->constants()->cache()->entry_at(Bytes::get_native_u2(bcp(thread) + 1)); }
+
+ static ConstantPoolCacheEntry* cache_entry_at(JavaThread *thread, int i) { return method(thread)->constants()->cache()->entry_at(i); }
+ static ConstantPoolCacheEntry* cache_entry(JavaThread *thread) { return cache_entry_at(thread, Bytes::get_native_u2(bcp(thread) + 1)); }
static void note_trap(JavaThread *thread, int reason, TRAPS);
public:
@@ -83,7 +86,9 @@
static void new_illegal_monitor_state_exception(JavaThread* thread);
// Calls
- static void resolve_invoke (JavaThread* thread, Bytecodes::Code bytecode);
+ static void resolve_invoke (JavaThread* thread, Bytecodes::Code bytecode);
+ static void resolve_invokedynamic(JavaThread* thread);
+ static void bootstrap_invokedynamic(JavaThread* thread, oopDesc* call_site);
// Breakpoints
static void _breakpoint(JavaThread* thread, methodOopDesc* method, address bcp);
--- a/hotspot/src/share/vm/interpreter/linkResolver.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -947,6 +947,7 @@
case Bytecodes::_invokestatic : resolve_invokestatic (result, pool, index, CHECK); break;
case Bytecodes::_invokespecial : resolve_invokespecial (result, pool, index, CHECK); break;
case Bytecodes::_invokevirtual : resolve_invokevirtual (result, recv, pool, index, CHECK); break;
+ case Bytecodes::_invokedynamic : resolve_invokedynamic (result, pool, index, CHECK); break;
case Bytecodes::_invokeinterface: resolve_invokeinterface(result, recv, pool, index, CHECK); break;
}
return;
@@ -1008,6 +1009,30 @@
resolve_interface_call(result, recv, recvrKlass, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
}
+
+void LinkResolver::resolve_invokedynamic(CallInfo& result, constantPoolHandle pool, int raw_index, TRAPS) {
+ assert(EnableInvokeDynamic, "");
+
+ // This guy is reached from InterpreterRuntime::resolve_invokedynamic.
+
+ assert(constantPoolCacheOopDesc::is_secondary_index(raw_index), "must be secondary index");
+ int nt_index = pool->map_instruction_operand_to_index(raw_index);
+
+ // At this point, we only need the signature, and can ignore the name.
+ symbolHandle method_signature(THREAD, pool->nt_signature_ref_at(nt_index));
+ symbolHandle method_name = vmSymbolHandles::invoke_name();
+ KlassHandle resolved_klass = SystemDictionaryHandles::MethodHandle_klass();
+
+ // JSR 292: this must be an implicitly generated method MethodHandle.invoke(*...)
+ // The extra MH receiver will be inserted into the stack on every call.
+ methodHandle resolved_method;
+ lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, CHECK);
+ if (resolved_method.is_null()) {
+ THROW(vmSymbols::java_lang_InternalError());
+ }
+ result.set_virtual(resolved_klass, KlassHandle(), resolved_method, resolved_method, resolved_method->vtable_index(), CHECK);
+}
+
//------------------------------------------------------------------------------------------------------------------------
#ifndef PRODUCT
--- a/hotspot/src/share/vm/interpreter/linkResolver.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/interpreter/linkResolver.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -167,6 +167,7 @@
static void resolve_invokespecial (CallInfo& result, constantPoolHandle pool, int index, TRAPS);
static void resolve_invokevirtual (CallInfo& result, Handle recv, constantPoolHandle pool, int index, TRAPS);
static void resolve_invokeinterface(CallInfo& result, Handle recv, constantPoolHandle pool, int index, TRAPS);
+ static void resolve_invokedynamic (CallInfo& result, constantPoolHandle pool, int index, TRAPS);
static void resolve_invoke (CallInfo& result, Handle recv, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS);
};
--- a/hotspot/src/share/vm/interpreter/rewriter.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/interpreter/rewriter.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -25,39 +25,50 @@
# include "incls/_precompiled.incl"
# include "incls/_rewriter.cpp.incl"
-
-// Computes an index_map (new_index -> original_index) for contant pool entries
+// Computes a CPC map (new_index -> original_index) for constant pool entries
// that are referred to by the interpreter at runtime via the constant pool cache.
-void Rewriter::compute_index_maps(constantPoolHandle pool, intArray*& index_map, intStack*& inverse_index_map) {
- const int length = pool->length();
- index_map = new intArray(length, -1);
- // Choose an initial value large enough that we don't get frequent
- // calls to grow().
- inverse_index_map = new intStack(length / 2);
+// Also computes a CP map (original_index -> new_index).
+// Marks entries in CP which require additional processing.
+void Rewriter::compute_index_maps() {
+ const int length = _pool->length();
+ init_cp_map(length);
for (int i = 0; i < length; i++) {
- switch (pool->tag_at(i).value()) {
+ int tag = _pool->tag_at(i).value();
+ switch (tag) {
+ case JVM_CONSTANT_InterfaceMethodref:
case JVM_CONSTANT_Fieldref : // fall through
case JVM_CONSTANT_Methodref : // fall through
- case JVM_CONSTANT_InterfaceMethodref: {
- index_map->at_put(i, inverse_index_map->length());
- inverse_index_map->append(i);
- }
+ add_cp_cache_entry(i);
+ break;
}
}
+
+ guarantee((int)_cp_cache_map.length()-1 <= (int)((u2)-1),
+ "all cp cache indexes fit in a u2");
}
-// Creates a constant pool cache given an inverse_index_map
+int Rewriter::add_extra_cp_cache_entry(int main_entry) {
+ // Hack: We put it on the map as an encoded value.
+ // The only place that consumes this is ConstantPoolCacheEntry::set_initial_state
+ int encoded = constantPoolCacheOopDesc::encode_secondary_index(main_entry);
+ int plain_secondary_index = _cp_cache_map.append(encoded);
+ return constantPoolCacheOopDesc::encode_secondary_index(plain_secondary_index);
+}
+
+
+
+// Creates a constant pool cache given a CPC map
// This creates the constant pool cache initially in a state
// that is unsafe for concurrent GC processing but sets it to
// a safe mode before the constant pool cache is returned.
-constantPoolCacheHandle Rewriter::new_constant_pool_cache(intArray& inverse_index_map, TRAPS) {
- const int length = inverse_index_map.length();
- constantPoolCacheOop cache = oopFactory::new_constantPoolCache(length,
- methodOopDesc::IsUnsafeConc,
- CHECK_(constantPoolCacheHandle()));
- cache->initialize(inverse_index_map);
- return constantPoolCacheHandle(THREAD, cache);
+void Rewriter::make_constant_pool_cache(TRAPS) {
+ const int length = _cp_cache_map.length();
+ constantPoolCacheOop cache =
+ oopFactory::new_constantPoolCache(length, methodOopDesc::IsUnsafeConc, CHECK);
+ cache->initialize(_cp_cache_map);
+ _pool->set_cache(cache);
+ cache->set_constant_pool(_pool());
}
@@ -101,8 +112,38 @@
}
+// Rewrite a classfile-order CP index into a native-order CPC index.
+int Rewriter::rewrite_member_reference(address bcp, int offset) {
+ address p = bcp + offset;
+ int cp_index = Bytes::get_Java_u2(p);
+ int cache_index = cp_entry_to_cp_cache(cp_index);
+ Bytes::put_native_u2(p, cache_index);
+ return cp_index;
+}
+
+
+void Rewriter::rewrite_invokedynamic(address bcp, int offset, int delete_me) {
+ address p = bcp + offset;
+ assert(p[-1] == Bytecodes::_invokedynamic, "");
+ int cp_index = Bytes::get_Java_u2(p);
+ int cpc = maybe_add_cp_cache_entry(cp_index); // add lazily
+ int cpc2 = add_extra_cp_cache_entry(cpc);
+
+ // Replace the trailing four bytes with a CPC index for the dynamic
+ // call site. Unlike other CPC entries, there is one per bytecode,
+ // not just one per distinct CP entry. In other words, the
+ // CPC-to-CP relation is many-to-one for invokedynamic entries.
+ // This means we must use a larger index size than u2 to address
+ // all these entries. That is the main reason invokedynamic
+ // must have a five-byte instruction format. (Of course, other JVM
+ // implementations can use the bytes for other purposes.)
+ Bytes::put_native_u4(p, cpc2);
+ // Note: We use native_u4 format exclusively for 4-byte indexes.
+}
+
+
// Rewrites a method given the index_map information
-methodHandle Rewriter::rewrite_method(methodHandle method, intArray& index_map, TRAPS) {
+void Rewriter::scan_method(methodOop method) {
int nof_jsrs = 0;
bool has_monitor_bytecodes = false;
@@ -121,6 +162,7 @@
int bc_length;
for (int bci = 0; bci < code_length; bci += bc_length) {
address bcp = code_base + bci;
+ int prefix_length = 0;
c = (Bytecodes::Code)(*bcp);
// Since we have the code, see if we can get the length
@@ -135,6 +177,7 @@
// by 'wide'. We don't currently examine any of the bytecodes
// modified by wide, but in case we do in the future...
if (c == Bytecodes::_wide) {
+ prefix_length = 1;
c = (Bytecodes::Code)bcp[1];
}
}
@@ -159,12 +202,13 @@
case Bytecodes::_putfield : // fall through
case Bytecodes::_invokevirtual : // fall through
case Bytecodes::_invokespecial : // fall through
- case Bytecodes::_invokestatic : // fall through
- case Bytecodes::_invokeinterface: {
- address p = bcp + 1;
- Bytes::put_native_u2(p, index_map[Bytes::get_Java_u2(p)]);
+ case Bytecodes::_invokestatic :
+ case Bytecodes::_invokeinterface:
+ rewrite_member_reference(bcp, prefix_length+1);
break;
- }
+ case Bytecodes::_invokedynamic:
+ rewrite_invokedynamic(bcp, prefix_length+1, int(sizeof"@@@@DELETE ME"));
+ break;
case Bytecodes::_jsr : // fall through
case Bytecodes::_jsr_w : nof_jsrs++; break;
case Bytecodes::_monitorenter : // fall through
@@ -182,53 +226,56 @@
// have to be rewritten, so we run the oopMapGenerator on the method
if (nof_jsrs > 0) {
method->set_has_jsrs();
- ResolveOopMapConflicts romc(method);
- methodHandle original_method = method;
- method = romc.do_potential_rewrite(CHECK_(methodHandle()));
- if (method() != original_method()) {
- // Insert invalid bytecode into original methodOop and set
- // interpreter entrypoint, so that a executing this method
- // will manifest itself in an easy recognizable form.
- address bcp = original_method->bcp_from(0);
- *bcp = (u1)Bytecodes::_shouldnotreachhere;
- int kind = Interpreter::method_kind(original_method);
- original_method->set_interpreter_kind(kind);
- }
+ // Second pass will revisit this method.
+ assert(method->has_jsrs(), "");
+ }
+}
- // Update monitor matching info.
- if (romc.monitor_safe()) {
- method->set_guaranteed_monitor_matching();
- }
+// After constant pool is created, revisit methods containing jsrs.
+methodHandle Rewriter::rewrite_jsrs(methodHandle method, TRAPS) {
+ ResolveOopMapConflicts romc(method);
+ methodHandle original_method = method;
+ method = romc.do_potential_rewrite(CHECK_(methodHandle()));
+ if (method() != original_method()) {
+ // Insert invalid bytecode into original methodOop and set
+ // interpreter entrypoint, so that a executing this method
+ // will manifest itself in an easy recognizable form.
+ address bcp = original_method->bcp_from(0);
+ *bcp = (u1)Bytecodes::_shouldnotreachhere;
+ int kind = Interpreter::method_kind(original_method);
+ original_method->set_interpreter_kind(kind);
}
- // Setup method entrypoints for compiler and interpreter
- method->link_method(method, CHECK_(methodHandle()));
+ // Update monitor matching info.
+ if (romc.monitor_safe()) {
+ method->set_guaranteed_monitor_matching();
+ }
return method;
}
void Rewriter::rewrite(instanceKlassHandle klass, TRAPS) {
- // gather starting points
ResourceMark rm(THREAD);
- constantPoolHandle pool (THREAD, klass->constants());
- objArrayHandle methods (THREAD, klass->methods());
- assert(pool->cache() == NULL, "constant pool cache must not be set yet");
+ Rewriter rw(klass, CHECK);
+ // (That's all, folks.)
+}
+
+Rewriter::Rewriter(instanceKlassHandle klass, TRAPS)
+ : _klass(klass),
+ // gather starting points
+ _pool( THREAD, klass->constants()),
+ _methods(THREAD, klass->methods())
+{
+ assert(_pool->cache() == NULL, "constant pool cache must not be set yet");
// determine index maps for methodOop rewriting
- intArray* index_map = NULL;
- intStack* inverse_index_map = NULL;
- compute_index_maps(pool, index_map, inverse_index_map);
+ compute_index_maps();
- // allocate constant pool cache
- constantPoolCacheHandle cache = new_constant_pool_cache(*inverse_index_map, CHECK);
- pool->set_cache(cache());
- cache->set_constant_pool(pool());
-
- if (RegisterFinalizersAtInit && klass->name() == vmSymbols::java_lang_Object()) {
- int i = methods->length();
+ if (RegisterFinalizersAtInit && _klass->name() == vmSymbols::java_lang_Object()) {
+ int i = _methods->length();
while (i-- > 0) {
- methodOop method = (methodOop)methods->obj_at(i);
+ methodOop method = (methodOop)_methods->obj_at(i);
if (method->intrinsic_id() == vmIntrinsics::_Object_init) {
// rewrite the return bytecodes of Object.<init> to register the
// object for finalization if needed.
@@ -239,13 +286,27 @@
}
}
- // rewrite methods
- { int i = methods->length();
- while (i-- > 0) {
- methodHandle m(THREAD, (methodOop)methods->obj_at(i));
- m = rewrite_method(m, *index_map, CHECK);
+ // rewrite methods, in two passes
+ int i, len = _methods->length();
+
+ for (i = len; --i >= 0; ) {
+ methodOop method = (methodOop)_methods->obj_at(i);
+ scan_method(method);
+ }
+
+ // allocate constant pool cache, now that we've seen all the bytecodes
+ make_constant_pool_cache(CHECK);
+
+ for (i = len; --i >= 0; ) {
+ methodHandle m(THREAD, (methodOop)_methods->obj_at(i));
+
+ if (m->has_jsrs()) {
+ m = rewrite_jsrs(m, CHECK);
// Method might have gotten rewritten.
- methods->obj_at_put(i, m());
+ _methods->obj_at_put(i, m());
}
+
+ // Set up method entry points for compiler and interpreter.
+ m->link_method(m, CHECK);
}
}
--- a/hotspot/src/share/vm/interpreter/rewriter.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/interpreter/rewriter.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -25,13 +25,44 @@
// The Rewriter adds caches to the constant pool and rewrites bytecode indices
// pointing into the constant pool for better interpreter performance.
-class Rewriter: public AllStatic {
+class Rewriter: public StackObj {
private:
- static void compute_index_maps(constantPoolHandle pool, intArray*& index_map, intStack*& inverse_index_map);
- static constantPoolCacheHandle new_constant_pool_cache(intArray& inverse_index_map, TRAPS);
- static methodHandle rewrite_method(methodHandle method, intArray& index_map, TRAPS);
- static void rewrite_Object_init(methodHandle method, TRAPS);
+ instanceKlassHandle _klass;
+ constantPoolHandle _pool;
+ objArrayHandle _methods;
+ intArray _cp_map;
+ intStack _cp_cache_map;
+
+ void init_cp_map(int length) {
+ _cp_map.initialize(length, -1);
+ // Choose an initial value large enough that we don't get frequent
+ // calls to grow().
+ _cp_cache_map.initialize(length / 2);
+ }
+ int cp_entry_to_cp_cache(int i) { assert(has_cp_cache(i), "oob"); return _cp_map[i]; }
+ bool has_cp_cache(int i) { return (uint)i < (uint)_cp_map.length() && _cp_map[i] >= 0; }
+ int maybe_add_cp_cache_entry(int i) { return has_cp_cache(i) ? _cp_map[i] : add_cp_cache_entry(i); }
+ int add_cp_cache_entry(int cp_index) {
+ assert(_cp_map[cp_index] == -1, "not twice on same cp_index");
+ int cache_index = _cp_cache_map.append(cp_index);
+ _cp_map.at_put(cp_index, cache_index);
+ assert(cp_entry_to_cp_cache(cp_index) == cache_index, "");
+ return cache_index;
+ }
+ int add_extra_cp_cache_entry(int main_entry);
+
+ // All the work goes in here:
+ Rewriter(instanceKlassHandle klass, TRAPS);
+
+ void compute_index_maps();
+ void make_constant_pool_cache(TRAPS);
+ void scan_method(methodOop m);
+ methodHandle rewrite_jsrs(methodHandle m, TRAPS);
+ void rewrite_Object_init(methodHandle m, TRAPS);
+ int rewrite_member_reference(address bcp, int offset);
+ void rewrite_invokedynamic(address bcp, int offset, int cp_index);
public:
+ // Driver routine:
static void rewrite(instanceKlassHandle klass, TRAPS);
};
--- a/hotspot/src/share/vm/interpreter/templateInterpreter.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/interpreter/templateInterpreter.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -178,12 +178,14 @@
#endif // !PRODUCT
EntryPoint TemplateInterpreter::_return_entry[TemplateInterpreter::number_of_return_entries];
EntryPoint TemplateInterpreter::_earlyret_entry;
+EntryPoint TemplateInterpreter::_return_unbox_entry;
EntryPoint TemplateInterpreter::_deopt_entry [TemplateInterpreter::number_of_deopt_entries ];
EntryPoint TemplateInterpreter::_continuation_entry;
EntryPoint TemplateInterpreter::_safept_entry;
address TemplateInterpreter::_return_3_addrs_by_index[TemplateInterpreter::number_of_return_addrs];
address TemplateInterpreter::_return_5_addrs_by_index[TemplateInterpreter::number_of_return_addrs];
+address TemplateInterpreter::_return_5_unbox_addrs_by_index[TemplateInterpreter::number_of_return_addrs];
DispatchTable TemplateInterpreter::_active_table;
DispatchTable TemplateInterpreter::_normal_table;
@@ -251,6 +253,22 @@
}
}
+ if (EnableInvokeDynamic) {
+ CodeletMark cm(_masm, "unboxing return entry points");
+ Interpreter::_return_unbox_entry =
+ EntryPoint(
+ generate_return_unbox_entry_for(btos, 5),
+ generate_return_unbox_entry_for(ctos, 5),
+ generate_return_unbox_entry_for(stos, 5),
+ generate_return_unbox_entry_for(atos, 5), // cast conversion
+ generate_return_unbox_entry_for(itos, 5),
+ generate_return_unbox_entry_for(ltos, 5),
+ generate_return_unbox_entry_for(ftos, 5),
+ generate_return_unbox_entry_for(dtos, 5),
+ Interpreter::_return_entry[5].entry(vtos) // no unboxing for void
+ );
+ }
+
{ CodeletMark cm(_masm, "earlyret entry points");
Interpreter::_earlyret_entry =
EntryPoint(
@@ -298,8 +316,11 @@
for (int j = 0; j < number_of_states; j++) {
const TosState states[] = {btos, ctos, stos, itos, ltos, ftos, dtos, atos, vtos};
- Interpreter::_return_3_addrs_by_index[Interpreter::TosState_as_index(states[j])] = Interpreter::return_entry(states[j], 3);
- Interpreter::_return_5_addrs_by_index[Interpreter::TosState_as_index(states[j])] = Interpreter::return_entry(states[j], 5);
+ int index = Interpreter::TosState_as_index(states[j]);
+ Interpreter::_return_3_addrs_by_index[index] = Interpreter::return_entry(states[j], 3);
+ Interpreter::_return_5_addrs_by_index[index] = Interpreter::return_entry(states[j], 5);
+ if (EnableInvokeDynamic)
+ Interpreter::_return_5_unbox_addrs_by_index[index] = Interpreter::return_unbox_entry(states[j], 5);
}
{ CodeletMark cm(_masm, "continuation entry points");
@@ -526,6 +547,18 @@
}
+address TemplateInterpreter::return_unbox_entry(TosState state, int length) {
+ assert(EnableInvokeDynamic, "");
+ if (state == vtos) {
+ // no unboxing to do, actually
+ return return_entry(state, length);
+ } else {
+ assert(length == 5, "unboxing entries generated for invokedynamic only");
+ return _return_unbox_entry.entry(state);
+ }
+}
+
+
address TemplateInterpreter::deopt_entry(TosState state, int length) {
guarantee(0 <= length && length < Interpreter::number_of_deopt_entries, "illegal length");
return _deopt_entry[length].entry(state);
--- a/hotspot/src/share/vm/interpreter/templateInterpreter.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/interpreter/templateInterpreter.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -83,9 +83,9 @@
public:
enum MoreConstants {
- number_of_return_entries = 9, // number of return entry points
- number_of_deopt_entries = 9, // number of deoptimization entry points
- number_of_return_addrs = 9 // number of return addresses
+ number_of_return_entries = number_of_states, // number of return entry points
+ number_of_deopt_entries = number_of_states, // number of deoptimization entry points
+ number_of_return_addrs = number_of_states // number of return addresses
};
protected:
@@ -110,12 +110,14 @@
#endif // !PRODUCT
static EntryPoint _return_entry[number_of_return_entries]; // entry points to return to from a call
static EntryPoint _earlyret_entry; // entry point to return early from a call
+ static EntryPoint _return_unbox_entry; // entry point to unbox a return value from a call
static EntryPoint _deopt_entry[number_of_deopt_entries]; // entry points to return to from a deoptimization
static EntryPoint _continuation_entry;
static EntryPoint _safept_entry;
static address _return_3_addrs_by_index[number_of_return_addrs]; // for invokevirtual return entries
static address _return_5_addrs_by_index[number_of_return_addrs]; // for invokeinterface return entries
+ static address _return_5_unbox_addrs_by_index[number_of_return_addrs]; // for invokedynamic bootstrap methods
static DispatchTable _active_table; // the active dispatch table (used by the interpreter for dispatch)
static DispatchTable _normal_table; // the normal dispatch table (used to set the active table in normal mode)
@@ -157,10 +159,12 @@
// Support for invokes
static address* return_3_addrs_by_index_table() { return _return_3_addrs_by_index; }
static address* return_5_addrs_by_index_table() { return _return_5_addrs_by_index; }
+ static address* return_5_unbox_addrs_by_index_table() { return _return_5_unbox_addrs_by_index; }
static int TosState_as_index(TosState state); // computes index into return_3_entry_by_index table
static address return_entry (TosState state, int length);
static address deopt_entry (TosState state, int length);
+ static address return_unbox_entry(TosState state, int length);
// Safepoint support
static void notice_safepoints(); // stops the thread when reaching a safepoint
--- a/hotspot/src/share/vm/interpreter/templateInterpreterGenerator.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/interpreter/templateInterpreterGenerator.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -51,7 +51,10 @@
address generate_WrongMethodType_handler();
address generate_ArrayIndexOutOfBounds_handler(const char* name);
address generate_continuation_for(TosState state);
- address generate_return_entry_for(TosState state, int step);
+ address generate_return_entry_for(TosState state, int step, bool unbox = false);
+ address generate_return_unbox_entry_for(TosState state, int step) {
+ return generate_return_entry_for(state, step, true);
+ }
address generate_earlyret_entry_for(TosState state);
address generate_deopt_entry_for(TosState state, int step);
address generate_safept_entry_for(TosState state, address runtime_entry);
--- a/hotspot/src/share/vm/interpreter/templateTable.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/interpreter/templateTable.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -442,6 +442,7 @@
def(Bytecodes::_invokespecial , ubcp|disp|clvm|____, vtos, vtos, invokespecial , 1 );
def(Bytecodes::_invokestatic , ubcp|disp|clvm|____, vtos, vtos, invokestatic , 1 );
def(Bytecodes::_invokeinterface , ubcp|disp|clvm|____, vtos, vtos, invokeinterface , 1 );
+ def(Bytecodes::_invokedynamic , ubcp|disp|clvm|____, vtos, vtos, invokedynamic , 1 );
def(Bytecodes::_new , ubcp|____|clvm|____, vtos, atos, _new , _ );
def(Bytecodes::_newarray , ubcp|____|clvm|____, itos, atos, newarray , _ );
def(Bytecodes::_anewarray , ubcp|____|clvm|____, itos, atos, anewarray , _ );
@@ -503,7 +504,6 @@
def(Bytecodes::_fast_invokevfinal , ubcp|disp|clvm|____, vtos, vtos, fast_invokevfinal , 2 );
-
def(Bytecodes::_fast_linearswitch , ubcp|disp|____|____, itos, vtos, fast_linearswitch , _ );
def(Bytecodes::_fast_binaryswitch , ubcp|disp|____|____, itos, vtos, fast_binaryswitch , _ );
--- a/hotspot/src/share/vm/interpreter/templateTable.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/interpreter/templateTable.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -261,6 +261,7 @@
static void invokespecial(int byte_no);
static void invokestatic(int byte_no);
static void invokeinterface(int byte_no);
+ static void invokedynamic(int byte_no);
static void fast_invokevfinal(int byte_no);
static void getfield_or_static(int byte_no, bool is_static);
--- a/hotspot/src/share/vm/oops/constantPoolKlass.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/oops/constantPoolKlass.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -312,6 +312,7 @@
if (cp->flags() != 0) {
st->print(" - flags : 0x%x", cp->flags());
if (cp->has_pseudo_string()) st->print(" has_pseudo_string");
+ if (cp->has_invokedynamic()) st->print(" has_invokedynamic");
st->cr();
}
--- a/hotspot/src/share/vm/oops/constantPoolOop.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/oops/constantPoolOop.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -249,32 +249,41 @@
}
-symbolOop constantPoolOopDesc::uncached_name_ref_at(int which) {
- jint ref_index = name_and_type_at(uncached_name_and_type_ref_index_at(which));
- int name_index = extract_low_short_from_int(ref_index);
+symbolOop constantPoolOopDesc::impl_name_ref_at(int which, bool uncached) {
+ int name_index = name_ref_index_at(impl_name_and_type_ref_index_at(which, uncached));
return symbol_at(name_index);
}
-symbolOop constantPoolOopDesc::uncached_signature_ref_at(int which) {
- jint ref_index = name_and_type_at(uncached_name_and_type_ref_index_at(which));
- int signature_index = extract_high_short_from_int(ref_index);
+symbolOop constantPoolOopDesc::impl_signature_ref_at(int which, bool uncached) {
+ int signature_index = signature_ref_index_at(impl_name_and_type_ref_index_at(which, uncached));
return symbol_at(signature_index);
}
-int constantPoolOopDesc::uncached_name_and_type_ref_index_at(int which) {
- jint ref_index = field_or_method_at(which, true);
+int constantPoolOopDesc::impl_name_and_type_ref_index_at(int which, bool uncached) {
+ jint ref_index = field_or_method_at(which, uncached);
return extract_high_short_from_int(ref_index);
}
-int constantPoolOopDesc::uncached_klass_ref_index_at(int which) {
- jint ref_index = field_or_method_at(which, true);
+int constantPoolOopDesc::impl_klass_ref_index_at(int which, bool uncached) {
+ jint ref_index = field_or_method_at(which, uncached);
return extract_low_short_from_int(ref_index);
}
+
+int constantPoolOopDesc::map_instruction_operand_to_index(int operand) {
+ if (constantPoolCacheOopDesc::is_secondary_index(operand)) {
+ return cache()->main_entry_at(operand)->constant_pool_index();
+ }
+ assert((int)(u2)operand == operand, "clean u2");
+ int index = Bytes::swap_u2(operand);
+ return cache()->entry_at(index)->constant_pool_index();
+}
+
+
void constantPoolOopDesc::verify_constant_pool_resolve(constantPoolHandle this_oop, KlassHandle k, TRAPS) {
if (k->oop_is_instance() || k->oop_is_objArray()) {
instanceKlassHandle holder (THREAD, this_oop->pool_holder());
@@ -290,26 +299,14 @@
}
-int constantPoolOopDesc::klass_ref_index_at(int which) {
- jint ref_index = field_or_method_at(which, false);
+int constantPoolOopDesc::name_ref_index_at(int which_nt) {
+ jint ref_index = name_and_type_at(which_nt);
return extract_low_short_from_int(ref_index);
}
-int constantPoolOopDesc::name_and_type_ref_index_at(int which) {
- jint ref_index = field_or_method_at(which, false);
- return extract_high_short_from_int(ref_index);
-}
-
-
-int constantPoolOopDesc::name_ref_index_at(int which) {
- jint ref_index = name_and_type_at(which);
- return extract_low_short_from_int(ref_index);
-}
-
-
-int constantPoolOopDesc::signature_ref_index_at(int which) {
- jint ref_index = name_and_type_at(which);
+int constantPoolOopDesc::signature_ref_index_at(int which_nt) {
+ jint ref_index = name_and_type_at(which_nt);
return extract_high_short_from_int(ref_index);
}
@@ -353,20 +350,6 @@
}
-symbolOop constantPoolOopDesc::name_ref_at(int which) {
- jint ref_index = name_and_type_at(name_and_type_ref_index_at(which));
- int name_index = extract_low_short_from_int(ref_index);
- return symbol_at(name_index);
-}
-
-
-symbolOop constantPoolOopDesc::signature_ref_at(int which) {
- jint ref_index = name_and_type_at(name_and_type_ref_index_at(which));
- int signature_index = extract_high_short_from_int(ref_index);
- return symbol_at(signature_index);
-}
-
-
BasicType constantPoolOopDesc::basic_type_for_signature_at(int which) {
return FieldType::basic_type(symbol_at(which));
}
--- a/hotspot/src/share/vm/oops/constantPoolOop.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/oops/constantPoolOop.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -53,6 +53,7 @@
void release_tag_at_put(int which, jbyte t) { tags()->release_byte_at_put(which, t); }
enum FlagBit {
+ FB_has_invokedynamic = 1,
FB_has_pseudo_string = 2
};
@@ -96,7 +97,9 @@
typeArrayOop tags() const { return _tags; }
bool has_pseudo_string() const { return flag_at(FB_has_pseudo_string); }
+ bool has_invokedynamic() const { return flag_at(FB_has_invokedynamic); }
void set_pseudo_string() { set_flag_at(FB_has_pseudo_string); }
+ void set_invokedynamic() { set_flag_at(FB_has_invokedynamic); }
// Klass holding pool
klassOop pool_holder() const { return _pool_holder; }
@@ -338,24 +341,28 @@
return *int_at_addr(which);
}
- // The following methods (klass_ref_at, klass_ref_at_noresolve, name_ref_at,
- // signature_ref_at, klass_ref_index_at, name_and_type_ref_index_at,
- // name_ref_index_at, signature_ref_index_at) all expect constant pool indices
+ // The following methods (name/signature/klass_ref_at, klass_ref_at_noresolve,
+ // name_and_type_ref_index_at) all expect constant pool indices
// from the bytecodes to be passed in, which are actually potentially byte-swapped
- // contstant pool cache indices. See field_or_method_at.
+ // or rewritten constant pool cache indices. They all call map_instruction_operand_to_index.
+ int map_instruction_operand_to_index(int operand);
+
+ // There are also "uncached" versions which do not map the operand index; see below.
// Lookup for entries consisting of (klass_index, name_and_type index)
klassOop klass_ref_at(int which, TRAPS);
symbolOop klass_ref_at_noresolve(int which);
- symbolOop name_ref_at(int which);
- symbolOop signature_ref_at(int which); // the type descriptor
+ symbolOop name_ref_at(int which) { return impl_name_ref_at(which, false); }
+ symbolOop signature_ref_at(int which) { return impl_signature_ref_at(which, false); }
- int klass_ref_index_at(int which);
- int name_and_type_ref_index_at(int which);
+ int klass_ref_index_at(int which) { return impl_klass_ref_index_at(which, false); }
+ int name_and_type_ref_index_at(int which) { return impl_name_and_type_ref_index_at(which, false); }
// Lookup for entries consisting of (name_index, signature_index)
- int name_ref_index_at(int which);
- int signature_ref_index_at(int which);
+ int name_ref_index_at(int which_nt); // == low-order jshort of name_and_type_at(which_nt)
+ int signature_ref_index_at(int which_nt); // == high-order jshort of name_and_type_at(which_nt)
+ symbolOop nt_name_ref_at(int which_nt) { return symbol_at(name_ref_index_at(which_nt)); }
+ symbolOop nt_signature_ref_at(int which_nt) { return symbol_at(signature_ref_index_at(which_nt)); }
BasicType basic_type_for_signature_at(int which);
@@ -397,10 +404,10 @@
// Routines currently used for annotations (only called by jvm.cpp) but which might be used in the
// future by other Java code. These take constant pool indices rather than possibly-byte-swapped
// constant pool cache indices as do the peer methods above.
- symbolOop uncached_name_ref_at(int which);
- symbolOop uncached_signature_ref_at(int which);
- int uncached_klass_ref_index_at(int which);
- int uncached_name_and_type_ref_index_at(int which);
+ symbolOop uncached_name_ref_at(int which) { return impl_name_ref_at(which, true); }
+ symbolOop uncached_signature_ref_at(int which) { return impl_signature_ref_at(which, true); }
+ int uncached_klass_ref_index_at(int which) { return impl_klass_ref_index_at(which, true); }
+ int uncached_name_and_type_ref_index_at(int which) { return impl_name_and_type_ref_index_at(which, true); }
// Sharing
int pre_resolve_shared_klasses(TRAPS);
@@ -413,16 +420,19 @@
private:
+ symbolOop impl_name_ref_at(int which, bool uncached);
+ symbolOop impl_signature_ref_at(int which, bool uncached);
+ int impl_klass_ref_index_at(int which, bool uncached);
+ int impl_name_and_type_ref_index_at(int which, bool uncached);
+
// Takes either a constant pool cache index in possibly byte-swapped
// byte order (which comes from the bytecodes after rewriting) or,
// if "uncached" is true, a vanilla constant pool index
jint field_or_method_at(int which, bool uncached) {
- int i = -1;
- if (uncached || cache() == NULL) {
- i = which;
- } else {
+ int i = which;
+ if (!uncached && cache() != NULL) {
// change byte-ordering and go via cache
- i = cache()->entry_at(Bytes::swap_u2(which))->constant_pool_index();
+ i = map_instruction_operand_to_index(which);
}
assert(tag_at(i).is_field_or_method(), "Corrupted constant pool");
return *int_at_addr(i);
--- a/hotspot/src/share/vm/oops/cpCacheKlass.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/oops/cpCacheKlass.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -169,11 +169,47 @@
void constantPoolCacheKlass::oop_copy_contents(PSPromotionManager* pm,
oop obj) {
assert(obj->is_constantPoolCache(), "should be constant pool");
+ if (EnableInvokeDynamic) {
+ constantPoolCacheOop cache = (constantPoolCacheOop)obj;
+ // during a scavenge, it is safe to inspect my pool, since it is perm
+ constantPoolOop pool = cache->constant_pool();
+ assert(pool->is_constantPool(), "should be constant pool");
+ if (pool->has_invokedynamic()) {
+ for (int i = 0; i < cache->length(); i++) {
+ ConstantPoolCacheEntry* e = cache->entry_at(i);
+ oop* p = (oop*)&e->_f1;
+ if (e->is_secondary_entry()) {
+ if (PSScavenge::should_scavenge(p))
+ pm->claim_or_forward_breadth(p);
+ assert(!(e->is_vfinal() && PSScavenge::should_scavenge((oop*)&e->_f2)),
+ "no live oops here");
+ }
+ }
+ }
+ }
}
void constantPoolCacheKlass::oop_push_contents(PSPromotionManager* pm,
oop obj) {
assert(obj->is_constantPoolCache(), "should be constant pool");
+ if (EnableInvokeDynamic) {
+ constantPoolCacheOop cache = (constantPoolCacheOop)obj;
+ // during a scavenge, it is safe to inspect my pool, since it is perm
+ constantPoolOop pool = cache->constant_pool();
+ assert(pool->is_constantPool(), "should be constant pool");
+ if (pool->has_invokedynamic()) {
+ for (int i = 0; i < cache->length(); i++) {
+ ConstantPoolCacheEntry* e = cache->entry_at(i);
+ oop* p = (oop*)&e->_f1;
+ if (e->is_secondary_entry()) {
+ if (PSScavenge::should_scavenge(p))
+ pm->claim_or_forward_depth(p);
+ assert(!(e->is_vfinal() && PSScavenge::should_scavenge((oop*)&e->_f2)),
+ "no live oops here");
+ }
+ }
+ }
+ }
}
int
--- a/hotspot/src/share/vm/oops/cpCacheOop.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/oops/cpCacheOop.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -29,8 +29,18 @@
// Implememtation of ConstantPoolCacheEntry
void ConstantPoolCacheEntry::set_initial_state(int index) {
- assert(0 <= index && index < 0x10000, "sanity check");
+ if (constantPoolCacheOopDesc::is_secondary_index(index)) {
+ // Hack: The rewriter is trying to say that this entry itself
+ // will be a secondary entry.
+ int main_index = constantPoolCacheOopDesc::decode_secondary_index(index);
+ assert(0 <= main_index && main_index < 0x10000, "sanity check");
+ _indices = (main_index << 16);
+ assert(main_entry_index() == main_index, "");
+ return;
+ }
+ assert(0 < index && index < 0x10000, "sanity check");
_indices = index;
+ assert(constant_pool_index() == index, "");
}
@@ -136,6 +146,7 @@
int byte_no = -1;
bool needs_vfinal_flag = false;
switch (invoke_code) {
+ case Bytecodes::_invokedynamic:
case Bytecodes::_invokevirtual:
case Bytecodes::_invokeinterface: {
if (method->can_be_statically_bound()) {
@@ -211,6 +222,23 @@
}
+void ConstantPoolCacheEntry::set_dynamic_call(Handle call_site, int extra_data) {
+ methodOop method = (methodOop) sun_dyn_CallSiteImpl::vmmethod(call_site());
+ assert(method->is_method(), "must be initialized properly");
+ int param_size = method->size_of_parameters();
+ assert(param_size > 1, "method argument size must include MH.this & initial dynamic receiver");
+ param_size -= 1; // do not count MH.this; it is not stacked for invokedynamic
+ if (Atomic::cmpxchg_ptr(call_site(), &_f1, NULL) == NULL) {
+ // racing threads might be trying to install their own favorites
+ set_f1(call_site());
+ }
+ set_f2(extra_data);
+ set_flags(as_flags(as_TosState(method->result_type()), method->is_final_method(), false, false, false, true) | param_size);
+ // do not do set_bytecode on a secondary CP cache entry
+ //set_bytecode_1(Bytecodes::_invokedynamic);
+}
+
+
class LocalOopClosure: public OopClosure {
private:
void (*_f)(oop*);
@@ -392,7 +420,11 @@
// print separator
if (index == 0) tty->print_cr(" -------------");
// print entry
- tty->print_cr("%3d (%08x) [%02x|%02x|%5d]", index, this, bytecode_2(), bytecode_1(), constant_pool_index());
+ tty->print_cr("%3d (%08x) ", index, this);
+ if (is_secondary_entry())
+ tty->print_cr("[%5d|secondary]", main_entry_index());
+ else
+ tty->print_cr("[%02x|%02x|%5d]", bytecode_2(), bytecode_1(), constant_pool_index());
tty->print_cr(" [ %08x]", (address)(oop)_f1);
tty->print_cr(" [ %08x]", _f2);
tty->print_cr(" [ %08x]", _flags);
--- a/hotspot/src/share/vm/oops/cpCacheOop.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/oops/cpCacheOop.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -89,6 +89,7 @@
// _f1 = method for all but virtual calls, unused by virtual calls
// (note: for interface calls, which are essentially virtual,
// contains klassOop for the corresponding interface.
+// for invokedynamic, f1 contains the CallSite object for the invocation
// _f2 = method/vtable index for virtual calls only, unused by all other
// calls. The vf flag indicates this is a method pointer not an
// index.
@@ -108,6 +109,8 @@
class ConstantPoolCacheEntry VALUE_OBJ_CLASS_SPEC {
friend class VMStructs;
+ friend class constantPoolCacheKlass;
+
private:
volatile intx _indices; // constant pool index & rewrite bytecodes
volatile oop _f1; // entry specific oop field
@@ -175,6 +178,11 @@
int index // Method index into interface
);
+ void set_dynamic_call(
+ Handle call_site, // Resolved java.dyn.CallSite (f1)
+ int extra_data // (f2)
+ );
+
void set_parameter_size(int value) {
assert(parameter_size() == 0 || parameter_size() == value,
"size must not change");
@@ -216,7 +224,11 @@
}
// Accessors
- int constant_pool_index() const { return _indices & 0xFFFF; }
+ bool is_secondary_entry() const { return (_indices & 0xFFFF) == 0; }
+ int constant_pool_index() const { assert((_indices & 0xFFFF) != 0, "must be main entry");
+ return (_indices & 0xFFFF); }
+ int main_entry_index() const { assert((_indices & 0xFFFF) == 0, "must be secondary entry");
+ return ((uintx)_indices >> 16); }
Bytecodes::Code bytecode_1() const { return Bytecodes::cast((_indices >> 16) & 0xFF); }
Bytecodes::Code bytecode_2() const { return Bytecodes::cast((_indices >> 24) & 0xFF); }
volatile oop f1() const { return _f1; }
@@ -314,10 +326,30 @@
// Initialization
void initialize(intArray& inverse_index_map);
+ // Secondary indexes.
+ // They must look completely different from normal indexes.
+ // The main reason is that byte swapping is sometimes done on normal indexes.
+ // Also, it is helpful for debugging to tell the two apart.
+ static bool is_secondary_index(int i) { return (i < 0); }
+ static int decode_secondary_index(int i) { assert(is_secondary_index(i), ""); return ~i; }
+ static int encode_secondary_index(int i) { assert(!is_secondary_index(i), ""); return ~i; }
+
// Accessors
void set_constant_pool(constantPoolOop pool) { oop_store_without_check((oop*)&_constant_pool, (oop)pool); }
constantPoolOop constant_pool() const { return _constant_pool; }
ConstantPoolCacheEntry* entry_at(int i) const { assert(0 <= i && i < length(), "index out of bounds"); return base() + i; }
+ ConstantPoolCacheEntry* main_entry_at(int i) const {
+ ConstantPoolCacheEntry* e;
+ if (is_secondary_index(i)) {
+ // run through an extra level of indirection:
+ i = decode_secondary_index(i);
+ e = entry_at(i);
+ i = e->main_entry_index();
+ }
+ e = entry_at(i);
+ assert(!e->is_secondary_entry(), "only one level of indirection");
+ return e;
+ }
// GC support
// If the _length field has not been set, the size of the
--- a/hotspot/src/share/vm/oops/generateOopMap.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/oops/generateOopMap.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1252,8 +1252,9 @@
case Bytecodes::_invokevirtual:
case Bytecodes::_invokespecial:
case Bytecodes::_invokestatic:
+ case Bytecodes::_invokedynamic:
case Bytecodes::_invokeinterface:
- int idx = currentBC->get_index_big();
+ int idx = currentBC->get_index_int();
constantPoolOop cp = method()->constants();
int nameAndTypeIdx = cp->name_and_type_ref_index_at(idx);
int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx);
@@ -1283,8 +1284,9 @@
case Bytecodes::_invokevirtual:
case Bytecodes::_invokespecial:
case Bytecodes::_invokestatic:
+ case Bytecodes::_invokedynamic:
case Bytecodes::_invokeinterface:
- int idx = currentBC->get_index_big();
+ int idx = currentBC->get_index_int();
constantPoolOop cp = method()->constants();
int nameAndTypeIdx = cp->name_and_type_ref_index_at(idx);
int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx);
@@ -1310,6 +1312,7 @@
case Bytecodes::_invokevirtual:
case Bytecodes::_invokespecial:
case Bytecodes::_invokestatic:
+ case Bytecodes::_invokedynamic:
case Bytecodes::_invokeinterface:
_itr_send = itr;
_report_result_for_send = true;
@@ -1556,6 +1559,7 @@
case Bytecodes::_invokevirtual:
case Bytecodes::_invokespecial: do_method(false, false, itr->get_index_big(), itr->bci()); break;
case Bytecodes::_invokestatic: do_method(true, false, itr->get_index_big(), itr->bci()); break;
+ case Bytecodes::_invokedynamic: do_method(false, true, itr->get_index_int(), itr->bci()); break;
case Bytecodes::_invokeinterface: do_method(false, true, itr->get_index_big(), itr->bci()); break;
case Bytecodes::_newarray:
case Bytecodes::_anewarray: pp_new_ref(vCTS, itr->bci()); break;
@@ -1899,7 +1903,7 @@
// Dig up signature for field in constant pool
constantPoolOop cp = _method->constants();
int nameAndTypeIdx = cp->name_and_type_ref_index_at(idx);
- int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx);
+ int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx); // @@@@@
symbolOop signature = cp->symbol_at(signatureIdx);
// Parse method signature
--- a/hotspot/src/share/vm/oops/instanceKlass.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/oops/instanceKlass.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -163,6 +163,8 @@
klassOop _implementors[implementors_limit];
// Generic signature, or null if none.
symbolOop _generic_signature;
+ // invokedynamic bootstrap method (a java.dyn.MethodHandle)
+ oop _bootstrap_method;
// Annotations for this class, or null if none.
typeArrayOop _class_annotations;
// Annotation objects (byte arrays) for fields, or null if no annotations.
@@ -464,6 +466,10 @@
u2 method_index) { _enclosing_method_class_index = class_index;
_enclosing_method_method_index = method_index; }
+ // JSR 292 support
+ oop bootstrap_method() const { return _bootstrap_method; }
+ void set_bootstrap_method(oop mh) { oop_store(&_bootstrap_method, mh); }
+
// jmethodID support
static jmethodID get_jmethod_id(instanceKlassHandle ik_h, size_t idnum,
jmethodID new_id, jmethodID* new_jmeths);
@@ -744,6 +750,7 @@
oop* adr_inner_classes() const { return (oop*)&this->_inner_classes;}
oop* adr_implementors() const { return (oop*)&this->_implementors[0];}
oop* adr_generic_signature() const { return (oop*)&this->_generic_signature;}
+ oop* adr_bootstrap_method() const { return (oop*)&this->_bootstrap_method;}
oop* adr_methods_jmethod_ids() const { return (oop*)&this->_methods_jmethod_ids;}
oop* adr_methods_cached_itable_indices() const { return (oop*)&this->_methods_cached_itable_indices;}
oop* adr_class_annotations() const { return (oop*)&this->_class_annotations;}
--- a/hotspot/src/share/vm/oops/instanceKlassKlass.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/oops/instanceKlassKlass.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -84,6 +84,7 @@
MarkSweep::mark_and_push(ik->adr_host_klass());
MarkSweep::mark_and_push(ik->adr_signers());
MarkSweep::mark_and_push(ik->adr_generic_signature());
+ MarkSweep::mark_and_push(ik->adr_bootstrap_method());
MarkSweep::mark_and_push(ik->adr_class_annotations());
MarkSweep::mark_and_push(ik->adr_fields_annotations());
MarkSweep::mark_and_push(ik->adr_methods_annotations());
@@ -124,6 +125,7 @@
PSParallelCompact::mark_and_push(cm, ik->adr_host_klass());
PSParallelCompact::mark_and_push(cm, ik->adr_signers());
PSParallelCompact::mark_and_push(cm, ik->adr_generic_signature());
+ PSParallelCompact::mark_and_push(cm, ik->adr_bootstrap_method());
PSParallelCompact::mark_and_push(cm, ik->adr_class_annotations());
PSParallelCompact::mark_and_push(cm, ik->adr_fields_annotations());
PSParallelCompact::mark_and_push(cm, ik->adr_methods_annotations());
@@ -170,6 +172,7 @@
blk->do_oop(&ik->adr_implementors()[i]);
}
blk->do_oop(ik->adr_generic_signature());
+ blk->do_oop(ik->adr_bootstrap_method());
blk->do_oop(ik->adr_class_annotations());
blk->do_oop(ik->adr_fields_annotations());
blk->do_oop(ik->adr_methods_annotations());
@@ -230,6 +233,8 @@
}
adr = ik->adr_generic_signature();
if (mr.contains(adr)) blk->do_oop(adr);
+ adr = ik->adr_bootstrap_method();
+ if (mr.contains(adr)) blk->do_oop(adr);
adr = ik->adr_class_annotations();
if (mr.contains(adr)) blk->do_oop(adr);
adr = ik->adr_fields_annotations();
@@ -274,6 +279,7 @@
MarkSweep::adjust_pointer(&ik->adr_implementors()[i]);
}
MarkSweep::adjust_pointer(ik->adr_generic_signature());
+ MarkSweep::adjust_pointer(ik->adr_bootstrap_method());
MarkSweep::adjust_pointer(ik->adr_class_annotations());
MarkSweep::adjust_pointer(ik->adr_fields_annotations());
MarkSweep::adjust_pointer(ik->adr_methods_annotations());
@@ -454,6 +460,7 @@
ik->set_breakpoints(NULL);
ik->init_previous_versions();
ik->set_generic_signature(NULL);
+ ik->set_bootstrap_method(NULL);
ik->release_set_methods_jmethod_ids(NULL);
ik->release_set_methods_cached_itable_indices(NULL);
ik->set_class_annotations(NULL);
@@ -578,6 +585,11 @@
} // pvw is cleaned up
} // rm is cleaned up
+ if (ik->bootstrap_method() != NULL) {
+ st->print(BULLET"bootstrap method: ");
+ ik->bootstrap_method()->print_value_on(st);
+ st->cr();
+ }
if (ik->generic_signature() != NULL) {
st->print(BULLET"generic signature: ");
ik->generic_signature()->print_value_on(st);
--- a/hotspot/src/share/vm/oops/methodDataOop.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/oops/methodDataOop.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -442,6 +442,8 @@
case Bytecodes::_invokevirtual:
case Bytecodes::_invokeinterface:
return VirtualCallData::static_cell_count();
+ case Bytecodes::_invokedynamic:
+ return CounterData::static_cell_count();
case Bytecodes::_ret:
return RetData::static_cell_count();
case Bytecodes::_ifeq:
@@ -570,6 +572,11 @@
cell_count = VirtualCallData::static_cell_count();
tag = DataLayout::virtual_call_data_tag;
break;
+ case Bytecodes::_invokedynamic:
+ // %%% should make a type profile for any invokedynamic that takes a ref argument
+ cell_count = CounterData::static_cell_count();
+ tag = DataLayout::counter_data_tag;
+ break;
case Bytecodes::_ret:
cell_count = RetData::static_cell_count();
tag = DataLayout::ret_data_tag;
--- a/hotspot/src/share/vm/oops/methodOop.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/oops/methodOop.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -161,7 +161,7 @@
int methodOopDesc::bci_from(address bcp) const {
- assert(is_native() && bcp == code_base() || contains(bcp), "bcp doesn't belong to this method");
+ assert(is_native() && bcp == code_base() || contains(bcp) || is_error_reported(), "bcp doesn't belong to this method");
return bcp - code_base();
}
--- a/hotspot/src/share/vm/oops/methodOop.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/oops/methodOop.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -534,7 +534,10 @@
oop method_handle_type() const;
static jint* method_type_offsets_chain(); // series of pointer-offsets, terminated by -1
// presize interpreter frames for extra interpreter stack entries, if needed
- static int extra_stack_entries() { return EnableMethodHandles ? (int)MethodHandlePushLimit : 0; }
+ // method handles want to be able to push a few extra values (e.g., a bound receiver), and
+ // invokedynamic sometimes needs to push a bootstrap method, call site, and arglist,
+ // all without checking for a stack overflow
+ static int extra_stack_entries() { return (EnableMethodHandles ? (int)MethodHandlePushLimit : 0) + (EnableInvokeDynamic ? 3 : 0); }
static int extra_stack_words(); // = extra_stack_entries() * Interpreter::stackElementSize()
// RedefineClasses() support:
bool is_old() const { return access_flags().is_old(); }
--- a/hotspot/src/share/vm/opto/buildOopMap.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/opto/buildOopMap.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -363,6 +363,20 @@
*/
#endif
+#ifdef ASSERT
+ for( OopMapStream oms1(omap, OopMapValue::derived_oop_value); !oms1.is_done(); oms1.next()) {
+ OopMapValue omv1 = oms1.current();
+ bool found = false;
+ for( OopMapStream oms2(omap,OopMapValue::oop_value); !oms2.is_done(); oms2.next()) {
+ if( omv1.content_reg() == oms2.current().reg() ) {
+ found = true;
+ break;
+ }
+ }
+ assert( found, "derived with no base in oopmap" );
+ }
+#endif
+
return omap;
}
--- a/hotspot/src/share/vm/opto/bytecodeInfo.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/opto/bytecodeInfo.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -321,7 +321,7 @@
// stricter than callee_holder->is_initialized()
ciBytecodeStream iter(caller_method);
iter.force_bci(caller_bci);
- int index = iter.get_index_big();
+ int index = iter.get_index_int();
if( !caller_method->is_klass_loaded(index, true) ) {
return false;
}
--- a/hotspot/src/share/vm/opto/chaitin.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/opto/chaitin.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1423,17 +1423,33 @@
// pointers derived from NULL! These are always along paths that
// can't happen at run-time but the optimizer cannot deduce it so
// we have to handle it gracefully.
+ assert(!derived->bottom_type()->isa_narrowoop() ||
+ derived->bottom_type()->make_ptr()->is_ptr()->_offset == 0, "sanity");
const TypePtr *tj = derived->bottom_type()->isa_ptr();
// If its an OOP with a non-zero offset, then it is derived.
- if( tj->_offset == 0 ) {
+ if( tj == NULL || tj->_offset == 0 ) {
derived_base_map[derived->_idx] = derived;
return derived;
}
// Derived is NULL+offset? Base is NULL!
if( derived->is_Con() ) {
- Node *base = new (C, 1) ConPNode( TypePtr::NULL_PTR );
- uint no_lidx = 0; // an unmatched constant in debug info has no LRG
- _names.extend(base->_idx, no_lidx);
+ Node *base = _matcher.mach_null();
+ assert(base != NULL, "sanity");
+ if (base->in(0) == NULL) {
+ // Initialize it once and make it shared:
+ // set control to _root and place it into Start block
+ // (where top() node is placed).
+ base->init_req(0, _cfg._root);
+ Block *startb = _cfg._bbs[C->top()->_idx];
+ startb->_nodes.insert(startb->find_node(C->top()), base );
+ _cfg._bbs.map( base->_idx, startb );
+ assert (n2lidx(base) == 0, "should not have LRG yet");
+ }
+ if (n2lidx(base) == 0) {
+ new_lrg(base, maxlrg++);
+ }
+ assert(base->in(0) == _cfg._root &&
+ _cfg._bbs[base->_idx] == _cfg._bbs[C->top()->_idx], "base NULL should be shared");
derived_base_map[derived->_idx] = base;
return base;
}
@@ -1460,9 +1476,13 @@
}
// Now we see we need a base-Phi here to merge the bases
- base = new (C, derived->req()) PhiNode( derived->in(0), base->bottom_type() );
- for( i = 1; i < derived->req(); i++ )
+ const Type *t = base->bottom_type();
+ base = new (C, derived->req()) PhiNode( derived->in(0), t );
+ for( i = 1; i < derived->req(); i++ ) {
base->init_req(i, find_base_for_derived(derived_base_map, derived->in(i), maxlrg));
+ t = t->meet(base->in(i)->bottom_type());
+ }
+ base->as_Phi()->set_type(t);
// Search the current block for an existing base-Phi
Block *b = _cfg._bbs[derived->_idx];
@@ -1560,6 +1580,8 @@
// This works because we are still in SSA during this call.
Node *derived = lrgs(neighbor)._def;
const TypePtr *tj = derived->bottom_type()->isa_ptr();
+ assert(!derived->bottom_type()->isa_narrowoop() ||
+ derived->bottom_type()->make_ptr()->is_ptr()->_offset == 0, "sanity");
// If its an OOP with a non-zero offset, then it is derived.
if( tj && tj->_offset != 0 && tj->isa_oop_ptr() ) {
Node *base = find_base_for_derived( derived_base_map, derived, maxlrg );
--- a/hotspot/src/share/vm/opto/doCall.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/opto/doCall.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -248,6 +248,14 @@
holder_klass);
return true;
}
+ if (dest_method->is_method_handle_invoke()
+ && holder_klass->name() == ciSymbol::java_dyn_Dynamic()) {
+ // FIXME: NYI
+ uncommon_trap(Deoptimization::Reason_unhandled,
+ Deoptimization::Action_none,
+ holder_klass);
+ return true;
+ }
assert(dest_method->will_link(method()->holder(), klass, bc()), "dest_method: typeflow responsibility");
return false;
@@ -748,6 +756,7 @@
case Bytecodes::_invokevirtual: increment_counter(SharedRuntime::nof_inlined_calls_addr()); break;
case Bytecodes::_invokeinterface: increment_counter(SharedRuntime::nof_inlined_interface_calls_addr()); break;
case Bytecodes::_invokestatic:
+ case Bytecodes::_invokedynamic:
case Bytecodes::_invokespecial: increment_counter(SharedRuntime::nof_inlined_static_calls_addr()); break;
default: fatal("unexpected call bytecode");
}
@@ -756,6 +765,7 @@
case Bytecodes::_invokevirtual: increment_counter(SharedRuntime::nof_normal_calls_addr()); break;
case Bytecodes::_invokeinterface: increment_counter(SharedRuntime::nof_interface_calls_addr()); break;
case Bytecodes::_invokestatic:
+ case Bytecodes::_invokedynamic:
case Bytecodes::_invokespecial: increment_counter(SharedRuntime::nof_static_calls_addr()); break;
default: fatal("unexpected call bytecode");
}
--- a/hotspot/src/share/vm/opto/graphKit.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/opto/graphKit.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -947,6 +947,7 @@
case Bytecodes::_invokevirtual:
case Bytecodes::_invokespecial:
case Bytecodes::_invokestatic:
+ case Bytecodes::_invokedynamic:
case Bytecodes::_invokeinterface:
{
bool is_static = (depth == 0);
@@ -2979,6 +2980,7 @@
// See comments on new_instance for the meaning of the other arguments.
Node* GraphKit::new_array(Node* klass_node, // array klass (maybe variable)
Node* length, // number of array elements
+ int nargs, // number of arguments to push back for uncommon trap
bool raw_mem_only, // affect only raw memory
Node* *return_size_val) {
jint layout_con = Klass::_lh_neutral_value;
@@ -2994,6 +2996,7 @@
Node* cmp_lh = _gvn.transform( new(C, 3) CmpINode(layout_val, intcon(layout_con)) );
Node* bol_lh = _gvn.transform( new(C, 2) BoolNode(cmp_lh, BoolTest::eq) );
{ BuildCutout unless(this, bol_lh, PROB_MAX);
+ _sp += nargs;
uncommon_trap(Deoptimization::Reason_class_check,
Deoptimization::Action_maybe_recompile);
}
--- a/hotspot/src/share/vm/opto/graphKit.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/opto/graphKit.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -699,7 +699,7 @@
Node* slow_test = NULL,
bool raw_mem_only = false,
Node* *return_size_val = NULL);
- Node* new_array(Node* klass_node, Node* count_val,
+ Node* new_array(Node* klass_node, Node* count_val, int nargs,
bool raw_mem_only = false, Node* *return_size_val = NULL);
// Handy for making control flow
--- a/hotspot/src/share/vm/opto/library_call.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/opto/library_call.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -3055,9 +3055,7 @@
// Normal case: The array type has been cached in the java.lang.Class.
// The following call works fine even if the array type is polymorphic.
// It could be a dynamic mix of int[], boolean[], Object[], etc.
- _sp += nargs; // set original stack for use by uncommon_trap
- Node* obj = new_array(klass_node, count_val);
- _sp -= nargs;
+ Node* obj = new_array(klass_node, count_val, nargs);
result_reg->init_req(_normal_path, control());
result_val->init_req(_normal_path, obj);
result_io ->init_req(_normal_path, i_o());
@@ -3179,9 +3177,7 @@
Node* orig_tail = _gvn.transform( new(C, 3) SubINode(orig_length, start) );
Node* moved = generate_min_max(vmIntrinsics::_min, orig_tail, length);
- _sp += nargs; // set original stack for use by uncommon_trap
- Node* newcopy = new_array(klass_node, length);
- _sp -= nargs;
+ Node* newcopy = new_array(klass_node, length, nargs);
// Generate a direct call to the right arraycopy function(s).
// We know the copy is disjoint but we might not know if the
@@ -3903,10 +3899,8 @@
set_control(array_ctl);
Node* obj_length = load_array_length(obj);
Node* obj_size = NULL;
- _sp += nargs; // set original stack for use by uncommon_trap
- Node* alloc_obj = new_array(obj_klass, obj_length,
+ Node* alloc_obj = new_array(obj_klass, obj_length, nargs,
raw_mem_only, &obj_size);
- _sp -= nargs;
assert(obj_size != NULL, "");
Node* raw_obj = alloc_obj->in(1);
assert(raw_obj->is_Proj() && raw_obj->in(0)->is_Allocate(), "");
--- a/hotspot/src/share/vm/opto/matcher.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/opto/matcher.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -275,6 +275,12 @@
C->print_method("Before Matching");
+ // Create new ideal node ConP #NULL even if it does exist in old space
+ // to avoid false sharing if the corresponding mach node is not used.
+ // The corresponding mach node is only used in rare cases for derived
+ // pointers.
+ Node* new_ideal_null = ConNode::make(C, TypePtr::NULL_PTR);
+
// Swap out to old-space; emptying new-space
Arena *old = C->node_arena()->move_contents(C->old_arena());
@@ -316,7 +322,16 @@
}
}
+ // Generate new mach node for ConP #NULL
+ assert(new_ideal_null != NULL, "sanity");
+ _mach_null = match_tree(new_ideal_null);
+ // Don't set control, it will confuse GCM since there are no uses.
+ // The control will be set when this node is used first time
+ // in find_base_for_derived().
+ assert(_mach_null != NULL, "");
+
C->set_root(xroot->is_Root() ? xroot->as_Root() : NULL);
+
#ifdef ASSERT
verify_new_nodes_only(xroot);
#endif
--- a/hotspot/src/share/vm/opto/matcher.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/opto/matcher.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -109,6 +109,9 @@
Node* _mem_node; // Ideal memory node consumed by mach node
#endif
+ // Mach node for ConP #NULL
+ MachNode* _mach_null;
+
public:
int LabelRootDepth;
static const int base2reg[]; // Map Types to machine register types
@@ -122,6 +125,8 @@
static RegMask mreg2regmask[];
static RegMask STACK_ONLY_mask;
+ MachNode* mach_null() const { return _mach_null; }
+
bool is_shared( Node *n ) { return _shared.test(n->_idx) != 0; }
void set_shared( Node *n ) { _shared.set(n->_idx); }
bool is_visited( Node *n ) { return _visited.test(n->_idx) != 0; }
--- a/hotspot/src/share/vm/opto/parse.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/opto/parse.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -476,7 +476,7 @@
void do_newarray(BasicType elemtype);
void do_anewarray();
void do_multianewarray();
- Node* expand_multianewarray(ciArrayKlass* array_klass, Node* *lengths, int ndimensions);
+ Node* expand_multianewarray(ciArrayKlass* array_klass, Node* *lengths, int ndimensions, int nargs);
// implementation of jsr/ret
void do_jsr();
--- a/hotspot/src/share/vm/opto/parse1.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/opto/parse1.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -828,6 +828,7 @@
break;
case Bytecodes::_invokestatic:
+ case Bytecodes::_invokedynamic:
case Bytecodes::_invokespecial:
case Bytecodes::_invokevirtual:
case Bytecodes::_invokeinterface:
--- a/hotspot/src/share/vm/opto/parse2.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/opto/parse2.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -2156,6 +2156,7 @@
break;
case Bytecodes::_invokestatic:
+ case Bytecodes::_invokedynamic:
case Bytecodes::_invokespecial:
case Bytecodes::_invokevirtual:
case Bytecodes::_invokeinterface:
--- a/hotspot/src/share/vm/opto/parse3.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/opto/parse3.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -335,7 +335,7 @@
const TypeKlassPtr* array_klass_type = TypeKlassPtr::make(array_klass);
Node* count_val = pop();
- Node* obj = new_array(makecon(array_klass_type), count_val);
+ Node* obj = new_array(makecon(array_klass_type), count_val, 1);
push(obj);
}
@@ -345,17 +345,17 @@
Node* count_val = pop();
const TypeKlassPtr* array_klass = TypeKlassPtr::make(ciTypeArrayKlass::make(elem_type));
- Node* obj = new_array(makecon(array_klass), count_val);
+ Node* obj = new_array(makecon(array_klass), count_val, 1);
// Push resultant oop onto stack
push(obj);
}
// Expand simple expressions like new int[3][5] and new Object[2][nonConLen].
// Also handle the degenerate 1-dimensional case of anewarray.
-Node* Parse::expand_multianewarray(ciArrayKlass* array_klass, Node* *lengths, int ndimensions) {
+Node* Parse::expand_multianewarray(ciArrayKlass* array_klass, Node* *lengths, int ndimensions, int nargs) {
Node* length = lengths[0];
assert(length != NULL, "");
- Node* array = new_array(makecon(TypeKlassPtr::make(array_klass)), length);
+ Node* array = new_array(makecon(TypeKlassPtr::make(array_klass)), length, nargs);
if (ndimensions > 1) {
jint length_con = find_int_con(length, -1);
guarantee(length_con >= 0, "non-constant multianewarray");
@@ -364,7 +364,7 @@
const Type* elemtype = _gvn.type(array)->is_aryptr()->elem();
const intptr_t header = arrayOopDesc::base_offset_in_bytes(T_OBJECT);
for (jint i = 0; i < length_con; i++) {
- Node* elem = expand_multianewarray(array_klass_1, &lengths[1], ndimensions-1);
+ Node* elem = expand_multianewarray(array_klass_1, &lengths[1], ndimensions-1, nargs);
intptr_t offset = header + ((intptr_t)i << LogBytesPerHeapOop);
Node* eaddr = basic_plus_adr(array, offset);
store_oop_to_array(control(), array, eaddr, adr_type, elem, elemtype, T_OBJECT);
@@ -419,7 +419,7 @@
// Can use multianewarray instead of [a]newarray if only one dimension,
// or if all non-final dimensions are small constants.
if (expand_count == 1 || (1 <= expand_count && expand_count <= expand_limit)) {
- Node* obj = expand_multianewarray(array_klass, &length[0], ndimensions);
+ Node* obj = expand_multianewarray(array_klass, &length[0], ndimensions, ndimensions);
push(obj);
return;
}
--- a/hotspot/src/share/vm/opto/parseHelper.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/opto/parseHelper.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -414,6 +414,7 @@
profile_receiver_type(receiver);
break;
case Bytecodes::_invokestatic:
+ case Bytecodes::_invokedynamic:
case Bytecodes::_invokespecial:
break;
default: fatal("unexpected call bytecode");
--- a/hotspot/src/share/vm/prims/jvm.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/prims/jvm.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -2222,6 +2222,9 @@
case JVM_CONSTANT_InterfaceMethodref:
case JVM_CONSTANT_Methodref:
return cp->uncached_name_ref_at(cp_index)->as_utf8();
+ case JVM_CONSTANT_NameAndType:
+ // for invokedynamic
+ return cp->nt_name_ref_at(cp_index)->as_utf8();
default:
fatal("JVM_GetCPMethodNameUTF: illegal constant");
}
@@ -2239,6 +2242,9 @@
case JVM_CONSTANT_InterfaceMethodref:
case JVM_CONSTANT_Methodref:
return cp->uncached_signature_ref_at(cp_index)->as_utf8();
+ case JVM_CONSTANT_NameAndType:
+ // for invokedynamic
+ return cp->nt_signature_ref_at(cp_index)->as_utf8();
default:
fatal("JVM_GetCPMethodSignatureUTF: illegal constant");
}
--- a/hotspot/src/share/vm/prims/jvmtiClassFileReconstituter.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/prims/jvmtiClassFileReconstituter.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -659,15 +659,21 @@
case Bytecodes::_invokevirtual : // fall through
case Bytecodes::_invokespecial : // fall through
case Bytecodes::_invokestatic : // fall through
+ case Bytecodes::_invokedynamic : // fall through
case Bytecodes::_invokeinterface :
assert(len == 3 || (code == Bytecodes::_invokeinterface && len ==5),
"sanity check");
+ int cpci = Bytes::get_native_u2(bcp+1);
+ bool is_invokedynamic = (EnableInvokeDynamic && code == Bytecodes::_invokedynamic);
+ if (is_invokedynamic)
+ cpci = Bytes::get_native_u4(bcp+1);
// cache cannot be pre-fetched since some classes won't have it yet
ConstantPoolCacheEntry* entry =
- mh->constants()->cache()->entry_at(Bytes::get_native_u2(bcp+1));
+ mh->constants()->cache()->main_entry_at(cpci);
int i = entry->constant_pool_index();
assert(i < mh->constants()->length(), "sanity check");
Bytes::put_Java_u2((address)(p+1), (u2)i); // java byte ordering
+ if (is_invokedynamic) *(p+3) = *(p+4) = 0;
break;
}
}
--- a/hotspot/src/share/vm/prims/methodComparator.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/prims/methodComparator.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -148,8 +148,8 @@
case Bytecodes::_invokespecial : // fall through
case Bytecodes::_invokestatic : // fall through
case Bytecodes::_invokeinterface : {
- u2 cpci_old = _s_old->get_index_big();
- u2 cpci_new = _s_new->get_index_big();
+ u2 cpci_old = _s_old->get_index_int();
+ u2 cpci_new = _s_new->get_index_int();
// Check if the names of classes, field/method names and signatures at these indexes
// are the same. Indices which are really into constantpool cache (rather than constant
// pool itself) are accepted by the constantpool query routines below.
--- a/hotspot/src/share/vm/prims/methodHandles.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/prims/methodHandles.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -2279,6 +2279,16 @@
JVM_END
+JVM_ENTRY(void, MH_linkCallSite(JNIEnv *env, jobject igcls, jobject site_jh, jobject target_jh)) {
+ // No special action required, yet.
+ oop site_oop = JNIHandles::resolve(site_jh);
+ if (site_oop == NULL || site_oop->klass() != SystemDictionary::CallSiteImpl_klass())
+ THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "call site");
+ sun_dyn_CallSiteImpl::set_target(site_oop, JNIHandles::resolve(target_jh));
+}
+JVM_END
+
+
/// JVM_RegisterMethodHandleMethods
#define ADR "J"
@@ -2297,6 +2307,7 @@
#define AMH IDYN"AdapterMethodHandle;"
#define BMH IDYN"BoundMethodHandle;"
#define DMH IDYN"DirectMethodHandle;"
+#define CSTI IDYN"CallSiteImpl;"
#define CC (char*) /*cast a literal from (const char*)*/
#define FN_PTR(f) CAST_FROM_FN_PTR(void*, &f)
@@ -2320,12 +2331,19 @@
{CC"getMembers", CC"("CLS""STRG""STRG"I"CLS"I["MEM")I", FN_PTR(MHI_getMembers)}
};
+// More entry points specifically for EnableInvokeDynamic.
+static JNINativeMethod methods2[] = {
+ {CC"linkCallSite", CC"("CSTI MH")V", FN_PTR(MH_linkCallSite)}
+};
+
// This one function is exported, used by NativeLookup.
JVM_ENTRY(void, JVM_RegisterMethodHandleMethods(JNIEnv *env, jclass MHN_class)) {
assert(MethodHandles::spot_check_entry_names(), "entry enum is OK");
+ // note: this explicit warning-producing stuff will be replaced by auto-detection of the JSR 292 classes
+
if (!EnableMethodHandles) {
warning("JSR 292 method handles are disabled in this JVM. Use -XX:+EnableMethodHandles to enable.");
return; // bind nothing
@@ -2343,5 +2361,23 @@
MethodHandles::set_enabled(true);
}
}
+
+ if (!EnableInvokeDynamic) {
+ warning("JSR 292 invokedynamic is disabled in this JVM. Use -XX:+EnableInvokeDynamic to enable.");
+ return; // bind nothing
+ }
+
+ {
+ ThreadToNativeFromVM ttnfv(thread);
+
+ int status = env->RegisterNatives(MHN_class, methods2, sizeof(methods2)/sizeof(JNINativeMethod));
+ if (env->ExceptionOccurred()) {
+ MethodHandles::set_enabled(false);
+ warning("JSR 292 method handle code is mismatched to this JVM. Disabling support.");
+ env->ExceptionClear();
+ } else {
+ MethodHandles::set_enabled(true);
+ }
+ }
}
JVM_END
--- a/hotspot/src/share/vm/runtime/arguments.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -2627,6 +2627,12 @@
}
#endif // PRODUCT
+ if (EnableInvokeDynamic && !EnableMethodHandles) {
+ if (!FLAG_IS_DEFAULT(EnableMethodHandles)) {
+ warning("forcing EnableMethodHandles true to allow EnableInvokeDynamic");
+ }
+ EnableMethodHandles = true;
+ }
if (EnableMethodHandles && !AnonymousClasses) {
if (!FLAG_IS_DEFAULT(AnonymousClasses)) {
warning("forcing AnonymousClasses true to enable EnableMethodHandles");
--- a/hotspot/src/share/vm/runtime/globals.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/runtime/globals.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -3316,6 +3316,12 @@
diagnostic(bool, OptimizeMethodHandles, true, \
"when constructing method handles, try to improve them") \
\
+ product(bool, EnableInvokeDynamic, false, \
+ "recognize the invokedynamic instruction") \
+ \
+ develop(bool, TraceInvokeDynamic, false, \
+ "trace internal invoke dynamic operations") \
+ \
product(bool, TaggedStackInterpreter, false, \
"Insert tags in interpreter execution stack for oopmap generaion")\
\
--- a/hotspot/src/share/vm/utilities/globalDefinitions.hpp Thu Apr 23 16:58:16 2009 -0400
+++ b/hotspot/src/share/vm/utilities/globalDefinitions.hpp Mon Apr 27 12:33:57 2009 -0700
@@ -572,8 +572,8 @@
enum TosState { // describes the tos cache contents
btos = 0, // byte, bool tos cached
- ctos = 1, // short, char tos cached
- stos = 2, // short, char tos cached
+ ctos = 1, // char tos cached
+ stos = 2, // short tos cached
itos = 3, // int tos cached
ltos = 4, // long tos cached
ftos = 5, // float tos cached
@@ -588,7 +588,7 @@
inline TosState as_TosState(BasicType type) {
switch (type) {
case T_BYTE : return btos;
- case T_BOOLEAN: return btos;
+ case T_BOOLEAN: return btos; // FIXME: Add ztos
case T_CHAR : return ctos;
case T_SHORT : return stos;
case T_INT : return itos;
@@ -602,6 +602,22 @@
return ilgl;
}
+inline BasicType as_BasicType(TosState state) {
+ switch (state) {
+ //case ztos: return T_BOOLEAN;//FIXME
+ case btos : return T_BYTE;
+ case ctos : return T_CHAR;
+ case stos : return T_SHORT;
+ case itos : return T_INT;
+ case ltos : return T_LONG;
+ case ftos : return T_FLOAT;
+ case dtos : return T_DOUBLE;
+ case atos : return T_OBJECT;
+ case vtos : return T_VOID;
+ }
+ return T_ILLEGAL;
+}
+
// Helper function to convert BasicType info into TosState
// Note: Cannot define here as it uses global constant at the time being.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/6589834/Test_ia32.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6589834
+ * @summary deoptimization problem with -XX:+DeoptimizeALot
+ *
+ * @run main/othervm -server Test_ia32
+ */
+
+/***************************************************************************************
+NOTE: The bug shows up (with several "Bug!" message) even without the
+ flag -XX:+DeoptimizeALot. In a debug build, you may want to try
+ the flags -XX:+VerifyStack and -XX:+DeoptimizeALot to get more information.
+****************************************************************************************/
+import java.lang.reflect.Constructor;
+
+public class Test_ia32 {
+
+ public static int NUM_THREADS = 100;
+
+ public static int CLONE_LENGTH = 1000;
+
+ public static void main(String[] args) throws InterruptedException, ClassNotFoundException {
+
+ Reflector[] threads = new Reflector[NUM_THREADS];
+ for (int i = 0; i < threads.length; i++) {
+ threads[i] = new Reflector();
+ threads[i].start();
+ }
+
+ System.out.println("Give Reflector.run() some time to compile...");
+ Thread.sleep(5000);
+
+ System.out.println("Load RMISecurityException causing run() deoptimization");
+ ClassLoader.getSystemClassLoader().loadClass("java.rmi.RMISecurityException");
+
+ for (Reflector thread : threads)
+ thread.requestStop();
+
+ for (Reflector thread : threads)
+ try {
+ thread.join();
+ } catch (InterruptedException e) {
+ System.out.println(e);
+ }
+
+ }
+
+}
+
+class Reflector extends Thread {
+
+ volatile boolean _doSpin = true;
+
+ Test_ia32[] _tests;
+
+ Reflector() {
+ _tests = new Test_ia32[Test_ia32.CLONE_LENGTH];
+ for (int i = 0; i < _tests.length; i++) {
+ _tests[i] = new Test_ia32();
+ }
+ }
+
+ static int g(int i1, int i2, Test_ia32[] arr, int i3, int i4) {
+
+ if (!(i1==1 && i2==2 && i3==3 && i4==4)) {
+ System.out.println("Bug!");
+ }
+
+ return arr.length;
+ }
+
+ static int f(Test_ia32[] arr) {
+ return g(1, 2, arr.clone(), 3, 4);
+ }
+
+ @Override
+ public void run() {
+ Constructor[] ctrs = null;
+ Class<Test_ia32> klass = Test_ia32.class;
+ try {
+ ctrs = klass.getConstructors();
+ } catch (SecurityException e) {
+ System.out.println(e);
+ }
+
+ try {
+ while (_doSpin) {
+ if (f(_tests) < 0)
+ System.out.println("return value usage");
+ }
+ } catch (NullPointerException e) {
+ e.printStackTrace();
+ }
+
+ System.out.println(this + " - stopped.");
+ }
+
+ public void requestStop() {
+ System.out.println(this + " - stop requested.");
+ _doSpin = false;
+ }
+
+}
--- a/jaxp/.hgtags Thu Apr 23 16:58:16 2009 -0400
+++ b/jaxp/.hgtags Mon Apr 27 12:33:57 2009 -0700
@@ -28,3 +28,5 @@
ae890d80d5dffcd4dc77a1f17d768e192d1852c7 jdk7-b51
69ad87dc25cbcaaaded4727199395ad0c78bc427 jdk7-b52
e8837366d3fd72f7c7a47ebfdbd5106c16156f12 jdk7-b53
+946a9f0c493261fa6a010dc33e61b9b535ba80c1 jdk7-b54
+039945fba683ee6773a721e2bd4e449f6133769a jdk7-b55
--- a/jaxws/.hgtags Thu Apr 23 16:58:16 2009 -0400
+++ b/jaxws/.hgtags Mon Apr 27 12:33:57 2009 -0700
@@ -28,3 +28,5 @@
41a66a42791ba90bff489af72cbfea71be9b40a5 jdk7-b51
e646890d18b770f625f14ed4ad5c50554d8d3d8b jdk7-b52
b250218eb2e534384667ec73e3713e684667fd4c jdk7-b53
+50ea00dc5f143fe00025233e704903c37f8464aa jdk7-b54
+e0eebd978b830c09e7862cff3f77a914c15651c9 jdk7-b55
--- a/jdk/.hgtags Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/.hgtags Mon Apr 27 12:33:57 2009 -0700
@@ -28,3 +28,5 @@
fea0898259ae41c73620b1815aa48f036216155c jdk7-b51
bcbeadb4a5d759b29e876ee2c83401e91ff22f60 jdk7-b52
a2033addca678f9e4c0d92ffa1e389171cc9321d jdk7-b53
+d1c43d1f5676a24ba86221ac7cad5694f3a9afda jdk7-b54
+522bb5aa17e0c0cff00b1ed7d1b51bc4db2cfef9 jdk7-b55
--- a/jdk/make/com/sun/Makefile Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/com/sun/Makefile Mon Apr 27 12:33:57 2009 -0700
@@ -41,7 +41,7 @@
# Omit mirror since it's built with the apt tool.
SUBDIRS = $(SCRIPT_SUBDIR) image security crypto/provider jndi jmx \
java inputmethods org xml rowset net/httpserver net/ssl demo \
- tools jarsigner tracing servicetag
+ tools jarsigner tracing servicetag nio
all build clean clobber::
$(SUBDIRS-loop)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/com/sun/nio/Makefile Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,38 @@
+#
+# Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+#
+# Makefile for com.sun.nio packages.
+#
+
+BUILDDIR = ../../..
+include $(BUILDDIR)/common/Defs.gmk
+
+SUBDIRS = sctp
+all build clean clobber::
+ $(SUBDIRS-loop)
+
+clean clobber::
+ $(RM) -r $(CLASSDESTDIR)/com/sun/nio
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/com/sun/nio/sctp/Exportedfiles.gmk Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,39 @@
+#
+# Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+#
+# These are the names of Java classes for which we will make .h files.
+#
+
+ifneq ($(PLATFORM), windows)
+FILES_export = \
+ sun/nio/ch/SctpAssocChange.java \
+ sun/nio/ch/SctpChannelImpl.java \
+ sun/nio/ch/SctpNet.java \
+ sun/nio/ch/SctpPeerAddrChange.java \
+ sun/nio/ch/SctpResultContainer.java \
+ sun/nio/ch/SctpServerChannelImpl.java \
+ sun/nio/ch/SctpStdSocketOption.java
+endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/com/sun/nio/sctp/FILES_c.gmk Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,31 @@
+#
+# Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+ifneq ($(PLATFORM),windows)
+FILES_c = \
+ SctpNet.c \
+ SctpChannelImpl.c \
+ SctpServerChannelImpl.c
+endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/com/sun/nio/sctp/FILES_java.gmk Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,67 @@
+#
+# Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+FILES_java = \
+ com/sun/nio/sctp/AbstractNotificationHandler.java \
+ com/sun/nio/sctp/Association.java \
+ com/sun/nio/sctp/AssociationChangeNotification.java \
+ com/sun/nio/sctp/HandlerResult.java \
+ com/sun/nio/sctp/IllegalReceiveException.java \
+ com/sun/nio/sctp/IllegalUnbindException.java \
+ com/sun/nio/sctp/InvalidStreamException.java \
+ com/sun/nio/sctp/MessageInfo.java \
+ com/sun/nio/sctp/Notification.java \
+ com/sun/nio/sctp/NotificationHandler.java \
+ com/sun/nio/sctp/PeerAddressChangeNotification.java \
+ com/sun/nio/sctp/SctpChannel.java \
+ com/sun/nio/sctp/SctpMultiChannel.java \
+ com/sun/nio/sctp/SctpServerChannel.java \
+ com/sun/nio/sctp/SctpSocketOption.java \
+ com/sun/nio/sctp/SctpStandardSocketOption.java \
+ com/sun/nio/sctp/SendFailedNotification.java \
+ com/sun/nio/sctp/ShutdownNotification.java \
+ \
+ sun/nio/ch/SctpMessageInfoImpl.java \
+ sun/nio/ch/SctpStdSocketOption.java
+
+ifneq ($(PLATFORM), windows)
+FILES_java += \
+ sun/nio/ch/SctpAssocChange.java \
+ sun/nio/ch/SctpAssociationImpl.java \
+ sun/nio/ch/SctpChannelImpl.java \
+ sun/nio/ch/SctpMultiChannelImpl.java \
+ sun/nio/ch/SctpNet.java \
+ sun/nio/ch/SctpNotification.java \
+ sun/nio/ch/SctpPeerAddrChange.java \
+ sun/nio/ch/SctpResultContainer.java \
+ sun/nio/ch/SctpSendFailed.java \
+ sun/nio/ch/SctpServerChannelImpl.java \
+ sun/nio/ch/SctpShutdown.java \
+ sun/nio/ch/SctpSocketDispatcher.java
+else
+FILES_java += \
+ sun/nio/ch/SctpChannelImpl.java \
+ sun/nio/ch/SctpMultiChannelImpl.java \
+ sun/nio/ch/SctpServerChannelImpl.java
+endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/com/sun/nio/sctp/Makefile Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,80 @@
+#
+# Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+#
+# Makefile for com.sun.nio.sctp
+#
+
+BUILDDIR = ../../../..
+PACKAGE = com.sun.nio.sctp
+LIBRARY = sctp
+PRODUCT = sun
+#OTHER_JAVACFLAGS += -Xmaxwarns 1000 -Xlint
+include $(BUILDDIR)/common/Defs.gmk
+
+#
+# Files to compile
+#
+include FILES_c.gmk
+include FILES_java.gmk
+include Exportedfiles.gmk
+
+ifneq ($(PLATFORM), windows)
+include $(BUILDDIR)/common/Mapfile-vers.gmk
+include $(BUILDDIR)/common/Library.gmk
+
+#
+# Find platform-specific C source files
+#
+vpath %.c $(PLATFORM_SRC)/native/sun/nio/ch
+
+#
+# Include nio.h, net_util.h, sun_nio_ch_IOStatus.h, etc
+#
+OTHER_INCLUDES += \
+ -I$(SHARE_SRC)/native/sun/nio/ch \
+ -I$(SHARE_SRC)/native/java/net \
+ -I$(PLATFORM_SRC)/native/java/net \
+ -I$(CLASSHDRDIR)/../../../../java/java.nio/nio/CClassHeaders
+
+ifeq ($(PLATFORM), linux)
+COMPILER_WARNINGS_FATAL=true
+#OTHER_LDLIBS += -L$(LIBDIR)/$(LIBARCH) -ljava -lnet -lpthread -ldl
+OTHER_LDLIBS += -L$(LIBDIR)/$(LIBARCH) -lnio -lnet -lpthread -ldl
+endif
+ifeq ($(PLATFORM), solaris)
+#LIBSCTP = -lsctp
+OTHER_LDLIBS += $(LIBSOCKET) -L$(LIBDIR)/$(LIBARCH) -lnet -lnio
+endif # PLATFORM
+
+else # windows
+include $(BUILDDIR)/common/Classes.gmk
+endif # ifneq windows
+
+
+clean clobber::
+ $(RM) -r $(CLASSDESTDIR)/com/sun/nio/sctp
+ $(RM) -r $(CLASSDESTDIR)/sun/nio/ch
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/com/sun/nio/sctp/mapfile-vers Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,49 @@
+#
+# Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+SUNWprivate_1.1 {
+ global:
+ Java_sun_nio_ch_SctpNet_socket0;
+ Java_sun_nio_ch_SctpNet_bindx;
+ Java_sun_nio_ch_SctpNet_getLocalAddresses0;
+ Java_sun_nio_ch_SctpNet_getRemoteAddresses0;
+ Java_sun_nio_ch_SctpNet_getPrimAddrOption0;
+ Java_sun_nio_ch_SctpNet_setPrimAddrOption0;
+ Java_sun_nio_ch_SctpNet_setPeerPrimAddrOption0;
+ Java_sun_nio_ch_SctpNet_getInitMsgOption0;
+ Java_sun_nio_ch_SctpNet_setInitMsgOption0;
+ Java_sun_nio_ch_SctpNet_getIntOption0;
+ Java_sun_nio_ch_SctpNet_setIntOption0;
+ Java_sun_nio_ch_SctpNet_shutdown0;
+ Java_sun_nio_ch_SctpChannelImpl_initIDs;
+ Java_sun_nio_ch_SctpChannelImpl_checkConnect;
+ Java_sun_nio_ch_SctpChannelImpl_receive0;
+ Java_sun_nio_ch_SctpChannelImpl_send0;
+ Java_sun_nio_ch_SctpServerChannelImpl_initIDs;
+ Java_sun_nio_ch_SctpServerChannelImpl_accept0;
+ JNI_OnLoad;
+ local:
+ *;
+};
--- a/jdk/make/docs/NON_CORE_PKGS.gmk Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/docs/NON_CORE_PKGS.gmk Mon Apr 27 12:33:57 2009 -0700
@@ -86,6 +86,8 @@
SMARTCARDIO_PKGS = javax.smartcardio
+SCTPAPI_PKGS = com.sun.nio.sctp
+
TRACING_PKGS = com.sun.tracing \
com.sun.tracing.dtrace
@@ -98,4 +100,6 @@
$(OLD_JSSE_PKGS) \
$(HTTPSERVER_PKGS) \
$(SMARTCARDIO_PKGS) \
- $(TRACING_PKGS)
+ $(TRACING_PKGS) \
+ $(SCTPAPI_PKGS)
+
--- a/jdk/make/java/java/mapfile-vers Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/java/java/mapfile-vers Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
#
-# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
+# Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -135,7 +135,8 @@
Java_java_lang_ClassLoader_00024NativeLibrary_find;
Java_java_lang_ClassLoader_00024NativeLibrary_load;
Java_java_lang_ClassLoader_00024NativeLibrary_unload;
- Java_java_lang_ClassLoader_registerNatives;
+ Java_java_lang_ClassLoader_getCaller;
+ Java_java_lang_ClassLoader_registerNatives;
Java_java_lang_Compiler_registerNatives;
Java_java_lang_Double_longBitsToDouble;
Java_java_lang_Double_doubleToRawLongBits;
--- a/jdk/make/java/net/FILES_c.gmk Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/java/net/FILES_c.gmk Mon Apr 27 12:33:57 2009 -0700
@@ -39,6 +39,10 @@
ResolverConfigurationImpl.c \
DefaultProxySelector.c
+ifeq ($(PLATFORM), solaris)
+ FILES_c += SdpProvider.c
+endif
+
ifeq ($(PLATFORM), linux)
FILES_c += linux_close.c
endif
--- a/jdk/make/java/net/Makefile Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/java/net/Makefile Mon Apr 27 12:33:57 2009 -0700
@@ -108,11 +108,24 @@
#
LOCALE_SET_DEFINITION = jre
-properties: $(LIBDIR) $(LIBDIR)/net.properties
+MISC_FILES = $(LIBDIR) $(LIBDIR)/net.properties
$(LIBDIR)/net.properties: $(SHARE_SRC)/lib/net.properties
@$(RM) $@
$(CP) $< $@
-build: properties
+#
+# SDP configuration template
+#
+ifeq ($(PLATFORM), solaris)
+SDP_PATH = sdp/sdp.conf.template
+SDP_CONF = $(LIBDIR)/$(SDP_PATH)
+$(SDP_CONF): $(PLATFORM_SRC)/lib/$(SDP_PATH)
+ @$(RM) $*
+ $(install-file)
+MISC_FILES += $(SDP_CONF)
+endif
+
+build: $(MISC_FILES)
+
--- a/jdk/make/java/net/mapfile-vers Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/java/net/mapfile-vers Mon Apr 27 12:33:57 2009 -0700
@@ -90,6 +90,7 @@
Java_sun_net_dns_ResolverConfigurationImpl_fallbackDomain0;
Java_sun_net_spi_DefaultProxySelector_init;
Java_sun_net_spi_DefaultProxySelector_getSystemProxy;
+ Java_sun_net_spi_SdpProvider_convert;
NET_AllocSockaddr;
NET_SockaddrToInetAddress;
NET_SockaddrEqualsInetAddress;
--- a/jdk/make/java/nio/mapfile-linux Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/java/nio/mapfile-linux Mon Apr 27 12:33:57 2009 -0700
@@ -189,6 +189,7 @@
Java_sun_nio_fs_UnixNativeDispatcher_getgrnam0;
Java_sun_nio_fs_UnixNativeDispatcher_getextmntent;
Java_sun_nio_fs_UnixCopyFile_transfer;
+ handleSocketError;
local:
*;
--- a/jdk/make/java/nio/mapfile-solaris Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/java/nio/mapfile-solaris Mon Apr 27 12:33:57 2009 -0700
@@ -175,6 +175,7 @@
Java_sun_nio_fs_SolarisWatchService_portDissociate;
Java_sun_nio_fs_SolarisWatchService_portSend;
Java_sun_nio_fs_SolarisWatchService_portGetn;
+ handleSocketError;
local:
*;
--- a/jdk/make/java/text/FILES_java.gmk Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/java/text/FILES_java.gmk Mon Apr 27 12:33:57 2009 -0700
@@ -92,11 +92,11 @@
sun/text/normalizer/SymbolTable.java \
sun/text/normalizer/Trie.java \
sun/text/normalizer/TrieIterator.java \
+ sun/text/normalizer/UBiDiProps.java \
sun/text/normalizer/UCharacter.java \
sun/text/normalizer/UCharacterIterator.java \
sun/text/normalizer/UCharacterProperty.java \
sun/text/normalizer/UCharacterPropertyReader.java \
- sun/text/normalizer/UProperty.java \
sun/text/normalizer/UTF16.java \
sun/text/normalizer/UnicodeMatcher.java \
sun/text/normalizer/UnicodeSet.java \
--- a/jdk/make/java/text/Makefile Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/java/text/Makefile Mon Apr 27 12:33:57 2009 -0700
@@ -64,7 +64,8 @@
$(TEXT_CLASSDIR)/SentenceBreakIteratorData
ICU_FILES = $(TEXT_CLASSDIR)/unorm.icu \
- $(TEXT_CLASSDIR)/uprops.icu
+ $(TEXT_CLASSDIR)/uprops.icu \
+ $(TEXT_CLASSDIR)/ubidi.icu
# builder
GENERATEBREAKITERATORDATA_JARFILE = \
@@ -89,7 +90,7 @@
build: $(BIFILES) $(ICU_FILES)
#
-# Extra rules to copy unorm.icu and uprops.icu
+# Extra rules to copy unorm.icu, uprops.icu, and ubidi.icu
#
$(TEXT_CLASSDIR)/unorm.icu: $(TEXT_SRCDIR)/unorm.icu
$(install-file)
@@ -97,6 +98,9 @@
$(TEXT_CLASSDIR)/uprops.icu: $(TEXT_SRCDIR)/uprops.icu
$(install-file)
+$(TEXT_CLASSDIR)/ubidi.icu: $(TEXT_SRCDIR)/ubidi.icu
+ $(install-file)
+
clean clobber::
$(RM) -r $(TEXT_CLASSES)
$(RM) -r $(BIFILES)
--- a/jdk/make/sun/awt/Depend.mak Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/sun/awt/Depend.mak Mon Apr 27 12:33:57 2009 -0700
@@ -71,6 +71,7 @@
$(STUBDIR)/Ole2.h \
$(STUBDIR)/Zmouse.h \
$(STUBDIR)/cderr.h \
+ $(STUBDIR)/commctrl.h \
$(STUBDIR)/commdlg.h \
$(STUBDIR)/direct.h \
$(STUBDIR)/d3dcom.h \
--- a/jdk/make/sun/awt/FILES_c_windows.gmk Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/sun/awt/FILES_c_windows.gmk Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
#
-# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
+# Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -104,7 +104,8 @@
OGLVertexCache.c \
WGLGraphicsConfig.c \
WGLSurfaceData.c \
- AccelGlyphCache.c
+ AccelGlyphCache.c \
+ rect.c
FILES_cpp = \
CmdIDList.cpp \
@@ -199,5 +200,6 @@
ShellFolder2.cpp \
ThemeReader.cpp \
ComCtl32Util.cpp \
+ DllUtil.cpp \
initIDs.cpp \
MouseInfo.cpp
--- a/jdk/make/sun/awt/FILES_export_unix.gmk Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/sun/awt/FILES_export_unix.gmk Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
#
-# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved.
+# Copyright 2000-2009 Sun Microsystems, Inc. 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
@@ -107,7 +107,8 @@
sun/java2d/x11/X11Renderer.java \
sun/java2d/x11/X11SurfaceData.java \
com/sun/java/swing/plaf/gtk/GTKEngine.java \
- com/sun/java/swing/plaf/gtk/GTKStyle.java
+ com/sun/java/swing/plaf/gtk/GTKStyle.java \
+ sun/awt/ExtendedKeyCodes.java
FILES_export2 = \
--- a/jdk/make/sun/awt/FILES_export_windows.gmk Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/sun/awt/FILES_export_windows.gmk Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
#
-# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved.
+# Copyright 2000-2009 Sun Microsystems, Inc. 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
@@ -154,7 +154,7 @@
sun/awt/datatransfer/DataTransferer.java \
sun/awt/datatransfer/SunClipboard.java \
sun/awt/dnd/SunDragSourceContextPeer.java \
- sun/awt/windows/WToolkitThreadBlockedHandler.java
+ sun/awt/windows/WToolkitThreadBlockedHandler.java
FILES_export3 = \
java/awt/CheckboxMenuItem.java \
@@ -214,6 +214,7 @@
sun/awt/windows/WBufferStrategy.java \
sun/awt/windows/WTrayIconPeer.java \
sun/awt/image/ImagingLib.java \
+ sun/awt/ExtendedKeyCodes.java \
sun/java2d/pipe/hw/AccelSurface.java \
sun/java2d/pipe/hw/AccelDeviceEventNotifier.java \
sun/java2d/pipe/hw/ContextCapabilities.java \
--- a/jdk/make/sun/awt/Makefile Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/sun/awt/Makefile Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
#
-# Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved.
+# Copyright 1995-2009 Sun Microsystems, Inc. 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
@@ -219,6 +219,7 @@
vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/shell
vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/medialib
vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/debug
+vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/utility
vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/../java2d
vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/../java2d/loops
vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/../java2d/pipe
--- a/jdk/make/sun/awt/README Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/sun/awt/README Mon Apr 27 12:33:57 2009 -0700
@@ -6,11 +6,9 @@
Included in this project is a generated file, make.depend, which lists
all interdependencies of the source files. This file is generated *on
-Solaris* with the following commands:
+Solaris or Linux* with the following command:
- % sccs edit make.depend
% gnumake -f Depend.mak
- % sccs delget make.depend
This step only needs to be run when new files are added to the project,
or include statements are changed.
--- a/jdk/make/sun/awt/make.depend Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/sun/awt/make.depend Mon Apr 27 12:33:57 2009 -0700
@@ -1,4 +1,4 @@
-$(OBJDIR)/AccelGlyphCache.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h
+$(OBJDIR)/AccelGlyphCache.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h
$(OBJDIR)/AlphaMacros.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
@@ -14,143 +14,143 @@
$(OBJDIR)/AnyShort.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-$(OBJDIR)/awt_AWTEvent.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_AWTEvent.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_BitmapUtil.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_BitmapUtil.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Brush.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Brush.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Button.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Button.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WButtonPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Button.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Button.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Button.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WButtonPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Button.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Canvas.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsConfig.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Canvas.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsConfig.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Checkbox.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Checkbox.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCheckboxPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Checkbox.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Checkbox.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Checkbox.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCheckboxPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Checkbox.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Choice.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Choice.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WChoicePeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Choice.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Choice.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Choice.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WChoicePeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Choice.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Clipboard.obj:: $(CLASSHDRDIR)/sun_awt_windows_WClipboard.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Clipboard.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Clipboard.obj:: $(CLASSHDRDIR)/sun_awt_windows_WClipboard.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Clipboard.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Color.obj:: $(CLASSHDRDIR)/sun_awt_windows_WColor.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Color.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Color.obj:: $(CLASSHDRDIR)/sun_awt_windows_WColor.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Color.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Component.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Color.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_MouseWheelEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_KeyboardFocusManager.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethod.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPanelPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/awt_InputTextInfor.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MouseEvent.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Component.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Color.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_MouseWheelEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethod.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPanelPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/awt_InputTextInfor.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MouseEvent.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Container.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Container.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Cursor.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Cursor.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCustomCursor.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WGlobalCursorManager.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Cursor.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Cursor.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCustomCursor.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WGlobalCursorManager.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_DataTransferer.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_datatransfer_DataTransferer.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDataTransferer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/common/locale_str.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_DataTransferer.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_datatransfer_DataTransferer.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDataTransferer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/common/locale_str.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Debug.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Debug.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Desktop.obj:: ../../../src/share/javavm/export/jni.h ../../../src/windows/javavm/export/jni_md.h
+$(OBJDIR)/awt_Desktop.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_DesktopProperties.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDesktopProperties.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DesktopProperties.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_DesktopProperties.obj:: $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_windows_WDesktopProperties.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DesktopProperties.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Dialog.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Dialog.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Dimension.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Dimension.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_DnDDS.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_dnd_DnDConstants.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_dnd_SunDragSourceContextPeer.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDragSourceContextPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DnDDS.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_DnDDS.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_dnd_DnDConstants.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_dnd_SunDragSourceContextPeer.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDragSourceContextPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DnDDS.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_DnDDT.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_dnd_DnDConstants.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDropTargetContextPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_DnDDS.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_DnDDT.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_dnd_DnDConstants.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDropTargetContextPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DnDDS.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_DrawingSurface.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jawt_md.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DrawingSurface.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_DrawingSurface.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jawt_md.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DrawingSurface.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Event.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Event.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Event.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Event.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_FileDialog.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_FileDialog.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Font.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDefaultFontCharset.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFontPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Font.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDefaultFontCharset.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFontPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Frame.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/java_lang_Integer.h $(CLASSHDRDIR)/sun_awt_EmbeddedFrame.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WEmbeddedFrame.h $(CLASSHDRDIR)/sun_awt_windows_WEmbeddedFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Frame.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/java_lang_Integer.h $(CLASSHDRDIR)/sun_awt_EmbeddedFrame.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WEmbeddedFrame.h $(CLASSHDRDIR)/sun_awt_windows_WEmbeddedFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_GDIObject.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_GDIObject.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_IconCursor.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_IconCursor.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/stdhdrs.h
$(OBJDIR)/awt_ImageRep.obj:: $(CLASSHDRDIR)/sun_awt_image_ImageRepresentation.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/image/awt_parseImage.h ../../../src/share/native/sun/awt/image/imageInitIDs.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h
$(OBJDIR)/awt_ImagingLib.obj:: $(CLASSHDRDIR)/java_awt_color_ColorSpace.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_image_BufferedImage.h $(CLASSHDRDIR)/java_awt_image_ConvolveOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_image_ImagingLib.h $(CLASSHDRDIR)/sun_awt_image_IntegerComponentRaster.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/image/awt_parseImage.h ../../../src/share/native/sun/awt/image/imageInitIDs.h ../../../src/share/native/sun/awt/medialib/awt_ImagingLib.h ../../../src/share/native/sun/awt/medialib/mlib_image_get.h ../../../src/share/native/sun/awt/medialib/mlib_image_types.h ../../../src/share/native/sun/awt/medialib/mlib_status.h ../../../src/share/native/sun/awt/medialib/mlib_types.h ../../../src/share/native/sun/awt/medialib/safe_alloc.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/awt_Mlib.h
-$(OBJDIR)/awt_InputEvent.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_InputEvent.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_InputMethod.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethod.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethodDescriptor.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/common/locale_str.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_InputMethod.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethodDescriptor.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethod.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/common/locale_str.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_InputTextInfor.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_InputTextInfor.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_InputTextInfor.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_InputTextInfor.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Insets.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Insets.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_KeyboardFocusManager.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_KeyboardFocusManager.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_KeyboardFocusManager.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_KeyboardFocusManager.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_KeyEvent.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_KeyEvent.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Label.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Label.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WLabelPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Label.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Label.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Label.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WLabelPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Label.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_List.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_List.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WListPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_List.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_List.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_List.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WListPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_List.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Menu.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_MenuBar.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_MenuBar.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_MenuItem.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_CheckboxMenuItem.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCheckboxMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DesktopProperties.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_MenuItem.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_CheckboxMenuItem.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCheckboxMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DesktopProperties.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Menu.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
$(OBJDIR)/awt_Mlib.obj:: $(CLASSHDRDIR)/java_awt_image_BufferedImage.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/medialib/awt_ImagingLib.h ../../../src/share/native/sun/awt/medialib/mlib_image_get.h ../../../src/share/native/sun/awt/medialib/mlib_image_types.h ../../../src/share/native/sun/awt/medialib/mlib_status.h ../../../src/share/native/sun/awt/medialib/mlib_types.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Mlib.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_MouseEvent.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_MouseEvent.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_MouseEvent.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MouseEvent.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_new.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_new.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_new.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_new.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Object.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Object.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Palette.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_CustomPaletteDef.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/img_util_md.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Palette.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_CustomPaletteDef.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/img_util_md.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Panel.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Panel.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
$(OBJDIR)/awt_parseImage.obj:: $(CLASSHDRDIR)/java_awt_color_ColorSpace.h $(CLASSHDRDIR)/java_awt_image_BufferedImage.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_image_ImagingLib.h $(CLASSHDRDIR)/sun_awt_image_IntegerComponentRaster.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/image/awt_parseImage.h ../../../src/share/native/sun/awt/image/imageInitIDs.h ../../../src/share/native/sun/awt/medialib/awt_ImagingLib.h ../../../src/share/native/sun/awt/medialib/mlib_image_get.h ../../../src/share/native/sun/awt/medialib/mlib_image_types.h ../../../src/share/native/sun/awt/medialib/mlib_status.h ../../../src/share/native/sun/awt/medialib/mlib_types.h ../../../src/share/native/sun/awt/medialib/safe_alloc.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/awt_Mlib.h
-$(OBJDIR)/awt_Pen.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Pen.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_PopupMenu.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_PopupMenu.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPopupMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Event.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PopupMenu.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_PopupMenu.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_PopupMenu.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPopupMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Event.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PopupMenu.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_PrintControl.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_PrintControl.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_PrintDialog.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPrintDialog.h $(CLASSHDRDIR)/sun_awt_windows_WPrintDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_PrintDialog.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPrintDialog.h $(CLASSHDRDIR)/sun_awt_windows_WPrintDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_PrintJob.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPrinterJob.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_PrintJob.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPrinterJob.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Rectangle.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Rectangle.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Rectangle.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Rectangle.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Robot.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WRobotPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Robot.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Robot.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WRobotPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Robot.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Scrollbar.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Scrollbar.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WScrollbarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Scrollbar.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Scrollbar.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Scrollbar.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WScrollbarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Scrollbar.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_ScrollPane.obj:: $(CLASSHDRDIR)/java_awt_Adjustable.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_AdjustmentEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_Scrollbar.h $(CLASSHDRDIR)/java_awt_ScrollPane.h $(CLASSHDRDIR)/java_awt_ScrollPaneAdjustable.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WScrollbarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WScrollPanePeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Scrollbar.h ../../../src/windows/native/sun/windows/awt_ScrollPane.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_ScrollPane.obj:: $(CLASSHDRDIR)/java_awt_Adjustable.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_AdjustmentEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_Scrollbar.h $(CLASSHDRDIR)/java_awt_ScrollPaneAdjustable.h $(CLASSHDRDIR)/java_awt_ScrollPane.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WScrollbarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WScrollPanePeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Scrollbar.h ../../../src/windows/native/sun/windows/awt_ScrollPane.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_TextArea.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_TextArea.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextAreaPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_TextArea.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_TextArea.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_TextArea.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextAreaPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_TextArea.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_TextComponent.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_TextComponent.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_TextField.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/java_awt_TextField.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextFieldPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_TextField.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_TextField.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/java_awt_TextField.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextFieldPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_TextField.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Toolkit.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_List.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_ComponentPeer.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_PopupMenu.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WListPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPopupMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jawt_md.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Clipboard.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DesktopProperties.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_DnDDS.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_DrawingSurface.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/awt_List.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_new.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PopupMenu.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/CmdIDList.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Toolkit.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_List.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_ComponentPeer.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_PopupMenu.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WListPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPopupMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jawt_md.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Clipboard.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DesktopProperties.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_DnDDS.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_DrawingSurface.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/awt_List.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_new.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PopupMenu.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/CmdIDList.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/DllUtil.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+
+$(OBJDIR)/awt_TrayIcon.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_ActionEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_TrayIcon.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WTrayIconPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_TrayIcon.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_TrayIcon.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_ActionEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_TrayIcon.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WTrayIconPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_TrayIcon.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Win32GraphicsConfig.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_DataBuffer.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_Win32GraphicsConfig.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsConfig.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Win32GraphicsConfig.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_DataBuffer.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_Win32GraphicsConfig.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsConfig.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Win32GraphicsDevice.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_color_ColorSpace.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_DataBuffer.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_Win32GraphicsDevice.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/awt/image/dither.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/img_util_md.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Win32GraphicsDevice.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_color_ColorSpace.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_image_DataBuffer.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_Win32GraphicsDevice.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/awt/image/dither.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/img_util_md.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Win32GraphicsEnv.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_Win32GraphicsEnvironment.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/DllUtil.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Win32GraphicsEnv.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_Win32GraphicsEnvironment.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/awt_Window.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Container.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_ComponentEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/awt_Window.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Container.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_ComponentEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/BlitBg.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_BlitBg.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
$(OBJDIR)/Blit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_Blit.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-$(OBJDIR)/BlitBg.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_BlitBg.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/BufferedMaskBlit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedMaskBlit.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntBgr.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-$(OBJDIR)/BufferedMaskBlit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedMaskBlit.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntBgr.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-
-$(OBJDIR)/BufferedRenderPipe.obj:: $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h
+$(OBJDIR)/BufferedRenderPipe.obj:: $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h
$(OBJDIR)/BufImgSurfaceData.obj:: $(CLASSHDRDIR)/sun_awt_image_BufImgSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/image/BufImgSurfaceData.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/img_util_md.h
@@ -160,62 +160,64 @@
$(OBJDIR)/ByteBinary4Bit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyByteBinary.h ../../../src/share/native/sun/java2d/loops/ByteBinary4Bit.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-$(OBJDIR)/ByteGray.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyByte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/Index8Gray.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/ByteGray.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyByte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/Index8Gray.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-$(OBJDIR)/ByteIndexed.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyByte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/ByteIndexed.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyByte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-$(OBJDIR)/CmdIDList.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/CmdIDList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/CmdIDList.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/CmdIDList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/ComCtl32Util.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/ComCtl32Util.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/D3DBlitLoops.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DBlitLoops.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntBgr.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/Ushort555Rgb.h ../../../src/share/native/sun/java2d/loops/Ushort565Rgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBlitLoops.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/D3DBlitLoops.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DBlitLoops.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntBgr.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/Ushort555Rgb.h ../../../src/share/native/sun/java2d/loops/Ushort565Rgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBlitLoops.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/D3DBufImgOps.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBufImgOps.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/D3DBufImgOps.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBufImgOps.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/D3DContext.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBufImgOps.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGlyphCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DShaders.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/D3DContext.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBufImgOps.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGlyphCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DShaders.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/D3DGlyphCache.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGlyphCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/D3DGlyphCache.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGlyphCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/D3DGraphicsDevice.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DGraphicsDevice.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGraphicsDevice.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/D3DGraphicsDevice.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DGraphicsDevice.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGraphicsDevice.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/D3DMaskBlit.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskBlit.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/D3DMaskBlit.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskBlit.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/D3DMaskCache.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/D3DMaskCache.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/D3DMaskFill.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DMaskFill.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskFill.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/D3DMaskFill.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DMaskFill.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskFill.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/D3DPaints.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/D3DPaints.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/D3DPipelineManager.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBadHardware.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/D3DPipelineManager.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBadHardware.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/D3DRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DRenderer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/D3DRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DRenderer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/D3DRenderQueue.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DBlitLoops.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBlitLoops.h ../../../src/windows/native/sun/java2d/d3d/D3DBufImgOps.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskBlit.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskFill.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/D3DRenderQueue.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DBlitLoops.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBlitLoops.h ../../../src/windows/native/sun/java2d/d3d/D3DBufImgOps.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskBlit.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskFill.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/D3DResourceManager.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/D3DResourceManager.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/D3DSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/D3DSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/D3DTextRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DTextRenderer.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGlyphCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/D3DTextRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DTextRenderer.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGlyphCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/D3DVertexCacher.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/D3DVertexCacher.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/DataBufferNative.obj:: $(CLASSHDRDIR)/sun_awt_image_DataBufferNative.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h
+$(OBJDIR)/DataBufferNative.obj:: $(CLASSHDRDIR)/sun_awt_image_DataBufferNative.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h
-$(OBJDIR)/debug_assert.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h
+$(OBJDIR)/debug_assert.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h
-$(OBJDIR)/debug_mem.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h
+$(OBJDIR)/debug_mem.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h
-$(OBJDIR)/debug_trace.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h
+$(OBJDIR)/debug_trace.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h
-$(OBJDIR)/debug_util.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h
+$(OBJDIR)/debug_util.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h
-$(OBJDIR)/Devices.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/Devices.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/stdhdrs.h
$(OBJDIR)/Disposer.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h
$(OBJDIR)/dither.obj:: ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/awt/image/dither.h ../../../src/windows/native/sun/windows/colordata.h
+$(OBJDIR)/DllUtil.obj:: ../../../src/windows/native/sun/windows/DllUtil.h
+
$(OBJDIR)/DrawLine.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_DrawLine.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
$(OBJDIR)/DrawPath.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_DrawPath.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/DrawPath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/ProcessPath.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
@@ -230,27 +232,27 @@
$(OBJDIR)/FillSpans.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_FillSpans.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-$(OBJDIR)/FourByteAbgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/Any4Byte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/FourByteAbgr.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/FourByteAbgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/Any4Byte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/FourByteAbgr.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-$(OBJDIR)/FourByteAbgrPre.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/Any4Byte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/FourByteAbgrPre.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/FourByteAbgrPre.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/Any4Byte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/FourByteAbgrPre.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-$(OBJDIR)/GDIBlitLoops.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIBlitLoops.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/GDIBlitLoops.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIBlitLoops.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/GDIHashtable.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/GDIHashtable.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/GDIRenderer.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_geom_PathIterator.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIRenderer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/GDIRenderer.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_geom_PathIterator.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIRenderer.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/GDIWindowSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIWindowSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/GDIWindowSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIWindowSurfaceData.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
$(OBJDIR)/gifdecoder.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h
$(OBJDIR)/GraphicsPrimitiveMgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_GraphicsPrimitiveMgr.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-$(OBJDIR)/Hashtable.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/Hashtable.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h
$(OBJDIR)/imageInitIDs.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/image/imageInitIDs.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h
-$(OBJDIR)/img_colors.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h
+$(OBJDIR)/img_colors.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h
$(OBJDIR)/img_globals.obj:: $(CLASSHDRDIR)/java_awt_image_DirectColorModel.h $(CLASSHDRDIR)/java_awt_image_IndexColorModel.h $(CLASSHDRDIR)/java_awt_Transparency.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/windows/javavm/export/jni_md.h
@@ -260,49 +262,49 @@
$(OBJDIR)/initIDs.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h
-$(OBJDIR)/IntArgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/IntArgbBm.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-$(OBJDIR)/IntArgbBm.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/IntArgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
$(OBJDIR)/IntArgbPre.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-$(OBJDIR)/IntBgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/Index8Gray.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntBgr.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/IntBgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/Index8Gray.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntBgr.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-$(OBJDIR)/IntRgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/IntRgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-$(OBJDIR)/IntRgbx.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/IntRgbx.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/IntRgbx.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyInt.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/IntRgbx.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
$(OBJDIR)/MaskBlit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_MaskBlit.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
$(OBJDIR)/MaskFill.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_MaskFill.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-$(OBJDIR)/MouseInfo.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/MouseInfo.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/ObjectList.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/ObjectList.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/OGLBlitLoops.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLBlitLoops.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLBlitLoops.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
+$(OBJDIR)/OGLBlitLoops.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLBlitLoops.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLBlitLoops.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
-$(OBJDIR)/OGLBufImgOps.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLBufImgOps.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
+$(OBJDIR)/OGLBufImgOps.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLBufImgOps.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
-$(OBJDIR)/OGLContext.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
+$(OBJDIR)/OGLContext.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
-$(OBJDIR)/OGLFuncs.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
+$(OBJDIR)/OGLFuncs.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
-$(OBJDIR)/OGLMaskBlit.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLMaskBlit.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
+$(OBJDIR)/OGLMaskBlit.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLMaskBlit.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
-$(OBJDIR)/OGLMaskFill.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLMaskFill.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLMaskFill.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
+$(OBJDIR)/OGLMaskFill.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLMaskFill.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLMaskFill.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
-$(OBJDIR)/OGLPaints.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedPaints.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLPaints.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
+$(OBJDIR)/OGLPaints.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedPaints.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLPaints.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
-$(OBJDIR)/OGLRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLRenderer.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
+$(OBJDIR)/OGLRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLRenderer.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
-$(OBJDIR)/OGLRenderQueue.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLBlitLoops.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLBlitLoops.h ../../../src/share/native/sun/java2d/opengl/OGLBufImgOps.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLMaskBlit.h ../../../src/share/native/sun/java2d/opengl/OGLMaskFill.h ../../../src/share/native/sun/java2d/opengl/OGLPaints.h ../../../src/share/native/sun/java2d/opengl/OGLRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLTextRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
+$(OBJDIR)/OGLRenderQueue.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLBlitLoops.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLBlitLoops.h ../../../src/share/native/sun/java2d/opengl/OGLBufImgOps.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLMaskBlit.h ../../../src/share/native/sun/java2d/opengl/OGLMaskFill.h ../../../src/share/native/sun/java2d/opengl/OGLPaints.h ../../../src/share/native/sun/java2d/opengl/OGLRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLTextRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
-$(OBJDIR)/OGLSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
+$(OBJDIR)/OGLSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
-$(OBJDIR)/OGLTextRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLTextRenderer.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLTextRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
+$(OBJDIR)/OGLTextRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLTextRenderer.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLTextRenderer.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
-$(OBJDIR)/OGLVertexCache.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLPaints.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
+$(OBJDIR)/OGLVertexCache.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLPaints.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/opengl/OGLVertexCache.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h
$(OBJDIR)/ProcessPath.obj:: $(CLASSHDRDIR)/java_awt_geom_PathIterator.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/ProcessPath.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
@@ -314,36 +316,36 @@
$(OBJDIR)/ShapeSpanIterator.obj:: $(CLASSHDRDIR)/java_awt_geom_PathIterator.h $(CLASSHDRDIR)/sun_java2d_pipe_ShapeSpanIterator.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/pipe/PathConsumer2D.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-$(OBJDIR)/ShellFolder2.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/ShellFolder2.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h
$(OBJDIR)/SpanClipRenderer.obj:: $(CLASSHDRDIR)/sun_java2d_pipe_RegionIterator.h $(CLASSHDRDIR)/sun_java2d_pipe_SpanClipRenderer.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h
$(OBJDIR)/SurfaceData.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h
-$(OBJDIR)/ThemeReader.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_ThemeReader.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/ThemeReader.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_ThemeReader.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/ThreeByteBgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/Any3Byte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/ThreeByteBgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/Any3Byte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-$(OBJDIR)/Trace.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h
+$(OBJDIR)/Trace.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h
$(OBJDIR)/TransformHelper.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_loops_TransformHelper.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-$(OBJDIR)/Ushort4444Argb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort4444Argb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/Ushort4444Argb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort4444Argb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-$(OBJDIR)/Ushort555Rgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort555Rgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/Ushort555Rgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort555Rgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-$(OBJDIR)/Ushort555Rgbx.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort555Rgbx.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/Ushort555Rgbx.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort555Rgbx.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-$(OBJDIR)/Ushort565Rgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort4444Argb.h ../../../src/share/native/sun/java2d/loops/Ushort565Rgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/Ushort565Rgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort4444Argb.h ../../../src/share/native/sun/java2d/loops/Ushort565Rgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-$(OBJDIR)/UshortGray.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/UshortGray.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-$(OBJDIR)/UshortIndexed.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyByte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/loops/UshortIndexed.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
+$(OBJDIR)/UshortIndexed.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyByte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/loops/UshortIndexed.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h
-$(OBJDIR)/WGLGraphicsConfig.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_WGLGraphicsConfig.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h ../../../src/windows/native/sun/java2d/opengl/WGLGraphicsConfig.h ../../../src/windows/native/sun/java2d/opengl/WGLSurfaceData.h
+$(OBJDIR)/WGLGraphicsConfig.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_WGLGraphicsConfig.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h ../../../src/windows/native/sun/java2d/opengl/WGLGraphicsConfig.h ../../../src/windows/native/sun/java2d/opengl/WGLSurfaceData.h
-$(OBJDIR)/WGLSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_WGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h ../../../src/windows/native/sun/java2d/opengl/WGLGraphicsConfig.h ../../../src/windows/native/sun/java2d/opengl/WGLSurfaceData.h
+$(OBJDIR)/WGLSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_WGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h ../../../src/windows/native/sun/java2d/opengl/WGLGraphicsConfig.h ../../../src/windows/native/sun/java2d/opengl/WGLSurfaceData.h
-$(OBJDIR)/WindowsFlags.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/WindowsFlags.obj:: ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/stdhdrs.h
-$(OBJDIR)/WPrinterJob.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
+$(OBJDIR)/WPrinterJob.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h
--- a/jdk/make/sun/awt/mapfile-mawt-vers Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/sun/awt/mapfile-mawt-vers Mon Apr 27 12:33:57 2009 -0700
@@ -291,6 +291,7 @@
Java_sun_awt_X11GraphicsConfig_createBackBuffer;
Java_sun_awt_X11GraphicsConfig_destroyBackBuffer;
Java_sun_awt_X11GraphicsConfig_swapBuffers;
+ Java_sun_awt_X11GraphicsConfig_isTranslucencyCapable;
Java_sun_awt_X11GraphicsDevice_isDBESupported;
Java_sun_awt_X11GraphicsDevice_getDisplay;
Java_sun_awt_X11GraphicsDevice_getDoubleBufferVisuals;
--- a/jdk/make/sun/awt/mapfile-vers-linux Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/sun/awt/mapfile-vers-linux Mon Apr 27 12:33:57 2009 -0700
@@ -407,6 +407,7 @@
Java_sun_awt_X11GraphicsConfig_getNumColors;
Java_sun_awt_X11GraphicsConfig_getXResolution;
Java_sun_awt_X11GraphicsConfig_getYResolution;
+ Java_sun_awt_X11GraphicsConfig_isTranslucencyCapable;
Java_sun_awt_X11GraphicsDevice_isDBESupported;
Java_sun_awt_X11GraphicsDevice_getDisplay;
Java_sun_awt_X11GraphicsDevice_getDoubleBufferVisuals;
--- a/jdk/make/sun/net/FILES_java.gmk Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/sun/net/FILES_java.gmk Mon Apr 27 12:33:57 2009 -0700
@@ -39,6 +39,7 @@
sun/net/TransferProtocolClient.java \
sun/net/ConnectionResetException.java \
sun/net/NetProperties.java \
+ sun/net/NetHooks.java \
sun/net/util/IPAddressUtil.java \
sun/net/dns/ResolverConfiguration.java \
sun/net/dns/ResolverConfigurationImpl.java \
@@ -123,3 +124,7 @@
ifeq ($(PLATFORM), windows)
FILES_java += sun/net/www/protocol/http/NTLMAuthSequence.java
endif
+
+ifeq ($(PLATFORM), solaris)
+ FILES_java += sun/net/spi/SdpProvider.java
+endif
--- a/jdk/make/sun/xawt/FILES_c_unix.gmk Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/sun/xawt/FILES_c_unix.gmk Mon Apr 27 12:33:57 2009 -0700
@@ -78,4 +78,5 @@
awt_Plugin.c \
gtk2_interface.c \
swing_GTKEngine.c \
- swing_GTKStyle.c
+ swing_GTKStyle.c \
+ rect.c
--- a/jdk/make/sun/xawt/Makefile Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/sun/xawt/Makefile Mon Apr 27 12:33:57 2009 -0700
@@ -79,6 +79,7 @@
vpath %.c $(SHARE_SRC)/native/sun/java2d/loops
vpath %.c $(SHARE_SRC)/native/sun/java2d/pipe
vpath %.c $(SHARE_SRC)/native/sun/awt/medialib
+vpath %.c $(SHARE_SRC)/native/sun/awt/utility
vpath %.cpp $(SHARE_SRC)/native/sun/image
vpath %.c $(SHARE_SRC)/native/sun/font
vpath %.c $(PLATFORM_SRC)/native/sun/awt/robot_child
@@ -274,6 +275,23 @@
$(ICONS_PATH_PREFIX)/classes/sun/awt/X11/java-icon32.png \
$(ICONS_PATH_PREFIX)/classes/sun/awt/X11/java-icon48.png
+
+ICONPATH=$(PLATFORM_SRC)/classes/sun/awt/X11
+
+ICONS += \
+ $(ICONPATH)/security-icon-bw16.png \
+ $(ICONPATH)/security-icon-interim16.png \
+ $(ICONPATH)/security-icon-yellow16.png \
+ $(ICONPATH)/security-icon-bw24.png \
+ $(ICONPATH)/security-icon-interim24.png \
+ $(ICONPATH)/security-icon-yellow24.png \
+ $(ICONPATH)/security-icon-bw32.png \
+ $(ICONPATH)/security-icon-interim32.png \
+ $(ICONPATH)/security-icon-yellow32.png \
+ $(ICONPATH)/security-icon-bw48.png \
+ $(ICONPATH)/security-icon-interim48.png \
+ $(ICONPATH)/security-icon-yellow48.png
+
TEMPDIR_CLASSES = $(TEMPDIR)/classes
$(TEMPDIR_CLASSES)/sun/awt/X11/ToBin.class: ToBin.java
--- a/jdk/make/sun/xawt/mapfile-vers Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/sun/xawt/mapfile-vers Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
#
-# Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved.
+# Copyright 2002-2009 Sun Microsystems, Inc. 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
@@ -93,6 +93,9 @@
Java_sun_awt_X11_XlibWrapper_XGetWMHints;
Java_sun_awt_X11_XlibWrapper_XShapeQueryExtension;
Java_sun_awt_X11_XlibWrapper_SetRectangularShape;
+ Java_sun_awt_X11_XlibWrapper_SetBitmapShape;
+ Java_sun_awt_X11_XlibWrapper_XConfigureWindow;
+ Java_sun_awt_X11_XlibWrapper_SetZOrder;
Java_sun_awt_X11_XToolkit_initIDs;
Java_sun_awt_X11_XWindow_getNativeColor;
Java_sun_awt_X11_XWindow_getWMInsets;
@@ -217,6 +220,7 @@
Java_sun_awt_X11GraphicsConfig_createBackBuffer;
Java_sun_awt_X11GraphicsConfig_destroyBackBuffer;
Java_sun_awt_X11GraphicsConfig_swapBuffers;
+ Java_sun_awt_X11GraphicsConfig_isTranslucencyCapable;
Java_java_awt_Insets_initIDs;
Java_java_awt_KeyboardFocusManager_initIDs;
Java_java_awt_Font_initIDs;
@@ -289,16 +293,26 @@
Java_sun_awt_X11_XlibWrapper_XGetIconSizes;
Java_sun_awt_X11_XlibWrapper_XKeycodeToKeysym;
Java_sun_awt_X11_XlibWrapper_XKeysymToKeycode;
- Java_sun_awt_X11_XlibWrapper_XQueryKeymap;
+ Java_sun_awt_X11_XlibWrapper_XQueryKeymap;
+ Java_sun_awt_X11_XlibWrapper_XkbGetEffectiveGroup;
+ Java_sun_awt_X11_XlibWrapper_XkbSelectEvents;
+ Java_sun_awt_X11_XlibWrapper_XkbSelectEventDetails;
+ Java_sun_awt_X11_XlibWrapper_XkbKeycodeToKeysym;
+ Java_sun_awt_X11_XlibWrapper_XkbLibraryVersion;
+ Java_sun_awt_X11_XlibWrapper_XkbQueryExtension;
+ Java_sun_awt_X11_XlibWrapper_XkbGetMap;
+ Java_sun_awt_X11_XlibWrapper_XkbGetUpdatedMap;
+ Java_sun_awt_X11_XlibWrapper_XkbFreeKeyboard;
+ Java_sun_awt_X11_XlibWrapper_XkbTranslateKeyCode;
Java_sun_awt_X11_XlibWrapper_XGetModifierMapping;
- Java_sun_awt_X11_XlibWrapper_XFreeModifiermap;
+ Java_sun_awt_X11_XlibWrapper_XFreeModifiermap;
Java_sun_awt_X11_XlibWrapper_XChangeActivePointerGrab;
Java_sun_awt_X11_XlibWrapper_XNextSecondaryLoopEvent;
Java_sun_awt_X11_XlibWrapper_ExitSecondaryLoop;
Java_sun_awt_X11_XlibWrapper_XTextPropertyToStringList;
Java_sun_awt_X11_XlibWrapper_XGrabServer;
Java_sun_awt_X11_XlibWrapper_XUngrabServer;
- Java_sun_awt_X11_XlibWrapper_XPutBackEvent;
+ Java_sun_awt_X11_XlibWrapper_XPutBackEvent;
Java_sun_awt_X11_XlibWrapper_XConvertCase;
Java_sun_awt_X11_XlibWrapper_XSynchronize;
Java_java_awt_FileDialog_initIDs;
--- a/jdk/make/tools/GenerateCharacter/CharacterData00.java.template Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/tools/GenerateCharacter/CharacterData00.java.template Mon Apr 27 12:33:57 2009 -0700
@@ -144,6 +144,55 @@
case 0x1FBC : mapChar = 0x1FB3; break;
case 0x1FCC : mapChar = 0x1FC3; break;
case 0x1FFC : mapChar = 0x1FF3; break;
+
+ case 0x023A : mapChar = 0x2C65; break;
+ case 0x023E : mapChar = 0x2C66; break;
+ case 0x10A0 : mapChar = 0x2D00; break;
+ case 0x10A1 : mapChar = 0x2D01; break;
+ case 0x10A2 : mapChar = 0x2D02; break;
+ case 0x10A3 : mapChar = 0x2D03; break;
+ case 0x10A4 : mapChar = 0x2D04; break;
+ case 0x10A5 : mapChar = 0x2D05; break;
+ case 0x10A6 : mapChar = 0x2D06; break;
+ case 0x10A7 : mapChar = 0x2D07; break;
+ case 0x10A8 : mapChar = 0x2D08; break;
+ case 0x10A9 : mapChar = 0x2D09; break;
+ case 0x10AA : mapChar = 0x2D0A; break;
+ case 0x10AB : mapChar = 0x2D0B; break;
+ case 0x10AC : mapChar = 0x2D0C; break;
+ case 0x10AD : mapChar = 0x2D0D; break;
+ case 0x10AE : mapChar = 0x2D0E; break;
+ case 0x10AF : mapChar = 0x2D0F; break;
+ case 0x10B0 : mapChar = 0x2D10; break;
+ case 0x10B1 : mapChar = 0x2D11; break;
+ case 0x10B2 : mapChar = 0x2D12; break;
+ case 0x10B3 : mapChar = 0x2D13; break;
+ case 0x10B4 : mapChar = 0x2D14; break;
+ case 0x10B5 : mapChar = 0x2D15; break;
+ case 0x10B6 : mapChar = 0x2D16; break;
+ case 0x10B7 : mapChar = 0x2D17; break;
+ case 0x10B8 : mapChar = 0x2D18; break;
+ case 0x10B9 : mapChar = 0x2D19; break;
+ case 0x10BA : mapChar = 0x2D1A; break;
+ case 0x10BB : mapChar = 0x2D1B; break;
+ case 0x10BC : mapChar = 0x2D1C; break;
+ case 0x10BD : mapChar = 0x2D1D; break;
+ case 0x10BE : mapChar = 0x2D1E; break;
+ case 0x10BF : mapChar = 0x2D1F; break;
+ case 0x10C0 : mapChar = 0x2D20; break;
+ case 0x10C1 : mapChar = 0x2D21; break;
+ case 0x10C2 : mapChar = 0x2D22; break;
+ case 0x10C3 : mapChar = 0x2D23; break;
+ case 0x10C4 : mapChar = 0x2D24; break;
+ case 0x10C5 : mapChar = 0x2D25; break;
+ case 0x1E9E : mapChar = 0x00DF; break;
+ case 0x2C62 : mapChar = 0x026B; break;
+ case 0x2C63 : mapChar = 0x1D7D; break;
+ case 0x2C64 : mapChar = 0x027D; break;
+ case 0x2C6D : mapChar = 0x0251; break;
+ case 0x2C6E : mapChar = 0x0271; break;
+ case 0x2C6F : mapChar = 0x0250; break;
+ case 0xA77D : mapChar = 0x1D79; break;
// default mapChar is already set, so no
// need to redo it here.
// default : mapChar = ch;
@@ -196,6 +245,54 @@
case 0x1FB3 : mapChar = 0x1FBC; break;
case 0x1FC3 : mapChar = 0x1FCC; break;
case 0x1FF3 : mapChar = 0x1FFC; break;
+
+ case 0x0250 : mapChar = 0x2C6F; break;
+ case 0x0251 : mapChar = 0x2C6D; break;
+ case 0x026B : mapChar = 0x2C62; break;
+ case 0x0271 : mapChar = 0x2C6E; break;
+ case 0x027D : mapChar = 0x2C64; break;
+ case 0x1D79 : mapChar = 0xA77D; break;
+ case 0x1D7D : mapChar = 0x2C63; break;
+ case 0x2C65 : mapChar = 0x023A; break;
+ case 0x2C66 : mapChar = 0x023E; break;
+ case 0x2D00 : mapChar = 0x10A0; break;
+ case 0x2D01 : mapChar = 0x10A1; break;
+ case 0x2D02 : mapChar = 0x10A2; break;
+ case 0x2D03 : mapChar = 0x10A3; break;
+ case 0x2D04 : mapChar = 0x10A4; break;
+ case 0x2D05 : mapChar = 0x10A5; break;
+ case 0x2D06 : mapChar = 0x10A6; break;
+ case 0x2D07 : mapChar = 0x10A7; break;
+ case 0x2D08 : mapChar = 0x10A8; break;
+ case 0x2D09 : mapChar = 0x10A9; break;
+ case 0x2D0A : mapChar = 0x10AA; break;
+ case 0x2D0B : mapChar = 0x10AB; break;
+ case 0x2D0C : mapChar = 0x10AC; break;
+ case 0x2D0D : mapChar = 0x10AD; break;
+ case 0x2D0E : mapChar = 0x10AE; break;
+ case 0x2D0F : mapChar = 0x10AF; break;
+ case 0x2D10 : mapChar = 0x10B0; break;
+ case 0x2D11 : mapChar = 0x10B1; break;
+ case 0x2D12 : mapChar = 0x10B2; break;
+ case 0x2D13 : mapChar = 0x10B3; break;
+ case 0x2D14 : mapChar = 0x10B4; break;
+ case 0x2D15 : mapChar = 0x10B5; break;
+ case 0x2D16 : mapChar = 0x10B6; break;
+ case 0x2D17 : mapChar = 0x10B7; break;
+ case 0x2D18 : mapChar = 0x10B8; break;
+ case 0x2D19 : mapChar = 0x10B9; break;
+ case 0x2D1A : mapChar = 0x10BA; break;
+ case 0x2D1B : mapChar = 0x10BB; break;
+ case 0x2D1C : mapChar = 0x10BC; break;
+ case 0x2D1D : mapChar = 0x10BD; break;
+ case 0x2D1E : mapChar = 0x10BE; break;
+ case 0x2D1F : mapChar = 0x10BF; break;
+ case 0x2D20 : mapChar = 0x10C0; break;
+ case 0x2D21 : mapChar = 0x10C1; break;
+ case 0x2D22 : mapChar = 0x10C2; break;
+ case 0x2D23 : mapChar = 0x10C3; break;
+ case 0x2D24 : mapChar = 0x10C4; break;
+ case 0x2D25 : mapChar = 0x10C5; break;
// ch must have a 1:M case mapping, but we
// can't handle it here. Return ch.
// since mapChar is already set, no need
@@ -315,6 +412,12 @@
case 0x32BE: retval = 49; break; // CIRCLED NUMBER FORTY NINE
case 0x32BF: retval = 50; break; // CIRCLED NUMBER FIFTY
+ case 0x0D71: retval = 100; break; // MALAYALAM NUMBER ONE HUNDRED
+ case 0x0D72: retval = 1000; break; // MALAYALAM NUMBER ONE THOUSAND
+ case 0x2186: retval = 50; break; // ROMAN NUMERAL FIFTY EARLY FORM
+ case 0x2187: retval = 50000; break; // ROMAN NUMERAL FIFTY THOUSAND
+ case 0x2188: retval = 100000; break; // ROMAN NUMERAL ONE HUNDRED THOUSAND
+
default: retval = -2; break;
}
break;
@@ -383,6 +486,54 @@
case 0x00B5 : mapChar = 0x039C; break;
case 0x017F : mapChar = 0x0053; break;
case 0x1FBE : mapChar = 0x0399; break;
+
+ case 0x0250 : mapChar = 0x2C6F; break;
+ case 0x0251 : mapChar = 0x2C6D; break;
+ case 0x026B : mapChar = 0x2C62; break;
+ case 0x0271 : mapChar = 0x2C6E; break;
+ case 0x027D : mapChar = 0x2C64; break;
+ case 0x1D79 : mapChar = 0xA77D; break;
+ case 0x1D7D : mapChar = 0x2C63; break;
+ case 0x2C65 : mapChar = 0x023A; break;
+ case 0x2C66 : mapChar = 0x023E; break;
+ case 0x2D00 : mapChar = 0x10A0; break;
+ case 0x2D01 : mapChar = 0x10A1; break;
+ case 0x2D02 : mapChar = 0x10A2; break;
+ case 0x2D03 : mapChar = 0x10A3; break;
+ case 0x2D04 : mapChar = 0x10A4; break;
+ case 0x2D05 : mapChar = 0x10A5; break;
+ case 0x2D06 : mapChar = 0x10A6; break;
+ case 0x2D07 : mapChar = 0x10A7; break;
+ case 0x2D08 : mapChar = 0x10A8; break;
+ case 0x2D09 : mapChar = 0x10A9; break;
+ case 0x2D0A : mapChar = 0x10AA; break;
+ case 0x2D0B : mapChar = 0x10AB; break;
+ case 0x2D0C : mapChar = 0x10AC; break;
+ case 0x2D0D : mapChar = 0x10AD; break;
+ case 0x2D0E : mapChar = 0x10AE; break;
+ case 0x2D0F : mapChar = 0x10AF; break;
+ case 0x2D10 : mapChar = 0x10B0; break;
+ case 0x2D11 : mapChar = 0x10B1; break;
+ case 0x2D12 : mapChar = 0x10B2; break;
+ case 0x2D13 : mapChar = 0x10B3; break;
+ case 0x2D14 : mapChar = 0x10B4; break;
+ case 0x2D15 : mapChar = 0x10B5; break;
+ case 0x2D16 : mapChar = 0x10B6; break;
+ case 0x2D17 : mapChar = 0x10B7; break;
+ case 0x2D18 : mapChar = 0x10B8; break;
+ case 0x2D19 : mapChar = 0x10B9; break;
+ case 0x2D1A : mapChar = 0x10BA; break;
+ case 0x2D1B : mapChar = 0x10BB; break;
+ case 0x2D1C : mapChar = 0x10BC; break;
+ case 0x2D1D : mapChar = 0x10BD; break;
+ case 0x2D1E : mapChar = 0x10BE; break;
+ case 0x2D1F : mapChar = 0x10BF; break;
+ case 0x2D20 : mapChar = 0x10C0; break;
+ case 0x2D21 : mapChar = 0x10C1; break;
+ case 0x2D22 : mapChar = 0x10C2; break;
+ case 0x2D23 : mapChar = 0x10C3; break;
+ case 0x2D24 : mapChar = 0x10C4; break;
+ case 0x2D25 : mapChar = 0x10C5; break;
default : mapChar = Character.ERROR; break;
}
}
--- a/jdk/make/tools/GenerateCharacter/CharacterData01.java.template Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/tools/GenerateCharacter/CharacterData01.java.template Mon Apr 27 12:33:57 2009 -0700
@@ -218,6 +218,48 @@
case 0x10132: retval = 80000; break; // AEGEAN NUMBER EIGHTY THOUSAND
case 0x10133: retval = 90000; break; // AEGEAN NUMBER NINETY THOUSAND
case 0x10323: retval = 50; break; // OLD ITALIC NUMERAL FIFTY
+
+ case 0x010144: retval = 50; break; // ACROPHONIC ATTIC FIFTY
+ case 0x010145: retval = 500; break; // ACROPHONIC ATTIC FIVE HUNDRED
+ case 0x010146: retval = 5000; break; // ACROPHONIC ATTIC FIVE THOUSAND
+ case 0x010147: retval = 50000; break; // ACROPHONIC ATTIC FIFTY THOUSAND
+ case 0x01014A: retval = 50; break; // ACROPHONIC ATTIC FIFTY TALENTS
+ case 0x01014B: retval = 100; break; // ACROPHONIC ATTIC ONE HUNDRED TALENTS
+ case 0x01014C: retval = 500; break; // ACROPHONIC ATTIC FIVE HUNDRED TALENTS
+ case 0x01014D: retval = 1000; break; // ACROPHONIC ATTIC ONE THOUSAND TALENTS
+ case 0x01014E: retval = 5000; break; // ACROPHONIC ATTIC FIVE THOUSAND TALENTS
+ case 0x010151: retval = 50; break; // ACROPHONIC ATTIC FIFTY STATERS
+ case 0x010152: retval = 100; break; // ACROPHONIC ATTIC ONE HUNDRED STATERS
+ case 0x010153: retval = 500; break; // ACROPHONIC ATTIC FIVE HUNDRED STATERS
+ case 0x010154: retval = 1000; break; // ACROPHONIC ATTIC ONE THOUSAND STATERS
+ case 0x010155: retval = 10000; break; // ACROPHONIC ATTIC TEN THOUSAND STATERS
+ case 0x010156: retval = 50000; break; // ACROPHONIC ATTIC FIFTY THOUSAND STATERS
+ case 0x010166: retval = 50; break; // ACROPHONIC TROEZENIAN FIFTY
+ case 0x010167: retval = 50; break; // ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM
+ case 0x010168: retval = 50; break; // ACROPHONIC HERMIONIAN FIFTY
+ case 0x010169: retval = 50; break; // ACROPHONIC THESPIAN FIFTY
+ case 0x01016A: retval = 100; break; // ACROPHONIC THESPIAN ONE HUNDRED
+ case 0x01016B: retval = 300; break; // ACROPHONIC THESPIAN THREE HUNDRED
+ case 0x01016C: retval = 500; break; // ACROPHONIC EPIDAUREAN FIVE HUNDRED
+ case 0x01016D: retval = 500; break; // ACROPHONIC TROEZENIAN FIVE HUNDRED
+ case 0x01016E: retval = 500; break; // ACROPHONIC THESPIAN FIVE HUNDRED
+ case 0x01016F: retval = 500; break; // ACROPHONIC CARYSTIAN FIVE HUNDRED
+ case 0x010170: retval = 500; break; // ACROPHONIC NAXIAN FIVE HUNDRED
+ case 0x010171: retval = 1000; break; // ACROPHONIC THESPIAN ONE THOUSAND
+ case 0x010172: retval = 5000; break; // ACROPHONIC THESPIAN FIVE THOUSAND
+ case 0x010174: retval = 50; break; // ACROPHONIC STRATIAN FIFTY MNAS
+ case 0x010341: retval = 90; break; // GOTHIC LETTER NINETY
+ case 0x01034A: retval = 900; break; // GOTHIC LETTER NINE HUNDRED
+ case 0x0103D5: retval = 100; break; // OLD PERSIAN NUMBER HUNDRED
+ case 0x010919: retval = 100; break; // PHOENICIAN NUMBER ONE HUNDRED
+ case 0x010A46: retval = 100; break; // KHAROSHTHI NUMBER ONE HUNDRED
+ case 0x010A47: retval = 1000; break; // KHAROSHTHI NUMBER ONE THOUSAND
+ case 0x01D36C: retval = 40; break; // COUNTING ROD TENS DIGIT FOUR
+ case 0x01D36D: retval = 50; break; // COUNTING ROD TENS DIGIT FIVE
+ case 0x01D36E: retval = 60; break; // COUNTING ROD TENS DIGIT SIX
+ case 0x01D36F: retval = 70; break; // COUNTING ROD TENS DIGIT SEVEN
+ case 0x01D370: retval = 80; break; // COUNTING ROD TENS DIGIT EIGHT
+ case 0x01D371: retval = 90; break; // COUNTING ROD TENS DIGIT NINE
default: retval = -2; break;
}
--- a/jdk/make/tools/UnicodeData/SpecialCasing.txt Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/tools/UnicodeData/SpecialCasing.txt Mon Apr 27 12:33:57 2009 -0700
@@ -1,12 +1,17 @@
-# SpecialCasing-4.0.0.txt
-# Date: 2003-03-14, 20:22:04 GMT [MD]
+# SpecialCasing-5.1.0.txt
+# Date: 2008-03-03, 21:58:10 GMT [MD]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2008 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
#
# Special Casing Properties
#
# This file is a supplement to the UnicodeData file.
# It contains additional information about the casing of Unicode characters.
# (For compatibility, the UnicodeData.txt file only contains case mappings for
-# characters where they are 1-1, and does not have locale-specific mappings.)
+# characters where they are 1-1, and independent of context and language.
# For more information, see the discussion of Case Mappings in the Unicode Standard.
#
# All code points not listed in this file that do not have a simple case mappings
@@ -18,31 +23,31 @@
#
# <code>; <lower> ; <title> ; <upper> ; (<condition_list> ;)? # <comment>
#
-# <code>, <lower>, <title>, and <upper> provide character values in hex. If there is more than
-# one character, they are separated by spaces. Other than as used to separate elements,
-# spaces are to be ignored.
+# <code>, <lower>, <title>, and <upper> provide character values in hex. If there is more
+# than one character, they are separated by spaces. Other than as used to separate
+# elements, spaces are to be ignored.
#
-# The <condition_list> is optional. Where present, it consists of one or more locales or contexts,
-# separated by spaces. In these conditions:
+# The <condition_list> is optional. Where present, it consists of one or more language IDs
+# or contexts, separated by spaces. In these conditions:
# - A condition list overrides the normal behavior if all of the listed conditions are true.
# - The context is always the context of the characters in the original string,
# NOT in the resulting string.
# - Case distinctions in the condition list are not significant.
# - Conditions preceded by "Not_" represent the negation of the condition.
+# The condition list is not represented in the UCD as a formal property.
#
-# A locale is defined as:
-# <locale> := <ISO_639_code> ( "_" <ISO_3166_code> ( "_" <variant> )? )?
-# <ISO_3166_code> := 2-letter ISO country code,
-# <ISO_639_code> := 2-letter ISO language code
+# A language ID is defined by BCP 47, with '-' and '_' treated equivalently.
#
-# A context is one of the following, as defined in the Unicode Standard:
-# Final_Sigma, After_Soft_Dotted, More_Above, Before_Dot, Not_Before_Dot, After_I
+# A context for a character C is defined by Section 3.13 Default Case
+# Operations, of The Unicode Standard, Version 5.0.
+# (This is identical to the context defined by Unicode 4.1.0,
+# as specified in http://www.unicode.org/versions/Unicode4.1.0/)
#
# Parsers of this file must be prepared to deal with future additions to this format:
# * Additional contexts
# * Additional fields
# ================================================================================
-
+# @missing 0000..10FFFF; <slc>; <stc>; <suc>
# ================================================================================
# Unconditional mappings
# ================================================================================
@@ -170,7 +175,7 @@
1FF3; 1FF3; 1FFC; 03A9 0399; # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
1FFC; 1FF3; 1FFC; 03A9 0399; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
-# Some characters with YPOGEGRAMMENI are also have no corresponding titlecases
+# Some characters with YPOGEGRAMMENI also have no corresponding titlecases
1FB2; 1FB2; 1FBA 0345; 1FBA 0399; # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
1FB4; 1FB4; 0386 0345; 0386 0399; # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
@@ -184,7 +189,14 @@
1FF7; 1FF7; 03A9 0342 0345; 03A9 0342 0399; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
# ================================================================================
-# Conditional mappings
+# Conditional Mappings
+# The remainder of this file provides conditional casing data used to produce
+# full case mappings.
+# ================================================================================
+# Language-Insensitive Mappings
+# These are characters whose full case mappings do not depend on language, but do
+# depend on context (which characters come before or after). For more information
+# see the header of this file and the Unicode Standard.
# ================================================================================
# Special case for final form of sigma
@@ -203,7 +215,10 @@
# 03C2; 03C3; 03A3; 03A3; Not_Final_Sigma; # GREEK SMALL LETTER FINAL SIGMA
# ================================================================================
-# Locale-sensitive mappings
+# Language-Sensitive Mappings
+# These are characters whose full case mappings depend on language and perhaps also
+# context (which characters come before or after). For more information
+# see the header of this file and the Unicode Standard.
# ================================================================================
# Lithuanian
@@ -254,3 +269,6 @@
# Note: the following case is already in the UnicodeData file.
# 0131; 0131; 0049; 0049; tr; # LATIN SMALL LETTER DOTLESS I
+
+# EOF
+
--- a/jdk/make/tools/UnicodeData/UnicodeData.txt Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/make/tools/UnicodeData/UnicodeData.txt Mon Apr 27 12:33:57 2009 -0700
@@ -41,11 +41,11 @@
0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;;
0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;;
002A;ASTERISK;Po;0;ON;;;;;N;;;;;
-002B;PLUS SIGN;Sm;0;ET;;;;;N;;;;;
+002B;PLUS SIGN;Sm;0;ES;;;;;N;;;;;
002C;COMMA;Po;0;CS;;;;;N;;;;;
-002D;HYPHEN-MINUS;Pd;0;ET;;;;;N;;;;;
+002D;HYPHEN-MINUS;Pd;0;ES;;;;;N;;;;;
002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;;
-002F;SOLIDUS;Po;0;ES;;;;;N;SLASH;;;;
+002F;SOLIDUS;Po;0;CS;;;;;N;SLASH;;;;
0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;;
0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;;
0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;;
@@ -171,7 +171,7 @@
00AA;FEMININE ORDINAL INDICATOR;Ll;0;L;<super> 0061;;;;N;;;;;
00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;*;;;
00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;;
-00AD;SOFT HYPHEN;Cf;0;ON;;;;;N;;;;;
+00AD;SOFT HYPHEN;Cf;0;BN;;;;;N;;;;;
00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;;
00AF;MACRON;Sk;0;ON;<compat> 0020 0304;;;;N;SPACING MACRON;;;;
00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;;
@@ -382,7 +382,7 @@
017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E;
017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D
017F;LATIN SMALL LETTER LONG S;Ll;0;L;<compat> 0073;;;;N;;;0053;;0053
-0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;;;
+0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;0243;;0243
0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253;
0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183;
0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182
@@ -408,7 +408,7 @@
0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268;
0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199;
0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198
-019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;;;
+019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;023D;;023D
019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;;;
019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F;
019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272;
@@ -565,8 +565,33 @@
0234;LATIN SMALL LETTER L WITH CURL;Ll;0;L;;;;;N;;;;;
0235;LATIN SMALL LETTER N WITH CURL;Ll;0;L;;;;;N;;;;;
0236;LATIN SMALL LETTER T WITH CURL;Ll;0;L;;;;;N;;;;;
-0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;;;
-0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;;;
+0237;LATIN SMALL LETTER DOTLESS J;Ll;0;L;;;;;N;;;;;
+0238;LATIN SMALL LETTER DB DIGRAPH;Ll;0;L;;;;;N;;;;;
+0239;LATIN SMALL LETTER QP DIGRAPH;Ll;0;L;;;;;N;;;;;
+023A;LATIN CAPITAL LETTER A WITH STROKE;Lu;0;L;;;;;N;;;;2C65;
+023B;LATIN CAPITAL LETTER C WITH STROKE;Lu;0;L;;;;;N;;;;023C;
+023C;LATIN SMALL LETTER C WITH STROKE;Ll;0;L;;;;;N;;;023B;;023B
+023D;LATIN CAPITAL LETTER L WITH BAR;Lu;0;L;;;;;N;;;;019A;
+023E;LATIN CAPITAL LETTER T WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;2C66;
+023F;LATIN SMALL LETTER S WITH SWASH TAIL;Ll;0;L;;;;;N;;;;;
+0240;LATIN SMALL LETTER Z WITH SWASH TAIL;Ll;0;L;;;;;N;;;;;
+0241;LATIN CAPITAL LETTER GLOTTAL STOP;Lu;0;L;;;;;N;;;;0242;
+0242;LATIN SMALL LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;0241;;0241
+0243;LATIN CAPITAL LETTER B WITH STROKE;Lu;0;L;;;;;N;;;;0180;
+0244;LATIN CAPITAL LETTER U BAR;Lu;0;L;;;;;N;;;;0289;
+0245;LATIN CAPITAL LETTER TURNED V;Lu;0;L;;;;;N;;;;028C;
+0246;LATIN CAPITAL LETTER E WITH STROKE;Lu;0;L;;;;;N;;;;0247;
+0247;LATIN SMALL LETTER E WITH STROKE;Ll;0;L;;;;;N;;;0246;;0246
+0248;LATIN CAPITAL LETTER J WITH STROKE;Lu;0;L;;;;;N;;;;0249;
+0249;LATIN SMALL LETTER J WITH STROKE;Ll;0;L;;;;;N;;;0248;;0248
+024A;LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL;Lu;0;L;;;;;N;;;;024B;
+024B;LATIN SMALL LETTER Q WITH HOOK TAIL;Ll;0;L;;;;;N;;;024A;;024A
+024C;LATIN CAPITAL LETTER R WITH STROKE;Lu;0;L;;;;;N;;;;024D;
+024D;LATIN SMALL LETTER R WITH STROKE;Ll;0;L;;;;;N;;;024C;;024C
+024E;LATIN CAPITAL LETTER Y WITH STROKE;Lu;0;L;;;;;N;;;;024F;
+024F;LATIN SMALL LETTER Y WITH STROKE;Ll;0;L;;;;;N;;;024E;;024E
+0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;2C6F;;2C6F
+0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;2C6D;;2C6D
0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;;;
0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181
0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186
@@ -592,13 +617,13 @@
0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197
0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196
026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;;;
-026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;2C62;;2C62
026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;;;
026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;;
026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;;
026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C
0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;;
-0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;;;
+0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;2C6E;;2C6E
0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D
0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;;
0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;;
@@ -610,7 +635,7 @@
027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;;
027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;;
027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;;
-027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;;;
+027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;2C64;;2C64
027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;;
027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;;
0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;*;01A6;;01A6
@@ -622,10 +647,10 @@
0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;;
0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;;;
0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE
-0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;;;
+0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;0244;;0244
028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1
028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2
-028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;;;
+028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;0245;;0245
028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;;
028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;;
028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;;
@@ -633,7 +658,7 @@
0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;;
0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7
0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;;
-0294;LATIN LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;;;
+0294;LATIN LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;;
0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;;
0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;;
0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;;
@@ -659,7 +684,7 @@
02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;;
02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;;
02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;;
-02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK ;Ll;0;L;;;;;N;;;;;
+02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK;Ll;0;L;;;;;N;;;;;
02AF;LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL;Ll;0;L;;;;;N;;;;;
02B0;MODIFIER LETTER SMALL H;Lm;0;L;<super> 0068;;;;N;;;;;
02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L;<super> 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;;
@@ -721,7 +746,7 @@
02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;;
02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;;
02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;;
-02EC;MODIFIER LETTER VOICING;Sk;0;ON;;;;;N;;;;;
+02EC;MODIFIER LETTER VOICING;Lm;0;ON;;;;;N;;;;;
02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;;
02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;;
02EF;MODIFIER LETTER LOW DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;;
@@ -829,6 +854,11 @@
0355;COMBINING RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
0356;COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
0357;COMBINING RIGHT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;;
+0358;COMBINING DOT ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;;
+0359;COMBINING ASTERISK BELOW;Mn;220;NSM;;;;;N;;;;;
+035A;COMBINING DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;;
+035B;COMBINING ZIGZAG ABOVE;Mn;230;NSM;;;;;N;;;;;
+035C;COMBINING DOUBLE BREVE BELOW;Mn;233;NSM;;;;;N;;;;;
035D;COMBINING DOUBLE BREVE;Mn;234;NSM;;;;;N;;;;;
035E;COMBINING DOUBLE MACRON;Mn;234;NSM;;;;;N;;;;;
035F;COMBINING DOUBLE MACRON BELOW;Mn;233;NSM;;;;;N;;;;;
@@ -848,9 +878,18 @@
036D;COMBINING LATIN SMALL LETTER T;Mn;230;NSM;;;;;N;;;;;
036E;COMBINING LATIN SMALL LETTER V;Mn;230;NSM;;;;;N;;;;;
036F;COMBINING LATIN SMALL LETTER X;Mn;230;NSM;;;;;N;;;;;
-0374;GREEK NUMERAL SIGN;Sk;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;Dexia keraia;;;
+0370;GREEK CAPITAL LETTER HETA;Lu;0;L;;;;;N;;;;0371;
+0371;GREEK SMALL LETTER HETA;Ll;0;L;;;;;N;;;0370;;0370
+0372;GREEK CAPITAL LETTER ARCHAIC SAMPI;Lu;0;L;;;;;N;;;;0373;
+0373;GREEK SMALL LETTER ARCHAIC SAMPI;Ll;0;L;;;;;N;;;0372;;0372
+0374;GREEK NUMERAL SIGN;Lm;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;Dexia keraia;;;
0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;Aristeri keraia;;;
+0376;GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA;Lu;0;L;;;;;N;;;;0377;
+0377;GREEK SMALL LETTER PAMPHYLIAN DIGAMMA;Ll;0;L;;;;;N;;;0376;;0376
037A;GREEK YPOGEGRAMMENI;Lm;0;L;<compat> 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;;
+037B;GREEK SMALL REVERSED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FD;;03FD
+037C;GREEK SMALL DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FE;;03FE
+037D;GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FF;;03FF
037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;Erotimatiko;;;
0384;GREEK TONOS;Sk;0;ON;<compat> 0020 0301;;;;N;GREEK SPACING TONOS;;;;
0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;;
@@ -924,6 +963,7 @@
03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C
03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E
03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F
+03CF;GREEK CAPITAL KAI SYMBOL;Lu;0;L;;;;;N;;;;03D7;
03D0;GREEK BETA SYMBOL;Ll;0;L;<compat> 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392
03D1;GREEK THETA SYMBOL;Ll;0;L;<compat> 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398
03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L;<compat> 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;;
@@ -931,7 +971,7 @@
03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;;
03D5;GREEK PHI SYMBOL;Ll;0;L;<compat> 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6
03D6;GREEK PI SYMBOL;Ll;0;L;<compat> 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0
-03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;;;
+03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;03CF;;03CF
03D8;GREEK LETTER ARCHAIC KOPPA;Lu;0;L;;;;;N;;*;;03D9;
03D9;GREEK SMALL LETTER ARCHAIC KOPPA;Ll;0;L;;;;;N;;*;03D8;;03D8
03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB;
@@ -968,6 +1008,10 @@
03F9;GREEK CAPITAL LUNATE SIGMA SYMBOL;Lu;0;L;<compat> 03A3;;;;N;;;;03F2;
03FA;GREEK CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;03FB;
03FB;GREEK SMALL LETTER SAN;Ll;0;L;;;;;N;;;03FA;;03FA
+03FC;GREEK RHO WITH STROKE SYMBOL;Ll;0;L;;;;;N;;;;;
+03FD;GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037B;
+03FE;GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037C;
+03FF;GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037D;
0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450;
0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451;
0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;Serbocroatian;;0452;
@@ -1103,6 +1147,7 @@
0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;;
0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;;
0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;;
+0487;COMBINING CYRILLIC POKRYTIE;Mn;230;NSM;;;;;N;;;;;
0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;;
0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
048A;CYRILLIC CAPITAL LETTER SHORT I WITH TAIL;Lu;0;L;;;;;N;;;;048B;
@@ -1159,7 +1204,7 @@
04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC
04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF;
04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE
-04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;;
+04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;04CF;
04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2;
04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1
04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4;
@@ -1174,6 +1219,7 @@
04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB
04CD;CYRILLIC CAPITAL LETTER EM WITH TAIL;Lu;0;L;;;;;N;;;;04CE;
04CE;CYRILLIC SMALL LETTER EM WITH TAIL;Ll;0;L;;;;;N;;;04CD;;04CD
+04CF;CYRILLIC SMALL LETTER PALOCHKA;Ll;0;L;;;;;N;;;04C0;;04C0
04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1;
04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0
04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3;
@@ -1212,8 +1258,16 @@
04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2
04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5;
04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4
+04F6;CYRILLIC CAPITAL LETTER GHE WITH DESCENDER;Lu;0;L;;;;;N;;;;04F7;
+04F7;CYRILLIC SMALL LETTER GHE WITH DESCENDER;Ll;0;L;;;;;N;;;04F6;;04F6
04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9;
04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8
+04FA;CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK;Lu;0;L;;;;;N;;;;04FB;
+04FB;CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK;Ll;0;L;;;;;N;;;04FA;;04FA
+04FC;CYRILLIC CAPITAL LETTER HA WITH HOOK;Lu;0;L;;;;;N;;;;04FD;
+04FD;CYRILLIC SMALL LETTER HA WITH HOOK;Ll;0;L;;;;;N;;;04FC;;04FC
+04FE;CYRILLIC CAPITAL LETTER HA WITH STROKE;Lu;0;L;;;;;N;;;;04FF;
+04FF;CYRILLIC SMALL LETTER HA WITH STROKE;Ll;0;L;;;;;N;;;04FE;;04FE
0500;CYRILLIC CAPITAL LETTER KOMI DE;Lu;0;L;;;;;N;;;;0501;
0501;CYRILLIC SMALL LETTER KOMI DE;Ll;0;L;;;;;N;;;0500;;0500
0502;CYRILLIC CAPITAL LETTER KOMI DJE;Lu;0;L;;;;;N;;;;0503;
@@ -1230,6 +1284,26 @@
050D;CYRILLIC SMALL LETTER KOMI SJE;Ll;0;L;;;;;N;;;050C;;050C
050E;CYRILLIC CAPITAL LETTER KOMI TJE;Lu;0;L;;;;;N;;;;050F;
050F;CYRILLIC SMALL LETTER KOMI TJE;Ll;0;L;;;;;N;;;050E;;050E
+0510;CYRILLIC CAPITAL LETTER REVERSED ZE;Lu;0;L;;;;;N;;;;0511;
+0511;CYRILLIC SMALL LETTER REVERSED ZE;Ll;0;L;;;;;N;;;0510;;0510
+0512;CYRILLIC CAPITAL LETTER EL WITH HOOK;Lu;0;L;;;;;N;;;;0513;
+0513;CYRILLIC SMALL LETTER EL WITH HOOK;Ll;0;L;;;;;N;;;0512;;0512
+0514;CYRILLIC CAPITAL LETTER LHA;Lu;0;L;;;;;N;;;;0515;
+0515;CYRILLIC SMALL LETTER LHA;Ll;0;L;;;;;N;;;0514;;0514
+0516;CYRILLIC CAPITAL LETTER RHA;Lu;0;L;;;;;N;;;;0517;
+0517;CYRILLIC SMALL LETTER RHA;Ll;0;L;;;;;N;;;0516;;0516
+0518;CYRILLIC CAPITAL LETTER YAE;Lu;0;L;;;;;N;;;;0519;
+0519;CYRILLIC SMALL LETTER YAE;Ll;0;L;;;;;N;;;0518;;0518
+051A;CYRILLIC CAPITAL LETTER QA;Lu;0;L;;;;;N;;;;051B;
+051B;CYRILLIC SMALL LETTER QA;Ll;0;L;;;;;N;;;051A;;051A
+051C;CYRILLIC CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;051D;
+051D;CYRILLIC SMALL LETTER WE;Ll;0;L;;;;;N;;;051C;;051C
+051E;CYRILLIC CAPITAL LETTER ALEUT KA;Lu;0;L;;;;;N;;;;051F;
+051F;CYRILLIC SMALL LETTER ALEUT KA;Ll;0;L;;;;;N;;;051E;;051E
+0520;CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0521;
+0521;CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0520;;0520
+0522;CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0523;
+0523;CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0522;;0522
0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561;
0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562;
0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563;
@@ -1333,6 +1407,7 @@
059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;;
05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;;
05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;;
+05A2;HEBREW ACCENT ATNAH HAFUKH;Mn;220;NSM;;;;;N;;;;;
05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;;
05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;;
05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;*;;;
@@ -1356,16 +1431,20 @@
05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;;
05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;;
05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;;
+05BA;HEBREW POINT HOLAM HASER FOR VAV;Mn;19;NSM;;;;;N;;;;;
05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;;
05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;or shuruq;;;
05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;*;;;
-05BE;HEBREW PUNCTUATION MAQAF;Po;0;R;;;;;N;;;;;
+05BE;HEBREW PUNCTUATION MAQAF;Pd;0;R;;;;;N;;;;;
05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;;
05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;*;;;
05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;;
05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;;
05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;*;;;
05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;;
+05C5;HEBREW MARK LOWER DOT;Mn;220;NSM;;;;;N;;;;;
+05C6;HEBREW PUNCTUATION NUN HAFUKHA;Po;0;R;;;;;N;;;;;
+05C7;HEBREW POINT QAMATS QATAN;Mn;18;NSM;;;;;N;;;;;
05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;;
05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;;
05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;;
@@ -1398,10 +1477,16 @@
05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;;
05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;;
05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;;
-0600;ARABIC NUMBER SIGN;Cf;0;AL;;;;;N;;;;;
-0601;ARABIC SIGN SANAH;Cf;0;AL;;;;;N;;;;;
-0602;ARABIC FOOTNOTE MARKER;Cf;0;AL;;;;;N;;;;;
-0603;ARABIC SIGN SAFHA;Cf;0;AL;;;;;N;;;;;
+0600;ARABIC NUMBER SIGN;Cf;0;AN;;;;;N;;;;;
+0601;ARABIC SIGN SANAH;Cf;0;AN;;;;;N;;;;;
+0602;ARABIC FOOTNOTE MARKER;Cf;0;AN;;;;;N;;;;;
+0603;ARABIC SIGN SAFHA;Cf;0;AN;;;;;N;;;;;
+0606;ARABIC-INDIC CUBE ROOT;Sm;0;ON;;;;;N;;;;;
+0607;ARABIC-INDIC FOURTH ROOT;Sm;0;ON;;;;;N;;;;;
+0608;ARABIC RAY;Sm;0;AL;;;;;N;;;;;
+0609;ARABIC-INDIC PER MILLE SIGN;Po;0;ET;;;;;N;;;;;
+060A;ARABIC-INDIC PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;;
+060B;AFGHANI SIGN;Sc;0;AL;;;;;N;;;;;
060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;;
060D;ARABIC DATE SEPARATOR;Po;0;AL;;;;;N;;;;;
060E;ARABIC POETIC VERSE SIGN;So;0;ON;;;;;N;;;;;
@@ -1411,8 +1496,14 @@
0612;ARABIC SIGN RAHMATULLAH ALAYHE;Mn;230;NSM;;;;;N;;;;;
0613;ARABIC SIGN RADI ALLAHOU ANHU;Mn;230;NSM;;;;;N;;;;;
0614;ARABIC SIGN TAKHALLUS;Mn;230;NSM;;;;;N;;;;;
-0615;ARABIC SMALL HIGH TAH ;Mn;230;NSM;;;;;N;;;;;
+0615;ARABIC SMALL HIGH TAH;Mn;230;NSM;;;;;N;;;;;
+0616;ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH;Mn;230;NSM;;;;;N;;;;;
+0617;ARABIC SMALL HIGH ZAIN;Mn;230;NSM;;;;;N;;;;;
+0618;ARABIC SMALL FATHA;Mn;30;NSM;;;;;N;;;;;
+0619;ARABIC SMALL DAMMA;Mn;31;NSM;;;;;N;;;;;
+061A;ARABIC SMALL KASRA;Mn;32;NSM;;;;;N;;;;;
061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;;
+061E;ARABIC TRIPLE DOT PUNCTUATION MARK;Po;0;AL;;;;;N;;;;;
061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;;
0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;;
0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;;
@@ -1440,6 +1531,11 @@
0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;;
0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;;
063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;;
+063B;ARABIC LETTER KEHEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+063C;ARABIC LETTER KEHEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+063D;ARABIC LETTER FARSI YEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+063E;ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+063F;ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;;
0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;;
0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;;
@@ -1465,6 +1561,12 @@
0656;ARABIC SUBSCRIPT ALEF;Mn;220;NSM;;;;;N;;;;;
0657;ARABIC INVERTED DAMMA;Mn;230;NSM;;;;;N;;;;;
0658;ARABIC MARK NOON GHUNNA;Mn;230;NSM;;;;;N;;;;;
+0659;ARABIC ZWARAKAY;Mn;230;NSM;;;;;N;;;;;
+065A;ARABIC VOWEL SIGN SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;;
+065B;ARABIC VOWEL SIGN INVERTED SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;;
+065C;ARABIC VOWEL SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;;
+065D;ARABIC REVERSED DAMMA;Mn;230;NSM;;;;;N;;;;;
+065E;ARABIC FATHA WITH TWO DOTS;Mn;230;NSM;;;;;N;;;;;
0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;;
0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;;
0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;;
@@ -1590,7 +1692,7 @@
06DA;ARABIC SMALL HIGH JEEM;Mn;230;NSM;;;;;N;;;;;
06DB;ARABIC SMALL HIGH THREE DOTS;Mn;230;NSM;;;;;N;;;;;
06DC;ARABIC SMALL HIGH SEEN;Mn;230;NSM;;;;;N;;;;;
-06DD;ARABIC END OF AYAH;Cf;0;AL;;;;;N;;;;;
+06DD;ARABIC END OF AYAH;Cf;0;AN;;;;;N;;;;;
06DE;ARABIC START OF RUB EL HIZB;Me;0;NSM;;;;;N;;;;;
06DF;ARABIC SMALL HIGH ROUNDED ZERO;Mn;230;NSM;;;;;N;;;;;
06E0;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO;Mn;230;NSM;;;;;N;;;;;
@@ -1702,6 +1804,54 @@
074D;SYRIAC LETTER SOGDIAN ZHAIN;Lo;0;AL;;;;;N;;;;;
074E;SYRIAC LETTER SOGDIAN KHAPH;Lo;0;AL;;;;;N;;;;;
074F;SYRIAC LETTER SOGDIAN FE;Lo;0;AL;;;;;N;;;;;
+0750;ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW;Lo;0;AL;;;;;N;;;;;
+0751;ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0752;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0753;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0754;ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+0755;ARABIC LETTER BEH WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;;
+0756;ARABIC LETTER BEH WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+0757;ARABIC LETTER HAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0758;ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0759;ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;;
+075A;ARABIC LETTER DAL WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;;
+075B;ARABIC LETTER REH WITH STROKE;Lo;0;AL;;;;;N;;;;;
+075C;ARABIC LETTER SEEN WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+075D;ARABIC LETTER AIN WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+075E;ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE;Lo;0;AL;;;;;N;;;;;
+075F;ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;;
+0760;ARABIC LETTER FEH WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+0761;ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0762;ARABIC LETTER KEHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+0763;ARABIC LETTER KEHEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0764;ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0765;ARABIC LETTER MEEM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+0766;ARABIC LETTER MEEM WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+0767;ARABIC LETTER NOON WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+0768;ARABIC LETTER NOON WITH SMALL TAH;Lo;0;AL;;;;;N;;;;;
+0769;ARABIC LETTER NOON WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+076A;ARABIC LETTER LAM WITH BAR;Lo;0;AL;;;;;N;;;;;
+076B;ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;;
+076C;ARABIC LETTER REH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;;
+076D;ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;;
+076E;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW;Lo;0;AL;;;;;N;;;;;
+076F;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;;
+0770;ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;;
+0771;ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;;
+0772;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE;Lo;0;AL;;;;;N;;;;;
+0773;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;;
+0774;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;;
+0775;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;;
+0776;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;;
+0777;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;;
+0778;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;;
+0779;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;;
+077A;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;;
+077B;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;;
+077C;ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;;
+077D;ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE;Lo;0;AL;;;;;N;;;;;
+077E;ARABIC LETTER SEEN WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+077F;ARABIC LETTER KAF WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;;
0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;;
0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;;
@@ -1752,6 +1902,65 @@
07AF;THAANA OABOAFILI;Mn;0;NSM;;;;;N;;;;;
07B0;THAANA SUKUN;Mn;0;NSM;;;;;N;;;;;
07B1;THAANA LETTER NAA;Lo;0;AL;;;;;N;;;;;
+07C0;NKO DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;;
+07C1;NKO DIGIT ONE;Nd;0;R;;1;1;1;N;;;;;
+07C2;NKO DIGIT TWO;Nd;0;R;;2;2;2;N;;;;;
+07C3;NKO DIGIT THREE;Nd;0;R;;3;3;3;N;;;;;
+07C4;NKO DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;;
+07C5;NKO DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;;
+07C6;NKO DIGIT SIX;Nd;0;R;;6;6;6;N;;;;;
+07C7;NKO DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;;
+07C8;NKO DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;;
+07C9;NKO DIGIT NINE;Nd;0;R;;9;9;9;N;;;;;
+07CA;NKO LETTER A;Lo;0;R;;;;;N;;;;;
+07CB;NKO LETTER EE;Lo;0;R;;;;;N;;;;;
+07CC;NKO LETTER I;Lo;0;R;;;;;N;;;;;
+07CD;NKO LETTER E;Lo;0;R;;;;;N;;;;;
+07CE;NKO LETTER U;Lo;0;R;;;;;N;;;;;
+07CF;NKO LETTER OO;Lo;0;R;;;;;N;;;;;
+07D0;NKO LETTER O;Lo;0;R;;;;;N;;;;;
+07D1;NKO LETTER DAGBASINNA;Lo;0;R;;;;;N;;;;;
+07D2;NKO LETTER N;Lo;0;R;;;;;N;;;;;
+07D3;NKO LETTER BA;Lo;0;R;;;;;N;;;;;
+07D4;NKO LETTER PA;Lo;0;R;;;;;N;;;;;
+07D5;NKO LETTER TA;Lo;0;R;;;;;N;;;;;
+07D6;NKO LETTER JA;Lo;0;R;;;;;N;;;;;
+07D7;NKO LETTER CHA;Lo;0;R;;;;;N;;;;;
+07D8;NKO LETTER DA;Lo;0;R;;;;;N;;;;;
+07D9;NKO LETTER RA;Lo;0;R;;;;;N;;;;;
+07DA;NKO LETTER RRA;Lo;0;R;;;;;N;;;;;
+07DB;NKO LETTER SA;Lo;0;R;;;;;N;;;;;
+07DC;NKO LETTER GBA;Lo;0;R;;;;;N;;;;;
+07DD;NKO LETTER FA;Lo;0;R;;;;;N;;;;;
+07DE;NKO LETTER KA;Lo;0;R;;;;;N;;;;;
+07DF;NKO LETTER LA;Lo;0;R;;;;;N;;;;;
+07E0;NKO LETTER NA WOLOSO;Lo;0;R;;;;;N;;;;;
+07E1;NKO LETTER MA;Lo;0;R;;;;;N;;;;;
+07E2;NKO LETTER NYA;Lo;0;R;;;;;N;;;;;
+07E3;NKO LETTER NA;Lo;0;R;;;;;N;;;;;
+07E4;NKO LETTER HA;Lo;0;R;;;;;N;;;;;
+07E5;NKO LETTER WA;Lo;0;R;;;;;N;;;;;
+07E6;NKO LETTER YA;Lo;0;R;;;;;N;;;;;
+07E7;NKO LETTER NYA WOLOSO;Lo;0;R;;;;;N;;;;;
+07E8;NKO LETTER JONA JA;Lo;0;R;;;;;N;;;;;
+07E9;NKO LETTER JONA CHA;Lo;0;R;;;;;N;;;;;
+07EA;NKO LETTER JONA RA;Lo;0;R;;;;;N;;;;;
+07EB;NKO COMBINING SHORT HIGH TONE;Mn;230;NSM;;;;;N;;;;;
+07EC;NKO COMBINING SHORT LOW TONE;Mn;230;NSM;;;;;N;;;;;
+07ED;NKO COMBINING SHORT RISING TONE;Mn;230;NSM;;;;;N;;;;;
+07EE;NKO COMBINING LONG DESCENDING TONE;Mn;230;NSM;;;;;N;;;;;
+07EF;NKO COMBINING LONG HIGH TONE;Mn;230;NSM;;;;;N;;;;;
+07F0;NKO COMBINING LONG LOW TONE;Mn;230;NSM;;;;;N;;;;;
+07F1;NKO COMBINING LONG RISING TONE;Mn;230;NSM;;;;;N;;;;;
+07F2;NKO COMBINING NASALIZATION MARK;Mn;220;NSM;;;;;N;;;;;
+07F3;NKO COMBINING DOUBLE DOT ABOVE;Mn;230;NSM;;;;;N;;;;;
+07F4;NKO HIGH TONE APOSTROPHE;Lm;0;R;;;;;N;;;;;
+07F5;NKO LOW TONE APOSTROPHE;Lm;0;R;;;;;N;;;;;
+07F6;NKO SYMBOL OO DENNEN;So;0;ON;;;;;N;;;;;
+07F7;NKO SYMBOL GBAKURUNEN;Po;0;ON;;;;;N;;;;;
+07F8;NKO COMMA;Po;0;ON;;;;;N;;;;;
+07F9;NKO EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+07FA;NKO LAJANYALAN;Lm;0;R;;;;;N;;;;;
0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
@@ -1857,6 +2066,13 @@
096E;DEVANAGARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
096F;DEVANAGARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
0970;DEVANAGARI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
+0971;DEVANAGARI SIGN HIGH SPACING DOT;Lm;0;L;;;;;N;;;;;
+0972;DEVANAGARI LETTER CANDRA A;Lo;0;L;;;;;N;;;;;
+097B;DEVANAGARI LETTER GGA;Lo;0;L;;;;;N;;;;;
+097C;DEVANAGARI LETTER JJA;Lo;0;L;;;;;N;;;;;
+097D;DEVANAGARI LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;;
+097E;DEVANAGARI LETTER DDDA;Lo;0;L;;;;;N;;;;;
+097F;DEVANAGARI LETTER BBA;Lo;0;L;;;;;N;;;;;
0981;BENGALI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
0982;BENGALI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
0983;BENGALI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
@@ -1918,6 +2134,7 @@
09CB;BENGALI VOWEL SIGN O;Mc;0;L;09C7 09BE;;;;N;;;;;
09CC;BENGALI VOWEL SIGN AU;Mc;0;L;09C7 09D7;;;;N;;;;;
09CD;BENGALI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+09CE;BENGALI LETTER KHANDA TA;Lo;0;L;;;;;N;;;;;
09D7;BENGALI AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
09DC;BENGALI LETTER RRA;Lo;0;L;09A1 09BC;;;;N;;;;;
09DD;BENGALI LETTER RHA;Lo;0;L;09A2 09BC;;;;N;;;;;
@@ -2004,6 +2221,7 @@
0A4B;GURMUKHI VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;;
0A4C;GURMUKHI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
0A4D;GURMUKHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0A51;GURMUKHI SIGN UDAAT;Mn;0;NSM;;;;;N;;;;;
0A59;GURMUKHI LETTER KHHA;Lo;0;L;0A16 0A3C;;;;N;;;;;
0A5A;GURMUKHI LETTER GHHA;Lo;0;L;0A17 0A3C;;;;N;;;;;
0A5B;GURMUKHI LETTER ZA;Lo;0;L;0A1C 0A3C;;;;N;;;;;
@@ -2024,6 +2242,7 @@
0A72;GURMUKHI IRI;Lo;0;L;;;;;N;;;;;
0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;;
0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;;
+0A75;GURMUKHI SIGN YAKASH;Mn;0;NSM;;;;;N;;;;;
0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
@@ -2164,6 +2383,7 @@
0B41;ORIYA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
0B42;ORIYA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
0B43;ORIYA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0B44;ORIYA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
0B47;ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
0B48;ORIYA VOWEL SIGN AI;Mc;0;L;0B47 0B56;;;;N;;;;;
0B4B;ORIYA VOWEL SIGN O;Mc;0;L;0B47 0B3E;;;;N;;;;;
@@ -2176,6 +2396,8 @@
0B5F;ORIYA LETTER YYA;Lo;0;L;;;;;N;;;;;
0B60;ORIYA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
0B61;ORIYA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0B62;ORIYA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0B63;ORIYA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
0B66;ORIYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
0B67;ORIYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
0B68;ORIYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
@@ -2221,6 +2443,7 @@
0BB3;TAMIL LETTER LLA;Lo;0;L;;;;;N;;;;;
0BB4;TAMIL LETTER LLLA;Lo;0;L;;;;;N;;;;;
0BB5;TAMIL LETTER VA;Lo;0;L;;;;;N;;;;;
+0BB6;TAMIL LETTER SHA;Lo;0;L;;;;;N;;;;;
0BB7;TAMIL LETTER SSA;Lo;0;L;;;;;N;;;;;
0BB8;TAMIL LETTER SA;Lo;0;L;;;;;N;;;;;
0BB9;TAMIL LETTER HA;Lo;0;L;;;;;N;;;;;
@@ -2236,7 +2459,9 @@
0BCB;TAMIL VOWEL SIGN OO;Mc;0;L;0BC7 0BBE;;;;N;;;;;
0BCC;TAMIL VOWEL SIGN AU;Mc;0;L;0BC6 0BD7;;;;N;;;;;
0BCD;TAMIL SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0BD0;TAMIL OM;Lo;0;L;;;;;N;;;;;
0BD7;TAMIL AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0BE6;TAMIL DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
0BE7;TAMIL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
0BE8;TAMIL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
0BE9;TAMIL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
@@ -2309,6 +2534,7 @@
0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;;
0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;;
0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;;
+0C3D;TELUGU SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;;
0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
0C40;TELUGU VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
@@ -2325,8 +2551,12 @@
0C4D;TELUGU SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
0C55;TELUGU LENGTH MARK;Mn;84;NSM;;;;;N;;;;;
0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;;
+0C58;TELUGU LETTER TSA;Lo;0;L;;;;;N;;;;;
+0C59;TELUGU LETTER DZA;Lo;0;L;;;;;N;;;;;
0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0C62;TELUGU VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0C63;TELUGU VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
0C66;TELUGU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
0C67;TELUGU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
0C68;TELUGU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
@@ -2337,6 +2567,14 @@
0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0C78;TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR;No;0;ON;;;;0;N;;;;;
+0C79;TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR;No;0;ON;;;;1;N;;;;;
+0C7A;TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR;No;0;ON;;;;2;N;;;;;
+0C7B;TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR;No;0;ON;;;;3;N;;;;;
+0C7C;TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR;No;0;ON;;;;1;N;;;;;
+0C7D;TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR;No;0;ON;;;;2;N;;;;;
+0C7E;TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR;No;0;ON;;;;3;N;;;;;
+0C7F;TELUGU SIGN TUUMU;So;0;L;;;;;N;;;;;
0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;;
@@ -2409,6 +2647,8 @@
0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;;
0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0CE2;KANNADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0CE3;KANNADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
@@ -2419,6 +2659,8 @@
0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0CF1;KANNADA SIGN JIHVAMULIYA;So;0;ON;;;;;N;;;;;
+0CF2;KANNADA SIGN UPADHMANIYA;So;0;ON;;;;;N;;;;;
0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;;
0D05;MALAYALAM LETTER A;Lo;0;L;;;;;N;;;;;
@@ -2471,12 +2713,14 @@
0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;;
0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;;
0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;;
+0D3D;MALAYALAM SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0D44;MALAYALAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
@@ -2487,6 +2731,8 @@
0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0D62;MALAYALAM VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0D63;MALAYALAM VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
@@ -2497,6 +2743,19 @@
0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0D70;MALAYALAM NUMBER TEN;No;0;L;;;;10;N;;;;;
+0D71;MALAYALAM NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;;
+0D72;MALAYALAM NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;;
+0D73;MALAYALAM FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;;
+0D74;MALAYALAM FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;;
+0D75;MALAYALAM FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;;
+0D79;MALAYALAM DATE MARK;So;0;L;;;;;N;;;;;
+0D7A;MALAYALAM LETTER CHILLU NN;Lo;0;L;;;;;N;;;;;
+0D7B;MALAYALAM LETTER CHILLU N;Lo;0;L;;;;;N;;;;;
+0D7C;MALAYALAM LETTER CHILLU RR;Lo;0;L;;;;;N;;;;;
+0D7D;MALAYALAM LETTER CHILLU L;Lo;0;L;;;;;N;;;;;
+0D7E;MALAYALAM LETTER CHILLU LL;Lo;0;L;;;;;N;;;;;
+0D7F;MALAYALAM LETTER CHILLU K;Lo;0;L;;;;;N;;;;;
0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;;
0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;;
0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;;
@@ -2787,10 +3046,10 @@
0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;nge zung gor ta;;;
0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;che go;;;
0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;tsa tru;;;
-0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;N;;gug ta yun;;;
-0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;N;;gug ta ye;;;
-0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;N;TIBETAN LEFT BRACE;ang kang yun;;;
-0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;N;TIBETAN RIGHT BRACE;ang kang ye;;;
+0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;Y;;gug ta yun;;;
+0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;Y;;gug ta ye;;;
+0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;Y;TIBETAN LEFT BRACE;ang kang yun;;;
+0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;Y;TIBETAN RIGHT BRACE;ang kang ye;;;
0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;yar tse;;;
0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;mar tse;;;
0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;;
@@ -2835,6 +3094,8 @@
0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;;
0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;;
0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;*;;;
+0F6B;TIBETAN LETTER KKA;Lo;0;L;;;;;N;;;;;
+0F6C;TIBETAN LETTER RRA;Lo;0;L;;;;;N;;;;;
0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;;
0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;;
0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;;
@@ -2921,7 +3182,13 @@
0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;norbu nyi khyi;;;
0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;norbu sum khyi;;;
0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;norbu shi khyi;;;
+0FCE;TIBETAN SIGN RDEL NAG RDEL DKAR;So;0;L;;;;;N;;dena deka;;;
0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;dena sum;;;
+0FD0;TIBETAN MARK BSKA- SHOG GI MGO RGYAN;Po;0;L;;;;;N;;ka shog gi go gyen;;;
+0FD1;TIBETAN MARK MNYAM YIG GI MGO RGYAN;Po;0;L;;;;;N;;nyam yig gi go gyen;;;
+0FD2;TIBETAN MARK NYIS TSHEG;Po;0;L;;;;;N;;nyi tsek;;;
+0FD3;TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA;Po;0;L;;;;;N;;da nying yik go dun ma;;;
+0FD4;TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA;Po;0;L;;;;;N;;da nying yik go kab ma;;;
1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;;
1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;;
1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;;
@@ -2956,13 +3223,16 @@
101F;MYANMAR LETTER HA;Lo;0;L;;;;;N;;;;;
1020;MYANMAR LETTER LLA;Lo;0;L;;;;;N;;;;;
1021;MYANMAR LETTER A;Lo;0;L;;;;;N;;;;;
+1022;MYANMAR LETTER SHAN A;Lo;0;L;;;;;N;;;;;
1023;MYANMAR LETTER I;Lo;0;L;;;;;N;;;;;
1024;MYANMAR LETTER II;Lo;0;L;;;;;N;;;;;
1025;MYANMAR LETTER U;Lo;0;L;;;;;N;;;;;
1026;MYANMAR LETTER UU;Lo;0;L;1025 102E;;;;N;;;;;
1027;MYANMAR LETTER E;Lo;0;L;;;;;N;;;;;
+1028;MYANMAR LETTER MON E;Lo;0;L;;;;;N;;;;;
1029;MYANMAR LETTER O;Lo;0;L;;;;;N;;;;;
102A;MYANMAR LETTER AU;Lo;0;L;;;;;N;;;;;
+102B;MYANMAR VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;;
102C;MYANMAR VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
102D;MYANMAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
102E;MYANMAR VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
@@ -2970,10 +3240,19 @@
1030;MYANMAR VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
1031;MYANMAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
1032;MYANMAR VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+1033;MYANMAR VOWEL SIGN MON II;Mn;0;NSM;;;;;N;;;;;
+1034;MYANMAR VOWEL SIGN MON O;Mn;0;NSM;;;;;N;;;;;
+1035;MYANMAR VOWEL SIGN E ABOVE;Mn;0;NSM;;;;;N;;;;;
1036;MYANMAR SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
1037;MYANMAR SIGN DOT BELOW;Mn;7;NSM;;;;;N;;;;;
1038;MYANMAR SIGN VISARGA;Mc;0;L;;;;;N;;;;;
1039;MYANMAR SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+103A;MYANMAR SIGN ASAT;Mn;9;NSM;;;;;N;;;;;
+103B;MYANMAR CONSONANT SIGN MEDIAL YA;Mc;0;L;;;;;N;;;;;
+103C;MYANMAR CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;;
+103D;MYANMAR CONSONANT SIGN MEDIAL WA;Mn;0;NSM;;;;;N;;;;;
+103E;MYANMAR CONSONANT SIGN MEDIAL HA;Mn;0;NSM;;;;;N;;;;;
+103F;MYANMAR LETTER GREAT SA;Lo;0;L;;;;;N;;;;;
1040;MYANMAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
1041;MYANMAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
1042;MYANMAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
@@ -3000,44 +3279,110 @@
1057;MYANMAR VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
1058;MYANMAR VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
1059;MYANMAR VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
-10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;Khutsuri;;;
-10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;Khutsuri;;;
-10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;Khutsuri;;;
-10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;Khutsuri;;;
-10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;Khutsuri;;;
-10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;Khutsuri;;;
-10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;Khutsuri;;;
-10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;Khutsuri;;;
-10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;Khutsuri;;;
-10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;Khutsuri;;;
-10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;Khutsuri;;;
-10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;Khutsuri;;;
-10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;Khutsuri;;;
-10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;Khutsuri;;;
-10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;Khutsuri;;;
-10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;Khutsuri;;;
-10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;Khutsuri;;;
-10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;Khutsuri;;;
-10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;Khutsuri;;;
-10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;Khutsuri;;;
-10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;Khutsuri;;;
-10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;Khutsuri;;;
-10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;Khutsuri;;;
-10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;Khutsuri;;;
-10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;Khutsuri;;;
-10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;Khutsuri;;;
-10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;Khutsuri;;;
-10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;Khutsuri;;;
-10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;Khutsuri;;;
-10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;Khutsuri;;;
-10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;Khutsuri;;;
-10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;Khutsuri;;;
-10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;Khutsuri;;;
-10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;Khutsuri;;;
-10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;Khutsuri;;;
-10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;Khutsuri;;;
-10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;Khutsuri;;;
-10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;Khutsuri;;;
+105A;MYANMAR LETTER MON NGA;Lo;0;L;;;;;N;;;;;
+105B;MYANMAR LETTER MON JHA;Lo;0;L;;;;;N;;;;;
+105C;MYANMAR LETTER MON BBA;Lo;0;L;;;;;N;;;;;
+105D;MYANMAR LETTER MON BBE;Lo;0;L;;;;;N;;;;;
+105E;MYANMAR CONSONANT SIGN MON MEDIAL NA;Mn;0;NSM;;;;;N;;;;;
+105F;MYANMAR CONSONANT SIGN MON MEDIAL MA;Mn;0;NSM;;;;;N;;;;;
+1060;MYANMAR CONSONANT SIGN MON MEDIAL LA;Mn;0;NSM;;;;;N;;;;;
+1061;MYANMAR LETTER SGAW KAREN SHA;Lo;0;L;;;;;N;;;;;
+1062;MYANMAR VOWEL SIGN SGAW KAREN EU;Mc;0;L;;;;;N;;;;;
+1063;MYANMAR TONE MARK SGAW KAREN HATHI;Mc;0;L;;;;;N;;;;;
+1064;MYANMAR TONE MARK SGAW KAREN KE PHO;Mc;0;L;;;;;N;;;;;
+1065;MYANMAR LETTER WESTERN PWO KAREN THA;Lo;0;L;;;;;N;;;;;
+1066;MYANMAR LETTER WESTERN PWO KAREN PWA;Lo;0;L;;;;;N;;;;;
+1067;MYANMAR VOWEL SIGN WESTERN PWO KAREN EU;Mc;0;L;;;;;N;;;;;
+1068;MYANMAR VOWEL SIGN WESTERN PWO KAREN UE;Mc;0;L;;;;;N;;;;;
+1069;MYANMAR SIGN WESTERN PWO KAREN TONE-1;Mc;0;L;;;;;N;;;;;
+106A;MYANMAR SIGN WESTERN PWO KAREN TONE-2;Mc;0;L;;;;;N;;;;;
+106B;MYANMAR SIGN WESTERN PWO KAREN TONE-3;Mc;0;L;;;;;N;;;;;
+106C;MYANMAR SIGN WESTERN PWO KAREN TONE-4;Mc;0;L;;;;;N;;;;;
+106D;MYANMAR SIGN WESTERN PWO KAREN TONE-5;Mc;0;L;;;;;N;;;;;
+106E;MYANMAR LETTER EASTERN PWO KAREN NNA;Lo;0;L;;;;;N;;;;;
+106F;MYANMAR LETTER EASTERN PWO KAREN YWA;Lo;0;L;;;;;N;;;;;
+1070;MYANMAR LETTER EASTERN PWO KAREN GHWA;Lo;0;L;;;;;N;;;;;
+1071;MYANMAR VOWEL SIGN GEBA KAREN I;Mn;0;NSM;;;;;N;;;;;
+1072;MYANMAR VOWEL SIGN KAYAH OE;Mn;0;NSM;;;;;N;;;;;
+1073;MYANMAR VOWEL SIGN KAYAH U;Mn;0;NSM;;;;;N;;;;;
+1074;MYANMAR VOWEL SIGN KAYAH EE;Mn;0;NSM;;;;;N;;;;;
+1075;MYANMAR LETTER SHAN KA;Lo;0;L;;;;;N;;;;;
+1076;MYANMAR LETTER SHAN KHA;Lo;0;L;;;;;N;;;;;
+1077;MYANMAR LETTER SHAN GA;Lo;0;L;;;;;N;;;;;
+1078;MYANMAR LETTER SHAN CA;Lo;0;L;;;;;N;;;;;
+1079;MYANMAR LETTER SHAN ZA;Lo;0;L;;;;;N;;;;;
+107A;MYANMAR LETTER SHAN NYA;Lo;0;L;;;;;N;;;;;
+107B;MYANMAR LETTER SHAN DA;Lo;0;L;;;;;N;;;;;
+107C;MYANMAR LETTER SHAN NA;Lo;0;L;;;;;N;;;;;
+107D;MYANMAR LETTER SHAN PHA;Lo;0;L;;;;;N;;;;;
+107E;MYANMAR LETTER SHAN FA;Lo;0;L;;;;;N;;;;;
+107F;MYANMAR LETTER SHAN BA;Lo;0;L;;;;;N;;;;;
+1080;MYANMAR LETTER SHAN THA;Lo;0;L;;;;;N;;;;;
+1081;MYANMAR LETTER SHAN HA;Lo;0;L;;;;;N;;;;;
+1082;MYANMAR CONSONANT SIGN SHAN MEDIAL WA;Mn;0;NSM;;;;;N;;;;;
+1083;MYANMAR VOWEL SIGN SHAN AA;Mc;0;L;;;;;N;;;;;
+1084;MYANMAR VOWEL SIGN SHAN E;Mc;0;L;;;;;N;;;;;
+1085;MYANMAR VOWEL SIGN SHAN E ABOVE;Mn;0;NSM;;;;;N;;;;;
+1086;MYANMAR VOWEL SIGN SHAN FINAL Y;Mn;0;NSM;;;;;N;;;;;
+1087;MYANMAR SIGN SHAN TONE-2;Mc;0;L;;;;;N;;;;;
+1088;MYANMAR SIGN SHAN TONE-3;Mc;0;L;;;;;N;;;;;
+1089;MYANMAR SIGN SHAN TONE-5;Mc;0;L;;;;;N;;;;;
+108A;MYANMAR SIGN SHAN TONE-6;Mc;0;L;;;;;N;;;;;
+108B;MYANMAR SIGN SHAN COUNCIL TONE-2;Mc;0;L;;;;;N;;;;;
+108C;MYANMAR SIGN SHAN COUNCIL TONE-3;Mc;0;L;;;;;N;;;;;
+108D;MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE;Mn;220;NSM;;;;;N;;;;;
+108E;MYANMAR LETTER RUMAI PALAUNG FA;Lo;0;L;;;;;N;;;;;
+108F;MYANMAR SIGN RUMAI PALAUNG TONE-5;Mc;0;L;;;;;N;;;;;
+1090;MYANMAR SHAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1091;MYANMAR SHAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1092;MYANMAR SHAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1093;MYANMAR SHAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1094;MYANMAR SHAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1095;MYANMAR SHAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1096;MYANMAR SHAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1097;MYANMAR SHAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1098;MYANMAR SHAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1099;MYANMAR SHAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+109E;MYANMAR SYMBOL SHAN ONE;So;0;L;;;;;N;;;;;
+109F;MYANMAR SYMBOL SHAN EXCLAMATION;So;0;L;;;;;N;;;;;
+10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;Khutsuri;;2D00;
+10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;Khutsuri;;2D01;
+10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;Khutsuri;;2D02;
+10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;Khutsuri;;2D03;
+10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;Khutsuri;;2D04;
+10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;Khutsuri;;2D05;
+10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;Khutsuri;;2D06;
+10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;Khutsuri;;2D07;
+10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;Khutsuri;;2D08;
+10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;Khutsuri;;2D09;
+10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;Khutsuri;;2D0A;
+10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;Khutsuri;;2D0B;
+10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;Khutsuri;;2D0C;
+10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;Khutsuri;;2D0D;
+10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;Khutsuri;;2D0E;
+10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;Khutsuri;;2D0F;
+10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;Khutsuri;;2D10;
+10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;Khutsuri;;2D11;
+10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;Khutsuri;;2D12;
+10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;Khutsuri;;2D13;
+10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;Khutsuri;;2D14;
+10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;Khutsuri;;2D15;
+10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;Khutsuri;;2D16;
+10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;Khutsuri;;2D17;
+10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;Khutsuri;;2D18;
+10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;Khutsuri;;2D19;
+10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;Khutsuri;;2D1A;
+10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;Khutsuri;;2D1B;
+10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;Khutsuri;;2D1C;
+10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;Khutsuri;;2D1D;
+10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;Khutsuri;;2D1E;
+10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;Khutsuri;;2D1F;
+10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;Khutsuri;;2D20;
+10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;Khutsuri;;2D21;
+10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;Khutsuri;;2D22;
+10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;Khutsuri;;2D23;
+10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;Khutsuri;;2D24;
+10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;Khutsuri;;2D25;
10D0;GEORGIAN LETTER AN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;;;
10D1;GEORGIAN LETTER BAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;;;
10D2;GEORGIAN LETTER GAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;;;
@@ -3079,7 +3424,10 @@
10F6;GEORGIAN LETTER FI;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;;;
10F7;GEORGIAN LETTER YN;Lo;0;L;;;;;N;;;;;
10F8;GEORGIAN LETTER ELIFI;Lo;0;L;;;;;N;;;;;
+10F9;GEORGIAN LETTER TURNED GAN;Lo;0;L;;;;;N;;;;;
+10FA;GEORGIAN LETTER AIN;Lo;0;L;;;;;N;;;;;
10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;;
+10FC;MODIFIER LETTER GEORGIAN NAR;Lm;0;L;<super> 10DC;;;;N;;;;;
1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;g *;;;
1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;gg *;;;
1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;n *;;;
@@ -3327,6 +3675,7 @@
1204;ETHIOPIC SYLLABLE HEE;Lo;0;L;;;;;N;;;;;
1205;ETHIOPIC SYLLABLE HE;Lo;0;L;;;;;N;;;;;
1206;ETHIOPIC SYLLABLE HO;Lo;0;L;;;;;N;;;;;
+1207;ETHIOPIC SYLLABLE HOA;Lo;0;L;;;;;N;;;;;
1208;ETHIOPIC SYLLABLE LA;Lo;0;L;;;;;N;;;;;
1209;ETHIOPIC SYLLABLE LU;Lo;0;L;;;;;N;;;;;
120A;ETHIOPIC SYLLABLE LI;Lo;0;L;;;;;N;;;;;
@@ -3390,6 +3739,7 @@
1244;ETHIOPIC SYLLABLE QEE;Lo;0;L;;;;;N;;;;;
1245;ETHIOPIC SYLLABLE QE;Lo;0;L;;;;;N;;;;;
1246;ETHIOPIC SYLLABLE QO;Lo;0;L;;;;;N;;;;;
+1247;ETHIOPIC SYLLABLE QOA;Lo;0;L;;;;;N;;;;;
1248;ETHIOPIC SYLLABLE QWA;Lo;0;L;;;;;N;;;;;
124A;ETHIOPIC SYLLABLE QWI;Lo;0;L;;;;;N;;;;;
124B;ETHIOPIC SYLLABLE QWAA;Lo;0;L;;;;;N;;;;;
@@ -3446,6 +3796,7 @@
1284;ETHIOPIC SYLLABLE XEE;Lo;0;L;;;;;N;;;;;
1285;ETHIOPIC SYLLABLE XE;Lo;0;L;;;;;N;;;;;
1286;ETHIOPIC SYLLABLE XO;Lo;0;L;;;;;N;;;;;
+1287;ETHIOPIC SYLLABLE XOA;Lo;0;L;;;;;N;;;;;
1288;ETHIOPIC SYLLABLE XWA;Lo;0;L;;;;;N;;;;;
128A;ETHIOPIC SYLLABLE XWI;Lo;0;L;;;;;N;;;;;
128B;ETHIOPIC SYLLABLE XWAA;Lo;0;L;;;;;N;;;;;
@@ -3482,6 +3833,7 @@
12AC;ETHIOPIC SYLLABLE KEE;Lo;0;L;;;;;N;;;;;
12AD;ETHIOPIC SYLLABLE KE;Lo;0;L;;;;;N;;;;;
12AE;ETHIOPIC SYLLABLE KO;Lo;0;L;;;;;N;;;;;
+12AF;ETHIOPIC SYLLABLE KOA;Lo;0;L;;;;;N;;;;;
12B0;ETHIOPIC SYLLABLE KWA;Lo;0;L;;;;;N;;;;;
12B2;ETHIOPIC SYLLABLE KWI;Lo;0;L;;;;;N;;;;;
12B3;ETHIOPIC SYLLABLE KWAA;Lo;0;L;;;;;N;;;;;
@@ -3506,6 +3858,7 @@
12CC;ETHIOPIC SYLLABLE WEE;Lo;0;L;;;;;N;;;;;
12CD;ETHIOPIC SYLLABLE WE;Lo;0;L;;;;;N;;;;;
12CE;ETHIOPIC SYLLABLE WO;Lo;0;L;;;;;N;;;;;
+12CF;ETHIOPIC SYLLABLE WOA;Lo;0;L;;;;;N;;;;;
12D0;ETHIOPIC SYLLABLE PHARYNGEAL A;Lo;0;L;;;;;N;;;;;
12D1;ETHIOPIC SYLLABLE PHARYNGEAL U;Lo;0;L;;;;;N;;;;;
12D2;ETHIOPIC SYLLABLE PHARYNGEAL I;Lo;0;L;;;;;N;;;;;
@@ -3536,6 +3889,7 @@
12EC;ETHIOPIC SYLLABLE YEE;Lo;0;L;;;;;N;;;;;
12ED;ETHIOPIC SYLLABLE YE;Lo;0;L;;;;;N;;;;;
12EE;ETHIOPIC SYLLABLE YO;Lo;0;L;;;;;N;;;;;
+12EF;ETHIOPIC SYLLABLE YOA;Lo;0;L;;;;;N;;;;;
12F0;ETHIOPIC SYLLABLE DA;Lo;0;L;;;;;N;;;;;
12F1;ETHIOPIC SYLLABLE DU;Lo;0;L;;;;;N;;;;;
12F2;ETHIOPIC SYLLABLE DI;Lo;0;L;;;;;N;;;;;
@@ -3567,6 +3921,7 @@
130C;ETHIOPIC SYLLABLE GEE;Lo;0;L;;;;;N;;;;;
130D;ETHIOPIC SYLLABLE GE;Lo;0;L;;;;;N;;;;;
130E;ETHIOPIC SYLLABLE GO;Lo;0;L;;;;;N;;;;;
+130F;ETHIOPIC SYLLABLE GOA;Lo;0;L;;;;;N;;;;;
1310;ETHIOPIC SYLLABLE GWA;Lo;0;L;;;;;N;;;;;
1312;ETHIOPIC SYLLABLE GWI;Lo;0;L;;;;;N;;;;;
1313;ETHIOPIC SYLLABLE GWAA;Lo;0;L;;;;;N;;;;;
@@ -3579,6 +3934,7 @@
131C;ETHIOPIC SYLLABLE GGEE;Lo;0;L;;;;;N;;;;;
131D;ETHIOPIC SYLLABLE GGE;Lo;0;L;;;;;N;;;;;
131E;ETHIOPIC SYLLABLE GGO;Lo;0;L;;;;;N;;;;;
+131F;ETHIOPIC SYLLABLE GGWAA;Lo;0;L;;;;;N;;;;;
1320;ETHIOPIC SYLLABLE THA;Lo;0;L;;;;;N;;;;;
1321;ETHIOPIC SYLLABLE THU;Lo;0;L;;;;;N;;;;;
1322;ETHIOPIC SYLLABLE THI;Lo;0;L;;;;;N;;;;;
@@ -3618,6 +3974,7 @@
1344;ETHIOPIC SYLLABLE TZEE;Lo;0;L;;;;;N;;;;;
1345;ETHIOPIC SYLLABLE TZE;Lo;0;L;;;;;N;;;;;
1346;ETHIOPIC SYLLABLE TZO;Lo;0;L;;;;;N;;;;;
+1347;ETHIOPIC SYLLABLE TZOA;Lo;0;L;;;;;N;;;;;
1348;ETHIOPIC SYLLABLE FA;Lo;0;L;;;;;N;;;;;
1349;ETHIOPIC SYLLABLE FU;Lo;0;L;;;;;N;;;;;
134A;ETHIOPIC SYLLABLE FI;Lo;0;L;;;;;N;;;;;
@@ -3637,6 +3994,8 @@
1358;ETHIOPIC SYLLABLE RYA;Lo;0;L;;;;;N;;;;;
1359;ETHIOPIC SYLLABLE MYA;Lo;0;L;;;;;N;;;;;
135A;ETHIOPIC SYLLABLE FYA;Lo;0;L;;;;;N;;;;;
+135F;ETHIOPIC COMBINING GEMINATION MARK;Mn;230;NSM;;;;;N;;;;;
+1360;ETHIOPIC SECTION MARK;So;0;L;;;;;N;;;;;
1361;ETHIOPIC WORDSPACE;Po;0;L;;;;;N;;;;;
1362;ETHIOPIC FULL STOP;Po;0;L;;;;;N;;;;;
1363;ETHIOPIC COMMA;Po;0;L;;;;;N;;;;;
@@ -3645,15 +4004,15 @@
1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;;
1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;;
1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;;
-1369;ETHIOPIC DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
-136A;ETHIOPIC DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
-136B;ETHIOPIC DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
-136C;ETHIOPIC DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
-136D;ETHIOPIC DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
-136E;ETHIOPIC DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
-136F;ETHIOPIC DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
-1370;ETHIOPIC DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
-1371;ETHIOPIC DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1369;ETHIOPIC DIGIT ONE;No;0;L;;;1;1;N;;;;;
+136A;ETHIOPIC DIGIT TWO;No;0;L;;;2;2;N;;;;;
+136B;ETHIOPIC DIGIT THREE;No;0;L;;;3;3;N;;;;;
+136C;ETHIOPIC DIGIT FOUR;No;0;L;;;4;4;N;;;;;
+136D;ETHIOPIC DIGIT FIVE;No;0;L;;;5;5;N;;;;;
+136E;ETHIOPIC DIGIT SIX;No;0;L;;;6;6;N;;;;;
+136F;ETHIOPIC DIGIT SEVEN;No;0;L;;;7;7;N;;;;;
+1370;ETHIOPIC DIGIT EIGHT;No;0;L;;;8;8;N;;;;;
+1371;ETHIOPIC DIGIT NINE;No;0;L;;;9;9;N;;;;;
1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;;
1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;;
1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;;
@@ -3665,6 +4024,32 @@
137A;ETHIOPIC NUMBER NINETY;No;0;L;;;;90;N;;;;;
137B;ETHIOPIC NUMBER HUNDRED;No;0;L;;;;100;N;;;;;
137C;ETHIOPIC NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;;
+1380;ETHIOPIC SYLLABLE SEBATBEIT MWA;Lo;0;L;;;;;N;;;;;
+1381;ETHIOPIC SYLLABLE MWI;Lo;0;L;;;;;N;;;;;
+1382;ETHIOPIC SYLLABLE MWEE;Lo;0;L;;;;;N;;;;;
+1383;ETHIOPIC SYLLABLE MWE;Lo;0;L;;;;;N;;;;;
+1384;ETHIOPIC SYLLABLE SEBATBEIT BWA;Lo;0;L;;;;;N;;;;;
+1385;ETHIOPIC SYLLABLE BWI;Lo;0;L;;;;;N;;;;;
+1386;ETHIOPIC SYLLABLE BWEE;Lo;0;L;;;;;N;;;;;
+1387;ETHIOPIC SYLLABLE BWE;Lo;0;L;;;;;N;;;;;
+1388;ETHIOPIC SYLLABLE SEBATBEIT FWA;Lo;0;L;;;;;N;;;;;
+1389;ETHIOPIC SYLLABLE FWI;Lo;0;L;;;;;N;;;;;
+138A;ETHIOPIC SYLLABLE FWEE;Lo;0;L;;;;;N;;;;;
+138B;ETHIOPIC SYLLABLE FWE;Lo;0;L;;;;;N;;;;;
+138C;ETHIOPIC SYLLABLE SEBATBEIT PWA;Lo;0;L;;;;;N;;;;;
+138D;ETHIOPIC SYLLABLE PWI;Lo;0;L;;;;;N;;;;;
+138E;ETHIOPIC SYLLABLE PWEE;Lo;0;L;;;;;N;;;;;
+138F;ETHIOPIC SYLLABLE PWE;Lo;0;L;;;;;N;;;;;
+1390;ETHIOPIC TONAL MARK YIZET;So;0;ON;;;;;N;;;;;
+1391;ETHIOPIC TONAL MARK DERET;So;0;ON;;;;;N;;;;;
+1392;ETHIOPIC TONAL MARK RIKRIK;So;0;ON;;;;;N;;;;;
+1393;ETHIOPIC TONAL MARK SHORT RIKRIK;So;0;ON;;;;;N;;;;;
+1394;ETHIOPIC TONAL MARK DIFAT;So;0;ON;;;;;N;;;;;
+1395;ETHIOPIC TONAL MARK KENAT;So;0;ON;;;;;N;;;;;
+1396;ETHIOPIC TONAL MARK CHIRET;So;0;ON;;;;;N;;;;;
+1397;ETHIOPIC TONAL MARK HIDET;So;0;ON;;;;;N;;;;;
+1398;ETHIOPIC TONAL MARK DERET-HIDET;So;0;ON;;;;;N;;;;;
+1399;ETHIOPIC TONAL MARK KURT;So;0;ON;;;;;N;;;;;
13A0;CHEROKEE LETTER A;Lo;0;L;;;;;N;;;;;
13A1;CHEROKEE LETTER E;Lo;0;L;;;;;N;;;;;
13A2;CHEROKEE LETTER I;Lo;0;L;;;;;N;;;;;
@@ -4407,8 +4792,8 @@
1698;OGHAM LETTER IFIN;Lo;0;L;;;;;N;;;;;
1699;OGHAM LETTER EAMHANCHOLL;Lo;0;L;;;;;N;;;;;
169A;OGHAM LETTER PEITH;Lo;0;L;;;;;N;;;;;
-169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;N;;;;;
-169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;N;;;;;
+169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;Y;;;;;
+169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;Y;;;;;
16A0;RUNIC LETTER FEHU FEOH FE F;Lo;0;L;;;;;N;;;;;
16A1;RUNIC LETTER V;Lo;0;L;;;;;N;;;;;
16A2;RUNIC LETTER URUZ UR U;Lo;0;L;;;;;N;;;;;
@@ -4840,6 +5225,7 @@
18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;;
18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;;
18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;;
+18AA;MONGOLIAN LETTER MANCHU ALI GALI LHA;Lo;0;L;;;;;N;;;;;
1900;LIMBU VOWEL-CARRIER LETTER;Lo;0;L;;;;;N;;;;;
1901;LIMBU LETTER KA;Lo;0;L;;;;;N;;;;;
1902;LIMBU LETTER KHA;Lo;0;L;;;;;N;;;;;
@@ -4878,9 +5264,9 @@
1926;LIMBU VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
1927;LIMBU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
1928;LIMBU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
-1929;LIMBU SUBJOINED LETTER YA;Mc;0;NSM;;;;;N;;;;;
-192A;LIMBU SUBJOINED LETTER RA;Mc;0;NSM;;;;;N;;;;;
-192B;LIMBU SUBJOINED LETTER WA;Mc;0;NSM;;;;;N;;;;;
+1929;LIMBU SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;;
+192A;LIMBU SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;;
+192B;LIMBU SUBJOINED LETTER WA;Mc;0;L;;;;;N;;;;;
1930;LIMBU SMALL LETTER KA;Mc;0;L;;;;;N;;;;;
1931;LIMBU SMALL LETTER NGA;Mc;0;L;;;;;N;;;;;
1932;LIMBU SMALL LETTER ANUSVARA;Mn;0;NSM;;;;;N;;;;;
@@ -4941,6 +5327,86 @@
1972;TAI LE LETTER TONE-4;Lo;0;L;;;;;N;;;;;
1973;TAI LE LETTER TONE-5;Lo;0;L;;;;;N;;;;;
1974;TAI LE LETTER TONE-6;Lo;0;L;;;;;N;;;;;
+1980;NEW TAI LUE LETTER HIGH QA;Lo;0;L;;;;;N;;;;;
+1981;NEW TAI LUE LETTER LOW QA;Lo;0;L;;;;;N;;;;;
+1982;NEW TAI LUE LETTER HIGH KA;Lo;0;L;;;;;N;;;;;
+1983;NEW TAI LUE LETTER HIGH XA;Lo;0;L;;;;;N;;;;;
+1984;NEW TAI LUE LETTER HIGH NGA;Lo;0;L;;;;;N;;;;;
+1985;NEW TAI LUE LETTER LOW KA;Lo;0;L;;;;;N;;;;;
+1986;NEW TAI LUE LETTER LOW XA;Lo;0;L;;;;;N;;;;;
+1987;NEW TAI LUE LETTER LOW NGA;Lo;0;L;;;;;N;;;;;
+1988;NEW TAI LUE LETTER HIGH TSA;Lo;0;L;;;;;N;;;;;
+1989;NEW TAI LUE LETTER HIGH SA;Lo;0;L;;;;;N;;;;;
+198A;NEW TAI LUE LETTER HIGH YA;Lo;0;L;;;;;N;;;;;
+198B;NEW TAI LUE LETTER LOW TSA;Lo;0;L;;;;;N;;;;;
+198C;NEW TAI LUE LETTER LOW SA;Lo;0;L;;;;;N;;;;;
+198D;NEW TAI LUE LETTER LOW YA;Lo;0;L;;;;;N;;;;;
+198E;NEW TAI LUE LETTER HIGH TA;Lo;0;L;;;;;N;;;;;
+198F;NEW TAI LUE LETTER HIGH THA;Lo;0;L;;;;;N;;;;;
+1990;NEW TAI LUE LETTER HIGH NA;Lo;0;L;;;;;N;;;;;
+1991;NEW TAI LUE LETTER LOW TA;Lo;0;L;;;;;N;;;;;
+1992;NEW TAI LUE LETTER LOW THA;Lo;0;L;;;;;N;;;;;
+1993;NEW TAI LUE LETTER LOW NA;Lo;0;L;;;;;N;;;;;
+1994;NEW TAI LUE LETTER HIGH PA;Lo;0;L;;;;;N;;;;;
+1995;NEW TAI LUE LETTER HIGH PHA;Lo;0;L;;;;;N;;;;;
+1996;NEW TAI LUE LETTER HIGH MA;Lo;0;L;;;;;N;;;;;
+1997;NEW TAI LUE LETTER LOW PA;Lo;0;L;;;;;N;;;;;
+1998;NEW TAI LUE LETTER LOW PHA;Lo;0;L;;;;;N;;;;;
+1999;NEW TAI LUE LETTER LOW MA;Lo;0;L;;;;;N;;;;;
+199A;NEW TAI LUE LETTER HIGH FA;Lo;0;L;;;;;N;;;;;
+199B;NEW TAI LUE LETTER HIGH VA;Lo;0;L;;;;;N;;;;;
+199C;NEW TAI LUE LETTER HIGH LA;Lo;0;L;;;;;N;;;;;
+199D;NEW TAI LUE LETTER LOW FA;Lo;0;L;;;;;N;;;;;
+199E;NEW TAI LUE LETTER LOW VA;Lo;0;L;;;;;N;;;;;
+199F;NEW TAI LUE LETTER LOW LA;Lo;0;L;;;;;N;;;;;
+19A0;NEW TAI LUE LETTER HIGH HA;Lo;0;L;;;;;N;;;;;
+19A1;NEW TAI LUE LETTER HIGH DA;Lo;0;L;;;;;N;;;;;
+19A2;NEW TAI LUE LETTER HIGH BA;Lo;0;L;;;;;N;;;;;
+19A3;NEW TAI LUE LETTER LOW HA;Lo;0;L;;;;;N;;;;;
+19A4;NEW TAI LUE LETTER LOW DA;Lo;0;L;;;;;N;;;;;
+19A5;NEW TAI LUE LETTER LOW BA;Lo;0;L;;;;;N;;;;;
+19A6;NEW TAI LUE LETTER HIGH KVA;Lo;0;L;;;;;N;;;;;
+19A7;NEW TAI LUE LETTER HIGH XVA;Lo;0;L;;;;;N;;;;;
+19A8;NEW TAI LUE LETTER LOW KVA;Lo;0;L;;;;;N;;;;;
+19A9;NEW TAI LUE LETTER LOW XVA;Lo;0;L;;;;;N;;;;;
+19B0;NEW TAI LUE VOWEL SIGN VOWEL SHORTENER;Mc;0;L;;;;;N;;;;;
+19B1;NEW TAI LUE VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+19B2;NEW TAI LUE VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+19B3;NEW TAI LUE VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+19B4;NEW TAI LUE VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+19B5;NEW TAI LUE VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+19B6;NEW TAI LUE VOWEL SIGN AE;Mc;0;L;;;;;N;;;;;
+19B7;NEW TAI LUE VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+19B8;NEW TAI LUE VOWEL SIGN OA;Mc;0;L;;;;;N;;;;;
+19B9;NEW TAI LUE VOWEL SIGN UE;Mc;0;L;;;;;N;;;;;
+19BA;NEW TAI LUE VOWEL SIGN AY;Mc;0;L;;;;;N;;;;;
+19BB;NEW TAI LUE VOWEL SIGN AAY;Mc;0;L;;;;;N;;;;;
+19BC;NEW TAI LUE VOWEL SIGN UY;Mc;0;L;;;;;N;;;;;
+19BD;NEW TAI LUE VOWEL SIGN OY;Mc;0;L;;;;;N;;;;;
+19BE;NEW TAI LUE VOWEL SIGN OAY;Mc;0;L;;;;;N;;;;;
+19BF;NEW TAI LUE VOWEL SIGN UEY;Mc;0;L;;;;;N;;;;;
+19C0;NEW TAI LUE VOWEL SIGN IY;Mc;0;L;;;;;N;;;;;
+19C1;NEW TAI LUE LETTER FINAL V;Lo;0;L;;;;;N;;;;;
+19C2;NEW TAI LUE LETTER FINAL NG;Lo;0;L;;;;;N;;;;;
+19C3;NEW TAI LUE LETTER FINAL N;Lo;0;L;;;;;N;;;;;
+19C4;NEW TAI LUE LETTER FINAL M;Lo;0;L;;;;;N;;;;;
+19C5;NEW TAI LUE LETTER FINAL K;Lo;0;L;;;;;N;;;;;
+19C6;NEW TAI LUE LETTER FINAL D;Lo;0;L;;;;;N;;;;;
+19C7;NEW TAI LUE LETTER FINAL B;Lo;0;L;;;;;N;;;;;
+19C8;NEW TAI LUE TONE MARK-1;Mc;0;L;;;;;N;;;;;
+19C9;NEW TAI LUE TONE MARK-2;Mc;0;L;;;;;N;;;;;
+19D0;NEW TAI LUE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+19D1;NEW TAI LUE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+19D2;NEW TAI LUE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+19D3;NEW TAI LUE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+19D4;NEW TAI LUE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+19D5;NEW TAI LUE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+19D6;NEW TAI LUE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+19D7;NEW TAI LUE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+19D8;NEW TAI LUE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+19D9;NEW TAI LUE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+19DE;NEW TAI LUE SIGN LAE;Po;0;ON;;;;;N;;;;;
+19DF;NEW TAI LUE SIGN LAEV;Po;0;ON;;;;;N;;;;;
19E0;KHMER SYMBOL PATHAMASAT;So;0;ON;;;;;N;;;;;
19E1;KHMER SYMBOL MUOY KOET;So;0;ON;;;;;N;;;;;
19E2;KHMER SYMBOL PII KOET;So;0;ON;;;;;N;;;;;
@@ -4973,6 +5439,334 @@
19FD;KHMER SYMBOL DAP-BEI ROC;So;0;ON;;;;;N;;;;;
19FE;KHMER SYMBOL DAP-BUON ROC;So;0;ON;;;;;N;;;;;
19FF;KHMER SYMBOL DAP-PRAM ROC;So;0;ON;;;;;N;;;;;
+1A00;BUGINESE LETTER KA;Lo;0;L;;;;;N;;;;;
+1A01;BUGINESE LETTER GA;Lo;0;L;;;;;N;;;;;
+1A02;BUGINESE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1A03;BUGINESE LETTER NGKA;Lo;0;L;;;;;N;;;;;
+1A04;BUGINESE LETTER PA;Lo;0;L;;;;;N;;;;;
+1A05;BUGINESE LETTER BA;Lo;0;L;;;;;N;;;;;
+1A06;BUGINESE LETTER MA;Lo;0;L;;;;;N;;;;;
+1A07;BUGINESE LETTER MPA;Lo;0;L;;;;;N;;;;;
+1A08;BUGINESE LETTER TA;Lo;0;L;;;;;N;;;;;
+1A09;BUGINESE LETTER DA;Lo;0;L;;;;;N;;;;;
+1A0A;BUGINESE LETTER NA;Lo;0;L;;;;;N;;;;;
+1A0B;BUGINESE LETTER NRA;Lo;0;L;;;;;N;;;;;
+1A0C;BUGINESE LETTER CA;Lo;0;L;;;;;N;;;;;
+1A0D;BUGINESE LETTER JA;Lo;0;L;;;;;N;;;;;
+1A0E;BUGINESE LETTER NYA;Lo;0;L;;;;;N;;;;;
+1A0F;BUGINESE LETTER NYCA;Lo;0;L;;;;;N;;;;;
+1A10;BUGINESE LETTER YA;Lo;0;L;;;;;N;;;;;
+1A11;BUGINESE LETTER RA;Lo;0;L;;;;;N;;;;;
+1A12;BUGINESE LETTER LA;Lo;0;L;;;;;N;;;;;
+1A13;BUGINESE LETTER VA;Lo;0;L;;;;;N;;;;;
+1A14;BUGINESE LETTER SA;Lo;0;L;;;;;N;;;;;
+1A15;BUGINESE LETTER A;Lo;0;L;;;;;N;;;;;
+1A16;BUGINESE LETTER HA;Lo;0;L;;;;;N;;;;;
+1A17;BUGINESE VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;;
+1A18;BUGINESE VOWEL SIGN U;Mn;220;NSM;;;;;N;;;;;
+1A19;BUGINESE VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+1A1A;BUGINESE VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+1A1B;BUGINESE VOWEL SIGN AE;Mc;0;L;;;;;N;;;;;
+1A1E;BUGINESE PALLAWA;Po;0;L;;;;;N;;;;;
+1A1F;BUGINESE END OF SECTION;Po;0;L;;;;;N;;;;;
+1B00;BALINESE SIGN ULU RICEM;Mn;0;NSM;;;;;N;;ardhacandra;;;
+1B01;BALINESE SIGN ULU CANDRA;Mn;0;NSM;;;;;N;;candrabindu;;;
+1B02;BALINESE SIGN CECEK;Mn;0;NSM;;;;;N;;anusvara;;;
+1B03;BALINESE SIGN SURANG;Mn;0;NSM;;;;;N;;repha;;;
+1B04;BALINESE SIGN BISAH;Mc;0;L;;;;;N;;visarga;;;
+1B05;BALINESE LETTER AKARA;Lo;0;L;;;;;N;;a;;;
+1B06;BALINESE LETTER AKARA TEDUNG;Lo;0;L;1B05 1B35;;;;N;;aa;;;
+1B07;BALINESE LETTER IKARA;Lo;0;L;;;;;N;;i;;;
+1B08;BALINESE LETTER IKARA TEDUNG;Lo;0;L;1B07 1B35;;;;N;;ii;;;
+1B09;BALINESE LETTER UKARA;Lo;0;L;;;;;N;;u;;;
+1B0A;BALINESE LETTER UKARA TEDUNG;Lo;0;L;1B09 1B35;;;;N;;uu;;;
+1B0B;BALINESE LETTER RA REPA;Lo;0;L;;;;;N;;vocalic r;;;
+1B0C;BALINESE LETTER RA REPA TEDUNG;Lo;0;L;1B0B 1B35;;;;N;;vocalic rr;;;
+1B0D;BALINESE LETTER LA LENGA;Lo;0;L;;;;;N;;vocalic l;;;
+1B0E;BALINESE LETTER LA LENGA TEDUNG;Lo;0;L;1B0D 1B35;;;;N;;vocalic ll;;;
+1B0F;BALINESE LETTER EKARA;Lo;0;L;;;;;N;;e;;;
+1B10;BALINESE LETTER AIKARA;Lo;0;L;;;;;N;;ai;;;
+1B11;BALINESE LETTER OKARA;Lo;0;L;;;;;N;;o;;;
+1B12;BALINESE LETTER OKARA TEDUNG;Lo;0;L;1B11 1B35;;;;N;;au;;;
+1B13;BALINESE LETTER KA;Lo;0;L;;;;;N;;;;;
+1B14;BALINESE LETTER KA MAHAPRANA;Lo;0;L;;;;;N;;kha;;;
+1B15;BALINESE LETTER GA;Lo;0;L;;;;;N;;;;;
+1B16;BALINESE LETTER GA GORA;Lo;0;L;;;;;N;;gha;;;
+1B17;BALINESE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1B18;BALINESE LETTER CA;Lo;0;L;;;;;N;;;;;
+1B19;BALINESE LETTER CA LACA;Lo;0;L;;;;;N;;cha;;;
+1B1A;BALINESE LETTER JA;Lo;0;L;;;;;N;;;;;
+1B1B;BALINESE LETTER JA JERA;Lo;0;L;;;;;N;;jha;;;
+1B1C;BALINESE LETTER NYA;Lo;0;L;;;;;N;;;;;
+1B1D;BALINESE LETTER TA LATIK;Lo;0;L;;;;;N;;tta;;;
+1B1E;BALINESE LETTER TA MURDA MAHAPRANA;Lo;0;L;;;;;N;;ttha;;;
+1B1F;BALINESE LETTER DA MURDA ALPAPRANA;Lo;0;L;;;;;N;;dda;;;
+1B20;BALINESE LETTER DA MURDA MAHAPRANA;Lo;0;L;;;;;N;;ddha;;;
+1B21;BALINESE LETTER NA RAMBAT;Lo;0;L;;;;;N;;nna;;;
+1B22;BALINESE LETTER TA;Lo;0;L;;;;;N;;;;;
+1B23;BALINESE LETTER TA TAWA;Lo;0;L;;;;;N;;tha;;;
+1B24;BALINESE LETTER DA;Lo;0;L;;;;;N;;;;;
+1B25;BALINESE LETTER DA MADU;Lo;0;L;;;;;N;;dha;;;
+1B26;BALINESE LETTER NA;Lo;0;L;;;;;N;;;;;
+1B27;BALINESE LETTER PA;Lo;0;L;;;;;N;;;;;
+1B28;BALINESE LETTER PA KAPAL;Lo;0;L;;;;;N;;pha;;;
+1B29;BALINESE LETTER BA;Lo;0;L;;;;;N;;;;;
+1B2A;BALINESE LETTER BA KEMBANG;Lo;0;L;;;;;N;;bha;;;
+1B2B;BALINESE LETTER MA;Lo;0;L;;;;;N;;;;;
+1B2C;BALINESE LETTER YA;Lo;0;L;;;;;N;;;;;
+1B2D;BALINESE LETTER RA;Lo;0;L;;;;;N;;;;;
+1B2E;BALINESE LETTER LA;Lo;0;L;;;;;N;;;;;
+1B2F;BALINESE LETTER WA;Lo;0;L;;;;;N;;;;;
+1B30;BALINESE LETTER SA SAGA;Lo;0;L;;;;;N;;sha;;;
+1B31;BALINESE LETTER SA SAPA;Lo;0;L;;;;;N;;ssa;;;
+1B32;BALINESE LETTER SA;Lo;0;L;;;;;N;;;;;
+1B33;BALINESE LETTER HA;Lo;0;L;;;;;N;;;;;
+1B34;BALINESE SIGN REREKAN;Mn;7;NSM;;;;;N;;nukta;;;
+1B35;BALINESE VOWEL SIGN TEDUNG;Mc;0;L;;;;;N;;aa;;;
+1B36;BALINESE VOWEL SIGN ULU;Mn;0;NSM;;;;;N;;i;;;
+1B37;BALINESE VOWEL SIGN ULU SARI;Mn;0;NSM;;;;;N;;ii;;;
+1B38;BALINESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;u;;;
+1B39;BALINESE VOWEL SIGN SUKU ILUT;Mn;0;NSM;;;;;N;;uu;;;
+1B3A;BALINESE VOWEL SIGN RA REPA;Mn;0;NSM;;;;;N;;vocalic r;;;
+1B3B;BALINESE VOWEL SIGN RA REPA TEDUNG;Mc;0;L;1B3A 1B35;;;;N;;vocalic rr;;;
+1B3C;BALINESE VOWEL SIGN LA LENGA;Mn;0;NSM;;;;;N;;vocalic l;;;
+1B3D;BALINESE VOWEL SIGN LA LENGA TEDUNG;Mc;0;L;1B3C 1B35;;;;N;;vocalic ll;;;
+1B3E;BALINESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;e;;;
+1B3F;BALINESE VOWEL SIGN TALING REPA;Mc;0;L;;;;;N;;ai;;;
+1B40;BALINESE VOWEL SIGN TALING TEDUNG;Mc;0;L;1B3E 1B35;;;;N;;o;;;
+1B41;BALINESE VOWEL SIGN TALING REPA TEDUNG;Mc;0;L;1B3F 1B35;;;;N;;au;;;
+1B42;BALINESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;ae;;;
+1B43;BALINESE VOWEL SIGN PEPET TEDUNG;Mc;0;L;1B42 1B35;;;;N;;oe;;;
+1B44;BALINESE ADEG ADEG;Mc;9;L;;;;;N;;virama;;;
+1B45;BALINESE LETTER KAF SASAK;Lo;0;L;;;;;N;;;;;
+1B46;BALINESE LETTER KHOT SASAK;Lo;0;L;;;;;N;;;;;
+1B47;BALINESE LETTER TZIR SASAK;Lo;0;L;;;;;N;;;;;
+1B48;BALINESE LETTER EF SASAK;Lo;0;L;;;;;N;;;;;
+1B49;BALINESE LETTER VE SASAK;Lo;0;L;;;;;N;;;;;
+1B4A;BALINESE LETTER ZAL SASAK;Lo;0;L;;;;;N;;;;;
+1B4B;BALINESE LETTER ASYURA SASAK;Lo;0;L;;;;;N;;;;;
+1B50;BALINESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1B51;BALINESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1B52;BALINESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1B53;BALINESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1B54;BALINESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1B55;BALINESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1B56;BALINESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1B57;BALINESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1B58;BALINESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1B59;BALINESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1B5A;BALINESE PANTI;Po;0;L;;;;;N;;section;;;
+1B5B;BALINESE PAMADA;Po;0;L;;;;;N;;honorific section;;;
+1B5C;BALINESE WINDU;Po;0;L;;;;;N;;punctuation ring;;;
+1B5D;BALINESE CARIK PAMUNGKAH;Po;0;L;;;;;N;;colon;;;
+1B5E;BALINESE CARIK SIKI;Po;0;L;;;;;N;;danda;;;
+1B5F;BALINESE CARIK PAREREN;Po;0;L;;;;;N;;double danda;;;
+1B60;BALINESE PAMENENG;Po;0;L;;;;;N;;line-breaking hyphen;;;
+1B61;BALINESE MUSICAL SYMBOL DONG;So;0;L;;;;;N;;;;;
+1B62;BALINESE MUSICAL SYMBOL DENG;So;0;L;;;;;N;;;;;
+1B63;BALINESE MUSICAL SYMBOL DUNG;So;0;L;;;;;N;;;;;
+1B64;BALINESE MUSICAL SYMBOL DANG;So;0;L;;;;;N;;;;;
+1B65;BALINESE MUSICAL SYMBOL DANG SURANG;So;0;L;;;;;N;;;;;
+1B66;BALINESE MUSICAL SYMBOL DING;So;0;L;;;;;N;;;;;
+1B67;BALINESE MUSICAL SYMBOL DAENG;So;0;L;;;;;N;;;;;
+1B68;BALINESE MUSICAL SYMBOL DEUNG;So;0;L;;;;;N;;;;;
+1B69;BALINESE MUSICAL SYMBOL DAING;So;0;L;;;;;N;;;;;
+1B6A;BALINESE MUSICAL SYMBOL DANG GEDE;So;0;L;;;;;N;;;;;
+1B6B;BALINESE MUSICAL SYMBOL COMBINING TEGEH;Mn;230;NSM;;;;;N;;;;;
+1B6C;BALINESE MUSICAL SYMBOL COMBINING ENDEP;Mn;220;NSM;;;;;N;;;;;
+1B6D;BALINESE MUSICAL SYMBOL COMBINING KEMPUL;Mn;230;NSM;;;;;N;;;;;
+1B6E;BALINESE MUSICAL SYMBOL COMBINING KEMPLI;Mn;230;NSM;;;;;N;;;;;
+1B6F;BALINESE MUSICAL SYMBOL COMBINING JEGOGAN;Mn;230;NSM;;;;;N;;;;;
+1B70;BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;;
+1B71;BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;;
+1B72;BALINESE MUSICAL SYMBOL COMBINING BENDE;Mn;230;NSM;;;;;N;;;;;
+1B73;BALINESE MUSICAL SYMBOL COMBINING GONG;Mn;230;NSM;;;;;N;;;;;
+1B74;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG;So;0;L;;;;;N;;;;;
+1B75;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG;So;0;L;;;;;N;;;;;
+1B76;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK;So;0;L;;;;;N;;;;;
+1B77;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK;So;0;L;;;;;N;;;;;
+1B78;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG;So;0;L;;;;;N;;;;;
+1B79;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG;So;0;L;;;;;N;;;;;
+1B7A;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK;So;0;L;;;;;N;;;;;
+1B7B;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK;So;0;L;;;;;N;;;;;
+1B7C;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING;So;0;L;;;;;N;;;;;
+1B80;SUNDANESE SIGN PANYECEK;Mn;0;NSM;;;;;N;;;;;
+1B81;SUNDANESE SIGN PANGLAYAR;Mn;0;NSM;;;;;N;;;;;
+1B82;SUNDANESE SIGN PANGWISAD;Mc;0;L;;;;;N;;;;;
+1B83;SUNDANESE LETTER A;Lo;0;L;;;;;N;;;;;
+1B84;SUNDANESE LETTER I;Lo;0;L;;;;;N;;;;;
+1B85;SUNDANESE LETTER U;Lo;0;L;;;;;N;;;;;
+1B86;SUNDANESE LETTER AE;Lo;0;L;;;;;N;;;;;
+1B87;SUNDANESE LETTER O;Lo;0;L;;;;;N;;;;;
+1B88;SUNDANESE LETTER E;Lo;0;L;;;;;N;;;;;
+1B89;SUNDANESE LETTER EU;Lo;0;L;;;;;N;;;;;
+1B8A;SUNDANESE LETTER KA;Lo;0;L;;;;;N;;;;;
+1B8B;SUNDANESE LETTER QA;Lo;0;L;;;;;N;;;;;
+1B8C;SUNDANESE LETTER GA;Lo;0;L;;;;;N;;;;;
+1B8D;SUNDANESE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1B8E;SUNDANESE LETTER CA;Lo;0;L;;;;;N;;;;;
+1B8F;SUNDANESE LETTER JA;Lo;0;L;;;;;N;;;;;
+1B90;SUNDANESE LETTER ZA;Lo;0;L;;;;;N;;;;;
+1B91;SUNDANESE LETTER NYA;Lo;0;L;;;;;N;;;;;
+1B92;SUNDANESE LETTER TA;Lo;0;L;;;;;N;;;;;
+1B93;SUNDANESE LETTER DA;Lo;0;L;;;;;N;;;;;
+1B94;SUNDANESE LETTER NA;Lo;0;L;;;;;N;;;;;
+1B95;SUNDANESE LETTER PA;Lo;0;L;;;;;N;;;;;
+1B96;SUNDANESE LETTER FA;Lo;0;L;;;;;N;;;;;
+1B97;SUNDANESE LETTER VA;Lo;0;L;;;;;N;;;;;
+1B98;SUNDANESE LETTER BA;Lo;0;L;;;;;N;;;;;
+1B99;SUNDANESE LETTER MA;Lo;0;L;;;;;N;;;;;
+1B9A;SUNDANESE LETTER YA;Lo;0;L;;;;;N;;;;;
+1B9B;SUNDANESE LETTER RA;Lo;0;L;;;;;N;;;;;
+1B9C;SUNDANESE LETTER LA;Lo;0;L;;;;;N;;;;;
+1B9D;SUNDANESE LETTER WA;Lo;0;L;;;;;N;;;;;
+1B9E;SUNDANESE LETTER SA;Lo;0;L;;;;;N;;;;;
+1B9F;SUNDANESE LETTER XA;Lo;0;L;;;;;N;;;;;
+1BA0;SUNDANESE LETTER HA;Lo;0;L;;;;;N;;;;;
+1BA1;SUNDANESE CONSONANT SIGN PAMINGKAL;Mc;0;L;;;;;N;;;;;
+1BA2;SUNDANESE CONSONANT SIGN PANYAKRA;Mn;0;NSM;;;;;N;;;;;
+1BA3;SUNDANESE CONSONANT SIGN PANYIKU;Mn;0;NSM;;;;;N;;;;;
+1BA4;SUNDANESE VOWEL SIGN PANGHULU;Mn;0;NSM;;;;;N;;;;;
+1BA5;SUNDANESE VOWEL SIGN PANYUKU;Mn;0;NSM;;;;;N;;;;;
+1BA6;SUNDANESE VOWEL SIGN PANAELAENG;Mc;0;L;;;;;N;;;;;
+1BA7;SUNDANESE VOWEL SIGN PANOLONG;Mc;0;L;;;;;N;;;;;
+1BA8;SUNDANESE VOWEL SIGN PAMEPET;Mn;0;NSM;;;;;N;;;;;
+1BA9;SUNDANESE VOWEL SIGN PANEULEUNG;Mn;0;NSM;;;;;N;;;;;
+1BAA;SUNDANESE SIGN PAMAAEH;Mc;9;L;;;;;N;;;;;
+1BAE;SUNDANESE LETTER KHA;Lo;0;L;;;;;N;;;;;
+1BAF;SUNDANESE LETTER SYA;Lo;0;L;;;;;N;;;;;
+1BB0;SUNDANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1BB1;SUNDANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1BB2;SUNDANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1BB3;SUNDANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1BB4;SUNDANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1BB5;SUNDANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1BB6;SUNDANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1BB7;SUNDANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1BB8;SUNDANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1BB9;SUNDANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1C00;LEPCHA LETTER KA;Lo;0;L;;;;;N;;;;;
+1C01;LEPCHA LETTER KLA;Lo;0;L;;;;;N;;;;;
+1C02;LEPCHA LETTER KHA;Lo;0;L;;;;;N;;;;;
+1C03;LEPCHA LETTER GA;Lo;0;L;;;;;N;;;;;
+1C04;LEPCHA LETTER GLA;Lo;0;L;;;;;N;;;;;
+1C05;LEPCHA LETTER NGA;Lo;0;L;;;;;N;;;;;
+1C06;LEPCHA LETTER CA;Lo;0;L;;;;;N;;;;;
+1C07;LEPCHA LETTER CHA;Lo;0;L;;;;;N;;;;;
+1C08;LEPCHA LETTER JA;Lo;0;L;;;;;N;;;;;
+1C09;LEPCHA LETTER NYA;Lo;0;L;;;;;N;;;;;
+1C0A;LEPCHA LETTER TA;Lo;0;L;;;;;N;;;;;
+1C0B;LEPCHA LETTER THA;Lo;0;L;;;;;N;;;;;
+1C0C;LEPCHA LETTER DA;Lo;0;L;;;;;N;;;;;
+1C0D;LEPCHA LETTER NA;Lo;0;L;;;;;N;;;;;
+1C0E;LEPCHA LETTER PA;Lo;0;L;;;;;N;;;;;
+1C0F;LEPCHA LETTER PLA;Lo;0;L;;;;;N;;;;;
+1C10;LEPCHA LETTER PHA;Lo;0;L;;;;;N;;;;;
+1C11;LEPCHA LETTER FA;Lo;0;L;;;;;N;;;;;
+1C12;LEPCHA LETTER FLA;Lo;0;L;;;;;N;;;;;
+1C13;LEPCHA LETTER BA;Lo;0;L;;;;;N;;;;;
+1C14;LEPCHA LETTER BLA;Lo;0;L;;;;;N;;;;;
+1C15;LEPCHA LETTER MA;Lo;0;L;;;;;N;;;;;
+1C16;LEPCHA LETTER MLA;Lo;0;L;;;;;N;;;;;
+1C17;LEPCHA LETTER TSA;Lo;0;L;;;;;N;;;;;
+1C18;LEPCHA LETTER TSHA;Lo;0;L;;;;;N;;;;;
+1C19;LEPCHA LETTER DZA;Lo;0;L;;;;;N;;;;;
+1C1A;LEPCHA LETTER YA;Lo;0;L;;;;;N;;;;;
+1C1B;LEPCHA LETTER RA;Lo;0;L;;;;;N;;;;;
+1C1C;LEPCHA LETTER LA;Lo;0;L;;;;;N;;;;;
+1C1D;LEPCHA LETTER HA;Lo;0;L;;;;;N;;;;;
+1C1E;LEPCHA LETTER HLA;Lo;0;L;;;;;N;;;;;
+1C1F;LEPCHA LETTER VA;Lo;0;L;;;;;N;;;;;
+1C20;LEPCHA LETTER SA;Lo;0;L;;;;;N;;;;;
+1C21;LEPCHA LETTER SHA;Lo;0;L;;;;;N;;;;;
+1C22;LEPCHA LETTER WA;Lo;0;L;;;;;N;;;;;
+1C23;LEPCHA LETTER A;Lo;0;L;;;;;N;;;;;
+1C24;LEPCHA SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;;
+1C25;LEPCHA SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;;
+1C26;LEPCHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+1C27;LEPCHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+1C28;LEPCHA VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+1C29;LEPCHA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+1C2A;LEPCHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+1C2B;LEPCHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+1C2C;LEPCHA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+1C2D;LEPCHA CONSONANT SIGN K;Mn;0;NSM;;;;;N;;;;;
+1C2E;LEPCHA CONSONANT SIGN M;Mn;0;NSM;;;;;N;;;;;
+1C2F;LEPCHA CONSONANT SIGN L;Mn;0;NSM;;;;;N;;;;;
+1C30;LEPCHA CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;;
+1C31;LEPCHA CONSONANT SIGN P;Mn;0;NSM;;;;;N;;;;;
+1C32;LEPCHA CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;;
+1C33;LEPCHA CONSONANT SIGN T;Mn;0;NSM;;;;;N;;;;;
+1C34;LEPCHA CONSONANT SIGN NYIN-DO;Mc;0;L;;;;;N;;;;;
+1C35;LEPCHA CONSONANT SIGN KANG;Mc;0;L;;;;;N;;;;;
+1C36;LEPCHA SIGN RAN;Mn;0;NSM;;;;;N;;;;;
+1C37;LEPCHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+1C3B;LEPCHA PUNCTUATION TA-ROL;Po;0;L;;;;;N;;;;;
+1C3C;LEPCHA PUNCTUATION NYET THYOOM TA-ROL;Po;0;L;;;;;N;;;;;
+1C3D;LEPCHA PUNCTUATION CER-WA;Po;0;L;;;;;N;;;;;
+1C3E;LEPCHA PUNCTUATION TSHOOK CER-WA;Po;0;L;;;;;N;;;;;
+1C3F;LEPCHA PUNCTUATION TSHOOK;Po;0;L;;;;;N;;;;;
+1C40;LEPCHA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1C41;LEPCHA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1C42;LEPCHA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1C43;LEPCHA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1C44;LEPCHA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1C45;LEPCHA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1C46;LEPCHA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1C47;LEPCHA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1C48;LEPCHA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1C49;LEPCHA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1C4D;LEPCHA LETTER TTA;Lo;0;L;;;;;N;;;;;
+1C4E;LEPCHA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+1C4F;LEPCHA LETTER DDA;Lo;0;L;;;;;N;;;;;
+1C50;OL CHIKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1C51;OL CHIKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1C52;OL CHIKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1C53;OL CHIKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1C54;OL CHIKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1C55;OL CHIKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1C56;OL CHIKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1C57;OL CHIKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1C58;OL CHIKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1C59;OL CHIKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1C5A;OL CHIKI LETTER LA;Lo;0;L;;;;;N;;;;;
+1C5B;OL CHIKI LETTER AT;Lo;0;L;;;;;N;;;;;
+1C5C;OL CHIKI LETTER AG;Lo;0;L;;;;;N;;;;;
+1C5D;OL CHIKI LETTER ANG;Lo;0;L;;;;;N;;;;;
+1C5E;OL CHIKI LETTER AL;Lo;0;L;;;;;N;;;;;
+1C5F;OL CHIKI LETTER LAA;Lo;0;L;;;;;N;;;;;
+1C60;OL CHIKI LETTER AAK;Lo;0;L;;;;;N;;;;;
+1C61;OL CHIKI LETTER AAJ;Lo;0;L;;;;;N;;;;;
+1C62;OL CHIKI LETTER AAM;Lo;0;L;;;;;N;;;;;
+1C63;OL CHIKI LETTER AAW;Lo;0;L;;;;;N;;;;;
+1C64;OL CHIKI LETTER LI;Lo;0;L;;;;;N;;;;;
+1C65;OL CHIKI LETTER IS;Lo;0;L;;;;;N;;;;;
+1C66;OL CHIKI LETTER IH;Lo;0;L;;;;;N;;;;;
+1C67;OL CHIKI LETTER INY;Lo;0;L;;;;;N;;;;;
+1C68;OL CHIKI LETTER IR;Lo;0;L;;;;;N;;;;;
+1C69;OL CHIKI LETTER LU;Lo;0;L;;;;;N;;;;;
+1C6A;OL CHIKI LETTER UC;Lo;0;L;;;;;N;;;;;
+1C6B;OL CHIKI LETTER UD;Lo;0;L;;;;;N;;;;;
+1C6C;OL CHIKI LETTER UNN;Lo;0;L;;;;;N;;;;;
+1C6D;OL CHIKI LETTER UY;Lo;0;L;;;;;N;;;;;
+1C6E;OL CHIKI LETTER LE;Lo;0;L;;;;;N;;;;;
+1C6F;OL CHIKI LETTER EP;Lo;0;L;;;;;N;;;;;
+1C70;OL CHIKI LETTER EDD;Lo;0;L;;;;;N;;;;;
+1C71;OL CHIKI LETTER EN;Lo;0;L;;;;;N;;;;;
+1C72;OL CHIKI LETTER ERR;Lo;0;L;;;;;N;;;;;
+1C73;OL CHIKI LETTER LO;Lo;0;L;;;;;N;;;;;
+1C74;OL CHIKI LETTER OTT;Lo;0;L;;;;;N;;;;;
+1C75;OL CHIKI LETTER OB;Lo;0;L;;;;;N;;;;;
+1C76;OL CHIKI LETTER OV;Lo;0;L;;;;;N;;;;;
+1C77;OL CHIKI LETTER OH;Lo;0;L;;;;;N;;;;;
+1C78;OL CHIKI MU TTUDDAG;Lm;0;L;;;;;N;;;;;
+1C79;OL CHIKI GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;;
+1C7A;OL CHIKI MU-GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;;
+1C7B;OL CHIKI RELAA;Lm;0;L;;;;;N;;;;;
+1C7C;OL CHIKI PHAARKAA;Lm;0;L;;;;;N;;;;;
+1C7D;OL CHIKI AHAD;Lm;0;L;;;;;N;;;;;
+1C7E;OL CHIKI PUNCTUATION MUCAAD;Po;0;L;;;;;N;;;;;
+1C7F;OL CHIKI PUNCTUATION DOUBLE MUCAAD;Po;0;L;;;;;N;;;;;
1D00;LATIN LETTER SMALL CAPITAL A;Ll;0;L;;;;;N;;;;;
1D01;LATIN LETTER SMALL CAPITAL AE;Ll;0;L;;;;;N;;;;;
1D02;LATIN SMALL LETTER TURNED AE;Ll;0;L;;;;;N;;;;;
@@ -5081,6 +5875,131 @@
1D69;GREEK SUBSCRIPT SMALL LETTER PHI;Ll;0;L;<sub> 03C6;;;;N;;;;;
1D6A;GREEK SUBSCRIPT SMALL LETTER CHI;Ll;0;L;<sub> 03C7;;;;N;;;;;
1D6B;LATIN SMALL LETTER UE;Ll;0;L;;;;;N;;;;;
+1D6C;LATIN SMALL LETTER B WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D6D;LATIN SMALL LETTER D WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D6E;LATIN SMALL LETTER F WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D6F;LATIN SMALL LETTER M WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D70;LATIN SMALL LETTER N WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D71;LATIN SMALL LETTER P WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D72;LATIN SMALL LETTER R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D73;LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D74;LATIN SMALL LETTER S WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D75;LATIN SMALL LETTER T WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D76;LATIN SMALL LETTER Z WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D77;LATIN SMALL LETTER TURNED G;Ll;0;L;;;;;N;;;;;
+1D78;MODIFIER LETTER CYRILLIC EN;Lm;0;L;<super> 043D;;;;N;;;;;
+1D79;LATIN SMALL LETTER INSULAR G;Ll;0;L;;;;;N;;;A77D;;A77D
+1D7A;LATIN SMALL LETTER TH WITH STRIKETHROUGH;Ll;0;L;;;;;N;;;;;
+1D7B;LATIN SMALL CAPITAL LETTER I WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D7C;LATIN SMALL LETTER IOTA WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D7D;LATIN SMALL LETTER P WITH STROKE;Ll;0;L;;;;;N;;;2C63;;2C63
+1D7E;LATIN SMALL CAPITAL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D7F;LATIN SMALL LETTER UPSILON WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D80;LATIN SMALL LETTER B WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D81;LATIN SMALL LETTER D WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D82;LATIN SMALL LETTER F WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D83;LATIN SMALL LETTER G WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D84;LATIN SMALL LETTER K WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D85;LATIN SMALL LETTER L WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D86;LATIN SMALL LETTER M WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D87;LATIN SMALL LETTER N WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D88;LATIN SMALL LETTER P WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D89;LATIN SMALL LETTER R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8A;LATIN SMALL LETTER S WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8B;LATIN SMALL LETTER ESH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8C;LATIN SMALL LETTER V WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8D;LATIN SMALL LETTER X WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8E;LATIN SMALL LETTER Z WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8F;LATIN SMALL LETTER A WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D90;LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D91;LATIN SMALL LETTER D WITH HOOK AND TAIL;Ll;0;L;;;;;N;;;;;
+1D92;LATIN SMALL LETTER E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D93;LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D94;LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D95;LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D96;LATIN SMALL LETTER I WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D97;LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D98;LATIN SMALL LETTER ESH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D99;LATIN SMALL LETTER U WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D9A;LATIN SMALL LETTER EZH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D9B;MODIFIER LETTER SMALL TURNED ALPHA;Lm;0;L;<super> 0252;;;;N;;;;;
+1D9C;MODIFIER LETTER SMALL C;Lm;0;L;<super> 0063;;;;N;;;;;
+1D9D;MODIFIER LETTER SMALL C WITH CURL;Lm;0;L;<super> 0255;;;;N;;;;;
+1D9E;MODIFIER LETTER SMALL ETH;Lm;0;L;<super> 00F0;;;;N;;;;;
+1D9F;MODIFIER LETTER SMALL REVERSED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;;
+1DA0;MODIFIER LETTER SMALL F;Lm;0;L;<super> 0066;;;;N;;;;;
+1DA1;MODIFIER LETTER SMALL DOTLESS J WITH STROKE;Lm;0;L;<super> 025F;;;;N;;;;;
+1DA2;MODIFIER LETTER SMALL SCRIPT G;Lm;0;L;<super> 0261;;;;N;;;;;
+1DA3;MODIFIER LETTER SMALL TURNED H;Lm;0;L;<super> 0265;;;;N;;;;;
+1DA4;MODIFIER LETTER SMALL I WITH STROKE;Lm;0;L;<super> 0268;;;;N;;;;;
+1DA5;MODIFIER LETTER SMALL IOTA;Lm;0;L;<super> 0269;;;;N;;;;;
+1DA6;MODIFIER LETTER SMALL CAPITAL I;Lm;0;L;<super> 026A;;;;N;;;;;
+1DA7;MODIFIER LETTER SMALL CAPITAL I WITH STROKE;Lm;0;L;<super> 1D7B;;;;N;;;;;
+1DA8;MODIFIER LETTER SMALL J WITH CROSSED-TAIL;Lm;0;L;<super> 029D;;;;N;;;;;
+1DA9;MODIFIER LETTER SMALL L WITH RETROFLEX HOOK;Lm;0;L;<super> 026D;;;;N;;;;;
+1DAA;MODIFIER LETTER SMALL L WITH PALATAL HOOK;Lm;0;L;<super> 1D85;;;;N;;;;;
+1DAB;MODIFIER LETTER SMALL CAPITAL L;Lm;0;L;<super> 029F;;;;N;;;;;
+1DAC;MODIFIER LETTER SMALL M WITH HOOK;Lm;0;L;<super> 0271;;;;N;;;;;
+1DAD;MODIFIER LETTER SMALL TURNED M WITH LONG LEG;Lm;0;L;<super> 0270;;;;N;;;;;
+1DAE;MODIFIER LETTER SMALL N WITH LEFT HOOK;Lm;0;L;<super> 0272;;;;N;;;;;
+1DAF;MODIFIER LETTER SMALL N WITH RETROFLEX HOOK;Lm;0;L;<super> 0273;;;;N;;;;;
+1DB0;MODIFIER LETTER SMALL CAPITAL N;Lm;0;L;<super> 0274;;;;N;;;;;
+1DB1;MODIFIER LETTER SMALL BARRED O;Lm;0;L;<super> 0275;;;;N;;;;;
+1DB2;MODIFIER LETTER SMALL PHI;Lm;0;L;<super> 0278;;;;N;;;;;
+1DB3;MODIFIER LETTER SMALL S WITH HOOK;Lm;0;L;<super> 0282;;;;N;;;;;
+1DB4;MODIFIER LETTER SMALL ESH;Lm;0;L;<super> 0283;;;;N;;;;;
+1DB5;MODIFIER LETTER SMALL T WITH PALATAL HOOK;Lm;0;L;<super> 01AB;;;;N;;;;;
+1DB6;MODIFIER LETTER SMALL U BAR;Lm;0;L;<super> 0289;;;;N;;;;;
+1DB7;MODIFIER LETTER SMALL UPSILON;Lm;0;L;<super> 028A;;;;N;;;;;
+1DB8;MODIFIER LETTER SMALL CAPITAL U;Lm;0;L;<super> 1D1C;;;;N;;;;;
+1DB9;MODIFIER LETTER SMALL V WITH HOOK;Lm;0;L;<super> 028B;;;;N;;;;;
+1DBA;MODIFIER LETTER SMALL TURNED V;Lm;0;L;<super> 028C;;;;N;;;;;
+1DBB;MODIFIER LETTER SMALL Z;Lm;0;L;<super> 007A;;;;N;;;;;
+1DBC;MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK;Lm;0;L;<super> 0290;;;;N;;;;;
+1DBD;MODIFIER LETTER SMALL Z WITH CURL;Lm;0;L;<super> 0291;;;;N;;;;;
+1DBE;MODIFIER LETTER SMALL EZH;Lm;0;L;<super> 0292;;;;N;;;;;
+1DBF;MODIFIER LETTER SMALL THETA;Lm;0;L;<super> 03B8;;;;N;;;;;
+1DC0;COMBINING DOTTED GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;;
+1DC1;COMBINING DOTTED ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;;
+1DC2;COMBINING SNAKE BELOW;Mn;220;NSM;;;;;N;;;;;
+1DC3;COMBINING SUSPENSION MARK;Mn;230;NSM;;;;;N;;;;;
+1DC4;COMBINING MACRON-ACUTE;Mn;230;NSM;;;;;N;;;;;
+1DC5;COMBINING GRAVE-MACRON;Mn;230;NSM;;;;;N;;;;;
+1DC6;COMBINING MACRON-GRAVE;Mn;230;NSM;;;;;N;;;;;
+1DC7;COMBINING ACUTE-MACRON;Mn;230;NSM;;;;;N;;;;;
+1DC8;COMBINING GRAVE-ACUTE-GRAVE;Mn;230;NSM;;;;;N;;;;;
+1DC9;COMBINING ACUTE-GRAVE-ACUTE;Mn;230;NSM;;;;;N;;;;;
+1DCA;COMBINING LATIN SMALL LETTER R BELOW;Mn;220;NSM;;;;;N;;;;;
+1DCB;COMBINING BREVE-MACRON;Mn;230;NSM;;;;;N;;;;;
+1DCC;COMBINING MACRON-BREVE;Mn;230;NSM;;;;;N;;;;;
+1DCD;COMBINING DOUBLE CIRCUMFLEX ABOVE;Mn;234;NSM;;;;;N;;;;;
+1DCE;COMBINING OGONEK ABOVE;Mn;214;NSM;;;;;N;;;;;
+1DCF;COMBINING ZIGZAG BELOW;Mn;220;NSM;;;;;N;;;;;
+1DD0;COMBINING IS BELOW;Mn;202;NSM;;;;;N;;;;;
+1DD1;COMBINING UR ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DD2;COMBINING US ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DD3;COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DD4;COMBINING LATIN SMALL LETTER AE;Mn;230;NSM;;;;;N;;;;;
+1DD5;COMBINING LATIN SMALL LETTER AO;Mn;230;NSM;;;;;N;;;;;
+1DD6;COMBINING LATIN SMALL LETTER AV;Mn;230;NSM;;;;;N;;;;;
+1DD7;COMBINING LATIN SMALL LETTER C CEDILLA;Mn;230;NSM;;;;;N;;;;;
+1DD8;COMBINING LATIN SMALL LETTER INSULAR D;Mn;230;NSM;;;;;N;;;;;
+1DD9;COMBINING LATIN SMALL LETTER ETH;Mn;230;NSM;;;;;N;;;;;
+1DDA;COMBINING LATIN SMALL LETTER G;Mn;230;NSM;;;;;N;;;;;
+1DDB;COMBINING LATIN LETTER SMALL CAPITAL G;Mn;230;NSM;;;;;N;;;;;
+1DDC;COMBINING LATIN SMALL LETTER K;Mn;230;NSM;;;;;N;;;;;
+1DDD;COMBINING LATIN SMALL LETTER L;Mn;230;NSM;;;;;N;;;;;
+1DDE;COMBINING LATIN LETTER SMALL CAPITAL L;Mn;230;NSM;;;;;N;;;;;
+1DDF;COMBINING LATIN LETTER SMALL CAPITAL M;Mn;230;NSM;;;;;N;;;;;
+1DE0;COMBINING LATIN SMALL LETTER N;Mn;230;NSM;;;;;N;;;;;
+1DE1;COMBINING LATIN LETTER SMALL CAPITAL N;Mn;230;NSM;;;;;N;;;;;
+1DE2;COMBINING LATIN LETTER SMALL CAPITAL R;Mn;230;NSM;;;;;N;;;;;
+1DE3;COMBINING LATIN SMALL LETTER R ROTUNDA;Mn;230;NSM;;;;;N;;;;;
+1DE4;COMBINING LATIN SMALL LETTER S;Mn;230;NSM;;;;;N;;;;;
+1DE5;COMBINING LATIN SMALL LETTER LONG S;Mn;230;NSM;;;;;N;;;;;
+1DE6;COMBINING LATIN SMALL LETTER Z;Mn;230;NSM;;;;;N;;;;;
+1DFE;COMBINING LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DFF;COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01;
1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00
1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03;
@@ -5237,6 +6156,10 @@
1E99;LATIN SMALL LETTER Y WITH RING ABOVE;Ll;0;L;0079 030A;;;;N;;;;;
1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L;<compat> 0061 02BE;;;;N;;;;;
1E9B;LATIN SMALL LETTER LONG S WITH DOT ABOVE;Ll;0;L;017F 0307;;;;N;;;1E60;;1E60
+1E9C;LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;;;
+1E9D;LATIN SMALL LETTER LONG S WITH HIGH STROKE;Ll;0;L;;;;;N;;;;;
+1E9E;LATIN CAPITAL LETTER SHARP S;Lu;0;L;;;;;N;;;;00DF;
+1E9F;LATIN SMALL LETTER DELTA;Ll;0;L;;;;;N;;;;;
1EA0;LATIN CAPITAL LETTER A WITH DOT BELOW;Lu;0;L;0041 0323;;;;N;;;;1EA1;
1EA1;LATIN SMALL LETTER A WITH DOT BELOW;Ll;0;L;0061 0323;;;;N;;;1EA0;;1EA0
1EA2;LATIN CAPITAL LETTER A WITH HOOK ABOVE;Lu;0;L;0041 0309;;;;N;;;;1EA3;
@@ -5327,6 +6250,12 @@
1EF7;LATIN SMALL LETTER Y WITH HOOK ABOVE;Ll;0;L;0079 0309;;;;N;;;1EF6;;1EF6
1EF8;LATIN CAPITAL LETTER Y WITH TILDE;Lu;0;L;0059 0303;;;;N;;;;1EF9;
1EF9;LATIN SMALL LETTER Y WITH TILDE;Ll;0;L;0079 0303;;;;N;;;1EF8;;1EF8
+1EFA;LATIN CAPITAL LETTER MIDDLE-WELSH LL;Lu;0;L;;;;;N;;;;1EFB;
+1EFB;LATIN SMALL LETTER MIDDLE-WELSH LL;Ll;0;L;;;;;N;;;1EFA;;1EFA
+1EFC;LATIN CAPITAL LETTER MIDDLE-WELSH V;Lu;0;L;;;;;N;;;;1EFD;
+1EFD;LATIN SMALL LETTER MIDDLE-WELSH V;Ll;0;L;;;;;N;;;1EFC;;1EFC
+1EFE;LATIN CAPITAL LETTER Y WITH LOOP;Lu;0;L;;;;;N;;;;1EFF;
+1EFF;LATIN SMALL LETTER Y WITH LOOP;Ll;0;L;;;;;N;;;1EFE;;1EFE
1F00;GREEK SMALL LETTER ALPHA WITH PSILI;Ll;0;L;03B1 0313;;;;N;;;1F08;;1F08
1F01;GREEK SMALL LETTER ALPHA WITH DASIA;Ll;0;L;03B1 0314;;;;N;;;1F09;;1F09
1F02;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA;Ll;0;L;1F00 0300;;;;N;;;1F0A;;1F0A
@@ -5571,7 +6500,7 @@
2008;PUNCTUATION SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
2009;THIN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
200A;HAIR SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
-200B;ZERO WIDTH SPACE;Zs;0;BN;;;;;N;;;;;
+200B;ZERO WIDTH SPACE;Cf;0;BN;;;;;N;;;;;
200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;;
200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;;
200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;;
@@ -5607,7 +6536,7 @@
202C;POP DIRECTIONAL FORMATTING;Cf;0;PDF;;;;;N;;;;;
202D;LEFT-TO-RIGHT OVERRIDE;Cf;0;LRO;;;;;N;;;;;
202E;RIGHT-TO-LEFT OVERRIDE;Cf;0;RLO;;;;;N;;;;;
-202F;NARROW NO-BREAK SPACE;Zs;0;WS;<noBreak> 0020;;;;N;;;;;
+202F;NARROW NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;;;;;
2030;PER MILLE SIGN;Po;0;ET;;;;;N;;;;;
2031;PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;;
2032;PRIME;Po;0;ET;;;;;N;;;;;
@@ -5628,7 +6557,7 @@
2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;;
2042;ASTERISM;Po;0;ON;;;;;N;;;;;
2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;;
-2044;FRACTION SLASH;Sm;0;ON;;;;;N;;;;;
+2044;FRACTION SLASH;Sm;0;CS;;;;;N;;;;;
2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;;
2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;;
2047;DOUBLE QUESTION MARK;Po;0;ON;<compat> 003F 003F;;;;N;;;;;
@@ -5645,12 +6574,22 @@
2052;COMMERCIAL MINUS SIGN;Sm;0;ON;;;;;N;;;;;
2053;SWUNG DASH;Po;0;ON;;;;;N;;;;;
2054;INVERTED UNDERTIE;Pc;0;ON;;;;;N;;;;;
+2055;FLOWER PUNCTUATION MARK;Po;0;ON;;;;;N;;;;;
+2056;THREE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
2057;QUADRUPLE PRIME;Po;0;ON;<compat> 2032 2032 2032 2032;;;;N;;;;;
+2058;FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2059;FIVE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+205A;TWO DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+205B;FOUR DOT MARK;Po;0;ON;;;;;N;;;;;
+205C;DOTTED CROSS;Po;0;ON;;;;;N;;;;;
+205D;TRICOLON;Po;0;ON;;;;;N;;;;;
+205E;VERTICAL FOUR DOTS;Po;0;ON;;;;;N;;;;;
205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
2060;WORD JOINER;Cf;0;BN;;;;;N;;;;;
2061;FUNCTION APPLICATION;Cf;0;BN;;;;;N;;;;;
2062;INVISIBLE TIMES;Cf;0;BN;;;;;N;;;;;
2063;INVISIBLE SEPARATOR;Cf;0;BN;;;;;N;;;;;
+2064;INVISIBLE PLUS;Cf;0;BN;;;;;N;;;;;
206A;INHIBIT SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;;
206B;ACTIVATE SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;;
206C;INHIBIT ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;;
@@ -5665,8 +6604,8 @@
2077;SUPERSCRIPT SEVEN;No;0;EN;<super> 0037;;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;;
2078;SUPERSCRIPT EIGHT;No;0;EN;<super> 0038;;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;;
2079;SUPERSCRIPT NINE;No;0;EN;<super> 0039;;9;9;N;SUPERSCRIPT DIGIT NINE;;;;
-207A;SUPERSCRIPT PLUS SIGN;Sm;0;ET;<super> 002B;;;;N;;;;;
-207B;SUPERSCRIPT MINUS;Sm;0;ET;<super> 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;;
+207A;SUPERSCRIPT PLUS SIGN;Sm;0;ES;<super> 002B;;;;N;;;;;
+207B;SUPERSCRIPT MINUS;Sm;0;ES;<super> 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;;
207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON;<super> 003D;;;;N;;;;;
207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON;<super> 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;;
207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<super> 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;;
@@ -5681,11 +6620,16 @@
2087;SUBSCRIPT SEVEN;No;0;EN;<sub> 0037;;7;7;N;SUBSCRIPT DIGIT SEVEN;;;;
2088;SUBSCRIPT EIGHT;No;0;EN;<sub> 0038;;8;8;N;SUBSCRIPT DIGIT EIGHT;;;;
2089;SUBSCRIPT NINE;No;0;EN;<sub> 0039;;9;9;N;SUBSCRIPT DIGIT NINE;;;;
-208A;SUBSCRIPT PLUS SIGN;Sm;0;ET;<sub> 002B;;;;N;;;;;
-208B;SUBSCRIPT MINUS;Sm;0;ET;<sub> 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;;
+208A;SUBSCRIPT PLUS SIGN;Sm;0;ES;<sub> 002B;;;;N;;;;;
+208B;SUBSCRIPT MINUS;Sm;0;ES;<sub> 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;;
208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON;<sub> 003D;;;;N;;;;;
208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON;<sub> 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;;
208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<sub> 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;;
+2090;LATIN SUBSCRIPT SMALL LETTER A;Lm;0;L;<sub> 0061;;;;N;;;;;
+2091;LATIN SUBSCRIPT SMALL LETTER E;Lm;0;L;<sub> 0065;;;;N;;;;;
+2092;LATIN SUBSCRIPT SMALL LETTER O;Lm;0;L;<sub> 006F;;;;N;;;;;
+2093;LATIN SUBSCRIPT SMALL LETTER X;Lm;0;L;<sub> 0078;;;;N;;;;;
+2094;LATIN SUBSCRIPT SMALL LETTER SCHWA;Lm;0;L;<sub> 0259;;;;N;;;;;
20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;;
20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;;
20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;;
@@ -5704,6 +6648,10 @@
20AF;DRACHMA SIGN;Sc;0;ET;;;;;N;;;;;
20B0;GERMAN PENNY SIGN;Sc;0;ET;;;;;N;;;;;
20B1;PESO SIGN;Sc;0;ET;;;;;N;;;;;
+20B2;GUARANI SIGN;Sc;0;ET;;;;;N;;;;;
+20B3;AUSTRAL SIGN;Sc;0;ET;;;;;N;;;;;
+20B4;HRYVNIA SIGN;Sc;0;ET;;;;;N;;;;;
+20B5;CEDI SIGN;Sc;0;ET;;;;;N;;;;;
20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;;
20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;;
20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;;
@@ -5731,6 +6679,12 @@
20E8;COMBINING TRIPLE UNDERDOT;Mn;220;NSM;;;;;N;;;;;
20E9;COMBINING WIDE BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;;
20EA;COMBINING LEFTWARDS ARROW OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20EB;COMBINING LONG DOUBLE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20EC;COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;;
+20ED;COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;;
+20EE;COMBINING LEFT ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+20EF;COMBINING RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+20F0;COMBINING ASTERISK ABOVE;Mn;230;NSM;;;;;N;;;;;
2100;ACCOUNT OF;So;0;ON;<compat> 0061 002F 0063;;;;N;;;;;
2101;ADDRESSED TO THE SUBJECT;So;0;ON;<compat> 0061 002F 0073;;;;N;;;;;
2102;DOUBLE-STRUCK CAPITAL C;Lu;0;L;<font> 0043;;;;N;DOUBLE-STRUCK C;;;;
@@ -5781,7 +6735,7 @@
212F;SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
2130;SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;SCRIPT E;;;;
2131;SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;SCRIPT F;;;;
-2132;TURNED CAPITAL F;So;0;ON;;;;;N;TURNED F;;;;
+2132;TURNED CAPITAL F;Lu;0;L;;;;;N;TURNED F;;;214E;
2133;SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;SCRIPT M;;;;
2134;SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
2135;ALEF SYMBOL;Lo;0;L;<compat> 05D0;;;;N;FIRST TRANSFINITE CARDINAL;;;;
@@ -5791,6 +6745,7 @@
2139;INFORMATION SOURCE;Ll;0;L;<font> 0069;;;;N;;;;;
213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;;
213B;FACSIMILE SIGN;So;0;ON;<compat> 0046 0041 0058;;;;N;;;;;
+213C;DOUBLE-STRUCK SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
213D;DOUBLE-STRUCK SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
213E;DOUBLE-STRUCK CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
213F;DOUBLE-STRUCK CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
@@ -5806,6 +6761,10 @@
2149;DOUBLE-STRUCK ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
214A;PROPERTY LINE;So;0;ON;;;;;N;;;;;
214B;TURNED AMPERSAND;Sm;0;ON;;;;;N;;;;;
+214C;PER SIGN;So;0;ON;;;;;N;;;;;
+214D;AKTIESELSKAB;So;0;ON;;;;;N;;;;;
+214E;TURNED SMALL F;Ll;0;L;;;;;N;;;2132;;2132
+214F;SYMBOL FOR SAMARITAN SOURCE;So;0;L;;;;;N;;;;;
2153;VULGAR FRACTION ONE THIRD;No;0;ON;<fraction> 0031 2044 0033;;;1/3;N;FRACTION ONE THIRD;;;;
2154;VULGAR FRACTION TWO THIRDS;No;0;ON;<fraction> 0032 2044 0033;;;2/3;N;FRACTION TWO THIRDS;;;;
2155;VULGAR FRACTION ONE FIFTH;No;0;ON;<fraction> 0031 2044 0035;;;1/5;N;FRACTION ONE FIFTH;;;;
@@ -5854,7 +6813,12 @@
2180;ROMAN NUMERAL ONE THOUSAND C D;Nl;0;L;;;;1000;N;;;;;
2181;ROMAN NUMERAL FIVE THOUSAND;Nl;0;L;;;;5000;N;;;;;
2182;ROMAN NUMERAL TEN THOUSAND;Nl;0;L;;;;10000;N;;;;;
-2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Nl;0;L;;;;;N;;;;;
+2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Lu;0;L;;;;;N;;;;2184;
+2184;LATIN SMALL LETTER REVERSED C;Ll;0;L;;;;;N;;;2183;;2183
+2185;ROMAN NUMERAL SIX LATE FORM;Nl;0;L;;;;6;N;;;;;
+2186;ROMAN NUMERAL FIFTY EARLY FORM;Nl;0;L;;;;50;N;;;;;
+2187;ROMAN NUMERAL FIFTY THOUSAND;Nl;0;L;;;;50000;N;;;;;
+2188;ROMAN NUMERAL ONE HUNDRED THOUSAND;Nl;0;L;;;;100000;N;;;;;
2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;;
2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;;
2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;;
@@ -5985,7 +6949,7 @@
220F;N-ARY PRODUCT;Sm;0;ON;;;;;N;;;;;
2210;N-ARY COPRODUCT;Sm;0;ON;;;;;N;;;;;
2211;N-ARY SUMMATION;Sm;0;ON;;;;;Y;;;;;
-2212;MINUS SIGN;Sm;0;ET;;;;;N;;;;;
+2212;MINUS SIGN;Sm;0;ES;;;;;N;;;;;
2213;MINUS-OR-PLUS SIGN;Sm;0;ET;;;;;N;;;;;
2214;DOT PLUS;Sm;0;ON;;;;;N;;;;;
2215;DIVISION SLASH;Sm;0;ON;;;;;Y;;;;;
@@ -6403,9 +7367,9 @@
23B1;UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;;
23B2;SUMMATION TOP;Sm;0;ON;;;;;N;;;;;
23B3;SUMMATION BOTTOM;Sm;0;ON;;;;;N;;;;;
-23B4;TOP SQUARE BRACKET;Ps;0;ON;;;;;N;;;;;
-23B5;BOTTOM SQUARE BRACKET;Pe;0;ON;;;;;N;;;;;
-23B6;BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET;Po;0;ON;;;;;N;;;;;
+23B4;TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;;
+23B5;BOTTOM SQUARE BRACKET;So;0;ON;;;;;N;;;;;
+23B6;BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;;
23B7;RADICAL SYMBOL BOTTOM;So;0;ON;;;;;N;;;;;
23B8;LEFT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;;
23B9;RIGHT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;;
@@ -6432,6 +7396,29 @@
23CE;RETURN SYMBOL;So;0;ON;;;;;N;;;;;
23CF;EJECT SYMBOL;So;0;ON;;;;;N;;;;;
23D0;VERTICAL LINE EXTENSION;So;0;ON;;;;;N;;;;;
+23D1;METRICAL BREVE;So;0;ON;;;;;N;;;;;
+23D2;METRICAL LONG OVER SHORT;So;0;ON;;;;;N;;;;;
+23D3;METRICAL SHORT OVER LONG;So;0;ON;;;;;N;;;;;
+23D4;METRICAL LONG OVER TWO SHORTS;So;0;ON;;;;;N;;;;;
+23D5;METRICAL TWO SHORTS OVER LONG;So;0;ON;;;;;N;;;;;
+23D6;METRICAL TWO SHORTS JOINED;So;0;ON;;;;;N;;;;;
+23D7;METRICAL TRISEME;So;0;ON;;;;;N;;;;;
+23D8;METRICAL TETRASEME;So;0;ON;;;;;N;;;;;
+23D9;METRICAL PENTASEME;So;0;ON;;;;;N;;;;;
+23DA;EARTH GROUND;So;0;ON;;;;;N;;;;;
+23DB;FUSE;So;0;ON;;;;;N;;;;;
+23DC;TOP PARENTHESIS;Sm;0;ON;;;;;N;;mathematical use;;;
+23DD;BOTTOM PARENTHESIS;Sm;0;ON;;;;;N;;mathematical use;;;
+23DE;TOP CURLY BRACKET;Sm;0;ON;;;;;N;;mathematical use;;;
+23DF;BOTTOM CURLY BRACKET;Sm;0;ON;;;;;N;;mathematical use;;;
+23E0;TOP TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;mathematical use;;;
+23E1;BOTTOM TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;mathematical use;;;
+23E2;WHITE TRAPEZIUM;So;0;ON;;;;;N;;;;;
+23E3;BENZENE RING WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23E4;STRAIGHTNESS;So;0;ON;;;;;N;;;;;
+23E5;FLATNESS;So;0;ON;;;;;N;;;;;
+23E6;AC CURRENT;So;0;ON;;;;;N;;;;;
+23E7;ELECTRICAL INTERSECTION;So;0;ON;;;;;N;;;;;
2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;;
2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;;
2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;;
@@ -6482,46 +7469,46 @@
2448;OCR DASH;So;0;ON;;;;;N;;;;;
2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;;
244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;;
-2460;CIRCLED DIGIT ONE;No;0;EN;<circle> 0031;;1;1;N;;;;;
-2461;CIRCLED DIGIT TWO;No;0;EN;<circle> 0032;;2;2;N;;;;;
-2462;CIRCLED DIGIT THREE;No;0;EN;<circle> 0033;;3;3;N;;;;;
-2463;CIRCLED DIGIT FOUR;No;0;EN;<circle> 0034;;4;4;N;;;;;
-2464;CIRCLED DIGIT FIVE;No;0;EN;<circle> 0035;;5;5;N;;;;;
-2465;CIRCLED DIGIT SIX;No;0;EN;<circle> 0036;;6;6;N;;;;;
-2466;CIRCLED DIGIT SEVEN;No;0;EN;<circle> 0037;;7;7;N;;;;;
-2467;CIRCLED DIGIT EIGHT;No;0;EN;<circle> 0038;;8;8;N;;;;;
-2468;CIRCLED DIGIT NINE;No;0;EN;<circle> 0039;;9;9;N;;;;;
-2469;CIRCLED NUMBER TEN;No;0;EN;<circle> 0031 0030;;;10;N;;;;;
-246A;CIRCLED NUMBER ELEVEN;No;0;EN;<circle> 0031 0031;;;11;N;;;;;
-246B;CIRCLED NUMBER TWELVE;No;0;EN;<circle> 0031 0032;;;12;N;;;;;
-246C;CIRCLED NUMBER THIRTEEN;No;0;EN;<circle> 0031 0033;;;13;N;;;;;
-246D;CIRCLED NUMBER FOURTEEN;No;0;EN;<circle> 0031 0034;;;14;N;;;;;
-246E;CIRCLED NUMBER FIFTEEN;No;0;EN;<circle> 0031 0035;;;15;N;;;;;
-246F;CIRCLED NUMBER SIXTEEN;No;0;EN;<circle> 0031 0036;;;16;N;;;;;
-2470;CIRCLED NUMBER SEVENTEEN;No;0;EN;<circle> 0031 0037;;;17;N;;;;;
-2471;CIRCLED NUMBER EIGHTEEN;No;0;EN;<circle> 0031 0038;;;18;N;;;;;
-2472;CIRCLED NUMBER NINETEEN;No;0;EN;<circle> 0031 0039;;;19;N;;;;;
-2473;CIRCLED NUMBER TWENTY;No;0;EN;<circle> 0032 0030;;;20;N;;;;;
-2474;PARENTHESIZED DIGIT ONE;No;0;EN;<compat> 0028 0031 0029;;1;1;N;;;;;
-2475;PARENTHESIZED DIGIT TWO;No;0;EN;<compat> 0028 0032 0029;;2;2;N;;;;;
-2476;PARENTHESIZED DIGIT THREE;No;0;EN;<compat> 0028 0033 0029;;3;3;N;;;;;
-2477;PARENTHESIZED DIGIT FOUR;No;0;EN;<compat> 0028 0034 0029;;4;4;N;;;;;
-2478;PARENTHESIZED DIGIT FIVE;No;0;EN;<compat> 0028 0035 0029;;5;5;N;;;;;
-2479;PARENTHESIZED DIGIT SIX;No;0;EN;<compat> 0028 0036 0029;;6;6;N;;;;;
-247A;PARENTHESIZED DIGIT SEVEN;No;0;EN;<compat> 0028 0037 0029;;7;7;N;;;;;
-247B;PARENTHESIZED DIGIT EIGHT;No;0;EN;<compat> 0028 0038 0029;;8;8;N;;;;;
-247C;PARENTHESIZED DIGIT NINE;No;0;EN;<compat> 0028 0039 0029;;9;9;N;;;;;
-247D;PARENTHESIZED NUMBER TEN;No;0;EN;<compat> 0028 0031 0030 0029;;;10;N;;;;;
-247E;PARENTHESIZED NUMBER ELEVEN;No;0;EN;<compat> 0028 0031 0031 0029;;;11;N;;;;;
-247F;PARENTHESIZED NUMBER TWELVE;No;0;EN;<compat> 0028 0031 0032 0029;;;12;N;;;;;
-2480;PARENTHESIZED NUMBER THIRTEEN;No;0;EN;<compat> 0028 0031 0033 0029;;;13;N;;;;;
-2481;PARENTHESIZED NUMBER FOURTEEN;No;0;EN;<compat> 0028 0031 0034 0029;;;14;N;;;;;
-2482;PARENTHESIZED NUMBER FIFTEEN;No;0;EN;<compat> 0028 0031 0035 0029;;;15;N;;;;;
-2483;PARENTHESIZED NUMBER SIXTEEN;No;0;EN;<compat> 0028 0031 0036 0029;;;16;N;;;;;
-2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;EN;<compat> 0028 0031 0037 0029;;;17;N;;;;;
-2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;EN;<compat> 0028 0031 0038 0029;;;18;N;;;;;
-2486;PARENTHESIZED NUMBER NINETEEN;No;0;EN;<compat> 0028 0031 0039 0029;;;19;N;;;;;
-2487;PARENTHESIZED NUMBER TWENTY;No;0;EN;<compat> 0028 0032 0030 0029;;;20;N;;;;;
+2460;CIRCLED DIGIT ONE;No;0;ON;<circle> 0031;;1;1;N;;;;;
+2461;CIRCLED DIGIT TWO;No;0;ON;<circle> 0032;;2;2;N;;;;;
+2462;CIRCLED DIGIT THREE;No;0;ON;<circle> 0033;;3;3;N;;;;;
+2463;CIRCLED DIGIT FOUR;No;0;ON;<circle> 0034;;4;4;N;;;;;
+2464;CIRCLED DIGIT FIVE;No;0;ON;<circle> 0035;;5;5;N;;;;;
+2465;CIRCLED DIGIT SIX;No;0;ON;<circle> 0036;;6;6;N;;;;;
+2466;CIRCLED DIGIT SEVEN;No;0;ON;<circle> 0037;;7;7;N;;;;;
+2467;CIRCLED DIGIT EIGHT;No;0;ON;<circle> 0038;;8;8;N;;;;;
+2468;CIRCLED DIGIT NINE;No;0;ON;<circle> 0039;;9;9;N;;;;;
+2469;CIRCLED NUMBER TEN;No;0;ON;<circle> 0031 0030;;;10;N;;;;;
+246A;CIRCLED NUMBER ELEVEN;No;0;ON;<circle> 0031 0031;;;11;N;;;;;
+246B;CIRCLED NUMBER TWELVE;No;0;ON;<circle> 0031 0032;;;12;N;;;;;
+246C;CIRCLED NUMBER THIRTEEN;No;0;ON;<circle> 0031 0033;;;13;N;;;;;
+246D;CIRCLED NUMBER FOURTEEN;No;0;ON;<circle> 0031 0034;;;14;N;;;;;
+246E;CIRCLED NUMBER FIFTEEN;No;0;ON;<circle> 0031 0035;;;15;N;;;;;
+246F;CIRCLED NUMBER SIXTEEN;No;0;ON;<circle> 0031 0036;;;16;N;;;;;
+2470;CIRCLED NUMBER SEVENTEEN;No;0;ON;<circle> 0031 0037;;;17;N;;;;;
+2471;CIRCLED NUMBER EIGHTEEN;No;0;ON;<circle> 0031 0038;;;18;N;;;;;
+2472;CIRCLED NUMBER NINETEEN;No;0;ON;<circle> 0031 0039;;;19;N;;;;;
+2473;CIRCLED NUMBER TWENTY;No;0;ON;<circle> 0032 0030;;;20;N;;;;;
+2474;PARENTHESIZED DIGIT ONE;No;0;ON;<compat> 0028 0031 0029;;1;1;N;;;;;
+2475;PARENTHESIZED DIGIT TWO;No;0;ON;<compat> 0028 0032 0029;;2;2;N;;;;;
+2476;PARENTHESIZED DIGIT THREE;No;0;ON;<compat> 0028 0033 0029;;3;3;N;;;;;
+2477;PARENTHESIZED DIGIT FOUR;No;0;ON;<compat> 0028 0034 0029;;4;4;N;;;;;
+2478;PARENTHESIZED DIGIT FIVE;No;0;ON;<compat> 0028 0035 0029;;5;5;N;;;;;
+2479;PARENTHESIZED DIGIT SIX;No;0;ON;<compat> 0028 0036 0029;;6;6;N;;;;;
+247A;PARENTHESIZED DIGIT SEVEN;No;0;ON;<compat> 0028 0037 0029;;7;7;N;;;;;
+247B;PARENTHESIZED DIGIT EIGHT;No;0;ON;<compat> 0028 0038 0029;;8;8;N;;;;;
+247C;PARENTHESIZED DIGIT NINE;No;0;ON;<compat> 0028 0039 0029;;9;9;N;;;;;
+247D;PARENTHESIZED NUMBER TEN;No;0;ON;<compat> 0028 0031 0030 0029;;;10;N;;;;;
+247E;PARENTHESIZED NUMBER ELEVEN;No;0;ON;<compat> 0028 0031 0031 0029;;;11;N;;;;;
+247F;PARENTHESIZED NUMBER TWELVE;No;0;ON;<compat> 0028 0031 0032 0029;;;12;N;;;;;
+2480;PARENTHESIZED NUMBER THIRTEEN;No;0;ON;<compat> 0028 0031 0033 0029;;;13;N;;;;;
+2481;PARENTHESIZED NUMBER FOURTEEN;No;0;ON;<compat> 0028 0031 0034 0029;;;14;N;;;;;
+2482;PARENTHESIZED NUMBER FIFTEEN;No;0;ON;<compat> 0028 0031 0035 0029;;;15;N;;;;;
+2483;PARENTHESIZED NUMBER SIXTEEN;No;0;ON;<compat> 0028 0031 0036 0029;;;16;N;;;;;
+2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;ON;<compat> 0028 0031 0037 0029;;;17;N;;;;;
+2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;ON;<compat> 0028 0031 0038 0029;;;18;N;;;;;
+2486;PARENTHESIZED NUMBER NINETEEN;No;0;ON;<compat> 0028 0031 0039 0029;;;19;N;;;;;
+2487;PARENTHESIZED NUMBER TWENTY;No;0;ON;<compat> 0028 0032 0030 0029;;;20;N;;;;;
2488;DIGIT ONE FULL STOP;No;0;EN;<compat> 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;;
2489;DIGIT TWO FULL STOP;No;0;EN;<compat> 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;;
248A;DIGIT THREE FULL STOP;No;0;EN;<compat> 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;;
@@ -6620,7 +7607,7 @@
24E7;CIRCLED LATIN SMALL LETTER X;So;0;L;<circle> 0078;;;;N;;;24CD;;24CD
24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L;<circle> 0079;;;;N;;;24CE;;24CE
24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L;<circle> 007A;;;;N;;;24CF;;24CF
-24EA;CIRCLED DIGIT ZERO;No;0;EN;<circle> 0030;;0;0;N;;;;;
+24EA;CIRCLED DIGIT ZERO;No;0;ON;<circle> 0030;;0;0;N;;;;;
24EB;NEGATIVE CIRCLED NUMBER ELEVEN;No;0;ON;;;;11;N;;;;;
24EC;NEGATIVE CIRCLED NUMBER TWELVE;No;0;ON;;;;12;N;;;;;
24ED;NEGATIVE CIRCLED NUMBER THIRTEEN;No;0;ON;;;;13;N;;;;;
@@ -6922,6 +7909,7 @@
2615;HOT BEVERAGE;So;0;ON;;;;;N;;;;;
2616;WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;;
2617;BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;;
+2618;SHAMROCK;So;0;ON;;;;;N;;;;;
2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;;
261A;BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;;
261B;BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;;
@@ -7023,6 +8011,8 @@
267B;BLACK UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;;
267C;RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;;
267D;PARTIALLY-RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;;
+267E;PERMANENT PAPER SIGN;So;0;ON;;;;;N;;;;;
+267F;WHEELCHAIR SYMBOL;So;0;ON;;;;;N;;;;;
2680;DIE FACE-1;So;0;ON;;;;;N;;;;;
2681;DIE FACE-2;So;0;ON;;;;;N;;;;;
2682;DIE FACE-3;So;0;ON;;;;;N;;;;;
@@ -7041,8 +8031,51 @@
268F;DIGRAM FOR GREATER YIN;So;0;ON;;;;;N;;;;;
2690;WHITE FLAG;So;0;ON;;;;;N;;;;;
2691;BLACK FLAG;So;0;ON;;;;;N;;;;;
+2692;HAMMER AND PICK;So;0;ON;;;;;N;;;;;
+2693;ANCHOR;So;0;ON;;;;;N;;;;;
+2694;CROSSED SWORDS;So;0;ON;;;;;N;;;;;
+2695;STAFF OF AESCULAPIUS;So;0;ON;;;;;N;;;;;
+2696;SCALES;So;0;ON;;;;;N;;;;;
+2697;ALEMBIC;So;0;ON;;;;;N;;;;;
+2698;FLOWER;So;0;ON;;;;;N;;;;;
+2699;GEAR;So;0;ON;;;;;N;;;;;
+269A;STAFF OF HERMES;So;0;ON;;;;;N;;;;;
+269B;ATOM SYMBOL;So;0;ON;;;;;N;;;;;
+269C;FLEUR-DE-LIS;So;0;ON;;;;;N;;;;;
+269D;OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;;
26A0;WARNING SIGN;So;0;ON;;;;;N;;;;;
26A1;HIGH VOLTAGE SIGN;So;0;ON;;;;;N;;;;;
+26A2;DOUBLED FEMALE SIGN;So;0;ON;;;;;N;;;;;
+26A3;DOUBLED MALE SIGN;So;0;ON;;;;;N;;;;;
+26A4;INTERLOCKED FEMALE AND MALE SIGN;So;0;ON;;;;;N;;;;;
+26A5;MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;;
+26A6;MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;;
+26A7;MALE WITH STROKE AND MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;;
+26A8;VERTICAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;;
+26A9;HORIZONTAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;;
+26AA;MEDIUM WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+26AB;MEDIUM BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+26AC;MEDIUM SMALL WHITE CIRCLE;So;0;L;;;;;N;;;;;
+26AD;MARRIAGE SYMBOL;So;0;ON;;;;;N;;;;;
+26AE;DIVORCE SYMBOL;So;0;ON;;;;;N;;;;;
+26AF;UNMARRIED PARTNERSHIP SYMBOL;So;0;ON;;;;;N;;;;;
+26B0;COFFIN;So;0;ON;;;;;N;;;;;
+26B1;FUNERAL URN;So;0;ON;;;;;N;;;;;
+26B2;NEUTER;So;0;ON;;;;;N;;;;;
+26B3;CERES;So;0;ON;;;;;N;;;;;
+26B4;PALLAS;So;0;ON;;;;;N;;;;;
+26B5;JUNO;So;0;ON;;;;;N;;;;;
+26B6;VESTA;So;0;ON;;;;;N;;;;;
+26B7;CHIRON;So;0;ON;;;;;N;;;;;
+26B8;BLACK MOON LILITH;So;0;ON;;;;;N;;;;;
+26B9;SEXTILE;So;0;ON;;;;;N;;;;;
+26BA;SEMISEXTILE;So;0;ON;;;;;N;;;;;
+26BB;QUINCUNX;So;0;ON;;;;;N;;;;;
+26BC;SESQUIQUADRATE;So;0;ON;;;;;N;;;;;
+26C0;WHITE DRAUGHTS MAN;So;0;ON;;;;;N;;;;;
+26C1;WHITE DRAUGHTS KING;So;0;ON;;;;;N;;;;;
+26C2;BLACK DRAUGHTS MAN;So;0;ON;;;;;N;;;;;
+26C3;BLACK DRAUGHTS KING;So;0;ON;;;;;N;;;;;
2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;;
2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;;
2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;;
@@ -7217,6 +8250,18 @@
27BC;WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;WEDGE-TAILED RIGHT ARROW;;;;
27BD;HEAVY WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WEDGE-TAILED RIGHT ARROW;;;;
27BE;OPEN-OUTLINED RIGHTWARDS ARROW;So;0;ON;;;;;N;OPEN-OUTLINED RIGHT ARROW;;;;
+27C0;THREE DIMENSIONAL ANGLE;Sm;0;ON;;;;;Y;;;;;
+27C1;WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE;Sm;0;ON;;;;;N;;;;;
+27C2;PERPENDICULAR;Sm;0;ON;;;;;N;;;;;
+27C3;OPEN SUBSET;Sm;0;ON;;;;;Y;;;;;
+27C4;OPEN SUPERSET;Sm;0;ON;;;;;Y;;;;;
+27C5;LEFT S-SHAPED BAG DELIMITER;Ps;0;ON;;;;;Y;;;;;
+27C6;RIGHT S-SHAPED BAG DELIMITER;Pe;0;ON;;;;;Y;;;;;
+27C7;OR WITH DOT INSIDE;Sm;0;ON;;;;;N;;;;;
+27C8;REVERSE SOLIDUS PRECEDING SUBSET;Sm;0;ON;;;;;Y;;;;;
+27C9;SUPERSET PRECEDING SOLIDUS;Sm;0;ON;;;;;Y;;;;;
+27CA;VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+27CC;LONG DIVISION;Sm;0;ON;;;;;Y;;;;;
27D0;WHITE DIAMOND WITH CENTRED DOT;Sm;0;ON;;;;;N;;;;;
27D1;AND WITH DOT;Sm;0;ON;;;;;N;;;;;
27D2;ELEMENT OF OPENING UPWARDS;Sm;0;ON;;;;;N;;;;;
@@ -7245,6 +8290,10 @@
27E9;MATHEMATICAL RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;;
27EA;MATHEMATICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;;
27EB;MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;;
+27EC;MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;;
+27ED;MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;;
+27EE;MATHEMATICAL LEFT FLATTENED PARENTHESIS;Ps;0;ON;;;;;Y;;;;;
+27EF;MATHEMATICAL RIGHT FLATTENED PARENTHESIS;Pe;0;ON;;;;;Y;;;;;
27F0;UPWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;;
27F1;DOWNWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;;
27F2;ANTICLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
@@ -7261,262 +8310,262 @@
27FD;LONG LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
27FE;LONG RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
27FF;LONG RIGHTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;;
-2800;BRAILLE PATTERN BLANK;So;0;ON;;;;;N;;;;;
-2801;BRAILLE PATTERN DOTS-1;So;0;ON;;;;;N;;;;;
-2802;BRAILLE PATTERN DOTS-2;So;0;ON;;;;;N;;;;;
-2803;BRAILLE PATTERN DOTS-12;So;0;ON;;;;;N;;;;;
-2804;BRAILLE PATTERN DOTS-3;So;0;ON;;;;;N;;;;;
-2805;BRAILLE PATTERN DOTS-13;So;0;ON;;;;;N;;;;;
-2806;BRAILLE PATTERN DOTS-23;So;0;ON;;;;;N;;;;;
-2807;BRAILLE PATTERN DOTS-123;So;0;ON;;;;;N;;;;;
-2808;BRAILLE PATTERN DOTS-4;So;0;ON;;;;;N;;;;;
-2809;BRAILLE PATTERN DOTS-14;So;0;ON;;;;;N;;;;;
-280A;BRAILLE PATTERN DOTS-24;So;0;ON;;;;;N;;;;;
-280B;BRAILLE PATTERN DOTS-124;So;0;ON;;;;;N;;;;;
-280C;BRAILLE PATTERN DOTS-34;So;0;ON;;;;;N;;;;;
-280D;BRAILLE PATTERN DOTS-134;So;0;ON;;;;;N;;;;;
-280E;BRAILLE PATTERN DOTS-234;So;0;ON;;;;;N;;;;;
-280F;BRAILLE PATTERN DOTS-1234;So;0;ON;;;;;N;;;;;
-2810;BRAILLE PATTERN DOTS-5;So;0;ON;;;;;N;;;;;
-2811;BRAILLE PATTERN DOTS-15;So;0;ON;;;;;N;;;;;
-2812;BRAILLE PATTERN DOTS-25;So;0;ON;;;;;N;;;;;
-2813;BRAILLE PATTERN DOTS-125;So;0;ON;;;;;N;;;;;
-2814;BRAILLE PATTERN DOTS-35;So;0;ON;;;;;N;;;;;
-2815;BRAILLE PATTERN DOTS-135;So;0;ON;;;;;N;;;;;
-2816;BRAILLE PATTERN DOTS-235;So;0;ON;;;;;N;;;;;
-2817;BRAILLE PATTERN DOTS-1235;So;0;ON;;;;;N;;;;;
-2818;BRAILLE PATTERN DOTS-45;So;0;ON;;;;;N;;;;;
-2819;BRAILLE PATTERN DOTS-145;So;0;ON;;;;;N;;;;;
-281A;BRAILLE PATTERN DOTS-245;So;0;ON;;;;;N;;;;;
-281B;BRAILLE PATTERN DOTS-1245;So;0;ON;;;;;N;;;;;
-281C;BRAILLE PATTERN DOTS-345;So;0;ON;;;;;N;;;;;
-281D;BRAILLE PATTERN DOTS-1345;So;0;ON;;;;;N;;;;;
-281E;BRAILLE PATTERN DOTS-2345;So;0;ON;;;;;N;;;;;
-281F;BRAILLE PATTERN DOTS-12345;So;0;ON;;;;;N;;;;;
-2820;BRAILLE PATTERN DOTS-6;So;0;ON;;;;;N;;;;;
-2821;BRAILLE PATTERN DOTS-16;So;0;ON;;;;;N;;;;;
-2822;BRAILLE PATTERN DOTS-26;So;0;ON;;;;;N;;;;;
-2823;BRAILLE PATTERN DOTS-126;So;0;ON;;;;;N;;;;;
-2824;BRAILLE PATTERN DOTS-36;So;0;ON;;;;;N;;;;;
-2825;BRAILLE PATTERN DOTS-136;So;0;ON;;;;;N;;;;;
-2826;BRAILLE PATTERN DOTS-236;So;0;ON;;;;;N;;;;;
-2827;BRAILLE PATTERN DOTS-1236;So;0;ON;;;;;N;;;;;
-2828;BRAILLE PATTERN DOTS-46;So;0;ON;;;;;N;;;;;
-2829;BRAILLE PATTERN DOTS-146;So;0;ON;;;;;N;;;;;
-282A;BRAILLE PATTERN DOTS-246;So;0;ON;;;;;N;;;;;
-282B;BRAILLE PATTERN DOTS-1246;So;0;ON;;;;;N;;;;;
-282C;BRAILLE PATTERN DOTS-346;So;0;ON;;;;;N;;;;;
-282D;BRAILLE PATTERN DOTS-1346;So;0;ON;;;;;N;;;;;
-282E;BRAILLE PATTERN DOTS-2346;So;0;ON;;;;;N;;;;;
-282F;BRAILLE PATTERN DOTS-12346;So;0;ON;;;;;N;;;;;
-2830;BRAILLE PATTERN DOTS-56;So;0;ON;;;;;N;;;;;
-2831;BRAILLE PATTERN DOTS-156;So;0;ON;;;;;N;;;;;
-2832;BRAILLE PATTERN DOTS-256;So;0;ON;;;;;N;;;;;
-2833;BRAILLE PATTERN DOTS-1256;So;0;ON;;;;;N;;;;;
-2834;BRAILLE PATTERN DOTS-356;So;0;ON;;;;;N;;;;;
-2835;BRAILLE PATTERN DOTS-1356;So;0;ON;;;;;N;;;;;
-2836;BRAILLE PATTERN DOTS-2356;So;0;ON;;;;;N;;;;;
-2837;BRAILLE PATTERN DOTS-12356;So;0;ON;;;;;N;;;;;
-2838;BRAILLE PATTERN DOTS-456;So;0;ON;;;;;N;;;;;
-2839;BRAILLE PATTERN DOTS-1456;So;0;ON;;;;;N;;;;;
-283A;BRAILLE PATTERN DOTS-2456;So;0;ON;;;;;N;;;;;
-283B;BRAILLE PATTERN DOTS-12456;So;0;ON;;;;;N;;;;;
-283C;BRAILLE PATTERN DOTS-3456;So;0;ON;;;;;N;;;;;
-283D;BRAILLE PATTERN DOTS-13456;So;0;ON;;;;;N;;;;;
-283E;BRAILLE PATTERN DOTS-23456;So;0;ON;;;;;N;;;;;
-283F;BRAILLE PATTERN DOTS-123456;So;0;ON;;;;;N;;;;;
-2840;BRAILLE PATTERN DOTS-7;So;0;ON;;;;;N;;;;;
-2841;BRAILLE PATTERN DOTS-17;So;0;ON;;;;;N;;;;;
-2842;BRAILLE PATTERN DOTS-27;So;0;ON;;;;;N;;;;;
-2843;BRAILLE PATTERN DOTS-127;So;0;ON;;;;;N;;;;;
-2844;BRAILLE PATTERN DOTS-37;So;0;ON;;;;;N;;;;;
-2845;BRAILLE PATTERN DOTS-137;So;0;ON;;;;;N;;;;;
-2846;BRAILLE PATTERN DOTS-237;So;0;ON;;;;;N;;;;;
-2847;BRAILLE PATTERN DOTS-1237;So;0;ON;;;;;N;;;;;
-2848;BRAILLE PATTERN DOTS-47;So;0;ON;;;;;N;;;;;
-2849;BRAILLE PATTERN DOTS-147;So;0;ON;;;;;N;;;;;
-284A;BRAILLE PATTERN DOTS-247;So;0;ON;;;;;N;;;;;
-284B;BRAILLE PATTERN DOTS-1247;So;0;ON;;;;;N;;;;;
-284C;BRAILLE PATTERN DOTS-347;So;0;ON;;;;;N;;;;;
-284D;BRAILLE PATTERN DOTS-1347;So;0;ON;;;;;N;;;;;
-284E;BRAILLE PATTERN DOTS-2347;So;0;ON;;;;;N;;;;;
-284F;BRAILLE PATTERN DOTS-12347;So;0;ON;;;;;N;;;;;
-2850;BRAILLE PATTERN DOTS-57;So;0;ON;;;;;N;;;;;
-2851;BRAILLE PATTERN DOTS-157;So;0;ON;;;;;N;;;;;
-2852;BRAILLE PATTERN DOTS-257;So;0;ON;;;;;N;;;;;
-2853;BRAILLE PATTERN DOTS-1257;So;0;ON;;;;;N;;;;;
-2854;BRAILLE PATTERN DOTS-357;So;0;ON;;;;;N;;;;;
-2855;BRAILLE PATTERN DOTS-1357;So;0;ON;;;;;N;;;;;
-2856;BRAILLE PATTERN DOTS-2357;So;0;ON;;;;;N;;;;;
-2857;BRAILLE PATTERN DOTS-12357;So;0;ON;;;;;N;;;;;
-2858;BRAILLE PATTERN DOTS-457;So;0;ON;;;;;N;;;;;
-2859;BRAILLE PATTERN DOTS-1457;So;0;ON;;;;;N;;;;;
-285A;BRAILLE PATTERN DOTS-2457;So;0;ON;;;;;N;;;;;
-285B;BRAILLE PATTERN DOTS-12457;So;0;ON;;;;;N;;;;;
-285C;BRAILLE PATTERN DOTS-3457;So;0;ON;;;;;N;;;;;
-285D;BRAILLE PATTERN DOTS-13457;So;0;ON;;;;;N;;;;;
-285E;BRAILLE PATTERN DOTS-23457;So;0;ON;;;;;N;;;;;
-285F;BRAILLE PATTERN DOTS-123457;So;0;ON;;;;;N;;;;;
-2860;BRAILLE PATTERN DOTS-67;So;0;ON;;;;;N;;;;;
-2861;BRAILLE PATTERN DOTS-167;So;0;ON;;;;;N;;;;;
-2862;BRAILLE PATTERN DOTS-267;So;0;ON;;;;;N;;;;;
-2863;BRAILLE PATTERN DOTS-1267;So;0;ON;;;;;N;;;;;
-2864;BRAILLE PATTERN DOTS-367;So;0;ON;;;;;N;;;;;
-2865;BRAILLE PATTERN DOTS-1367;So;0;ON;;;;;N;;;;;
-2866;BRAILLE PATTERN DOTS-2367;So;0;ON;;;;;N;;;;;
-2867;BRAILLE PATTERN DOTS-12367;So;0;ON;;;;;N;;;;;
-2868;BRAILLE PATTERN DOTS-467;So;0;ON;;;;;N;;;;;
-2869;BRAILLE PATTERN DOTS-1467;So;0;ON;;;;;N;;;;;
-286A;BRAILLE PATTERN DOTS-2467;So;0;ON;;;;;N;;;;;
-286B;BRAILLE PATTERN DOTS-12467;So;0;ON;;;;;N;;;;;
-286C;BRAILLE PATTERN DOTS-3467;So;0;ON;;;;;N;;;;;
-286D;BRAILLE PATTERN DOTS-13467;So;0;ON;;;;;N;;;;;
-286E;BRAILLE PATTERN DOTS-23467;So;0;ON;;;;;N;;;;;
-286F;BRAILLE PATTERN DOTS-123467;So;0;ON;;;;;N;;;;;
-2870;BRAILLE PATTERN DOTS-567;So;0;ON;;;;;N;;;;;
-2871;BRAILLE PATTERN DOTS-1567;So;0;ON;;;;;N;;;;;
-2872;BRAILLE PATTERN DOTS-2567;So;0;ON;;;;;N;;;;;
-2873;BRAILLE PATTERN DOTS-12567;So;0;ON;;;;;N;;;;;
-2874;BRAILLE PATTERN DOTS-3567;So;0;ON;;;;;N;;;;;
-2875;BRAILLE PATTERN DOTS-13567;So;0;ON;;;;;N;;;;;
-2876;BRAILLE PATTERN DOTS-23567;So;0;ON;;;;;N;;;;;
-2877;BRAILLE PATTERN DOTS-123567;So;0;ON;;;;;N;;;;;
-2878;BRAILLE PATTERN DOTS-4567;So;0;ON;;;;;N;;;;;
-2879;BRAILLE PATTERN DOTS-14567;So;0;ON;;;;;N;;;;;
-287A;BRAILLE PATTERN DOTS-24567;So;0;ON;;;;;N;;;;;
-287B;BRAILLE PATTERN DOTS-124567;So;0;ON;;;;;N;;;;;
-287C;BRAILLE PATTERN DOTS-34567;So;0;ON;;;;;N;;;;;
-287D;BRAILLE PATTERN DOTS-134567;So;0;ON;;;;;N;;;;;
-287E;BRAILLE PATTERN DOTS-234567;So;0;ON;;;;;N;;;;;
-287F;BRAILLE PATTERN DOTS-1234567;So;0;ON;;;;;N;;;;;
-2880;BRAILLE PATTERN DOTS-8;So;0;ON;;;;;N;;;;;
-2881;BRAILLE PATTERN DOTS-18;So;0;ON;;;;;N;;;;;
-2882;BRAILLE PATTERN DOTS-28;So;0;ON;;;;;N;;;;;
-2883;BRAILLE PATTERN DOTS-128;So;0;ON;;;;;N;;;;;
-2884;BRAILLE PATTERN DOTS-38;So;0;ON;;;;;N;;;;;
-2885;BRAILLE PATTERN DOTS-138;So;0;ON;;;;;N;;;;;
-2886;BRAILLE PATTERN DOTS-238;So;0;ON;;;;;N;;;;;
-2887;BRAILLE PATTERN DOTS-1238;So;0;ON;;;;;N;;;;;
-2888;BRAILLE PATTERN DOTS-48;So;0;ON;;;;;N;;;;;
-2889;BRAILLE PATTERN DOTS-148;So;0;ON;;;;;N;;;;;
-288A;BRAILLE PATTERN DOTS-248;So;0;ON;;;;;N;;;;;
-288B;BRAILLE PATTERN DOTS-1248;So;0;ON;;;;;N;;;;;
-288C;BRAILLE PATTERN DOTS-348;So;0;ON;;;;;N;;;;;
-288D;BRAILLE PATTERN DOTS-1348;So;0;ON;;;;;N;;;;;
-288E;BRAILLE PATTERN DOTS-2348;So;0;ON;;;;;N;;;;;
-288F;BRAILLE PATTERN DOTS-12348;So;0;ON;;;;;N;;;;;
-2890;BRAILLE PATTERN DOTS-58;So;0;ON;;;;;N;;;;;
-2891;BRAILLE PATTERN DOTS-158;So;0;ON;;;;;N;;;;;
-2892;BRAILLE PATTERN DOTS-258;So;0;ON;;;;;N;;;;;
-2893;BRAILLE PATTERN DOTS-1258;So;0;ON;;;;;N;;;;;
-2894;BRAILLE PATTERN DOTS-358;So;0;ON;;;;;N;;;;;
-2895;BRAILLE PATTERN DOTS-1358;So;0;ON;;;;;N;;;;;
-2896;BRAILLE PATTERN DOTS-2358;So;0;ON;;;;;N;;;;;
-2897;BRAILLE PATTERN DOTS-12358;So;0;ON;;;;;N;;;;;
-2898;BRAILLE PATTERN DOTS-458;So;0;ON;;;;;N;;;;;
-2899;BRAILLE PATTERN DOTS-1458;So;0;ON;;;;;N;;;;;
-289A;BRAILLE PATTERN DOTS-2458;So;0;ON;;;;;N;;;;;
-289B;BRAILLE PATTERN DOTS-12458;So;0;ON;;;;;N;;;;;
-289C;BRAILLE PATTERN DOTS-3458;So;0;ON;;;;;N;;;;;
-289D;BRAILLE PATTERN DOTS-13458;So;0;ON;;;;;N;;;;;
-289E;BRAILLE PATTERN DOTS-23458;So;0;ON;;;;;N;;;;;
-289F;BRAILLE PATTERN DOTS-123458;So;0;ON;;;;;N;;;;;
-28A0;BRAILLE PATTERN DOTS-68;So;0;ON;;;;;N;;;;;
-28A1;BRAILLE PATTERN DOTS-168;So;0;ON;;;;;N;;;;;
-28A2;BRAILLE PATTERN DOTS-268;So;0;ON;;;;;N;;;;;
-28A3;BRAILLE PATTERN DOTS-1268;So;0;ON;;;;;N;;;;;
-28A4;BRAILLE PATTERN DOTS-368;So;0;ON;;;;;N;;;;;
-28A5;BRAILLE PATTERN DOTS-1368;So;0;ON;;;;;N;;;;;
-28A6;BRAILLE PATTERN DOTS-2368;So;0;ON;;;;;N;;;;;
-28A7;BRAILLE PATTERN DOTS-12368;So;0;ON;;;;;N;;;;;
-28A8;BRAILLE PATTERN DOTS-468;So;0;ON;;;;;N;;;;;
-28A9;BRAILLE PATTERN DOTS-1468;So;0;ON;;;;;N;;;;;
-28AA;BRAILLE PATTERN DOTS-2468;So;0;ON;;;;;N;;;;;
-28AB;BRAILLE PATTERN DOTS-12468;So;0;ON;;;;;N;;;;;
-28AC;BRAILLE PATTERN DOTS-3468;So;0;ON;;;;;N;;;;;
-28AD;BRAILLE PATTERN DOTS-13468;So;0;ON;;;;;N;;;;;
-28AE;BRAILLE PATTERN DOTS-23468;So;0;ON;;;;;N;;;;;
-28AF;BRAILLE PATTERN DOTS-123468;So;0;ON;;;;;N;;;;;
-28B0;BRAILLE PATTERN DOTS-568;So;0;ON;;;;;N;;;;;
-28B1;BRAILLE PATTERN DOTS-1568;So;0;ON;;;;;N;;;;;
-28B2;BRAILLE PATTERN DOTS-2568;So;0;ON;;;;;N;;;;;
-28B3;BRAILLE PATTERN DOTS-12568;So;0;ON;;;;;N;;;;;
-28B4;BRAILLE PATTERN DOTS-3568;So;0;ON;;;;;N;;;;;
-28B5;BRAILLE PATTERN DOTS-13568;So;0;ON;;;;;N;;;;;
-28B6;BRAILLE PATTERN DOTS-23568;So;0;ON;;;;;N;;;;;
-28B7;BRAILLE PATTERN DOTS-123568;So;0;ON;;;;;N;;;;;
-28B8;BRAILLE PATTERN DOTS-4568;So;0;ON;;;;;N;;;;;
-28B9;BRAILLE PATTERN DOTS-14568;So;0;ON;;;;;N;;;;;
-28BA;BRAILLE PATTERN DOTS-24568;So;0;ON;;;;;N;;;;;
-28BB;BRAILLE PATTERN DOTS-124568;So;0;ON;;;;;N;;;;;
-28BC;BRAILLE PATTERN DOTS-34568;So;0;ON;;;;;N;;;;;
-28BD;BRAILLE PATTERN DOTS-134568;So;0;ON;;;;;N;;;;;
-28BE;BRAILLE PATTERN DOTS-234568;So;0;ON;;;;;N;;;;;
-28BF;BRAILLE PATTERN DOTS-1234568;So;0;ON;;;;;N;;;;;
-28C0;BRAILLE PATTERN DOTS-78;So;0;ON;;;;;N;;;;;
-28C1;BRAILLE PATTERN DOTS-178;So;0;ON;;;;;N;;;;;
-28C2;BRAILLE PATTERN DOTS-278;So;0;ON;;;;;N;;;;;
-28C3;BRAILLE PATTERN DOTS-1278;So;0;ON;;;;;N;;;;;
-28C4;BRAILLE PATTERN DOTS-378;So;0;ON;;;;;N;;;;;
-28C5;BRAILLE PATTERN DOTS-1378;So;0;ON;;;;;N;;;;;
-28C6;BRAILLE PATTERN DOTS-2378;So;0;ON;;;;;N;;;;;
-28C7;BRAILLE PATTERN DOTS-12378;So;0;ON;;;;;N;;;;;
-28C8;BRAILLE PATTERN DOTS-478;So;0;ON;;;;;N;;;;;
-28C9;BRAILLE PATTERN DOTS-1478;So;0;ON;;;;;N;;;;;
-28CA;BRAILLE PATTERN DOTS-2478;So;0;ON;;;;;N;;;;;
-28CB;BRAILLE PATTERN DOTS-12478;So;0;ON;;;;;N;;;;;
-28CC;BRAILLE PATTERN DOTS-3478;So;0;ON;;;;;N;;;;;
-28CD;BRAILLE PATTERN DOTS-13478;So;0;ON;;;;;N;;;;;
-28CE;BRAILLE PATTERN DOTS-23478;So;0;ON;;;;;N;;;;;
-28CF;BRAILLE PATTERN DOTS-123478;So;0;ON;;;;;N;;;;;
-28D0;BRAILLE PATTERN DOTS-578;So;0;ON;;;;;N;;;;;
-28D1;BRAILLE PATTERN DOTS-1578;So;0;ON;;;;;N;;;;;
-28D2;BRAILLE PATTERN DOTS-2578;So;0;ON;;;;;N;;;;;
-28D3;BRAILLE PATTERN DOTS-12578;So;0;ON;;;;;N;;;;;
-28D4;BRAILLE PATTERN DOTS-3578;So;0;ON;;;;;N;;;;;
-28D5;BRAILLE PATTERN DOTS-13578;So;0;ON;;;;;N;;;;;
-28D6;BRAILLE PATTERN DOTS-23578;So;0;ON;;;;;N;;;;;
-28D7;BRAILLE PATTERN DOTS-123578;So;0;ON;;;;;N;;;;;
-28D8;BRAILLE PATTERN DOTS-4578;So;0;ON;;;;;N;;;;;
-28D9;BRAILLE PATTERN DOTS-14578;So;0;ON;;;;;N;;;;;
-28DA;BRAILLE PATTERN DOTS-24578;So;0;ON;;;;;N;;;;;
-28DB;BRAILLE PATTERN DOTS-124578;So;0;ON;;;;;N;;;;;
-28DC;BRAILLE PATTERN DOTS-34578;So;0;ON;;;;;N;;;;;
-28DD;BRAILLE PATTERN DOTS-134578;So;0;ON;;;;;N;;;;;
-28DE;BRAILLE PATTERN DOTS-234578;So;0;ON;;;;;N;;;;;
-28DF;BRAILLE PATTERN DOTS-1234578;So;0;ON;;;;;N;;;;;
-28E0;BRAILLE PATTERN DOTS-678;So;0;ON;;;;;N;;;;;
-28E1;BRAILLE PATTERN DOTS-1678;So;0;ON;;;;;N;;;;;
-28E2;BRAILLE PATTERN DOTS-2678;So;0;ON;;;;;N;;;;;
-28E3;BRAILLE PATTERN DOTS-12678;So;0;ON;;;;;N;;;;;
-28E4;BRAILLE PATTERN DOTS-3678;So;0;ON;;;;;N;;;;;
-28E5;BRAILLE PATTERN DOTS-13678;So;0;ON;;;;;N;;;;;
-28E6;BRAILLE PATTERN DOTS-23678;So;0;ON;;;;;N;;;;;
-28E7;BRAILLE PATTERN DOTS-123678;So;0;ON;;;;;N;;;;;
-28E8;BRAILLE PATTERN DOTS-4678;So;0;ON;;;;;N;;;;;
-28E9;BRAILLE PATTERN DOTS-14678;So;0;ON;;;;;N;;;;;
-28EA;BRAILLE PATTERN DOTS-24678;So;0;ON;;;;;N;;;;;
-28EB;BRAILLE PATTERN DOTS-124678;So;0;ON;;;;;N;;;;;
-28EC;BRAILLE PATTERN DOTS-34678;So;0;ON;;;;;N;;;;;
-28ED;BRAILLE PATTERN DOTS-134678;So;0;ON;;;;;N;;;;;
-28EE;BRAILLE PATTERN DOTS-234678;So;0;ON;;;;;N;;;;;
-28EF;BRAILLE PATTERN DOTS-1234678;So;0;ON;;;;;N;;;;;
-28F0;BRAILLE PATTERN DOTS-5678;So;0;ON;;;;;N;;;;;
-28F1;BRAILLE PATTERN DOTS-15678;So;0;ON;;;;;N;;;;;
-28F2;BRAILLE PATTERN DOTS-25678;So;0;ON;;;;;N;;;;;
-28F3;BRAILLE PATTERN DOTS-125678;So;0;ON;;;;;N;;;;;
-28F4;BRAILLE PATTERN DOTS-35678;So;0;ON;;;;;N;;;;;
-28F5;BRAILLE PATTERN DOTS-135678;So;0;ON;;;;;N;;;;;
-28F6;BRAILLE PATTERN DOTS-235678;So;0;ON;;;;;N;;;;;
-28F7;BRAILLE PATTERN DOTS-1235678;So;0;ON;;;;;N;;;;;
-28F8;BRAILLE PATTERN DOTS-45678;So;0;ON;;;;;N;;;;;
-28F9;BRAILLE PATTERN DOTS-145678;So;0;ON;;;;;N;;;;;
-28FA;BRAILLE PATTERN DOTS-245678;So;0;ON;;;;;N;;;;;
-28FB;BRAILLE PATTERN DOTS-1245678;So;0;ON;;;;;N;;;;;
-28FC;BRAILLE PATTERN DOTS-345678;So;0;ON;;;;;N;;;;;
-28FD;BRAILLE PATTERN DOTS-1345678;So;0;ON;;;;;N;;;;;
-28FE;BRAILLE PATTERN DOTS-2345678;So;0;ON;;;;;N;;;;;
-28FF;BRAILLE PATTERN DOTS-12345678;So;0;ON;;;;;N;;;;;
+2800;BRAILLE PATTERN BLANK;So;0;L;;;;;N;;;;;
+2801;BRAILLE PATTERN DOTS-1;So;0;L;;;;;N;;;;;
+2802;BRAILLE PATTERN DOTS-2;So;0;L;;;;;N;;;;;
+2803;BRAILLE PATTERN DOTS-12;So;0;L;;;;;N;;;;;
+2804;BRAILLE PATTERN DOTS-3;So;0;L;;;;;N;;;;;
+2805;BRAILLE PATTERN DOTS-13;So;0;L;;;;;N;;;;;
+2806;BRAILLE PATTERN DOTS-23;So;0;L;;;;;N;;;;;
+2807;BRAILLE PATTERN DOTS-123;So;0;L;;;;;N;;;;;
+2808;BRAILLE PATTERN DOTS-4;So;0;L;;;;;N;;;;;
+2809;BRAILLE PATTERN DOTS-14;So;0;L;;;;;N;;;;;
+280A;BRAILLE PATTERN DOTS-24;So;0;L;;;;;N;;;;;
+280B;BRAILLE PATTERN DOTS-124;So;0;L;;;;;N;;;;;
+280C;BRAILLE PATTERN DOTS-34;So;0;L;;;;;N;;;;;
+280D;BRAILLE PATTERN DOTS-134;So;0;L;;;;;N;;;;;
+280E;BRAILLE PATTERN DOTS-234;So;0;L;;;;;N;;;;;
+280F;BRAILLE PATTERN DOTS-1234;So;0;L;;;;;N;;;;;
+2810;BRAILLE PATTERN DOTS-5;So;0;L;;;;;N;;;;;
+2811;BRAILLE PATTERN DOTS-15;So;0;L;;;;;N;;;;;
+2812;BRAILLE PATTERN DOTS-25;So;0;L;;;;;N;;;;;
+2813;BRAILLE PATTERN DOTS-125;So;0;L;;;;;N;;;;;
+2814;BRAILLE PATTERN DOTS-35;So;0;L;;;;;N;;;;;
+2815;BRAILLE PATTERN DOTS-135;So;0;L;;;;;N;;;;;
+2816;BRAILLE PATTERN DOTS-235;So;0;L;;;;;N;;;;;
+2817;BRAILLE PATTERN DOTS-1235;So;0;L;;;;;N;;;;;
+2818;BRAILLE PATTERN DOTS-45;So;0;L;;;;;N;;;;;
+2819;BRAILLE PATTERN DOTS-145;So;0;L;;;;;N;;;;;
+281A;BRAILLE PATTERN DOTS-245;So;0;L;;;;;N;;;;;
+281B;BRAILLE PATTERN DOTS-1245;So;0;L;;;;;N;;;;;
+281C;BRAILLE PATTERN DOTS-345;So;0;L;;;;;N;;;;;
+281D;BRAILLE PATTERN DOTS-1345;So;0;L;;;;;N;;;;;
+281E;BRAILLE PATTERN DOTS-2345;So;0;L;;;;;N;;;;;
+281F;BRAILLE PATTERN DOTS-12345;So;0;L;;;;;N;;;;;
+2820;BRAILLE PATTERN DOTS-6;So;0;L;;;;;N;;;;;
+2821;BRAILLE PATTERN DOTS-16;So;0;L;;;;;N;;;;;
+2822;BRAILLE PATTERN DOTS-26;So;0;L;;;;;N;;;;;
+2823;BRAILLE PATTERN DOTS-126;So;0;L;;;;;N;;;;;
+2824;BRAILLE PATTERN DOTS-36;So;0;L;;;;;N;;;;;
+2825;BRAILLE PATTERN DOTS-136;So;0;L;;;;;N;;;;;
+2826;BRAILLE PATTERN DOTS-236;So;0;L;;;;;N;;;;;
+2827;BRAILLE PATTERN DOTS-1236;So;0;L;;;;;N;;;;;
+2828;BRAILLE PATTERN DOTS-46;So;0;L;;;;;N;;;;;
+2829;BRAILLE PATTERN DOTS-146;So;0;L;;;;;N;;;;;
+282A;BRAILLE PATTERN DOTS-246;So;0;L;;;;;N;;;;;
+282B;BRAILLE PATTERN DOTS-1246;So;0;L;;;;;N;;;;;
+282C;BRAILLE PATTERN DOTS-346;So;0;L;;;;;N;;;;;
+282D;BRAILLE PATTERN DOTS-1346;So;0;L;;;;;N;;;;;
+282E;BRAILLE PATTERN DOTS-2346;So;0;L;;;;;N;;;;;
+282F;BRAILLE PATTERN DOTS-12346;So;0;L;;;;;N;;;;;
+2830;BRAILLE PATTERN DOTS-56;So;0;L;;;;;N;;;;;
+2831;BRAILLE PATTERN DOTS-156;So;0;L;;;;;N;;;;;
+2832;BRAILLE PATTERN DOTS-256;So;0;L;;;;;N;;;;;
+2833;BRAILLE PATTERN DOTS-1256;So;0;L;;;;;N;;;;;
+2834;BRAILLE PATTERN DOTS-356;So;0;L;;;;;N;;;;;
+2835;BRAILLE PATTERN DOTS-1356;So;0;L;;;;;N;;;;;
+2836;BRAILLE PATTERN DOTS-2356;So;0;L;;;;;N;;;;;
+2837;BRAILLE PATTERN DOTS-12356;So;0;L;;;;;N;;;;;
+2838;BRAILLE PATTERN DOTS-456;So;0;L;;;;;N;;;;;
+2839;BRAILLE PATTERN DOTS-1456;So;0;L;;;;;N;;;;;
+283A;BRAILLE PATTERN DOTS-2456;So;0;L;;;;;N;;;;;
+283B;BRAILLE PATTERN DOTS-12456;So;0;L;;;;;N;;;;;
+283C;BRAILLE PATTERN DOTS-3456;So;0;L;;;;;N;;;;;
+283D;BRAILLE PATTERN DOTS-13456;So;0;L;;;;;N;;;;;
+283E;BRAILLE PATTERN DOTS-23456;So;0;L;;;;;N;;;;;
+283F;BRAILLE PATTERN DOTS-123456;So;0;L;;;;;N;;;;;
+2840;BRAILLE PATTERN DOTS-7;So;0;L;;;;;N;;;;;
+2841;BRAILLE PATTERN DOTS-17;So;0;L;;;;;N;;;;;
+2842;BRAILLE PATTERN DOTS-27;So;0;L;;;;;N;;;;;
+2843;BRAILLE PATTERN DOTS-127;So;0;L;;;;;N;;;;;
+2844;BRAILLE PATTERN DOTS-37;So;0;L;;;;;N;;;;;
+2845;BRAILLE PATTERN DOTS-137;So;0;L;;;;;N;;;;;
+2846;BRAILLE PATTERN DOTS-237;So;0;L;;;;;N;;;;;
+2847;BRAILLE PATTERN DOTS-1237;So;0;L;;;;;N;;;;;
+2848;BRAILLE PATTERN DOTS-47;So;0;L;;;;;N;;;;;
+2849;BRAILLE PATTERN DOTS-147;So;0;L;;;;;N;;;;;
+284A;BRAILLE PATTERN DOTS-247;So;0;L;;;;;N;;;;;
+284B;BRAILLE PATTERN DOTS-1247;So;0;L;;;;;N;;;;;
+284C;BRAILLE PATTERN DOTS-347;So;0;L;;;;;N;;;;;
+284D;BRAILLE PATTERN DOTS-1347;So;0;L;;;;;N;;;;;
+284E;BRAILLE PATTERN DOTS-2347;So;0;L;;;;;N;;;;;
+284F;BRAILLE PATTERN DOTS-12347;So;0;L;;;;;N;;;;;
+2850;BRAILLE PATTERN DOTS-57;So;0;L;;;;;N;;;;;
+2851;BRAILLE PATTERN DOTS-157;So;0;L;;;;;N;;;;;
+2852;BRAILLE PATTERN DOTS-257;So;0;L;;;;;N;;;;;
+2853;BRAILLE PATTERN DOTS-1257;So;0;L;;;;;N;;;;;
+2854;BRAILLE PATTERN DOTS-357;So;0;L;;;;;N;;;;;
+2855;BRAILLE PATTERN DOTS-1357;So;0;L;;;;;N;;;;;
+2856;BRAILLE PATTERN DOTS-2357;So;0;L;;;;;N;;;;;
+2857;BRAILLE PATTERN DOTS-12357;So;0;L;;;;;N;;;;;
+2858;BRAILLE PATTERN DOTS-457;So;0;L;;;;;N;;;;;
+2859;BRAILLE PATTERN DOTS-1457;So;0;L;;;;;N;;;;;
+285A;BRAILLE PATTERN DOTS-2457;So;0;L;;;;;N;;;;;
+285B;BRAILLE PATTERN DOTS-12457;So;0;L;;;;;N;;;;;
+285C;BRAILLE PATTERN DOTS-3457;So;0;L;;;;;N;;;;;
+285D;BRAILLE PATTERN DOTS-13457;So;0;L;;;;;N;;;;;
+285E;BRAILLE PATTERN DOTS-23457;So;0;L;;;;;N;;;;;
+285F;BRAILLE PATTERN DOTS-123457;So;0;L;;;;;N;;;;;
+2860;BRAILLE PATTERN DOTS-67;So;0;L;;;;;N;;;;;
+2861;BRAILLE PATTERN DOTS-167;So;0;L;;;;;N;;;;;
+2862;BRAILLE PATTERN DOTS-267;So;0;L;;;;;N;;;;;
+2863;BRAILLE PATTERN DOTS-1267;So;0;L;;;;;N;;;;;
+2864;BRAILLE PATTERN DOTS-367;So;0;L;;;;;N;;;;;
+2865;BRAILLE PATTERN DOTS-1367;So;0;L;;;;;N;;;;;
+2866;BRAILLE PATTERN DOTS-2367;So;0;L;;;;;N;;;;;
+2867;BRAILLE PATTERN DOTS-12367;So;0;L;;;;;N;;;;;
+2868;BRAILLE PATTERN DOTS-467;So;0;L;;;;;N;;;;;
+2869;BRAILLE PATTERN DOTS-1467;So;0;L;;;;;N;;;;;
+286A;BRAILLE PATTERN DOTS-2467;So;0;L;;;;;N;;;;;
+286B;BRAILLE PATTERN DOTS-12467;So;0;L;;;;;N;;;;;
+286C;BRAILLE PATTERN DOTS-3467;So;0;L;;;;;N;;;;;
+286D;BRAILLE PATTERN DOTS-13467;So;0;L;;;;;N;;;;;
+286E;BRAILLE PATTERN DOTS-23467;So;0;L;;;;;N;;;;;
+286F;BRAILLE PATTERN DOTS-123467;So;0;L;;;;;N;;;;;
+2870;BRAILLE PATTERN DOTS-567;So;0;L;;;;;N;;;;;
+2871;BRAILLE PATTERN DOTS-1567;So;0;L;;;;;N;;;;;
+2872;BRAILLE PATTERN DOTS-2567;So;0;L;;;;;N;;;;;
+2873;BRAILLE PATTERN DOTS-12567;So;0;L;;;;;N;;;;;
+2874;BRAILLE PATTERN DOTS-3567;So;0;L;;;;;N;;;;;
+2875;BRAILLE PATTERN DOTS-13567;So;0;L;;;;;N;;;;;
+2876;BRAILLE PATTERN DOTS-23567;So;0;L;;;;;N;;;;;
+2877;BRAILLE PATTERN DOTS-123567;So;0;L;;;;;N;;;;;
+2878;BRAILLE PATTERN DOTS-4567;So;0;L;;;;;N;;;;;
+2879;BRAILLE PATTERN DOTS-14567;So;0;L;;;;;N;;;;;
+287A;BRAILLE PATTERN DOTS-24567;So;0;L;;;;;N;;;;;
+287B;BRAILLE PATTERN DOTS-124567;So;0;L;;;;;N;;;;;
+287C;BRAILLE PATTERN DOTS-34567;So;0;L;;;;;N;;;;;
+287D;BRAILLE PATTERN DOTS-134567;So;0;L;;;;;N;;;;;
+287E;BRAILLE PATTERN DOTS-234567;So;0;L;;;;;N;;;;;
+287F;BRAILLE PATTERN DOTS-1234567;So;0;L;;;;;N;;;;;
+2880;BRAILLE PATTERN DOTS-8;So;0;L;;;;;N;;;;;
+2881;BRAILLE PATTERN DOTS-18;So;0;L;;;;;N;;;;;
+2882;BRAILLE PATTERN DOTS-28;So;0;L;;;;;N;;;;;
+2883;BRAILLE PATTERN DOTS-128;So;0;L;;;;;N;;;;;
+2884;BRAILLE PATTERN DOTS-38;So;0;L;;;;;N;;;;;
+2885;BRAILLE PATTERN DOTS-138;So;0;L;;;;;N;;;;;
+2886;BRAILLE PATTERN DOTS-238;So;0;L;;;;;N;;;;;
+2887;BRAILLE PATTERN DOTS-1238;So;0;L;;;;;N;;;;;
+2888;BRAILLE PATTERN DOTS-48;So;0;L;;;;;N;;;;;
+2889;BRAILLE PATTERN DOTS-148;So;0;L;;;;;N;;;;;
+288A;BRAILLE PATTERN DOTS-248;So;0;L;;;;;N;;;;;
+288B;BRAILLE PATTERN DOTS-1248;So;0;L;;;;;N;;;;;
+288C;BRAILLE PATTERN DOTS-348;So;0;L;;;;;N;;;;;
+288D;BRAILLE PATTERN DOTS-1348;So;0;L;;;;;N;;;;;
+288E;BRAILLE PATTERN DOTS-2348;So;0;L;;;;;N;;;;;
+288F;BRAILLE PATTERN DOTS-12348;So;0;L;;;;;N;;;;;
+2890;BRAILLE PATTERN DOTS-58;So;0;L;;;;;N;;;;;
+2891;BRAILLE PATTERN DOTS-158;So;0;L;;;;;N;;;;;
+2892;BRAILLE PATTERN DOTS-258;So;0;L;;;;;N;;;;;
+2893;BRAILLE PATTERN DOTS-1258;So;0;L;;;;;N;;;;;
+2894;BRAILLE PATTERN DOTS-358;So;0;L;;;;;N;;;;;
+2895;BRAILLE PATTERN DOTS-1358;So;0;L;;;;;N;;;;;
+2896;BRAILLE PATTERN DOTS-2358;So;0;L;;;;;N;;;;;
+2897;BRAILLE PATTERN DOTS-12358;So;0;L;;;;;N;;;;;
+2898;BRAILLE PATTERN DOTS-458;So;0;L;;;;;N;;;;;
+2899;BRAILLE PATTERN DOTS-1458;So;0;L;;;;;N;;;;;
+289A;BRAILLE PATTERN DOTS-2458;So;0;L;;;;;N;;;;;
+289B;BRAILLE PATTERN DOTS-12458;So;0;L;;;;;N;;;;;
+289C;BRAILLE PATTERN DOTS-3458;So;0;L;;;;;N;;;;;
+289D;BRAILLE PATTERN DOTS-13458;So;0;L;;;;;N;;;;;
+289E;BRAILLE PATTERN DOTS-23458;So;0;L;;;;;N;;;;;
+289F;BRAILLE PATTERN DOTS-123458;So;0;L;;;;;N;;;;;
+28A0;BRAILLE PATTERN DOTS-68;So;0;L;;;;;N;;;;;
+28A1;BRAILLE PATTERN DOTS-168;So;0;L;;;;;N;;;;;
+28A2;BRAILLE PATTERN DOTS-268;So;0;L;;;;;N;;;;;
+28A3;BRAILLE PATTERN DOTS-1268;So;0;L;;;;;N;;;;;
+28A4;BRAILLE PATTERN DOTS-368;So;0;L;;;;;N;;;;;
+28A5;BRAILLE PATTERN DOTS-1368;So;0;L;;;;;N;;;;;
+28A6;BRAILLE PATTERN DOTS-2368;So;0;L;;;;;N;;;;;
+28A7;BRAILLE PATTERN DOTS-12368;So;0;L;;;;;N;;;;;
+28A8;BRAILLE PATTERN DOTS-468;So;0;L;;;;;N;;;;;
+28A9;BRAILLE PATTERN DOTS-1468;So;0;L;;;;;N;;;;;
+28AA;BRAILLE PATTERN DOTS-2468;So;0;L;;;;;N;;;;;
+28AB;BRAILLE PATTERN DOTS-12468;So;0;L;;;;;N;;;;;
+28AC;BRAILLE PATTERN DOTS-3468;So;0;L;;;;;N;;;;;
+28AD;BRAILLE PATTERN DOTS-13468;So;0;L;;;;;N;;;;;
+28AE;BRAILLE PATTERN DOTS-23468;So;0;L;;;;;N;;;;;
+28AF;BRAILLE PATTERN DOTS-123468;So;0;L;;;;;N;;;;;
+28B0;BRAILLE PATTERN DOTS-568;So;0;L;;;;;N;;;;;
+28B1;BRAILLE PATTERN DOTS-1568;So;0;L;;;;;N;;;;;
+28B2;BRAILLE PATTERN DOTS-2568;So;0;L;;;;;N;;;;;
+28B3;BRAILLE PATTERN DOTS-12568;So;0;L;;;;;N;;;;;
+28B4;BRAILLE PATTERN DOTS-3568;So;0;L;;;;;N;;;;;
+28B5;BRAILLE PATTERN DOTS-13568;So;0;L;;;;;N;;;;;
+28B6;BRAILLE PATTERN DOTS-23568;So;0;L;;;;;N;;;;;
+28B7;BRAILLE PATTERN DOTS-123568;So;0;L;;;;;N;;;;;
+28B8;BRAILLE PATTERN DOTS-4568;So;0;L;;;;;N;;;;;
+28B9;BRAILLE PATTERN DOTS-14568;So;0;L;;;;;N;;;;;
+28BA;BRAILLE PATTERN DOTS-24568;So;0;L;;;;;N;;;;;
+28BB;BRAILLE PATTERN DOTS-124568;So;0;L;;;;;N;;;;;
+28BC;BRAILLE PATTERN DOTS-34568;So;0;L;;;;;N;;;;;
+28BD;BRAILLE PATTERN DOTS-134568;So;0;L;;;;;N;;;;;
+28BE;BRAILLE PATTERN DOTS-234568;So;0;L;;;;;N;;;;;
+28BF;BRAILLE PATTERN DOTS-1234568;So;0;L;;;;;N;;;;;
+28C0;BRAILLE PATTERN DOTS-78;So;0;L;;;;;N;;;;;
+28C1;BRAILLE PATTERN DOTS-178;So;0;L;;;;;N;;;;;
+28C2;BRAILLE PATTERN DOTS-278;So;0;L;;;;;N;;;;;
+28C3;BRAILLE PATTERN DOTS-1278;So;0;L;;;;;N;;;;;
+28C4;BRAILLE PATTERN DOTS-378;So;0;L;;;;;N;;;;;
+28C5;BRAILLE PATTERN DOTS-1378;So;0;L;;;;;N;;;;;
+28C6;BRAILLE PATTERN DOTS-2378;So;0;L;;;;;N;;;;;
+28C7;BRAILLE PATTERN DOTS-12378;So;0;L;;;;;N;;;;;
+28C8;BRAILLE PATTERN DOTS-478;So;0;L;;;;;N;;;;;
+28C9;BRAILLE PATTERN DOTS-1478;So;0;L;;;;;N;;;;;
+28CA;BRAILLE PATTERN DOTS-2478;So;0;L;;;;;N;;;;;
+28CB;BRAILLE PATTERN DOTS-12478;So;0;L;;;;;N;;;;;
+28CC;BRAILLE PATTERN DOTS-3478;So;0;L;;;;;N;;;;;
+28CD;BRAILLE PATTERN DOTS-13478;So;0;L;;;;;N;;;;;
+28CE;BRAILLE PATTERN DOTS-23478;So;0;L;;;;;N;;;;;
+28CF;BRAILLE PATTERN DOTS-123478;So;0;L;;;;;N;;;;;
+28D0;BRAILLE PATTERN DOTS-578;So;0;L;;;;;N;;;;;
+28D1;BRAILLE PATTERN DOTS-1578;So;0;L;;;;;N;;;;;
+28D2;BRAILLE PATTERN DOTS-2578;So;0;L;;;;;N;;;;;
+28D3;BRAILLE PATTERN DOTS-12578;So;0;L;;;;;N;;;;;
+28D4;BRAILLE PATTERN DOTS-3578;So;0;L;;;;;N;;;;;
+28D5;BRAILLE PATTERN DOTS-13578;So;0;L;;;;;N;;;;;
+28D6;BRAILLE PATTERN DOTS-23578;So;0;L;;;;;N;;;;;
+28D7;BRAILLE PATTERN DOTS-123578;So;0;L;;;;;N;;;;;
+28D8;BRAILLE PATTERN DOTS-4578;So;0;L;;;;;N;;;;;
+28D9;BRAILLE PATTERN DOTS-14578;So;0;L;;;;;N;;;;;
+28DA;BRAILLE PATTERN DOTS-24578;So;0;L;;;;;N;;;;;
+28DB;BRAILLE PATTERN DOTS-124578;So;0;L;;;;;N;;;;;
+28DC;BRAILLE PATTERN DOTS-34578;So;0;L;;;;;N;;;;;
+28DD;BRAILLE PATTERN DOTS-134578;So;0;L;;;;;N;;;;;
+28DE;BRAILLE PATTERN DOTS-234578;So;0;L;;;;;N;;;;;
+28DF;BRAILLE PATTERN DOTS-1234578;So;0;L;;;;;N;;;;;
+28E0;BRAILLE PATTERN DOTS-678;So;0;L;;;;;N;;;;;
+28E1;BRAILLE PATTERN DOTS-1678;So;0;L;;;;;N;;;;;
+28E2;BRAILLE PATTERN DOTS-2678;So;0;L;;;;;N;;;;;
+28E3;BRAILLE PATTERN DOTS-12678;So;0;L;;;;;N;;;;;
+28E4;BRAILLE PATTERN DOTS-3678;So;0;L;;;;;N;;;;;
+28E5;BRAILLE PATTERN DOTS-13678;So;0;L;;;;;N;;;;;
+28E6;BRAILLE PATTERN DOTS-23678;So;0;L;;;;;N;;;;;
+28E7;BRAILLE PATTERN DOTS-123678;So;0;L;;;;;N;;;;;
+28E8;BRAILLE PATTERN DOTS-4678;So;0;L;;;;;N;;;;;
+28E9;BRAILLE PATTERN DOTS-14678;So;0;L;;;;;N;;;;;
+28EA;BRAILLE PATTERN DOTS-24678;So;0;L;;;;;N;;;;;
+28EB;BRAILLE PATTERN DOTS-124678;So;0;L;;;;;N;;;;;
+28EC;BRAILLE PATTERN DOTS-34678;So;0;L;;;;;N;;;;;
+28ED;BRAILLE PATTERN DOTS-134678;So;0;L;;;;;N;;;;;
+28EE;BRAILLE PATTERN DOTS-234678;So;0;L;;;;;N;;;;;
+28EF;BRAILLE PATTERN DOTS-1234678;So;0;L;;;;;N;;;;;
+28F0;BRAILLE PATTERN DOTS-5678;So;0;L;;;;;N;;;;;
+28F1;BRAILLE PATTERN DOTS-15678;So;0;L;;;;;N;;;;;
+28F2;BRAILLE PATTERN DOTS-25678;So;0;L;;;;;N;;;;;
+28F3;BRAILLE PATTERN DOTS-125678;So;0;L;;;;;N;;;;;
+28F4;BRAILLE PATTERN DOTS-35678;So;0;L;;;;;N;;;;;
+28F5;BRAILLE PATTERN DOTS-135678;So;0;L;;;;;N;;;;;
+28F6;BRAILLE PATTERN DOTS-235678;So;0;L;;;;;N;;;;;
+28F7;BRAILLE PATTERN DOTS-1235678;So;0;L;;;;;N;;;;;
+28F8;BRAILLE PATTERN DOTS-45678;So;0;L;;;;;N;;;;;
+28F9;BRAILLE PATTERN DOTS-145678;So;0;L;;;;;N;;;;;
+28FA;BRAILLE PATTERN DOTS-245678;So;0;L;;;;;N;;;;;
+28FB;BRAILLE PATTERN DOTS-1245678;So;0;L;;;;;N;;;;;
+28FC;BRAILLE PATTERN DOTS-345678;So;0;L;;;;;N;;;;;
+28FD;BRAILLE PATTERN DOTS-1345678;So;0;L;;;;;N;;;;;
+28FE;BRAILLE PATTERN DOTS-2345678;So;0;L;;;;;N;;;;;
+28FF;BRAILLE PATTERN DOTS-12345678;So;0;L;;;;;N;;;;;
2900;RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
2901;RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
2902;LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
@@ -8043,6 +9092,564 @@
2B0B;SOUTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;;
2B0C;LEFT RIGHT BLACK ARROW;So;0;ON;;;;;N;;;;;
2B0D;UP DOWN BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0E;RIGHTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;;
+2B0F;RIGHTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;;
+2B10;LEFTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;;
+2B11;LEFTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;;
+2B12;SQUARE WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;;
+2B13;SQUARE WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;;
+2B14;SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+2B15;SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+2B16;DIAMOND WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;;
+2B17;DIAMOND WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;;
+2B18;DIAMOND WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;;
+2B19;DIAMOND WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;;
+2B1A;DOTTED SQUARE;So;0;ON;;;;;N;;;;;
+2B1B;BLACK LARGE SQUARE;So;0;ON;;;;;N;;;;;
+2B1C;WHITE LARGE SQUARE;So;0;ON;;;;;N;;;;;
+2B1D;BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;;
+2B1E;WHITE VERY SMALL SQUARE;So;0;ON;;;;;N;;;;;
+2B1F;BLACK PENTAGON;So;0;ON;;;;;N;;;;;
+2B20;WHITE PENTAGON;So;0;ON;;;;;N;;;;;
+2B21;WHITE HEXAGON;So;0;ON;;;;;N;;;;;
+2B22;BLACK HEXAGON;So;0;ON;;;;;N;;;;;
+2B23;HORIZONTAL BLACK HEXAGON;So;0;ON;;;;;N;;;;;
+2B24;BLACK LARGE CIRCLE;So;0;ON;;;;;N;;;;;
+2B25;BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;;
+2B26;WHITE MEDIUM DIAMOND;So;0;ON;;;;;N;;;;;
+2B27;BLACK MEDIUM LOZENGE;So;0;ON;;;;;N;;;;;
+2B28;WHITE MEDIUM LOZENGE;So;0;ON;;;;;N;;;;;
+2B29;BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;;
+2B2A;BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;;
+2B2B;WHITE SMALL LOZENGE;So;0;ON;;;;;N;;;;;
+2B2C;BLACK HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;;
+2B2D;WHITE HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;;
+2B2E;BLACK VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;;
+2B2F;WHITE VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;;
+2B30;LEFT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+2B31;THREE LEFTWARDS ARROWS;Sm;0;ON;;;;;N;;;;;
+2B32;LEFT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;;
+2B33;LONG LEFTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;;
+2B34;LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B35;LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B36;LEFTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+2B37;LEFTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+2B38;LEFTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;;
+2B39;LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B3A;LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B3B;LEFTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;;
+2B3C;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B3D;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2B3E;LEFTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;;
+2B3F;WAVE ARROW POINTING DIRECTLY LEFT;Sm;0;ON;;;;;N;;;;;
+2B40;EQUALS SIGN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2B41;REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2B42;LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2B43;RIGHTWARDS ARROW THROUGH GREATER-THAN;Sm;0;ON;;;;;N;;;;;
+2B44;RIGHTWARDS ARROW THROUGH SUPERSET;Sm;0;ON;;;;;N;;;;;
+2B45;LEFTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;;
+2B46;RIGHTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;;
+2B47;REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2B48;RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2B49;TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2B4A;LEFTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2B4B;LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;;
+2B4C;RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;;
+2B50;WHITE MEDIUM STAR;So;0;ON;;;;;N;;;;;
+2B51;BLACK SMALL STAR;So;0;ON;;;;;N;;;;;
+2B52;WHITE SMALL STAR;So;0;ON;;;;;N;;;;;
+2B53;BLACK RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;;
+2B54;WHITE RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;;
+2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30;
+2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31;
+2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32;
+2C03;GLAGOLITIC CAPITAL LETTER GLAGOLI;Lu;0;L;;;;;N;;;;2C33;
+2C04;GLAGOLITIC CAPITAL LETTER DOBRO;Lu;0;L;;;;;N;;;;2C34;
+2C05;GLAGOLITIC CAPITAL LETTER YESTU;Lu;0;L;;;;;N;;;;2C35;
+2C06;GLAGOLITIC CAPITAL LETTER ZHIVETE;Lu;0;L;;;;;N;;;;2C36;
+2C07;GLAGOLITIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;2C37;
+2C08;GLAGOLITIC CAPITAL LETTER ZEMLJA;Lu;0;L;;;;;N;;;;2C38;
+2C09;GLAGOLITIC CAPITAL LETTER IZHE;Lu;0;L;;;;;N;;;;2C39;
+2C0A;GLAGOLITIC CAPITAL LETTER INITIAL IZHE;Lu;0;L;;;;;N;;;;2C3A;
+2C0B;GLAGOLITIC CAPITAL LETTER I;Lu;0;L;;;;;N;;;;2C3B;
+2C0C;GLAGOLITIC CAPITAL LETTER DJERVI;Lu;0;L;;;;;N;;;;2C3C;
+2C0D;GLAGOLITIC CAPITAL LETTER KAKO;Lu;0;L;;;;;N;;;;2C3D;
+2C0E;GLAGOLITIC CAPITAL LETTER LJUDIJE;Lu;0;L;;;;;N;;;;2C3E;
+2C0F;GLAGOLITIC CAPITAL LETTER MYSLITE;Lu;0;L;;;;;N;;;;2C3F;
+2C10;GLAGOLITIC CAPITAL LETTER NASHI;Lu;0;L;;;;;N;;;;2C40;
+2C11;GLAGOLITIC CAPITAL LETTER ONU;Lu;0;L;;;;;N;;;;2C41;
+2C12;GLAGOLITIC CAPITAL LETTER POKOJI;Lu;0;L;;;;;N;;;;2C42;
+2C13;GLAGOLITIC CAPITAL LETTER RITSI;Lu;0;L;;;;;N;;;;2C43;
+2C14;GLAGOLITIC CAPITAL LETTER SLOVO;Lu;0;L;;;;;N;;;;2C44;
+2C15;GLAGOLITIC CAPITAL LETTER TVRIDO;Lu;0;L;;;;;N;;;;2C45;
+2C16;GLAGOLITIC CAPITAL LETTER UKU;Lu;0;L;;;;;N;;;;2C46;
+2C17;GLAGOLITIC CAPITAL LETTER FRITU;Lu;0;L;;;;;N;;;;2C47;
+2C18;GLAGOLITIC CAPITAL LETTER HERU;Lu;0;L;;;;;N;;;;2C48;
+2C19;GLAGOLITIC CAPITAL LETTER OTU;Lu;0;L;;;;;N;;;;2C49;
+2C1A;GLAGOLITIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;2C4A;
+2C1B;GLAGOLITIC CAPITAL LETTER SHTA;Lu;0;L;;;;;N;;;;2C4B;
+2C1C;GLAGOLITIC CAPITAL LETTER TSI;Lu;0;L;;;;;N;;;;2C4C;
+2C1D;GLAGOLITIC CAPITAL LETTER CHRIVI;Lu;0;L;;;;;N;;;;2C4D;
+2C1E;GLAGOLITIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;2C4E;
+2C1F;GLAGOLITIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;;;;2C4F;
+2C20;GLAGOLITIC CAPITAL LETTER YERI;Lu;0;L;;;;;N;;;;2C50;
+2C21;GLAGOLITIC CAPITAL LETTER YATI;Lu;0;L;;;;;N;;;;2C51;
+2C22;GLAGOLITIC CAPITAL LETTER SPIDERY HA;Lu;0;L;;;;;N;;;;2C52;
+2C23;GLAGOLITIC CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;2C53;
+2C24;GLAGOLITIC CAPITAL LETTER SMALL YUS;Lu;0;L;;;;;N;;;;2C54;
+2C25;GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL;Lu;0;L;;;;;N;;;;2C55;
+2C26;GLAGOLITIC CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;2C56;
+2C27;GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS;Lu;0;L;;;;;N;;;;2C57;
+2C28;GLAGOLITIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;2C58;
+2C29;GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS;Lu;0;L;;;;;N;;;;2C59;
+2C2A;GLAGOLITIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;2C5A;
+2C2B;GLAGOLITIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;2C5B;
+2C2C;GLAGOLITIC CAPITAL LETTER SHTAPIC;Lu;0;L;;;;;N;;;;2C5C;
+2C2D;GLAGOLITIC CAPITAL LETTER TROKUTASTI A;Lu;0;L;;;;;N;;;;2C5D;
+2C2E;GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE;Lu;0;L;;;;;N;;;;2C5E;
+2C30;GLAGOLITIC SMALL LETTER AZU;Ll;0;L;;;;;N;;;2C00;;2C00
+2C31;GLAGOLITIC SMALL LETTER BUKY;Ll;0;L;;;;;N;;;2C01;;2C01
+2C32;GLAGOLITIC SMALL LETTER VEDE;Ll;0;L;;;;;N;;;2C02;;2C02
+2C33;GLAGOLITIC SMALL LETTER GLAGOLI;Ll;0;L;;;;;N;;;2C03;;2C03
+2C34;GLAGOLITIC SMALL LETTER DOBRO;Ll;0;L;;;;;N;;;2C04;;2C04
+2C35;GLAGOLITIC SMALL LETTER YESTU;Ll;0;L;;;;;N;;;2C05;;2C05
+2C36;GLAGOLITIC SMALL LETTER ZHIVETE;Ll;0;L;;;;;N;;;2C06;;2C06
+2C37;GLAGOLITIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;2C07;;2C07
+2C38;GLAGOLITIC SMALL LETTER ZEMLJA;Ll;0;L;;;;;N;;;2C08;;2C08
+2C39;GLAGOLITIC SMALL LETTER IZHE;Ll;0;L;;;;;N;;;2C09;;2C09
+2C3A;GLAGOLITIC SMALL LETTER INITIAL IZHE;Ll;0;L;;;;;N;;;2C0A;;2C0A
+2C3B;GLAGOLITIC SMALL LETTER I;Ll;0;L;;;;;N;;;2C0B;;2C0B
+2C3C;GLAGOLITIC SMALL LETTER DJERVI;Ll;0;L;;;;;N;;;2C0C;;2C0C
+2C3D;GLAGOLITIC SMALL LETTER KAKO;Ll;0;L;;;;;N;;;2C0D;;2C0D
+2C3E;GLAGOLITIC SMALL LETTER LJUDIJE;Ll;0;L;;;;;N;;;2C0E;;2C0E
+2C3F;GLAGOLITIC SMALL LETTER MYSLITE;Ll;0;L;;;;;N;;;2C0F;;2C0F
+2C40;GLAGOLITIC SMALL LETTER NASHI;Ll;0;L;;;;;N;;;2C10;;2C10
+2C41;GLAGOLITIC SMALL LETTER ONU;Ll;0;L;;;;;N;;;2C11;;2C11
+2C42;GLAGOLITIC SMALL LETTER POKOJI;Ll;0;L;;;;;N;;;2C12;;2C12
+2C43;GLAGOLITIC SMALL LETTER RITSI;Ll;0;L;;;;;N;;;2C13;;2C13
+2C44;GLAGOLITIC SMALL LETTER SLOVO;Ll;0;L;;;;;N;;;2C14;;2C14
+2C45;GLAGOLITIC SMALL LETTER TVRIDO;Ll;0;L;;;;;N;;;2C15;;2C15
+2C46;GLAGOLITIC SMALL LETTER UKU;Ll;0;L;;;;;N;;;2C16;;2C16
+2C47;GLAGOLITIC SMALL LETTER FRITU;Ll;0;L;;;;;N;;;2C17;;2C17
+2C48;GLAGOLITIC SMALL LETTER HERU;Ll;0;L;;;;;N;;;2C18;;2C18
+2C49;GLAGOLITIC SMALL LETTER OTU;Ll;0;L;;;;;N;;;2C19;;2C19
+2C4A;GLAGOLITIC SMALL LETTER PE;Ll;0;L;;;;;N;;;2C1A;;2C1A
+2C4B;GLAGOLITIC SMALL LETTER SHTA;Ll;0;L;;;;;N;;;2C1B;;2C1B
+2C4C;GLAGOLITIC SMALL LETTER TSI;Ll;0;L;;;;;N;;;2C1C;;2C1C
+2C4D;GLAGOLITIC SMALL LETTER CHRIVI;Ll;0;L;;;;;N;;;2C1D;;2C1D
+2C4E;GLAGOLITIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;2C1E;;2C1E
+2C4F;GLAGOLITIC SMALL LETTER YERU;Ll;0;L;;;;;N;;;2C1F;;2C1F
+2C50;GLAGOLITIC SMALL LETTER YERI;Ll;0;L;;;;;N;;;2C20;;2C20
+2C51;GLAGOLITIC SMALL LETTER YATI;Ll;0;L;;;;;N;;;2C21;;2C21
+2C52;GLAGOLITIC SMALL LETTER SPIDERY HA;Ll;0;L;;;;;N;;;2C22;;2C22
+2C53;GLAGOLITIC SMALL LETTER YU;Ll;0;L;;;;;N;;;2C23;;2C23
+2C54;GLAGOLITIC SMALL LETTER SMALL YUS;Ll;0;L;;;;;N;;;2C24;;2C24
+2C55;GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL;Ll;0;L;;;;;N;;;2C25;;2C25
+2C56;GLAGOLITIC SMALL LETTER YO;Ll;0;L;;;;;N;;;2C26;;2C26
+2C57;GLAGOLITIC SMALL LETTER IOTATED SMALL YUS;Ll;0;L;;;;;N;;;2C27;;2C27
+2C58;GLAGOLITIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;2C28;;2C28
+2C59;GLAGOLITIC SMALL LETTER IOTATED BIG YUS;Ll;0;L;;;;;N;;;2C29;;2C29
+2C5A;GLAGOLITIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;2C2A;;2C2A
+2C5B;GLAGOLITIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;2C2B;;2C2B
+2C5C;GLAGOLITIC SMALL LETTER SHTAPIC;Ll;0;L;;;;;N;;;2C2C;;2C2C
+2C5D;GLAGOLITIC SMALL LETTER TROKUTASTI A;Ll;0;L;;;;;N;;;2C2D;;2C2D
+2C5E;GLAGOLITIC SMALL LETTER LATINATE MYSLITE;Ll;0;L;;;;;N;;;2C2E;;2C2E
+2C60;LATIN CAPITAL LETTER L WITH DOUBLE BAR;Lu;0;L;;;;;N;;;;2C61;
+2C61;LATIN SMALL LETTER L WITH DOUBLE BAR;Ll;0;L;;;;;N;;;2C60;;2C60
+2C62;LATIN CAPITAL LETTER L WITH MIDDLE TILDE;Lu;0;L;;;;;N;;;;026B;
+2C63;LATIN CAPITAL LETTER P WITH STROKE;Lu;0;L;;;;;N;;;;1D7D;
+2C64;LATIN CAPITAL LETTER R WITH TAIL;Lu;0;L;;;;;N;;;;027D;
+2C65;LATIN SMALL LETTER A WITH STROKE;Ll;0;L;;;;;N;;;023A;;023A
+2C66;LATIN SMALL LETTER T WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;023E;;023E
+2C67;LATIN CAPITAL LETTER H WITH DESCENDER;Lu;0;L;;;;;N;;;;2C68;
+2C68;LATIN SMALL LETTER H WITH DESCENDER;Ll;0;L;;;;;N;;;2C67;;2C67
+2C69;LATIN CAPITAL LETTER K WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6A;
+2C6A;LATIN SMALL LETTER K WITH DESCENDER;Ll;0;L;;;;;N;;;2C69;;2C69
+2C6B;LATIN CAPITAL LETTER Z WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6C;
+2C6C;LATIN SMALL LETTER Z WITH DESCENDER;Ll;0;L;;;;;N;;;2C6B;;2C6B
+2C6D;LATIN CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;0251;
+2C6E;LATIN CAPITAL LETTER M WITH HOOK;Lu;0;L;;;;;N;;;;0271;
+2C6F;LATIN CAPITAL LETTER TURNED A;Lu;0;L;;;;;N;;;;0250;
+2C71;LATIN SMALL LETTER V WITH RIGHT HOOK;Ll;0;L;;;;;N;;;;;
+2C72;LATIN CAPITAL LETTER W WITH HOOK;Lu;0;L;;;;;N;;;;2C73;
+2C73;LATIN SMALL LETTER W WITH HOOK;Ll;0;L;;;;;N;;;2C72;;2C72
+2C74;LATIN SMALL LETTER V WITH CURL;Ll;0;L;;;;;N;;;;;
+2C75;LATIN CAPITAL LETTER HALF H;Lu;0;L;;;;;N;;;;2C76;
+2C76;LATIN SMALL LETTER HALF H;Ll;0;L;;;;;N;;;2C75;;2C75
+2C77;LATIN SMALL LETTER TAILLESS PHI;Ll;0;L;;;;;N;;;;;
+2C78;LATIN SMALL LETTER E WITH NOTCH;Ll;0;L;;;;;N;;;;;
+2C79;LATIN SMALL LETTER TURNED R WITH TAIL;Ll;0;L;;;;;N;;;;;
+2C7A;LATIN SMALL LETTER O WITH LOW RING INSIDE;Ll;0;L;;;;;N;;;;;
+2C7B;LATIN LETTER SMALL CAPITAL TURNED E;Ll;0;L;;;;;N;;;;;
+2C7C;LATIN SUBSCRIPT SMALL LETTER J;Ll;0;L;<sub> 006A;;;;N;;;;;
+2C7D;MODIFIER LETTER CAPITAL V;Lm;0;L;<super> 0056;;;;N;;;;;
+2C80;COPTIC CAPITAL LETTER ALFA;Lu;0;L;;;;;N;;;;2C81;
+2C81;COPTIC SMALL LETTER ALFA;Ll;0;L;;;;;N;;;2C80;;2C80
+2C82;COPTIC CAPITAL LETTER VIDA;Lu;0;L;;;;;N;;;;2C83;
+2C83;COPTIC SMALL LETTER VIDA;Ll;0;L;;;;;N;;;2C82;;2C82
+2C84;COPTIC CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;2C85;
+2C85;COPTIC SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;2C84;;2C84
+2C86;COPTIC CAPITAL LETTER DALDA;Lu;0;L;;;;;N;;;;2C87;
+2C87;COPTIC SMALL LETTER DALDA;Ll;0;L;;;;;N;;;2C86;;2C86
+2C88;COPTIC CAPITAL LETTER EIE;Lu;0;L;;;;;N;;;;2C89;
+2C89;COPTIC SMALL LETTER EIE;Ll;0;L;;;;;N;;;2C88;;2C88
+2C8A;COPTIC CAPITAL LETTER SOU;Lu;0;L;;;;;N;;;;2C8B;
+2C8B;COPTIC SMALL LETTER SOU;Ll;0;L;;;;;N;;;2C8A;;2C8A
+2C8C;COPTIC CAPITAL LETTER ZATA;Lu;0;L;;;;;N;;;;2C8D;
+2C8D;COPTIC SMALL LETTER ZATA;Ll;0;L;;;;;N;;;2C8C;;2C8C
+2C8E;COPTIC CAPITAL LETTER HATE;Lu;0;L;;;;;N;;;;2C8F;
+2C8F;COPTIC SMALL LETTER HATE;Ll;0;L;;;;;N;;;2C8E;;2C8E
+2C90;COPTIC CAPITAL LETTER THETHE;Lu;0;L;;;;;N;;;;2C91;
+2C91;COPTIC SMALL LETTER THETHE;Ll;0;L;;;;;N;;;2C90;;2C90
+2C92;COPTIC CAPITAL LETTER IAUDA;Lu;0;L;;;;;N;;;;2C93;
+2C93;COPTIC SMALL LETTER IAUDA;Ll;0;L;;;;;N;;;2C92;;2C92
+2C94;COPTIC CAPITAL LETTER KAPA;Lu;0;L;;;;;N;;;;2C95;
+2C95;COPTIC SMALL LETTER KAPA;Ll;0;L;;;;;N;;;2C94;;2C94
+2C96;COPTIC CAPITAL LETTER LAULA;Lu;0;L;;;;;N;;;;2C97;
+2C97;COPTIC SMALL LETTER LAULA;Ll;0;L;;;;;N;;;2C96;;2C96
+2C98;COPTIC CAPITAL LETTER MI;Lu;0;L;;;;;N;;;;2C99;
+2C99;COPTIC SMALL LETTER MI;Ll;0;L;;;;;N;;;2C98;;2C98
+2C9A;COPTIC CAPITAL LETTER NI;Lu;0;L;;;;;N;;;;2C9B;
+2C9B;COPTIC SMALL LETTER NI;Ll;0;L;;;;;N;;;2C9A;;2C9A
+2C9C;COPTIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;2C9D;
+2C9D;COPTIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;2C9C;;2C9C
+2C9E;COPTIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;2C9F;
+2C9F;COPTIC SMALL LETTER O;Ll;0;L;;;;;N;;;2C9E;;2C9E
+2CA0;COPTIC CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;2CA1;
+2CA1;COPTIC SMALL LETTER PI;Ll;0;L;;;;;N;;;2CA0;;2CA0
+2CA2;COPTIC CAPITAL LETTER RO;Lu;0;L;;;;;N;;;;2CA3;
+2CA3;COPTIC SMALL LETTER RO;Ll;0;L;;;;;N;;;2CA2;;2CA2
+2CA4;COPTIC CAPITAL LETTER SIMA;Lu;0;L;;;;;N;;;;2CA5;
+2CA5;COPTIC SMALL LETTER SIMA;Ll;0;L;;;;;N;;;2CA4;;2CA4
+2CA6;COPTIC CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;2CA7;
+2CA7;COPTIC SMALL LETTER TAU;Ll;0;L;;;;;N;;;2CA6;;2CA6
+2CA8;COPTIC CAPITAL LETTER UA;Lu;0;L;;;;;N;;;;2CA9;
+2CA9;COPTIC SMALL LETTER UA;Ll;0;L;;;;;N;;;2CA8;;2CA8
+2CAA;COPTIC CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;2CAB;
+2CAB;COPTIC SMALL LETTER FI;Ll;0;L;;;;;N;;;2CAA;;2CAA
+2CAC;COPTIC CAPITAL LETTER KHI;Lu;0;L;;;;;N;;;;2CAD;
+2CAD;COPTIC SMALL LETTER KHI;Ll;0;L;;;;;N;;;2CAC;;2CAC
+2CAE;COPTIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;2CAF;
+2CAF;COPTIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;2CAE;;2CAE
+2CB0;COPTIC CAPITAL LETTER OOU;Lu;0;L;;;;;N;;;;2CB1;
+2CB1;COPTIC SMALL LETTER OOU;Ll;0;L;;;;;N;;;2CB0;;2CB0
+2CB2;COPTIC CAPITAL LETTER DIALECT-P ALEF;Lu;0;L;;;;;N;;;;2CB3;
+2CB3;COPTIC SMALL LETTER DIALECT-P ALEF;Ll;0;L;;;;;N;;;2CB2;;2CB2
+2CB4;COPTIC CAPITAL LETTER OLD COPTIC AIN;Lu;0;L;;;;;N;;;;2CB5;
+2CB5;COPTIC SMALL LETTER OLD COPTIC AIN;Ll;0;L;;;;;N;;;2CB4;;2CB4
+2CB6;COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE;Lu;0;L;;;;;N;;;;2CB7;
+2CB7;COPTIC SMALL LETTER CRYPTOGRAMMIC EIE;Ll;0;L;;;;;N;;;2CB6;;2CB6
+2CB8;COPTIC CAPITAL LETTER DIALECT-P KAPA;Lu;0;L;;;;;N;;;;2CB9;
+2CB9;COPTIC SMALL LETTER DIALECT-P KAPA;Ll;0;L;;;;;N;;;2CB8;;2CB8
+2CBA;COPTIC CAPITAL LETTER DIALECT-P NI;Lu;0;L;;;;;N;;;;2CBB;
+2CBB;COPTIC SMALL LETTER DIALECT-P NI;Ll;0;L;;;;;N;;;2CBA;;2CBA
+2CBC;COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI;Lu;0;L;;;;;N;;;;2CBD;
+2CBD;COPTIC SMALL LETTER CRYPTOGRAMMIC NI;Ll;0;L;;;;;N;;;2CBC;;2CBC
+2CBE;COPTIC CAPITAL LETTER OLD COPTIC OOU;Lu;0;L;;;;;N;;;;2CBF;
+2CBF;COPTIC SMALL LETTER OLD COPTIC OOU;Ll;0;L;;;;;N;;;2CBE;;2CBE
+2CC0;COPTIC CAPITAL LETTER SAMPI;Lu;0;L;;;;;N;;;;2CC1;
+2CC1;COPTIC SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;2CC0;;2CC0
+2CC2;COPTIC CAPITAL LETTER CROSSED SHEI;Lu;0;L;;;;;N;;;;2CC3;
+2CC3;COPTIC SMALL LETTER CROSSED SHEI;Ll;0;L;;;;;N;;;2CC2;;2CC2
+2CC4;COPTIC CAPITAL LETTER OLD COPTIC SHEI;Lu;0;L;;;;;N;;;;2CC5;
+2CC5;COPTIC SMALL LETTER OLD COPTIC SHEI;Ll;0;L;;;;;N;;;2CC4;;2CC4
+2CC6;COPTIC CAPITAL LETTER OLD COPTIC ESH;Lu;0;L;;;;;N;;;;2CC7;
+2CC7;COPTIC SMALL LETTER OLD COPTIC ESH;Ll;0;L;;;;;N;;;2CC6;;2CC6
+2CC8;COPTIC CAPITAL LETTER AKHMIMIC KHEI;Lu;0;L;;;;;N;;;;2CC9;
+2CC9;COPTIC SMALL LETTER AKHMIMIC KHEI;Ll;0;L;;;;;N;;;2CC8;;2CC8
+2CCA;COPTIC CAPITAL LETTER DIALECT-P HORI;Lu;0;L;;;;;N;;;;2CCB;
+2CCB;COPTIC SMALL LETTER DIALECT-P HORI;Ll;0;L;;;;;N;;;2CCA;;2CCA
+2CCC;COPTIC CAPITAL LETTER OLD COPTIC HORI;Lu;0;L;;;;;N;;;;2CCD;
+2CCD;COPTIC SMALL LETTER OLD COPTIC HORI;Ll;0;L;;;;;N;;;2CCC;;2CCC
+2CCE;COPTIC CAPITAL LETTER OLD COPTIC HA;Lu;0;L;;;;;N;;;;2CCF;
+2CCF;COPTIC SMALL LETTER OLD COPTIC HA;Ll;0;L;;;;;N;;;2CCE;;2CCE
+2CD0;COPTIC CAPITAL LETTER L-SHAPED HA;Lu;0;L;;;;;N;;;;2CD1;
+2CD1;COPTIC SMALL LETTER L-SHAPED HA;Ll;0;L;;;;;N;;;2CD0;;2CD0
+2CD2;COPTIC CAPITAL LETTER OLD COPTIC HEI;Lu;0;L;;;;;N;;;;2CD3;
+2CD3;COPTIC SMALL LETTER OLD COPTIC HEI;Ll;0;L;;;;;N;;;2CD2;;2CD2
+2CD4;COPTIC CAPITAL LETTER OLD COPTIC HAT;Lu;0;L;;;;;N;;;;2CD5;
+2CD5;COPTIC SMALL LETTER OLD COPTIC HAT;Ll;0;L;;;;;N;;;2CD4;;2CD4
+2CD6;COPTIC CAPITAL LETTER OLD COPTIC GANGIA;Lu;0;L;;;;;N;;;;2CD7;
+2CD7;COPTIC SMALL LETTER OLD COPTIC GANGIA;Ll;0;L;;;;;N;;;2CD6;;2CD6
+2CD8;COPTIC CAPITAL LETTER OLD COPTIC DJA;Lu;0;L;;;;;N;;;;2CD9;
+2CD9;COPTIC SMALL LETTER OLD COPTIC DJA;Ll;0;L;;;;;N;;;2CD8;;2CD8
+2CDA;COPTIC CAPITAL LETTER OLD COPTIC SHIMA;Lu;0;L;;;;;N;;;;2CDB;
+2CDB;COPTIC SMALL LETTER OLD COPTIC SHIMA;Ll;0;L;;;;;N;;;2CDA;;2CDA
+2CDC;COPTIC CAPITAL LETTER OLD NUBIAN SHIMA;Lu;0;L;;;;;N;;;;2CDD;
+2CDD;COPTIC SMALL LETTER OLD NUBIAN SHIMA;Ll;0;L;;;;;N;;;2CDC;;2CDC
+2CDE;COPTIC CAPITAL LETTER OLD NUBIAN NGI;Lu;0;L;;;;;N;;;;2CDF;
+2CDF;COPTIC SMALL LETTER OLD NUBIAN NGI;Ll;0;L;;;;;N;;;2CDE;;2CDE
+2CE0;COPTIC CAPITAL LETTER OLD NUBIAN NYI;Lu;0;L;;;;;N;;;;2CE1;
+2CE1;COPTIC SMALL LETTER OLD NUBIAN NYI;Ll;0;L;;;;;N;;;2CE0;;2CE0
+2CE2;COPTIC CAPITAL LETTER OLD NUBIAN WAU;Lu;0;L;;;;;N;;;;2CE3;
+2CE3;COPTIC SMALL LETTER OLD NUBIAN WAU;Ll;0;L;;;;;N;;;2CE2;;2CE2
+2CE4;COPTIC SYMBOL KAI;Ll;0;L;;;;;N;;;;;
+2CE5;COPTIC SYMBOL MI RO;So;0;ON;;;;;N;;;;;
+2CE6;COPTIC SYMBOL PI RO;So;0;ON;;;;;N;;;;;
+2CE7;COPTIC SYMBOL STAUROS;So;0;ON;;;;;N;;;;;
+2CE8;COPTIC SYMBOL TAU RO;So;0;ON;;;;;N;;;;;
+2CE9;COPTIC SYMBOL KHI RO;So;0;ON;;;;;N;;;;;
+2CEA;COPTIC SYMBOL SHIMA SIMA;So;0;ON;;;;;N;;;;;
+2CF9;COPTIC OLD NUBIAN FULL STOP;Po;0;ON;;;;;N;;;;;
+2CFA;COPTIC OLD NUBIAN DIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;;
+2CFB;COPTIC OLD NUBIAN INDIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;;
+2CFC;COPTIC OLD NUBIAN VERSE DIVIDER;Po;0;ON;;;;;N;;;;;
+2CFD;COPTIC FRACTION ONE HALF;No;0;ON;;;;1/2;N;;;;;
+2CFE;COPTIC FULL STOP;Po;0;ON;;;;;N;;;;;
+2CFF;COPTIC MORPHOLOGICAL DIVIDER;Po;0;ON;;;;;N;;;;;
+2D00;GEORGIAN SMALL LETTER AN;Ll;0;L;;;;;N;;Khutsuri;10A0;;10A0
+2D01;GEORGIAN SMALL LETTER BAN;Ll;0;L;;;;;N;;Khutsuri;10A1;;10A1
+2D02;GEORGIAN SMALL LETTER GAN;Ll;0;L;;;;;N;;Khutsuri;10A2;;10A2
+2D03;GEORGIAN SMALL LETTER DON;Ll;0;L;;;;;N;;Khutsuri;10A3;;10A3
+2D04;GEORGIAN SMALL LETTER EN;Ll;0;L;;;;;N;;Khutsuri;10A4;;10A4
+2D05;GEORGIAN SMALL LETTER VIN;Ll;0;L;;;;;N;;Khutsuri;10A5;;10A5
+2D06;GEORGIAN SMALL LETTER ZEN;Ll;0;L;;;;;N;;Khutsuri;10A6;;10A6
+2D07;GEORGIAN SMALL LETTER TAN;Ll;0;L;;;;;N;;Khutsuri;10A7;;10A7
+2D08;GEORGIAN SMALL LETTER IN;Ll;0;L;;;;;N;;Khutsuri;10A8;;10A8
+2D09;GEORGIAN SMALL LETTER KAN;Ll;0;L;;;;;N;;Khutsuri;10A9;;10A9
+2D0A;GEORGIAN SMALL LETTER LAS;Ll;0;L;;;;;N;;Khutsuri;10AA;;10AA
+2D0B;GEORGIAN SMALL LETTER MAN;Ll;0;L;;;;;N;;Khutsuri;10AB;;10AB
+2D0C;GEORGIAN SMALL LETTER NAR;Ll;0;L;;;;;N;;Khutsuri;10AC;;10AC
+2D0D;GEORGIAN SMALL LETTER ON;Ll;0;L;;;;;N;;Khutsuri;10AD;;10AD
+2D0E;GEORGIAN SMALL LETTER PAR;Ll;0;L;;;;;N;;Khutsuri;10AE;;10AE
+2D0F;GEORGIAN SMALL LETTER ZHAR;Ll;0;L;;;;;N;;Khutsuri;10AF;;10AF
+2D10;GEORGIAN SMALL LETTER RAE;Ll;0;L;;;;;N;;Khutsuri;10B0;;10B0
+2D11;GEORGIAN SMALL LETTER SAN;Ll;0;L;;;;;N;;Khutsuri;10B1;;10B1
+2D12;GEORGIAN SMALL LETTER TAR;Ll;0;L;;;;;N;;Khutsuri;10B2;;10B2
+2D13;GEORGIAN SMALL LETTER UN;Ll;0;L;;;;;N;;Khutsuri;10B3;;10B3
+2D14;GEORGIAN SMALL LETTER PHAR;Ll;0;L;;;;;N;;Khutsuri;10B4;;10B4
+2D15;GEORGIAN SMALL LETTER KHAR;Ll;0;L;;;;;N;;Khutsuri;10B5;;10B5
+2D16;GEORGIAN SMALL LETTER GHAN;Ll;0;L;;;;;N;;Khutsuri;10B6;;10B6
+2D17;GEORGIAN SMALL LETTER QAR;Ll;0;L;;;;;N;;Khutsuri;10B7;;10B7
+2D18;GEORGIAN SMALL LETTER SHIN;Ll;0;L;;;;;N;;Khutsuri;10B8;;10B8
+2D19;GEORGIAN SMALL LETTER CHIN;Ll;0;L;;;;;N;;Khutsuri;10B9;;10B9
+2D1A;GEORGIAN SMALL LETTER CAN;Ll;0;L;;;;;N;;Khutsuri;10BA;;10BA
+2D1B;GEORGIAN SMALL LETTER JIL;Ll;0;L;;;;;N;;Khutsuri;10BB;;10BB
+2D1C;GEORGIAN SMALL LETTER CIL;Ll;0;L;;;;;N;;Khutsuri;10BC;;10BC
+2D1D;GEORGIAN SMALL LETTER CHAR;Ll;0;L;;;;;N;;Khutsuri;10BD;;10BD
+2D1E;GEORGIAN SMALL LETTER XAN;Ll;0;L;;;;;N;;Khutsuri;10BE;;10BE
+2D1F;GEORGIAN SMALL LETTER JHAN;Ll;0;L;;;;;N;;Khutsuri;10BF;;10BF
+2D20;GEORGIAN SMALL LETTER HAE;Ll;0;L;;;;;N;;Khutsuri;10C0;;10C0
+2D21;GEORGIAN SMALL LETTER HE;Ll;0;L;;;;;N;;Khutsuri;10C1;;10C1
+2D22;GEORGIAN SMALL LETTER HIE;Ll;0;L;;;;;N;;Khutsuri;10C2;;10C2
+2D23;GEORGIAN SMALL LETTER WE;Ll;0;L;;;;;N;;Khutsuri;10C3;;10C3
+2D24;GEORGIAN SMALL LETTER HAR;Ll;0;L;;;;;N;;Khutsuri;10C4;;10C4
+2D25;GEORGIAN SMALL LETTER HOE;Ll;0;L;;;;;N;;Khutsuri;10C5;;10C5
+2D30;TIFINAGH LETTER YA;Lo;0;L;;;;;N;;;;;
+2D31;TIFINAGH LETTER YAB;Lo;0;L;;;;;N;;;;;
+2D32;TIFINAGH LETTER YABH;Lo;0;L;;;;;N;;;;;
+2D33;TIFINAGH LETTER YAG;Lo;0;L;;;;;N;;;;;
+2D34;TIFINAGH LETTER YAGHH;Lo;0;L;;;;;N;;;;;
+2D35;TIFINAGH LETTER BERBER ACADEMY YAJ;Lo;0;L;;;;;N;;;;;
+2D36;TIFINAGH LETTER YAJ;Lo;0;L;;;;;N;;;;;
+2D37;TIFINAGH LETTER YAD;Lo;0;L;;;;;N;;;;;
+2D38;TIFINAGH LETTER YADH;Lo;0;L;;;;;N;;;;;
+2D39;TIFINAGH LETTER YADD;Lo;0;L;;;;;N;;;;;
+2D3A;TIFINAGH LETTER YADDH;Lo;0;L;;;;;N;;;;;
+2D3B;TIFINAGH LETTER YEY;Lo;0;L;;;;;N;;;;;
+2D3C;TIFINAGH LETTER YAF;Lo;0;L;;;;;N;;;;;
+2D3D;TIFINAGH LETTER YAK;Lo;0;L;;;;;N;;;;;
+2D3E;TIFINAGH LETTER TUAREG YAK;Lo;0;L;;;;;N;;;;;
+2D3F;TIFINAGH LETTER YAKHH;Lo;0;L;;;;;N;;;;;
+2D40;TIFINAGH LETTER YAH;Lo;0;L;;;;;N;;Tuareg yab;;;
+2D41;TIFINAGH LETTER BERBER ACADEMY YAH;Lo;0;L;;;;;N;;;;;
+2D42;TIFINAGH LETTER TUAREG YAH;Lo;0;L;;;;;N;;;;;
+2D43;TIFINAGH LETTER YAHH;Lo;0;L;;;;;N;;;;;
+2D44;TIFINAGH LETTER YAA;Lo;0;L;;;;;N;;;;;
+2D45;TIFINAGH LETTER YAKH;Lo;0;L;;;;;N;;;;;
+2D46;TIFINAGH LETTER TUAREG YAKH;Lo;0;L;;;;;N;;;;;
+2D47;TIFINAGH LETTER YAQ;Lo;0;L;;;;;N;;;;;
+2D48;TIFINAGH LETTER TUAREG YAQ;Lo;0;L;;;;;N;;;;;
+2D49;TIFINAGH LETTER YI;Lo;0;L;;;;;N;;;;;
+2D4A;TIFINAGH LETTER YAZH;Lo;0;L;;;;;N;;;;;
+2D4B;TIFINAGH LETTER AHAGGAR YAZH;Lo;0;L;;;;;N;;;;;
+2D4C;TIFINAGH LETTER TUAREG YAZH;Lo;0;L;;;;;N;;;;;
+2D4D;TIFINAGH LETTER YAL;Lo;0;L;;;;;N;;;;;
+2D4E;TIFINAGH LETTER YAM;Lo;0;L;;;;;N;;;;;
+2D4F;TIFINAGH LETTER YAN;Lo;0;L;;;;;N;;;;;
+2D50;TIFINAGH LETTER TUAREG YAGN;Lo;0;L;;;;;N;;;;;
+2D51;TIFINAGH LETTER TUAREG YANG;Lo;0;L;;;;;N;;;;;
+2D52;TIFINAGH LETTER YAP;Lo;0;L;;;;;N;;;;;
+2D53;TIFINAGH LETTER YU;Lo;0;L;;;;;N;;Tuareg yaw;;;
+2D54;TIFINAGH LETTER YAR;Lo;0;L;;;;;N;;;;;
+2D55;TIFINAGH LETTER YARR;Lo;0;L;;;;;N;;;;;
+2D56;TIFINAGH LETTER YAGH;Lo;0;L;;;;;N;;;;;
+2D57;TIFINAGH LETTER TUAREG YAGH;Lo;0;L;;;;;N;;;;;
+2D58;TIFINAGH LETTER AYER YAGH;Lo;0;L;;;;;N;;Adrar yaj;;;
+2D59;TIFINAGH LETTER YAS;Lo;0;L;;;;;N;;;;;
+2D5A;TIFINAGH LETTER YASS;Lo;0;L;;;;;N;;;;;
+2D5B;TIFINAGH LETTER YASH;Lo;0;L;;;;;N;;;;;
+2D5C;TIFINAGH LETTER YAT;Lo;0;L;;;;;N;;;;;
+2D5D;TIFINAGH LETTER YATH;Lo;0;L;;;;;N;;;;;
+2D5E;TIFINAGH LETTER YACH;Lo;0;L;;;;;N;;;;;
+2D5F;TIFINAGH LETTER YATT;Lo;0;L;;;;;N;;;;;
+2D60;TIFINAGH LETTER YAV;Lo;0;L;;;;;N;;;;;
+2D61;TIFINAGH LETTER YAW;Lo;0;L;;;;;N;;;;;
+2D62;TIFINAGH LETTER YAY;Lo;0;L;;;;;N;;;;;
+2D63;TIFINAGH LETTER YAZ;Lo;0;L;;;;;N;;;;;
+2D64;TIFINAGH LETTER TAWELLEMET YAZ;Lo;0;L;;;;;N;;harpoon yaz;;;
+2D65;TIFINAGH LETTER YAZZ;Lo;0;L;;;;;N;;;;;
+2D6F;TIFINAGH MODIFIER LETTER LABIALIZATION MARK;Lm;0;L;<super> 2D61;;;;N;;tamatart;;;
+2D80;ETHIOPIC SYLLABLE LOA;Lo;0;L;;;;;N;;;;;
+2D81;ETHIOPIC SYLLABLE MOA;Lo;0;L;;;;;N;;;;;
+2D82;ETHIOPIC SYLLABLE ROA;Lo;0;L;;;;;N;;;;;
+2D83;ETHIOPIC SYLLABLE SOA;Lo;0;L;;;;;N;;;;;
+2D84;ETHIOPIC SYLLABLE SHOA;Lo;0;L;;;;;N;;;;;
+2D85;ETHIOPIC SYLLABLE BOA;Lo;0;L;;;;;N;;;;;
+2D86;ETHIOPIC SYLLABLE TOA;Lo;0;L;;;;;N;;;;;
+2D87;ETHIOPIC SYLLABLE COA;Lo;0;L;;;;;N;;;;;
+2D88;ETHIOPIC SYLLABLE NOA;Lo;0;L;;;;;N;;;;;
+2D89;ETHIOPIC SYLLABLE NYOA;Lo;0;L;;;;;N;;;;;
+2D8A;ETHIOPIC SYLLABLE GLOTTAL OA;Lo;0;L;;;;;N;;;;;
+2D8B;ETHIOPIC SYLLABLE ZOA;Lo;0;L;;;;;N;;;;;
+2D8C;ETHIOPIC SYLLABLE DOA;Lo;0;L;;;;;N;;;;;
+2D8D;ETHIOPIC SYLLABLE DDOA;Lo;0;L;;;;;N;;;;;
+2D8E;ETHIOPIC SYLLABLE JOA;Lo;0;L;;;;;N;;;;;
+2D8F;ETHIOPIC SYLLABLE THOA;Lo;0;L;;;;;N;;;;;
+2D90;ETHIOPIC SYLLABLE CHOA;Lo;0;L;;;;;N;;;;;
+2D91;ETHIOPIC SYLLABLE PHOA;Lo;0;L;;;;;N;;;;;
+2D92;ETHIOPIC SYLLABLE POA;Lo;0;L;;;;;N;;;;;
+2D93;ETHIOPIC SYLLABLE GGWA;Lo;0;L;;;;;N;;;;;
+2D94;ETHIOPIC SYLLABLE GGWI;Lo;0;L;;;;;N;;;;;
+2D95;ETHIOPIC SYLLABLE GGWEE;Lo;0;L;;;;;N;;;;;
+2D96;ETHIOPIC SYLLABLE GGWE;Lo;0;L;;;;;N;;;;;
+2DA0;ETHIOPIC SYLLABLE SSA;Lo;0;L;;;;;N;;;;;
+2DA1;ETHIOPIC SYLLABLE SSU;Lo;0;L;;;;;N;;;;;
+2DA2;ETHIOPIC SYLLABLE SSI;Lo;0;L;;;;;N;;;;;
+2DA3;ETHIOPIC SYLLABLE SSAA;Lo;0;L;;;;;N;;;;;
+2DA4;ETHIOPIC SYLLABLE SSEE;Lo;0;L;;;;;N;;;;;
+2DA5;ETHIOPIC SYLLABLE SSE;Lo;0;L;;;;;N;;;;;
+2DA6;ETHIOPIC SYLLABLE SSO;Lo;0;L;;;;;N;;;;;
+2DA8;ETHIOPIC SYLLABLE CCA;Lo;0;L;;;;;N;;;;;
+2DA9;ETHIOPIC SYLLABLE CCU;Lo;0;L;;;;;N;;;;;
+2DAA;ETHIOPIC SYLLABLE CCI;Lo;0;L;;;;;N;;;;;
+2DAB;ETHIOPIC SYLLABLE CCAA;Lo;0;L;;;;;N;;;;;
+2DAC;ETHIOPIC SYLLABLE CCEE;Lo;0;L;;;;;N;;;;;
+2DAD;ETHIOPIC SYLLABLE CCE;Lo;0;L;;;;;N;;;;;
+2DAE;ETHIOPIC SYLLABLE CCO;Lo;0;L;;;;;N;;;;;
+2DB0;ETHIOPIC SYLLABLE ZZA;Lo;0;L;;;;;N;;;;;
+2DB1;ETHIOPIC SYLLABLE ZZU;Lo;0;L;;;;;N;;;;;
+2DB2;ETHIOPIC SYLLABLE ZZI;Lo;0;L;;;;;N;;;;;
+2DB3;ETHIOPIC SYLLABLE ZZAA;Lo;0;L;;;;;N;;;;;
+2DB4;ETHIOPIC SYLLABLE ZZEE;Lo;0;L;;;;;N;;;;;
+2DB5;ETHIOPIC SYLLABLE ZZE;Lo;0;L;;;;;N;;;;;
+2DB6;ETHIOPIC SYLLABLE ZZO;Lo;0;L;;;;;N;;;;;
+2DB8;ETHIOPIC SYLLABLE CCHA;Lo;0;L;;;;;N;;;;;
+2DB9;ETHIOPIC SYLLABLE CCHU;Lo;0;L;;;;;N;;;;;
+2DBA;ETHIOPIC SYLLABLE CCHI;Lo;0;L;;;;;N;;;;;
+2DBB;ETHIOPIC SYLLABLE CCHAA;Lo;0;L;;;;;N;;;;;
+2DBC;ETHIOPIC SYLLABLE CCHEE;Lo;0;L;;;;;N;;;;;
+2DBD;ETHIOPIC SYLLABLE CCHE;Lo;0;L;;;;;N;;;;;
+2DBE;ETHIOPIC SYLLABLE CCHO;Lo;0;L;;;;;N;;;;;
+2DC0;ETHIOPIC SYLLABLE QYA;Lo;0;L;;;;;N;;;;;
+2DC1;ETHIOPIC SYLLABLE QYU;Lo;0;L;;;;;N;;;;;
+2DC2;ETHIOPIC SYLLABLE QYI;Lo;0;L;;;;;N;;;;;
+2DC3;ETHIOPIC SYLLABLE QYAA;Lo;0;L;;;;;N;;;;;
+2DC4;ETHIOPIC SYLLABLE QYEE;Lo;0;L;;;;;N;;;;;
+2DC5;ETHIOPIC SYLLABLE QYE;Lo;0;L;;;;;N;;;;;
+2DC6;ETHIOPIC SYLLABLE QYO;Lo;0;L;;;;;N;;;;;
+2DC8;ETHIOPIC SYLLABLE KYA;Lo;0;L;;;;;N;;;;;
+2DC9;ETHIOPIC SYLLABLE KYU;Lo;0;L;;;;;N;;;;;
+2DCA;ETHIOPIC SYLLABLE KYI;Lo;0;L;;;;;N;;;;;
+2DCB;ETHIOPIC SYLLABLE KYAA;Lo;0;L;;;;;N;;;;;
+2DCC;ETHIOPIC SYLLABLE KYEE;Lo;0;L;;;;;N;;;;;
+2DCD;ETHIOPIC SYLLABLE KYE;Lo;0;L;;;;;N;;;;;
+2DCE;ETHIOPIC SYLLABLE KYO;Lo;0;L;;;;;N;;;;;
+2DD0;ETHIOPIC SYLLABLE XYA;Lo;0;L;;;;;N;;;;;
+2DD1;ETHIOPIC SYLLABLE XYU;Lo;0;L;;;;;N;;;;;
+2DD2;ETHIOPIC SYLLABLE XYI;Lo;0;L;;;;;N;;;;;
+2DD3;ETHIOPIC SYLLABLE XYAA;Lo;0;L;;;;;N;;;;;
+2DD4;ETHIOPIC SYLLABLE XYEE;Lo;0;L;;;;;N;;;;;
+2DD5;ETHIOPIC SYLLABLE XYE;Lo;0;L;;;;;N;;;;;
+2DD6;ETHIOPIC SYLLABLE XYO;Lo;0;L;;;;;N;;;;;
+2DD8;ETHIOPIC SYLLABLE GYA;Lo;0;L;;;;;N;;;;;
+2DD9;ETHIOPIC SYLLABLE GYU;Lo;0;L;;;;;N;;;;;
+2DDA;ETHIOPIC SYLLABLE GYI;Lo;0;L;;;;;N;;;;;
+2DDB;ETHIOPIC SYLLABLE GYAA;Lo;0;L;;;;;N;;;;;
+2DDC;ETHIOPIC SYLLABLE GYEE;Lo;0;L;;;;;N;;;;;
+2DDD;ETHIOPIC SYLLABLE GYE;Lo;0;L;;;;;N;;;;;
+2DDE;ETHIOPIC SYLLABLE GYO;Lo;0;L;;;;;N;;;;;
+2DE0;COMBINING CYRILLIC LETTER BE;Mn;230;NSM;;;;;N;;;;;
+2DE1;COMBINING CYRILLIC LETTER VE;Mn;230;NSM;;;;;N;;;;;
+2DE2;COMBINING CYRILLIC LETTER GHE;Mn;230;NSM;;;;;N;;;;;
+2DE3;COMBINING CYRILLIC LETTER DE;Mn;230;NSM;;;;;N;;;;;
+2DE4;COMBINING CYRILLIC LETTER ZHE;Mn;230;NSM;;;;;N;;;;;
+2DE5;COMBINING CYRILLIC LETTER ZE;Mn;230;NSM;;;;;N;;;;;
+2DE6;COMBINING CYRILLIC LETTER KA;Mn;230;NSM;;;;;N;;;;;
+2DE7;COMBINING CYRILLIC LETTER EL;Mn;230;NSM;;;;;N;;;;;
+2DE8;COMBINING CYRILLIC LETTER EM;Mn;230;NSM;;;;;N;;;;;
+2DE9;COMBINING CYRILLIC LETTER EN;Mn;230;NSM;;;;;N;;;;;
+2DEA;COMBINING CYRILLIC LETTER O;Mn;230;NSM;;;;;N;;;;;
+2DEB;COMBINING CYRILLIC LETTER PE;Mn;230;NSM;;;;;N;;;;;
+2DEC;COMBINING CYRILLIC LETTER ER;Mn;230;NSM;;;;;N;;;;;
+2DED;COMBINING CYRILLIC LETTER ES;Mn;230;NSM;;;;;N;;;;;
+2DEE;COMBINING CYRILLIC LETTER TE;Mn;230;NSM;;;;;N;;;;;
+2DEF;COMBINING CYRILLIC LETTER HA;Mn;230;NSM;;;;;N;;;;;
+2DF0;COMBINING CYRILLIC LETTER TSE;Mn;230;NSM;;;;;N;;;;;
+2DF1;COMBINING CYRILLIC LETTER CHE;Mn;230;NSM;;;;;N;;;;;
+2DF2;COMBINING CYRILLIC LETTER SHA;Mn;230;NSM;;;;;N;;;;;
+2DF3;COMBINING CYRILLIC LETTER SHCHA;Mn;230;NSM;;;;;N;;;;;
+2DF4;COMBINING CYRILLIC LETTER FITA;Mn;230;NSM;;;;;N;;;;;
+2DF5;COMBINING CYRILLIC LETTER ES-TE;Mn;230;NSM;;;;;N;;;;;
+2DF6;COMBINING CYRILLIC LETTER A;Mn;230;NSM;;;;;N;;;;;
+2DF7;COMBINING CYRILLIC LETTER IE;Mn;230;NSM;;;;;N;;;;;
+2DF8;COMBINING CYRILLIC LETTER DJERV;Mn;230;NSM;;;;;N;;;;;
+2DF9;COMBINING CYRILLIC LETTER MONOGRAPH UK;Mn;230;NSM;;;;;N;;;;;
+2DFA;COMBINING CYRILLIC LETTER YAT;Mn;230;NSM;;;;;N;;;;;
+2DFB;COMBINING CYRILLIC LETTER YU;Mn;230;NSM;;;;;N;;;;;
+2DFC;COMBINING CYRILLIC LETTER IOTIFIED A;Mn;230;NSM;;;;;N;;;;;
+2DFD;COMBINING CYRILLIC LETTER LITTLE YUS;Mn;230;NSM;;;;;N;;;;;
+2DFE;COMBINING CYRILLIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;;
+2DFF;COMBINING CYRILLIC LETTER IOTIFIED BIG YUS;Mn;230;NSM;;;;;N;;;;;
+2E00;RIGHT ANGLE SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;;
+2E01;RIGHT ANGLE DOTTED SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;;
+2E02;LEFT SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E03;RIGHT SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E04;LEFT DOTTED SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E05;RIGHT DOTTED SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E06;RAISED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;;
+2E07;RAISED DOTTED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;;
+2E08;DOTTED TRANSPOSITION MARKER;Po;0;ON;;;;;N;;;;;
+2E09;LEFT TRANSPOSITION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E0A;RIGHT TRANSPOSITION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E0B;RAISED SQUARE;Po;0;ON;;;;;N;;;;;
+2E0C;LEFT RAISED OMISSION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E0D;RIGHT RAISED OMISSION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E0E;EDITORIAL CORONIS;Po;0;ON;;;;;N;;;;;
+2E0F;PARAGRAPHOS;Po;0;ON;;;;;N;;;;;
+2E10;FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;;
+2E11;REVERSED FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;;
+2E12;HYPODIASTOLE;Po;0;ON;;;;;N;;;;;
+2E13;DOTTED OBELOS;Po;0;ON;;;;;N;;;;;
+2E14;DOWNWARDS ANCORA;Po;0;ON;;;;;N;;;;;
+2E15;UPWARDS ANCORA;Po;0;ON;;;;;N;;;;;
+2E16;DOTTED RIGHT-POINTING ANGLE;Po;0;ON;;;;;N;;;;;
+2E17;DOUBLE OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;;
+2E18;INVERTED INTERROBANG;Po;0;ON;;;;;N;;;;;
+2E19;PALM BRANCH;Po;0;ON;;;;;N;;;;;
+2E1A;HYPHEN WITH DIAERESIS;Pd;0;ON;;;;;N;;;;;
+2E1B;TILDE WITH RING ABOVE;Po;0;ON;;;;;N;;;;;
+2E1C;LEFT LOW PARAPHRASE BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E1D;RIGHT LOW PARAPHRASE BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E1E;TILDE WITH DOT ABOVE;Po;0;ON;;;;;N;;;;;
+2E1F;TILDE WITH DOT BELOW;Po;0;ON;;;;;N;;;;;
+2E20;LEFT VERTICAL BAR WITH QUILL;Pi;0;ON;;;;;Y;;;;;
+2E21;RIGHT VERTICAL BAR WITH QUILL;Pf;0;ON;;;;;Y;;;;;
+2E22;TOP LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;;
+2E23;TOP RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;;
+2E24;BOTTOM LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;;
+2E25;BOTTOM RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;;
+2E26;LEFT SIDEWAYS U BRACKET;Ps;0;ON;;;;;Y;;;;;
+2E27;RIGHT SIDEWAYS U BRACKET;Pe;0;ON;;;;;Y;;;;;
+2E28;LEFT DOUBLE PARENTHESIS;Ps;0;ON;;;;;Y;;;;;
+2E29;RIGHT DOUBLE PARENTHESIS;Pe;0;ON;;;;;Y;;;;;
+2E2A;TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2E2B;ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2E2C;SQUARED FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2E2D;FIVE DOT MARK;Po;0;ON;;;;;N;;;;;
+2E2E;REVERSED QUESTION MARK;Po;0;ON;;;;;N;;;;;
+2E2F;VERTICAL TILDE;Lm;0;ON;;;;;N;;;;;
+2E30;RING POINT;Po;0;ON;;;;;N;;;;;
2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;;
2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;;
2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;;
@@ -8632,7 +10239,7 @@
30F8;KATAKANA LETTER VI;Lo;0;L;30F0 3099;;;;N;;;;;
30F9;KATAKANA LETTER VE;Lo;0;L;30F1 3099;;;;N;;;;;
30FA;KATAKANA LETTER VO;Lo;0;L;30F2 3099;;;;N;;;;;
-30FB;KATAKANA MIDDLE DOT;Pc;0;ON;;;;;N;;;;;
+30FB;KATAKANA MIDDLE DOT;Po;0;ON;;;;;N;;;;;
30FC;KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;;;;;N;;;;;
30FD;KATAKANA ITERATION MARK;Lm;0;L;;;;;N;;;;;
30FE;KATAKANA VOICED ITERATION MARK;Lm;0;L;30FD 3099;;;;N;;;;;
@@ -8677,6 +10284,7 @@
312A;BOPOMOFO LETTER V;Lo;0;L;;;;;N;;;;;
312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;;
312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;;
+312D;BOPOMOFO LETTER IH;Lo;0;L;;;;;N;;;;;
3131;HANGUL LETTER KIYEOK;Lo;0;L;<compat> 1100;;;;N;HANGUL LETTER GIYEOG;;;;
3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L;<compat> 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;;
3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<compat> 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;;
@@ -8811,6 +10419,42 @@
31B5;BOPOMOFO FINAL LETTER T;Lo;0;L;;;;;N;;;;;
31B6;BOPOMOFO FINAL LETTER K;Lo;0;L;;;;;N;;;;;
31B7;BOPOMOFO FINAL LETTER H;Lo;0;L;;;;;N;;;;;
+31C0;CJK STROKE T;So;0;ON;;;;;N;;;;;
+31C1;CJK STROKE WG;So;0;ON;;;;;N;;;;;
+31C2;CJK STROKE XG;So;0;ON;;;;;N;;;;;
+31C3;CJK STROKE BXG;So;0;ON;;;;;N;;;;;
+31C4;CJK STROKE SW;So;0;ON;;;;;N;;;;;
+31C5;CJK STROKE HZZ;So;0;ON;;;;;N;;;;;
+31C6;CJK STROKE HZG;So;0;ON;;;;;N;;;;;
+31C7;CJK STROKE HP;So;0;ON;;;;;N;;;;;
+31C8;CJK STROKE HZWG;So;0;ON;;;;;N;;;;;
+31C9;CJK STROKE SZWG;So;0;ON;;;;;N;;;;;
+31CA;CJK STROKE HZT;So;0;ON;;;;;N;;;;;
+31CB;CJK STROKE HZZP;So;0;ON;;;;;N;;;;;
+31CC;CJK STROKE HPWG;So;0;ON;;;;;N;;;;;
+31CD;CJK STROKE HZW;So;0;ON;;;;;N;;;;;
+31CE;CJK STROKE HZZZ;So;0;ON;;;;;N;;;;;
+31CF;CJK STROKE N;So;0;ON;;;;;N;;;;;
+31D0;CJK STROKE H;So;0;ON;;;;;N;;;;;
+31D1;CJK STROKE S;So;0;ON;;;;;N;;;;;
+31D2;CJK STROKE P;So;0;ON;;;;;N;;;;;
+31D3;CJK STROKE SP;So;0;ON;;;;;N;;;;;
+31D4;CJK STROKE D;So;0;ON;;;;;N;;;;;
+31D5;CJK STROKE HZ;So;0;ON;;;;;N;;;;;
+31D6;CJK STROKE HG;So;0;ON;;;;;N;;;;;
+31D7;CJK STROKE SZ;So;0;ON;;;;;N;;;;;
+31D8;CJK STROKE SWZ;So;0;ON;;;;;N;;;;;
+31D9;CJK STROKE ST;So;0;ON;;;;;N;;;;;
+31DA;CJK STROKE SG;So;0;ON;;;;;N;;;;;
+31DB;CJK STROKE PD;So;0;ON;;;;;N;;;;;
+31DC;CJK STROKE PZ;So;0;ON;;;;;N;;;;;
+31DD;CJK STROKE TN;So;0;ON;;;;;N;;;;;
+31DE;CJK STROKE SZZ;So;0;ON;;;;;N;;;;;
+31DF;CJK STROKE SWG;So;0;ON;;;;;N;;;;;
+31E0;CJK STROKE HXWG;So;0;ON;;;;;N;;;;;
+31E1;CJK STROKE HZZZG;So;0;ON;;;;;N;;;;;
+31E2;CJK STROKE PG;So;0;ON;;;;;N;;;;;
+31E3;CJK STROKE Q;So;0;ON;;;;;N;;;;;
31F0;KATAKANA LETTER SMALL KU;Lo;0;L;;;;;N;;;;;
31F1;KATAKANA LETTER SMALL SI;Lo;0;L;;;;;N;;;;;
31F2;KATAKANA LETTER SMALL SU;Lo;0;L;;;;;N;;;;;
@@ -8940,6 +10584,7 @@
327B;CIRCLED HANGUL HIEUH A;So;0;L;<circle> 1112 1161;;;;N;CIRCLED HANGUL HA;;;;
327C;CIRCLED KOREAN CHARACTER CHAMKO;So;0;ON;<circle> 110E 1161 11B7 1100 1169;;;;N;;;;;
327D;CIRCLED KOREAN CHARACTER JUEUI;So;0;ON;<circle> 110C 116E 110B 1174;;;;N;;;;;
+327E;CIRCLED HANGUL IEUNG U;So;0;ON;<circle> 110B 116E;;;;N;;;;;
327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;;
3280;CIRCLED IDEOGRAPH ONE;No;0;L;<circle> 4E00;;;1;N;;;;;
3281;CIRCLED IDEOGRAPH TWO;No;0;L;<circle> 4E8C;;;2;N;;;;;
@@ -9391,7 +11036,7 @@
4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;;
4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;;
4E00;<CJK Ideograph, First>;Lo;0;L;;;;;N;;;;;
-9FA5;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;;
+9FC3;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;;
A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;;
A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;;
A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;;
@@ -9413,7 +11058,7 @@
A012;YI SYLLABLE OP;Lo;0;L;;;;;N;;;;;
A013;YI SYLLABLE EX;Lo;0;L;;;;;N;;;;;
A014;YI SYLLABLE E;Lo;0;L;;;;;N;;;;;
-A015;YI SYLLABLE WU;Lo;0;L;;;;;N;;;;;
+A015;YI SYLLABLE WU;Lm;0;L;;;;;N;;;;;
A016;YI SYLLABLE BIT;Lo;0;L;;;;;N;;;;;
A017;YI SYLLABLE BIX;Lo;0;L;;;;;N;;;;;
A018;YI SYLLABLE BI;Lo;0;L;;;;;N;;;;;
@@ -10612,6 +12257,879 @@
A4C4;YI RADICAL ZZIET;So;0;ON;;;;;N;;;;;
A4C5;YI RADICAL NBIE;So;0;ON;;;;;N;;;;;
A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;;
+A500;VAI SYLLABLE EE;Lo;0;L;;;;;N;;;;;
+A501;VAI SYLLABLE EEN;Lo;0;L;;;;;N;;;;;
+A502;VAI SYLLABLE HEE;Lo;0;L;;;;;N;;;;;
+A503;VAI SYLLABLE WEE;Lo;0;L;;;;;N;;;;;
+A504;VAI SYLLABLE WEEN;Lo;0;L;;;;;N;;;;;
+A505;VAI SYLLABLE PEE;Lo;0;L;;;;;N;;;;;
+A506;VAI SYLLABLE BHEE;Lo;0;L;;;;;N;;;;;
+A507;VAI SYLLABLE BEE;Lo;0;L;;;;;N;;;;;
+A508;VAI SYLLABLE MBEE;Lo;0;L;;;;;N;;;;;
+A509;VAI SYLLABLE KPEE;Lo;0;L;;;;;N;;;;;
+A50A;VAI SYLLABLE MGBEE;Lo;0;L;;;;;N;;;;;
+A50B;VAI SYLLABLE GBEE;Lo;0;L;;;;;N;;;;;
+A50C;VAI SYLLABLE FEE;Lo;0;L;;;;;N;;;;;
+A50D;VAI SYLLABLE VEE;Lo;0;L;;;;;N;;;;;
+A50E;VAI SYLLABLE TEE;Lo;0;L;;;;;N;;;;;
+A50F;VAI SYLLABLE THEE;Lo;0;L;;;;;N;;;;;
+A510;VAI SYLLABLE DHEE;Lo;0;L;;;;;N;;;;;
+A511;VAI SYLLABLE DHHEE;Lo;0;L;;;;;N;;;;;
+A512;VAI SYLLABLE LEE;Lo;0;L;;;;;N;;;;;
+A513;VAI SYLLABLE REE;Lo;0;L;;;;;N;;;;;
+A514;VAI SYLLABLE DEE;Lo;0;L;;;;;N;;;;;
+A515;VAI SYLLABLE NDEE;Lo;0;L;;;;;N;;;;;
+A516;VAI SYLLABLE SEE;Lo;0;L;;;;;N;;;;;
+A517;VAI SYLLABLE SHEE;Lo;0;L;;;;;N;;;;;
+A518;VAI SYLLABLE ZEE;Lo;0;L;;;;;N;;;;;
+A519;VAI SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;;
+A51A;VAI SYLLABLE CEE;Lo;0;L;;;;;N;;;;;
+A51B;VAI SYLLABLE JEE;Lo;0;L;;;;;N;;;;;
+A51C;VAI SYLLABLE NJEE;Lo;0;L;;;;;N;;;;;
+A51D;VAI SYLLABLE YEE;Lo;0;L;;;;;N;;;;;
+A51E;VAI SYLLABLE KEE;Lo;0;L;;;;;N;;;;;
+A51F;VAI SYLLABLE NGGEE;Lo;0;L;;;;;N;;;;;
+A520;VAI SYLLABLE GEE;Lo;0;L;;;;;N;;;;;
+A521;VAI SYLLABLE MEE;Lo;0;L;;;;;N;;;;;
+A522;VAI SYLLABLE NEE;Lo;0;L;;;;;N;;;;;
+A523;VAI SYLLABLE NYEE;Lo;0;L;;;;;N;;;;;
+A524;VAI SYLLABLE I;Lo;0;L;;;;;N;;;;;
+A525;VAI SYLLABLE IN;Lo;0;L;;;;;N;;;;;
+A526;VAI SYLLABLE HI;Lo;0;L;;;;;N;;;;;
+A527;VAI SYLLABLE HIN;Lo;0;L;;;;;N;;;;;
+A528;VAI SYLLABLE WI;Lo;0;L;;;;;N;;;;;
+A529;VAI SYLLABLE WIN;Lo;0;L;;;;;N;;;;;
+A52A;VAI SYLLABLE PI;Lo;0;L;;;;;N;;;;;
+A52B;VAI SYLLABLE BHI;Lo;0;L;;;;;N;;;;;
+A52C;VAI SYLLABLE BI;Lo;0;L;;;;;N;;;;;
+A52D;VAI SYLLABLE MBI;Lo;0;L;;;;;N;;;;;
+A52E;VAI SYLLABLE KPI;Lo;0;L;;;;;N;;;;;
+A52F;VAI SYLLABLE MGBI;Lo;0;L;;;;;N;;;;;
+A530;VAI SYLLABLE GBI;Lo;0;L;;;;;N;;;;;
+A531;VAI SYLLABLE FI;Lo;0;L;;;;;N;;;;;
+A532;VAI SYLLABLE VI;Lo;0;L;;;;;N;;;;;
+A533;VAI SYLLABLE TI;Lo;0;L;;;;;N;;;;;
+A534;VAI SYLLABLE THI;Lo;0;L;;;;;N;;;;;
+A535;VAI SYLLABLE DHI;Lo;0;L;;;;;N;;;;;
+A536;VAI SYLLABLE DHHI;Lo;0;L;;;;;N;;;;;
+A537;VAI SYLLABLE LI;Lo;0;L;;;;;N;;;;;
+A538;VAI SYLLABLE RI;Lo;0;L;;;;;N;;;;;
+A539;VAI SYLLABLE DI;Lo;0;L;;;;;N;;;;;
+A53A;VAI SYLLABLE NDI;Lo;0;L;;;;;N;;;;;
+A53B;VAI SYLLABLE SI;Lo;0;L;;;;;N;;;;;
+A53C;VAI SYLLABLE SHI;Lo;0;L;;;;;N;;;;;
+A53D;VAI SYLLABLE ZI;Lo;0;L;;;;;N;;;;;
+A53E;VAI SYLLABLE ZHI;Lo;0;L;;;;;N;;;;;
+A53F;VAI SYLLABLE CI;Lo;0;L;;;;;N;;;;;
+A540;VAI SYLLABLE JI;Lo;0;L;;;;;N;;;;;
+A541;VAI SYLLABLE NJI;Lo;0;L;;;;;N;;;;;
+A542;VAI SYLLABLE YI;Lo;0;L;;;;;N;;;;;
+A543;VAI SYLLABLE KI;Lo;0;L;;;;;N;;;;;
+A544;VAI SYLLABLE NGGI;Lo;0;L;;;;;N;;;;;
+A545;VAI SYLLABLE GI;Lo;0;L;;;;;N;;;;;
+A546;VAI SYLLABLE MI;Lo;0;L;;;;;N;;;;;
+A547;VAI SYLLABLE NI;Lo;0;L;;;;;N;;;;;
+A548;VAI SYLLABLE NYI;Lo;0;L;;;;;N;;;;;
+A549;VAI SYLLABLE A;Lo;0;L;;;;;N;;;;;
+A54A;VAI SYLLABLE AN;Lo;0;L;;;;;N;;;;;
+A54B;VAI SYLLABLE NGAN;Lo;0;L;;;;;N;;;;;
+A54C;VAI SYLLABLE HA;Lo;0;L;;;;;N;;;;;
+A54D;VAI SYLLABLE HAN;Lo;0;L;;;;;N;;;;;
+A54E;VAI SYLLABLE WA;Lo;0;L;;;;;N;;;;;
+A54F;VAI SYLLABLE WAN;Lo;0;L;;;;;N;;;;;
+A550;VAI SYLLABLE PA;Lo;0;L;;;;;N;;;;;
+A551;VAI SYLLABLE BHA;Lo;0;L;;;;;N;;;;;
+A552;VAI SYLLABLE BA;Lo;0;L;;;;;N;;;;;
+A553;VAI SYLLABLE MBA;Lo;0;L;;;;;N;;;;;
+A554;VAI SYLLABLE KPA;Lo;0;L;;;;;N;;;;;
+A555;VAI SYLLABLE KPAN;Lo;0;L;;;;;N;;;;;
+A556;VAI SYLLABLE MGBA;Lo;0;L;;;;;N;;;;;
+A557;VAI SYLLABLE GBA;Lo;0;L;;;;;N;;;;;
+A558;VAI SYLLABLE FA;Lo;0;L;;;;;N;;;;;
+A559;VAI SYLLABLE VA;Lo;0;L;;;;;N;;;;;
+A55A;VAI SYLLABLE TA;Lo;0;L;;;;;N;;;;;
+A55B;VAI SYLLABLE THA;Lo;0;L;;;;;N;;;;;
+A55C;VAI SYLLABLE DHA;Lo;0;L;;;;;N;;;;;
+A55D;VAI SYLLABLE DHHA;Lo;0;L;;;;;N;;;;;
+A55E;VAI SYLLABLE LA;Lo;0;L;;;;;N;;;;;
+A55F;VAI SYLLABLE RA;Lo;0;L;;;;;N;;;;;
+A560;VAI SYLLABLE DA;Lo;0;L;;;;;N;;;;;
+A561;VAI SYLLABLE NDA;Lo;0;L;;;;;N;;;;;
+A562;VAI SYLLABLE SA;Lo;0;L;;;;;N;;;;;
+A563;VAI SYLLABLE SHA;Lo;0;L;;;;;N;;;;;
+A564;VAI SYLLABLE ZA;Lo;0;L;;;;;N;;;;;
+A565;VAI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;;
+A566;VAI SYLLABLE CA;Lo;0;L;;;;;N;;;;;
+A567;VAI SYLLABLE JA;Lo;0;L;;;;;N;;;;;
+A568;VAI SYLLABLE NJA;Lo;0;L;;;;;N;;;;;
+A569;VAI SYLLABLE YA;Lo;0;L;;;;;N;;;;;
+A56A;VAI SYLLABLE KA;Lo;0;L;;;;;N;;;;;
+A56B;VAI SYLLABLE KAN;Lo;0;L;;;;;N;;;;;
+A56C;VAI SYLLABLE NGGA;Lo;0;L;;;;;N;;;;;
+A56D;VAI SYLLABLE GA;Lo;0;L;;;;;N;;;;;
+A56E;VAI SYLLABLE MA;Lo;0;L;;;;;N;;;;;
+A56F;VAI SYLLABLE NA;Lo;0;L;;;;;N;;;;;
+A570;VAI SYLLABLE NYA;Lo;0;L;;;;;N;;;;;
+A571;VAI SYLLABLE OO;Lo;0;L;;;;;N;;;;;
+A572;VAI SYLLABLE OON;Lo;0;L;;;;;N;;;;;
+A573;VAI SYLLABLE HOO;Lo;0;L;;;;;N;;;;;
+A574;VAI SYLLABLE WOO;Lo;0;L;;;;;N;;;;;
+A575;VAI SYLLABLE WOON;Lo;0;L;;;;;N;;;;;
+A576;VAI SYLLABLE POO;Lo;0;L;;;;;N;;;;;
+A577;VAI SYLLABLE BHOO;Lo;0;L;;;;;N;;;;;
+A578;VAI SYLLABLE BOO;Lo;0;L;;;;;N;;;;;
+A579;VAI SYLLABLE MBOO;Lo;0;L;;;;;N;;;;;
+A57A;VAI SYLLABLE KPOO;Lo;0;L;;;;;N;;;;;
+A57B;VAI SYLLABLE MGBOO;Lo;0;L;;;;;N;;;;;
+A57C;VAI SYLLABLE GBOO;Lo;0;L;;;;;N;;;;;
+A57D;VAI SYLLABLE FOO;Lo;0;L;;;;;N;;;;;
+A57E;VAI SYLLABLE VOO;Lo;0;L;;;;;N;;;;;
+A57F;VAI SYLLABLE TOO;Lo;0;L;;;;;N;;;;;
+A580;VAI SYLLABLE THOO;Lo;0;L;;;;;N;;;;;
+A581;VAI SYLLABLE DHOO;Lo;0;L;;;;;N;;;;;
+A582;VAI SYLLABLE DHHOO;Lo;0;L;;;;;N;;;;;
+A583;VAI SYLLABLE LOO;Lo;0;L;;;;;N;;;;;
+A584;VAI SYLLABLE ROO;Lo;0;L;;;;;N;;;;;
+A585;VAI SYLLABLE DOO;Lo;0;L;;;;;N;;;;;
+A586;VAI SYLLABLE NDOO;Lo;0;L;;;;;N;;;;;
+A587;VAI SYLLABLE SOO;Lo;0;L;;;;;N;;;;;
+A588;VAI SYLLABLE SHOO;Lo;0;L;;;;;N;;;;;
+A589;VAI SYLLABLE ZOO;Lo;0;L;;;;;N;;;;;
+A58A;VAI SYLLABLE ZHOO;Lo;0;L;;;;;N;;;;;
+A58B;VAI SYLLABLE COO;Lo;0;L;;;;;N;;;;;
+A58C;VAI SYLLABLE JOO;Lo;0;L;;;;;N;;;;;
+A58D;VAI SYLLABLE NJOO;Lo;0;L;;;;;N;;;;;
+A58E;VAI SYLLABLE YOO;Lo;0;L;;;;;N;;;;;
+A58F;VAI SYLLABLE KOO;Lo;0;L;;;;;N;;;;;
+A590;VAI SYLLABLE NGGOO;Lo;0;L;;;;;N;;;;;
+A591;VAI SYLLABLE GOO;Lo;0;L;;;;;N;;;;;
+A592;VAI SYLLABLE MOO;Lo;0;L;;;;;N;;;;;
+A593;VAI SYLLABLE NOO;Lo;0;L;;;;;N;;;;;
+A594;VAI SYLLABLE NYOO;Lo;0;L;;;;;N;;;;;
+A595;VAI SYLLABLE U;Lo;0;L;;;;;N;;;;;
+A596;VAI SYLLABLE UN;Lo;0;L;;;;;N;;;;;
+A597;VAI SYLLABLE HU;Lo;0;L;;;;;N;;;;;
+A598;VAI SYLLABLE HUN;Lo;0;L;;;;;N;;;;;
+A599;VAI SYLLABLE WU;Lo;0;L;;;;;N;;;;;
+A59A;VAI SYLLABLE WUN;Lo;0;L;;;;;N;;;;;
+A59B;VAI SYLLABLE PU;Lo;0;L;;;;;N;;;;;
+A59C;VAI SYLLABLE BHU;Lo;0;L;;;;;N;;;;;
+A59D;VAI SYLLABLE BU;Lo;0;L;;;;;N;;;;;
+A59E;VAI SYLLABLE MBU;Lo;0;L;;;;;N;;;;;
+A59F;VAI SYLLABLE KPU;Lo;0;L;;;;;N;;;;;
+A5A0;VAI SYLLABLE MGBU;Lo;0;L;;;;;N;;;;;
+A5A1;VAI SYLLABLE GBU;Lo;0;L;;;;;N;;;;;
+A5A2;VAI SYLLABLE FU;Lo;0;L;;;;;N;;;;;
+A5A3;VAI SYLLABLE VU;Lo;0;L;;;;;N;;;;;
+A5A4;VAI SYLLABLE TU;Lo;0;L;;;;;N;;;;;
+A5A5;VAI SYLLABLE THU;Lo;0;L;;;;;N;;;;;
+A5A6;VAI SYLLABLE DHU;Lo;0;L;;;;;N;;;;;
+A5A7;VAI SYLLABLE DHHU;Lo;0;L;;;;;N;;;;;
+A5A8;VAI SYLLABLE LU;Lo;0;L;;;;;N;;;;;
+A5A9;VAI SYLLABLE RU;Lo;0;L;;;;;N;;;;;
+A5AA;VAI SYLLABLE DU;Lo;0;L;;;;;N;;;;;
+A5AB;VAI SYLLABLE NDU;Lo;0;L;;;;;N;;;;;
+A5AC;VAI SYLLABLE SU;Lo;0;L;;;;;N;;;;;
+A5AD;VAI SYLLABLE SHU;Lo;0;L;;;;;N;;;;;
+A5AE;VAI SYLLABLE ZU;Lo;0;L;;;;;N;;;;;
+A5AF;VAI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;;
+A5B0;VAI SYLLABLE CU;Lo;0;L;;;;;N;;;;;
+A5B1;VAI SYLLABLE JU;Lo;0;L;;;;;N;;;;;
+A5B2;VAI SYLLABLE NJU;Lo;0;L;;;;;N;;;;;
+A5B3;VAI SYLLABLE YU;Lo;0;L;;;;;N;;;;;
+A5B4;VAI SYLLABLE KU;Lo;0;L;;;;;N;;;;;
+A5B5;VAI SYLLABLE NGGU;Lo;0;L;;;;;N;;;;;
+A5B6;VAI SYLLABLE GU;Lo;0;L;;;;;N;;;;;
+A5B7;VAI SYLLABLE MU;Lo;0;L;;;;;N;;;;;
+A5B8;VAI SYLLABLE NU;Lo;0;L;;;;;N;;;;;
+A5B9;VAI SYLLABLE NYU;Lo;0;L;;;;;N;;;;;
+A5BA;VAI SYLLABLE O;Lo;0;L;;;;;N;;;;;
+A5BB;VAI SYLLABLE ON;Lo;0;L;;;;;N;;;;;
+A5BC;VAI SYLLABLE NGON;Lo;0;L;;;;;N;;;;;
+A5BD;VAI SYLLABLE HO;Lo;0;L;;;;;N;;;;;
+A5BE;VAI SYLLABLE HON;Lo;0;L;;;;;N;;;;;
+A5BF;VAI SYLLABLE WO;Lo;0;L;;;;;N;;;;;
+A5C0;VAI SYLLABLE WON;Lo;0;L;;;;;N;;;;;
+A5C1;VAI SYLLABLE PO;Lo;0;L;;;;;N;;;;;
+A5C2;VAI SYLLABLE BHO;Lo;0;L;;;;;N;;;;;
+A5C3;VAI SYLLABLE BO;Lo;0;L;;;;;N;;;;;
+A5C4;VAI SYLLABLE MBO;Lo;0;L;;;;;N;;;;;
+A5C5;VAI SYLLABLE KPO;Lo;0;L;;;;;N;;;;;
+A5C6;VAI SYLLABLE MGBO;Lo;0;L;;;;;N;;;;;
+A5C7;VAI SYLLABLE GBO;Lo;0;L;;;;;N;;;;;
+A5C8;VAI SYLLABLE GBON;Lo;0;L;;;;;N;;;;;
+A5C9;VAI SYLLABLE FO;Lo;0;L;;;;;N;;;;;
+A5CA;VAI SYLLABLE VO;Lo;0;L;;;;;N;;;;;
+A5CB;VAI SYLLABLE TO;Lo;0;L;;;;;N;;;;;
+A5CC;VAI SYLLABLE THO;Lo;0;L;;;;;N;;;;;
+A5CD;VAI SYLLABLE DHO;Lo;0;L;;;;;N;;;;;
+A5CE;VAI SYLLABLE DHHO;Lo;0;L;;;;;N;;;;;
+A5CF;VAI SYLLABLE LO;Lo;0;L;;;;;N;;;;;
+A5D0;VAI SYLLABLE RO;Lo;0;L;;;;;N;;;;;
+A5D1;VAI SYLLABLE DO;Lo;0;L;;;;;N;;;;;
+A5D2;VAI SYLLABLE NDO;Lo;0;L;;;;;N;;;;;
+A5D3;VAI SYLLABLE SO;Lo;0;L;;;;;N;;;;;
+A5D4;VAI SYLLABLE SHO;Lo;0;L;;;;;N;;;;;
+A5D5;VAI SYLLABLE ZO;Lo;0;L;;;;;N;;;;;
+A5D6;VAI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;;
+A5D7;VAI SYLLABLE CO;Lo;0;L;;;;;N;;;;;
+A5D8;VAI SYLLABLE JO;Lo;0;L;;;;;N;;;;;
+A5D9;VAI SYLLABLE NJO;Lo;0;L;;;;;N;;;;;
+A5DA;VAI SYLLABLE YO;Lo;0;L;;;;;N;;;;;
+A5DB;VAI SYLLABLE KO;Lo;0;L;;;;;N;;;;;
+A5DC;VAI SYLLABLE NGGO;Lo;0;L;;;;;N;;;;;
+A5DD;VAI SYLLABLE GO;Lo;0;L;;;;;N;;;;;
+A5DE;VAI SYLLABLE MO;Lo;0;L;;;;;N;;;;;
+A5DF;VAI SYLLABLE NO;Lo;0;L;;;;;N;;;;;
+A5E0;VAI SYLLABLE NYO;Lo;0;L;;;;;N;;;;;
+A5E1;VAI SYLLABLE E;Lo;0;L;;;;;N;;;;;
+A5E2;VAI SYLLABLE EN;Lo;0;L;;;;;N;;;;;
+A5E3;VAI SYLLABLE NGEN;Lo;0;L;;;;;N;;;;;
+A5E4;VAI SYLLABLE HE;Lo;0;L;;;;;N;;;;;
+A5E5;VAI SYLLABLE HEN;Lo;0;L;;;;;N;;;;;
+A5E6;VAI SYLLABLE WE;Lo;0;L;;;;;N;;;;;
+A5E7;VAI SYLLABLE WEN;Lo;0;L;;;;;N;;;;;
+A5E8;VAI SYLLABLE PE;Lo;0;L;;;;;N;;;;;
+A5E9;VAI SYLLABLE BHE;Lo;0;L;;;;;N;;;;;
+A5EA;VAI SYLLABLE BE;Lo;0;L;;;;;N;;;;;
+A5EB;VAI SYLLABLE MBE;Lo;0;L;;;;;N;;;;;
+A5EC;VAI SYLLABLE KPE;Lo;0;L;;;;;N;;;;;
+A5ED;VAI SYLLABLE KPEN;Lo;0;L;;;;;N;;;;;
+A5EE;VAI SYLLABLE MGBE;Lo;0;L;;;;;N;;;;;
+A5EF;VAI SYLLABLE GBE;Lo;0;L;;;;;N;;;;;
+A5F0;VAI SYLLABLE GBEN;Lo;0;L;;;;;N;;;;;
+A5F1;VAI SYLLABLE FE;Lo;0;L;;;;;N;;;;;
+A5F2;VAI SYLLABLE VE;Lo;0;L;;;;;N;;;;;
+A5F3;VAI SYLLABLE TE;Lo;0;L;;;;;N;;;;;
+A5F4;VAI SYLLABLE THE;Lo;0;L;;;;;N;;;;;
+A5F5;VAI SYLLABLE DHE;Lo;0;L;;;;;N;;;;;
+A5F6;VAI SYLLABLE DHHE;Lo;0;L;;;;;N;;;;;
+A5F7;VAI SYLLABLE LE;Lo;0;L;;;;;N;;;;;
+A5F8;VAI SYLLABLE RE;Lo;0;L;;;;;N;;;;;
+A5F9;VAI SYLLABLE DE;Lo;0;L;;;;;N;;;;;
+A5FA;VAI SYLLABLE NDE;Lo;0;L;;;;;N;;;;;
+A5FB;VAI SYLLABLE SE;Lo;0;L;;;;;N;;;;;
+A5FC;VAI SYLLABLE SHE;Lo;0;L;;;;;N;;;;;
+A5FD;VAI SYLLABLE ZE;Lo;0;L;;;;;N;;;;;
+A5FE;VAI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;;
+A5FF;VAI SYLLABLE CE;Lo;0;L;;;;;N;;;;;
+A600;VAI SYLLABLE JE;Lo;0;L;;;;;N;;;;;
+A601;VAI SYLLABLE NJE;Lo;0;L;;;;;N;;;;;
+A602;VAI SYLLABLE YE;Lo;0;L;;;;;N;;;;;
+A603;VAI SYLLABLE KE;Lo;0;L;;;;;N;;;;;
+A604;VAI SYLLABLE NGGE;Lo;0;L;;;;;N;;;;;
+A605;VAI SYLLABLE NGGEN;Lo;0;L;;;;;N;;;;;
+A606;VAI SYLLABLE GE;Lo;0;L;;;;;N;;;;;
+A607;VAI SYLLABLE GEN;Lo;0;L;;;;;N;;;;;
+A608;VAI SYLLABLE ME;Lo;0;L;;;;;N;;;;;
+A609;VAI SYLLABLE NE;Lo;0;L;;;;;N;;;;;
+A60A;VAI SYLLABLE NYE;Lo;0;L;;;;;N;;;;;
+A60B;VAI SYLLABLE NG;Lo;0;L;;;;;N;;;;;
+A60C;VAI SYLLABLE LENGTHENER;Lm;0;L;;;;;N;;;;;
+A60D;VAI COMMA;Po;0;ON;;;;;N;;;;;
+A60E;VAI FULL STOP;Po;0;ON;;;;;N;;;;;
+A60F;VAI QUESTION MARK;Po;0;ON;;;;;N;;;;;
+A610;VAI SYLLABLE NDOLE FA;Lo;0;L;;;;;N;;;;;
+A611;VAI SYLLABLE NDOLE KA;Lo;0;L;;;;;N;;;;;
+A612;VAI SYLLABLE NDOLE SOO;Lo;0;L;;;;;N;;;;;
+A613;VAI SYMBOL FEENG;Lo;0;L;;;;;N;;;;;
+A614;VAI SYMBOL KEENG;Lo;0;L;;;;;N;;;;;
+A615;VAI SYMBOL TING;Lo;0;L;;;;;N;;;;;
+A616;VAI SYMBOL NII;Lo;0;L;;;;;N;;;;;
+A617;VAI SYMBOL BANG;Lo;0;L;;;;;N;;;;;
+A618;VAI SYMBOL FAA;Lo;0;L;;;;;N;;;;;
+A619;VAI SYMBOL TAA;Lo;0;L;;;;;N;;;;;
+A61A;VAI SYMBOL DANG;Lo;0;L;;;;;N;;;;;
+A61B;VAI SYMBOL DOONG;Lo;0;L;;;;;N;;;;;
+A61C;VAI SYMBOL KUNG;Lo;0;L;;;;;N;;;;;
+A61D;VAI SYMBOL TONG;Lo;0;L;;;;;N;;;;;
+A61E;VAI SYMBOL DO-O;Lo;0;L;;;;;N;;;;;
+A61F;VAI SYMBOL JONG;Lo;0;L;;;;;N;;;;;
+A620;VAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+A621;VAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+A622;VAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+A623;VAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+A624;VAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+A625;VAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+A626;VAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+A627;VAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+A628;VAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+A629;VAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+A62A;VAI SYLLABLE NDOLE MA;Lo;0;L;;;;;N;;;;;
+A62B;VAI SYLLABLE NDOLE DO;Lo;0;L;;;;;N;;;;;
+A640;CYRILLIC CAPITAL LETTER ZEMLYA;Lu;0;L;;;;;N;;;;A641;
+A641;CYRILLIC SMALL LETTER ZEMLYA;Ll;0;L;;;;;N;;;A640;;A640
+A642;CYRILLIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;A643;
+A643;CYRILLIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;A642;;A642
+A644;CYRILLIC CAPITAL LETTER REVERSED DZE;Lu;0;L;;;;;N;;;;A645;
+A645;CYRILLIC SMALL LETTER REVERSED DZE;Ll;0;L;;;;;N;;;A644;;A644
+A646;CYRILLIC CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;A647;
+A647;CYRILLIC SMALL LETTER IOTA;Ll;0;L;;;;;N;;;A646;;A646
+A648;CYRILLIC CAPITAL LETTER DJERV;Lu;0;L;;;;;N;;;;A649;
+A649;CYRILLIC SMALL LETTER DJERV;Ll;0;L;;;;;N;;;A648;;A648
+A64A;CYRILLIC CAPITAL LETTER MONOGRAPH UK;Lu;0;L;;;;;N;;;;A64B;
+A64B;CYRILLIC SMALL LETTER MONOGRAPH UK;Ll;0;L;;;;;N;;;A64A;;A64A
+A64C;CYRILLIC CAPITAL LETTER BROAD OMEGA;Lu;0;L;;;;;N;;;;A64D;
+A64D;CYRILLIC SMALL LETTER BROAD OMEGA;Ll;0;L;;;;;N;;;A64C;;A64C
+A64E;CYRILLIC CAPITAL LETTER NEUTRAL YER;Lu;0;L;;;;;N;;;;A64F;
+A64F;CYRILLIC SMALL LETTER NEUTRAL YER;Ll;0;L;;;;;N;;;A64E;;A64E
+A650;CYRILLIC CAPITAL LETTER YERU WITH BACK YER;Lu;0;L;;;;;N;;;;A651;
+A651;CYRILLIC SMALL LETTER YERU WITH BACK YER;Ll;0;L;;;;;N;;;A650;;A650
+A652;CYRILLIC CAPITAL LETTER IOTIFIED YAT;Lu;0;L;;;;;N;;;;A653;
+A653;CYRILLIC SMALL LETTER IOTIFIED YAT;Ll;0;L;;;;;N;;;A652;;A652
+A654;CYRILLIC CAPITAL LETTER REVERSED YU;Lu;0;L;;;;;N;;;;A655;
+A655;CYRILLIC SMALL LETTER REVERSED YU;Ll;0;L;;;;;N;;;A654;;A654
+A656;CYRILLIC CAPITAL LETTER IOTIFIED A;Lu;0;L;;;;;N;;;;A657;
+A657;CYRILLIC SMALL LETTER IOTIFIED A;Ll;0;L;;;;;N;;;A656;;A656
+A658;CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A659;
+A659;CYRILLIC SMALL LETTER CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A658;;A658
+A65A;CYRILLIC CAPITAL LETTER BLENDED YUS;Lu;0;L;;;;;N;;;;A65B;
+A65B;CYRILLIC SMALL LETTER BLENDED YUS;Ll;0;L;;;;;N;;;A65A;;A65A
+A65C;CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A65D;
+A65D;CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A65C;;A65C
+A65E;CYRILLIC CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;A65F;
+A65F;CYRILLIC SMALL LETTER YN;Ll;0;L;;;;;N;;;A65E;;A65E
+A662;CYRILLIC CAPITAL LETTER SOFT DE;Lu;0;L;;;;;N;;;;A663;
+A663;CYRILLIC SMALL LETTER SOFT DE;Ll;0;L;;;;;N;;;A662;;A662
+A664;CYRILLIC CAPITAL LETTER SOFT EL;Lu;0;L;;;;;N;;;;A665;
+A665;CYRILLIC SMALL LETTER SOFT EL;Ll;0;L;;;;;N;;;A664;;A664
+A666;CYRILLIC CAPITAL LETTER SOFT EM;Lu;0;L;;;;;N;;;;A667;
+A667;CYRILLIC SMALL LETTER SOFT EM;Ll;0;L;;;;;N;;;A666;;A666
+A668;CYRILLIC CAPITAL LETTER MONOCULAR O;Lu;0;L;;;;;N;;;;A669;
+A669;CYRILLIC SMALL LETTER MONOCULAR O;Ll;0;L;;;;;N;;;A668;;A668
+A66A;CYRILLIC CAPITAL LETTER BINOCULAR O;Lu;0;L;;;;;N;;;;A66B;
+A66B;CYRILLIC SMALL LETTER BINOCULAR O;Ll;0;L;;;;;N;;;A66A;;A66A
+A66C;CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O;Lu;0;L;;;;;N;;;;A66D;
+A66D;CYRILLIC SMALL LETTER DOUBLE MONOCULAR O;Ll;0;L;;;;;N;;;A66C;;A66C
+A66E;CYRILLIC LETTER MULTIOCULAR O;Lo;0;L;;;;;N;;;;;
+A66F;COMBINING CYRILLIC VZMET;Mn;230;NSM;;;;;N;;;;;
+A670;COMBINING CYRILLIC TEN MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+A671;COMBINING CYRILLIC HUNDRED MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+A672;COMBINING CYRILLIC THOUSAND MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+A673;SLAVONIC ASTERISK;Po;0;ON;;;;;N;;;;;
+A67C;COMBINING CYRILLIC KAVYKA;Mn;230;NSM;;;;;N;;;;;
+A67D;COMBINING CYRILLIC PAYEROK;Mn;230;NSM;;;;;N;;;;;
+A67E;CYRILLIC KAVYKA;Po;0;ON;;;;;N;;;;;
+A67F;CYRILLIC PAYEROK;Lm;0;ON;;;;;N;;;;;
+A680;CYRILLIC CAPITAL LETTER DWE;Lu;0;L;;;;;N;;;;A681;
+A681;CYRILLIC SMALL LETTER DWE;Ll;0;L;;;;;N;;;A680;;A680
+A682;CYRILLIC CAPITAL LETTER DZWE;Lu;0;L;;;;;N;;;;A683;
+A683;CYRILLIC SMALL LETTER DZWE;Ll;0;L;;;;;N;;;A682;;A682
+A684;CYRILLIC CAPITAL LETTER ZHWE;Lu;0;L;;;;;N;;;;A685;
+A685;CYRILLIC SMALL LETTER ZHWE;Ll;0;L;;;;;N;;;A684;;A684
+A686;CYRILLIC CAPITAL LETTER CCHE;Lu;0;L;;;;;N;;;;A687;
+A687;CYRILLIC SMALL LETTER CCHE;Ll;0;L;;;;;N;;;A686;;A686
+A688;CYRILLIC CAPITAL LETTER DZZE;Lu;0;L;;;;;N;;;;A689;
+A689;CYRILLIC SMALL LETTER DZZE;Ll;0;L;;;;;N;;;A688;;A688
+A68A;CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;A68B;
+A68B;CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;A68A;;A68A
+A68C;CYRILLIC CAPITAL LETTER TWE;Lu;0;L;;;;;N;;;;A68D;
+A68D;CYRILLIC SMALL LETTER TWE;Ll;0;L;;;;;N;;;A68C;;A68C
+A68E;CYRILLIC CAPITAL LETTER TSWE;Lu;0;L;;;;;N;;;;A68F;
+A68F;CYRILLIC SMALL LETTER TSWE;Ll;0;L;;;;;N;;;A68E;;A68E
+A690;CYRILLIC CAPITAL LETTER TSSE;Lu;0;L;;;;;N;;;;A691;
+A691;CYRILLIC SMALL LETTER TSSE;Ll;0;L;;;;;N;;;A690;;A690
+A692;CYRILLIC CAPITAL LETTER TCHE;Lu;0;L;;;;;N;;;;A693;
+A693;CYRILLIC SMALL LETTER TCHE;Ll;0;L;;;;;N;;;A692;;A692
+A694;CYRILLIC CAPITAL LETTER HWE;Lu;0;L;;;;;N;;;;A695;
+A695;CYRILLIC SMALL LETTER HWE;Ll;0;L;;;;;N;;;A694;;A694
+A696;CYRILLIC CAPITAL LETTER SHWE;Lu;0;L;;;;;N;;;;A697;
+A697;CYRILLIC SMALL LETTER SHWE;Ll;0;L;;;;;N;;;A696;;A696
+A700;MODIFIER LETTER CHINESE TONE YIN PING;Sk;0;ON;;;;;N;;;;;
+A701;MODIFIER LETTER CHINESE TONE YANG PING;Sk;0;ON;;;;;N;;;;;
+A702;MODIFIER LETTER CHINESE TONE YIN SHANG;Sk;0;ON;;;;;N;;;;;
+A703;MODIFIER LETTER CHINESE TONE YANG SHANG;Sk;0;ON;;;;;N;;;;;
+A704;MODIFIER LETTER CHINESE TONE YIN QU;Sk;0;ON;;;;;N;;;;;
+A705;MODIFIER LETTER CHINESE TONE YANG QU;Sk;0;ON;;;;;N;;;;;
+A706;MODIFIER LETTER CHINESE TONE YIN RU;Sk;0;ON;;;;;N;;;;;
+A707;MODIFIER LETTER CHINESE TONE YANG RU;Sk;0;ON;;;;;N;;;;;
+A708;MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A709;MODIFIER LETTER HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70A;MODIFIER LETTER MID DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70B;MODIFIER LETTER LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70C;MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70D;MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70E;MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70F;MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A710;MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A711;MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A712;MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A713;MODIFIER LETTER HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A714;MODIFIER LETTER MID LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A715;MODIFIER LETTER LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A716;MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A717;MODIFIER LETTER DOT VERTICAL BAR;Lm;0;ON;;;;;N;;;;;
+A718;MODIFIER LETTER DOT SLASH;Lm;0;ON;;;;;N;;;;;
+A719;MODIFIER LETTER DOT HORIZONTAL BAR;Lm;0;ON;;;;;N;;;;;
+A71A;MODIFIER LETTER LOWER RIGHT CORNER ANGLE;Lm;0;ON;;;;;N;;;;;
+A71B;MODIFIER LETTER RAISED UP ARROW;Lm;0;ON;;;;;N;;;;;
+A71C;MODIFIER LETTER RAISED DOWN ARROW;Lm;0;ON;;;;;N;;;;;
+A71D;MODIFIER LETTER RAISED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;;
+A71E;MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;;
+A71F;MODIFIER LETTER LOW INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;;
+A720;MODIFIER LETTER STRESS AND HIGH TONE;Sk;0;ON;;;;;N;;;;;
+A721;MODIFIER LETTER STRESS AND LOW TONE;Sk;0;ON;;;;;N;;;;;
+A722;LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF;Lu;0;L;;;;;N;;;;A723;
+A723;LATIN SMALL LETTER EGYPTOLOGICAL ALEF;Ll;0;L;;;;;N;;;A722;;A722
+A724;LATIN CAPITAL LETTER EGYPTOLOGICAL AIN;Lu;0;L;;;;;N;;;;A725;
+A725;LATIN SMALL LETTER EGYPTOLOGICAL AIN;Ll;0;L;;;;;N;;;A724;;A724
+A726;LATIN CAPITAL LETTER HENG;Lu;0;L;;;;;N;;;;A727;
+A727;LATIN SMALL LETTER HENG;Ll;0;L;;;;;N;;;A726;;A726
+A728;LATIN CAPITAL LETTER TZ;Lu;0;L;;;;;N;;;;A729;
+A729;LATIN SMALL LETTER TZ;Ll;0;L;;;;;N;;;A728;;A728
+A72A;LATIN CAPITAL LETTER TRESILLO;Lu;0;L;;;;;N;;;;A72B;
+A72B;LATIN SMALL LETTER TRESILLO;Ll;0;L;;;;;N;;;A72A;;A72A
+A72C;LATIN CAPITAL LETTER CUATRILLO;Lu;0;L;;;;;N;;;;A72D;
+A72D;LATIN SMALL LETTER CUATRILLO;Ll;0;L;;;;;N;;;A72C;;A72C
+A72E;LATIN CAPITAL LETTER CUATRILLO WITH COMMA;Lu;0;L;;;;;N;;;;A72F;
+A72F;LATIN SMALL LETTER CUATRILLO WITH COMMA;Ll;0;L;;;;;N;;;A72E;;A72E
+A730;LATIN LETTER SMALL CAPITAL F;Ll;0;L;;;;;N;;;;;
+A731;LATIN LETTER SMALL CAPITAL S;Ll;0;L;;;;;N;;;;;
+A732;LATIN CAPITAL LETTER AA;Lu;0;L;;;;;N;;;;A733;
+A733;LATIN SMALL LETTER AA;Ll;0;L;;;;;N;;;A732;;A732
+A734;LATIN CAPITAL LETTER AO;Lu;0;L;;;;;N;;;;A735;
+A735;LATIN SMALL LETTER AO;Ll;0;L;;;;;N;;;A734;;A734
+A736;LATIN CAPITAL LETTER AU;Lu;0;L;;;;;N;;;;A737;
+A737;LATIN SMALL LETTER AU;Ll;0;L;;;;;N;;;A736;;A736
+A738;LATIN CAPITAL LETTER AV;Lu;0;L;;;;;N;;;;A739;
+A739;LATIN SMALL LETTER AV;Ll;0;L;;;;;N;;;A738;;A738
+A73A;LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR;Lu;0;L;;;;;N;;;;A73B;
+A73B;LATIN SMALL LETTER AV WITH HORIZONTAL BAR;Ll;0;L;;;;;N;;;A73A;;A73A
+A73C;LATIN CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;A73D;
+A73D;LATIN SMALL LETTER AY;Ll;0;L;;;;;N;;;A73C;;A73C
+A73E;LATIN CAPITAL LETTER REVERSED C WITH DOT;Lu;0;L;;;;;N;;;;A73F;
+A73F;LATIN SMALL LETTER REVERSED C WITH DOT;Ll;0;L;;;;;N;;;A73E;;A73E
+A740;LATIN CAPITAL LETTER K WITH STROKE;Lu;0;L;;;;;N;;;;A741;
+A741;LATIN SMALL LETTER K WITH STROKE;Ll;0;L;;;;;N;;;A740;;A740
+A742;LATIN CAPITAL LETTER K WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A743;
+A743;LATIN SMALL LETTER K WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A742;;A742
+A744;LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A745;
+A745;LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE;Ll;0;L;;;;;N;;;A744;;A744
+A746;LATIN CAPITAL LETTER BROKEN L;Lu;0;L;;;;;N;;;;A747;
+A747;LATIN SMALL LETTER BROKEN L;Ll;0;L;;;;;N;;;A746;;A746
+A748;LATIN CAPITAL LETTER L WITH HIGH STROKE;Lu;0;L;;;;;N;;;;A749;
+A749;LATIN SMALL LETTER L WITH HIGH STROKE;Ll;0;L;;;;;N;;;A748;;A748
+A74A;LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY;Lu;0;L;;;;;N;;;;A74B;
+A74B;LATIN SMALL LETTER O WITH LONG STROKE OVERLAY;Ll;0;L;;;;;N;;;A74A;;A74A
+A74C;LATIN CAPITAL LETTER O WITH LOOP;Lu;0;L;;;;;N;;;;A74D;
+A74D;LATIN SMALL LETTER O WITH LOOP;Ll;0;L;;;;;N;;;A74C;;A74C
+A74E;LATIN CAPITAL LETTER OO;Lu;0;L;;;;;N;;;;A74F;
+A74F;LATIN SMALL LETTER OO;Ll;0;L;;;;;N;;;A74E;;A74E
+A750;LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A751;
+A751;LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A750;;A750
+A752;LATIN CAPITAL LETTER P WITH FLOURISH;Lu;0;L;;;;;N;;;;A753;
+A753;LATIN SMALL LETTER P WITH FLOURISH;Ll;0;L;;;;;N;;;A752;;A752
+A754;LATIN CAPITAL LETTER P WITH SQUIRREL TAIL;Lu;0;L;;;;;N;;;;A755;
+A755;LATIN SMALL LETTER P WITH SQUIRREL TAIL;Ll;0;L;;;;;N;;;A754;;A754
+A756;LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A757;
+A757;LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A756;;A756
+A758;LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A759;
+A759;LATIN SMALL LETTER Q WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A758;;A758
+A75A;LATIN CAPITAL LETTER R ROTUNDA;Lu;0;L;;;;;N;;;;A75B;
+A75B;LATIN SMALL LETTER R ROTUNDA;Ll;0;L;;;;;N;;;A75A;;A75A
+A75C;LATIN CAPITAL LETTER RUM ROTUNDA;Lu;0;L;;;;;N;;;;A75D;
+A75D;LATIN SMALL LETTER RUM ROTUNDA;Ll;0;L;;;;;N;;;A75C;;A75C
+A75E;LATIN CAPITAL LETTER V WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A75F;
+A75F;LATIN SMALL LETTER V WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A75E;;A75E
+A760;LATIN CAPITAL LETTER VY;Lu;0;L;;;;;N;;;;A761;
+A761;LATIN SMALL LETTER VY;Ll;0;L;;;;;N;;;A760;;A760
+A762;LATIN CAPITAL LETTER VISIGOTHIC Z;Lu;0;L;;;;;N;;;;A763;
+A763;LATIN SMALL LETTER VISIGOTHIC Z;Ll;0;L;;;;;N;;;A762;;A762
+A764;LATIN CAPITAL LETTER THORN WITH STROKE;Lu;0;L;;;;;N;;;;A765;
+A765;LATIN SMALL LETTER THORN WITH STROKE;Ll;0;L;;;;;N;;;A764;;A764
+A766;LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A767;
+A767;LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A766;;A766
+A768;LATIN CAPITAL LETTER VEND;Lu;0;L;;;;;N;;;;A769;
+A769;LATIN SMALL LETTER VEND;Ll;0;L;;;;;N;;;A768;;A768
+A76A;LATIN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;A76B;
+A76B;LATIN SMALL LETTER ET;Ll;0;L;;;;;N;;;A76A;;A76A
+A76C;LATIN CAPITAL LETTER IS;Lu;0;L;;;;;N;;;;A76D;
+A76D;LATIN SMALL LETTER IS;Ll;0;L;;;;;N;;;A76C;;A76C
+A76E;LATIN CAPITAL LETTER CON;Lu;0;L;;;;;N;;;;A76F;
+A76F;LATIN SMALL LETTER CON;Ll;0;L;;;;;N;;;A76E;;A76E
+A770;MODIFIER LETTER US;Lm;0;L;<super> A76F;;;;N;;;;;
+A771;LATIN SMALL LETTER DUM;Ll;0;L;;;;;N;;;;;
+A772;LATIN SMALL LETTER LUM;Ll;0;L;;;;;N;;;;;
+A773;LATIN SMALL LETTER MUM;Ll;0;L;;;;;N;;;;;
+A774;LATIN SMALL LETTER NUM;Ll;0;L;;;;;N;;;;;
+A775;LATIN SMALL LETTER RUM;Ll;0;L;;;;;N;;;;;
+A776;LATIN LETTER SMALL CAPITAL RUM;Ll;0;L;;;;;N;;;;;
+A777;LATIN SMALL LETTER TUM;Ll;0;L;;;;;N;;;;;
+A778;LATIN SMALL LETTER UM;Ll;0;L;;;;;N;;;;;
+A779;LATIN CAPITAL LETTER INSULAR D;Lu;0;L;;;;;N;;;;A77A;
+A77A;LATIN SMALL LETTER INSULAR D;Ll;0;L;;;;;N;;;A779;;A779
+A77B;LATIN CAPITAL LETTER INSULAR F;Lu;0;L;;;;;N;;;;A77C;
+A77C;LATIN SMALL LETTER INSULAR F;Ll;0;L;;;;;N;;;A77B;;A77B
+A77D;LATIN CAPITAL LETTER INSULAR G;Lu;0;L;;;;;N;;;;1D79;
+A77E;LATIN CAPITAL LETTER TURNED INSULAR G;Lu;0;L;;;;;N;;;;A77F;
+A77F;LATIN SMALL LETTER TURNED INSULAR G;Ll;0;L;;;;;N;;;A77E;;A77E
+A780;LATIN CAPITAL LETTER TURNED L;Lu;0;L;;;;;N;;;;A781;
+A781;LATIN SMALL LETTER TURNED L;Ll;0;L;;;;;N;;;A780;;A780
+A782;LATIN CAPITAL LETTER INSULAR R;Lu;0;L;;;;;N;;;;A783;
+A783;LATIN SMALL LETTER INSULAR R;Ll;0;L;;;;;N;;;A782;;A782
+A784;LATIN CAPITAL LETTER INSULAR S;Lu;0;L;;;;;N;;;;A785;
+A785;LATIN SMALL LETTER INSULAR S;Ll;0;L;;;;;N;;;A784;;A784
+A786;LATIN CAPITAL LETTER INSULAR T;Lu;0;L;;;;;N;;;;A787;
+A787;LATIN SMALL LETTER INSULAR T;Ll;0;L;;;;;N;;;A786;;A786
+A788;MODIFIER LETTER LOW CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;;;;;
+A789;MODIFIER LETTER COLON;Sk;0;L;;;;;N;;;;;
+A78A;MODIFIER LETTER SHORT EQUALS SIGN;Sk;0;L;;;;;N;;;;;
+A78B;LATIN CAPITAL LETTER SALTILLO;Lu;0;L;;;;;N;;;;A78C;
+A78C;LATIN SMALL LETTER SALTILLO;Ll;0;L;;;;;N;;;A78B;;A78B
+A7FB;LATIN EPIGRAPHIC LETTER REVERSED F;Lo;0;L;;;;;N;;;;;
+A7FC;LATIN EPIGRAPHIC LETTER REVERSED P;Lo;0;L;;;;;N;;;;;
+A7FD;LATIN EPIGRAPHIC LETTER INVERTED M;Lo;0;L;;;;;N;;;;;
+A7FE;LATIN EPIGRAPHIC LETTER I LONGA;Lo;0;L;;;;;N;;;;;
+A7FF;LATIN EPIGRAPHIC LETTER ARCHAIC M;Lo;0;L;;;;;N;;;;;
+A800;SYLOTI NAGRI LETTER A;Lo;0;L;;;;;N;;;;;
+A801;SYLOTI NAGRI LETTER I;Lo;0;L;;;;;N;;;;;
+A802;SYLOTI NAGRI SIGN DVISVARA;Mn;0;NSM;;;;;N;;;;;
+A803;SYLOTI NAGRI LETTER U;Lo;0;L;;;;;N;;;;;
+A804;SYLOTI NAGRI LETTER E;Lo;0;L;;;;;N;;;;;
+A805;SYLOTI NAGRI LETTER O;Lo;0;L;;;;;N;;;;;
+A806;SYLOTI NAGRI SIGN HASANTA;Mn;9;NSM;;;;;N;;;;;
+A807;SYLOTI NAGRI LETTER KO;Lo;0;L;;;;;N;;;;;
+A808;SYLOTI NAGRI LETTER KHO;Lo;0;L;;;;;N;;;;;
+A809;SYLOTI NAGRI LETTER GO;Lo;0;L;;;;;N;;;;;
+A80A;SYLOTI NAGRI LETTER GHO;Lo;0;L;;;;;N;;;;;
+A80B;SYLOTI NAGRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+A80C;SYLOTI NAGRI LETTER CO;Lo;0;L;;;;;N;;;;;
+A80D;SYLOTI NAGRI LETTER CHO;Lo;0;L;;;;;N;;;;;
+A80E;SYLOTI NAGRI LETTER JO;Lo;0;L;;;;;N;;;;;
+A80F;SYLOTI NAGRI LETTER JHO;Lo;0;L;;;;;N;;;;;
+A810;SYLOTI NAGRI LETTER TTO;Lo;0;L;;;;;N;;;;;
+A811;SYLOTI NAGRI LETTER TTHO;Lo;0;L;;;;;N;;;;;
+A812;SYLOTI NAGRI LETTER DDO;Lo;0;L;;;;;N;;;;;
+A813;SYLOTI NAGRI LETTER DDHO;Lo;0;L;;;;;N;;;;;
+A814;SYLOTI NAGRI LETTER TO;Lo;0;L;;;;;N;;;;;
+A815;SYLOTI NAGRI LETTER THO;Lo;0;L;;;;;N;;;;;
+A816;SYLOTI NAGRI LETTER DO;Lo;0;L;;;;;N;;;;;
+A817;SYLOTI NAGRI LETTER DHO;Lo;0;L;;;;;N;;;;;
+A818;SYLOTI NAGRI LETTER NO;Lo;0;L;;;;;N;;;;;
+A819;SYLOTI NAGRI LETTER PO;Lo;0;L;;;;;N;;;;;
+A81A;SYLOTI NAGRI LETTER PHO;Lo;0;L;;;;;N;;;;;
+A81B;SYLOTI NAGRI LETTER BO;Lo;0;L;;;;;N;;;;;
+A81C;SYLOTI NAGRI LETTER BHO;Lo;0;L;;;;;N;;;;;
+A81D;SYLOTI NAGRI LETTER MO;Lo;0;L;;;;;N;;;;;
+A81E;SYLOTI NAGRI LETTER RO;Lo;0;L;;;;;N;;;;;
+A81F;SYLOTI NAGRI LETTER LO;Lo;0;L;;;;;N;;;;;
+A820;SYLOTI NAGRI LETTER RRO;Lo;0;L;;;;;N;;;;;
+A821;SYLOTI NAGRI LETTER SO;Lo;0;L;;;;;N;;;;;
+A822;SYLOTI NAGRI LETTER HO;Lo;0;L;;;;;N;;;;;
+A823;SYLOTI NAGRI VOWEL SIGN A;Mc;0;L;;;;;N;;;;;
+A824;SYLOTI NAGRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+A825;SYLOTI NAGRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+A826;SYLOTI NAGRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+A827;SYLOTI NAGRI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+A828;SYLOTI NAGRI POETRY MARK-1;So;0;ON;;;;;N;;;;;
+A829;SYLOTI NAGRI POETRY MARK-2;So;0;ON;;;;;N;;;;;
+A82A;SYLOTI NAGRI POETRY MARK-3;So;0;ON;;;;;N;;;;;
+A82B;SYLOTI NAGRI POETRY MARK-4;So;0;ON;;;;;N;;;;;
+A840;PHAGS-PA LETTER KA;Lo;0;L;;;;;N;;;;;
+A841;PHAGS-PA LETTER KHA;Lo;0;L;;;;;N;;;;;
+A842;PHAGS-PA LETTER GA;Lo;0;L;;;;;N;;;;;
+A843;PHAGS-PA LETTER NGA;Lo;0;L;;;;;N;;;;;
+A844;PHAGS-PA LETTER CA;Lo;0;L;;;;;N;;;;;
+A845;PHAGS-PA LETTER CHA;Lo;0;L;;;;;N;;;;;
+A846;PHAGS-PA LETTER JA;Lo;0;L;;;;;N;;;;;
+A847;PHAGS-PA LETTER NYA;Lo;0;L;;;;;N;;;;;
+A848;PHAGS-PA LETTER TA;Lo;0;L;;;;;N;;;;;
+A849;PHAGS-PA LETTER THA;Lo;0;L;;;;;N;;;;;
+A84A;PHAGS-PA LETTER DA;Lo;0;L;;;;;N;;;;;
+A84B;PHAGS-PA LETTER NA;Lo;0;L;;;;;N;;;;;
+A84C;PHAGS-PA LETTER PA;Lo;0;L;;;;;N;;;;;
+A84D;PHAGS-PA LETTER PHA;Lo;0;L;;;;;N;;;;;
+A84E;PHAGS-PA LETTER BA;Lo;0;L;;;;;N;;;;;
+A84F;PHAGS-PA LETTER MA;Lo;0;L;;;;;N;;;;;
+A850;PHAGS-PA LETTER TSA;Lo;0;L;;;;;N;;;;;
+A851;PHAGS-PA LETTER TSHA;Lo;0;L;;;;;N;;;;;
+A852;PHAGS-PA LETTER DZA;Lo;0;L;;;;;N;;;;;
+A853;PHAGS-PA LETTER WA;Lo;0;L;;;;;N;;;;;
+A854;PHAGS-PA LETTER ZHA;Lo;0;L;;;;;N;;;;;
+A855;PHAGS-PA LETTER ZA;Lo;0;L;;;;;N;;;;;
+A856;PHAGS-PA LETTER SMALL A;Lo;0;L;;;;;N;;;;;
+A857;PHAGS-PA LETTER YA;Lo;0;L;;;;;N;;;;;
+A858;PHAGS-PA LETTER RA;Lo;0;L;;;;;N;;;;;
+A859;PHAGS-PA LETTER LA;Lo;0;L;;;;;N;;;;;
+A85A;PHAGS-PA LETTER SHA;Lo;0;L;;;;;N;;;;;
+A85B;PHAGS-PA LETTER SA;Lo;0;L;;;;;N;;;;;
+A85C;PHAGS-PA LETTER HA;Lo;0;L;;;;;N;;;;;
+A85D;PHAGS-PA LETTER A;Lo;0;L;;;;;N;;;;;
+A85E;PHAGS-PA LETTER I;Lo;0;L;;;;;N;;;;;
+A85F;PHAGS-PA LETTER U;Lo;0;L;;;;;N;;;;;
+A860;PHAGS-PA LETTER E;Lo;0;L;;;;;N;;;;;
+A861;PHAGS-PA LETTER O;Lo;0;L;;;;;N;;;;;
+A862;PHAGS-PA LETTER QA;Lo;0;L;;;;;N;;;;;
+A863;PHAGS-PA LETTER XA;Lo;0;L;;;;;N;;;;;
+A864;PHAGS-PA LETTER FA;Lo;0;L;;;;;N;;;;;
+A865;PHAGS-PA LETTER GGA;Lo;0;L;;;;;N;;;;;
+A866;PHAGS-PA LETTER EE;Lo;0;L;;;;;N;;;;;
+A867;PHAGS-PA SUBJOINED LETTER WA;Lo;0;L;;;;;N;;;;;
+A868;PHAGS-PA SUBJOINED LETTER YA;Lo;0;L;;;;;N;;;;;
+A869;PHAGS-PA LETTER TTA;Lo;0;L;;;;;N;;;;;
+A86A;PHAGS-PA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+A86B;PHAGS-PA LETTER DDA;Lo;0;L;;;;;N;;;;;
+A86C;PHAGS-PA LETTER NNA;Lo;0;L;;;;;N;;;;;
+A86D;PHAGS-PA LETTER ALTERNATE YA;Lo;0;L;;;;;N;;;;;
+A86E;PHAGS-PA LETTER VOICELESS SHA;Lo;0;L;;;;;N;;;;;
+A86F;PHAGS-PA LETTER VOICED HA;Lo;0;L;;;;;N;;;;;
+A870;PHAGS-PA LETTER ASPIRATED FA;Lo;0;L;;;;;N;;;;;
+A871;PHAGS-PA SUBJOINED LETTER RA;Lo;0;L;;;;;N;;;;;
+A872;PHAGS-PA SUPERFIXED LETTER RA;Lo;0;L;;;;;N;;;;;
+A873;PHAGS-PA LETTER CANDRABINDU;Lo;0;L;;;;;N;;;;;
+A874;PHAGS-PA SINGLE HEAD MARK;Po;0;ON;;;;;N;;;;;
+A875;PHAGS-PA DOUBLE HEAD MARK;Po;0;ON;;;;;N;;;;;
+A876;PHAGS-PA MARK SHAD;Po;0;ON;;;;;N;;;;;
+A877;PHAGS-PA MARK DOUBLE SHAD;Po;0;ON;;;;;N;;;;;
+A880;SAURASHTRA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+A881;SAURASHTRA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+A882;SAURASHTRA LETTER A;Lo;0;L;;;;;N;;;;;
+A883;SAURASHTRA LETTER AA;Lo;0;L;;;;;N;;;;;
+A884;SAURASHTRA LETTER I;Lo;0;L;;;;;N;;;;;
+A885;SAURASHTRA LETTER II;Lo;0;L;;;;;N;;;;;
+A886;SAURASHTRA LETTER U;Lo;0;L;;;;;N;;;;;
+A887;SAURASHTRA LETTER UU;Lo;0;L;;;;;N;;;;;
+A888;SAURASHTRA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+A889;SAURASHTRA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+A88A;SAURASHTRA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+A88B;SAURASHTRA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+A88C;SAURASHTRA LETTER E;Lo;0;L;;;;;N;;;;;
+A88D;SAURASHTRA LETTER EE;Lo;0;L;;;;;N;;;;;
+A88E;SAURASHTRA LETTER AI;Lo;0;L;;;;;N;;;;;
+A88F;SAURASHTRA LETTER O;Lo;0;L;;;;;N;;;;;
+A890;SAURASHTRA LETTER OO;Lo;0;L;;;;;N;;;;;
+A891;SAURASHTRA LETTER AU;Lo;0;L;;;;;N;;;;;
+A892;SAURASHTRA LETTER KA;Lo;0;L;;;;;N;;;;;
+A893;SAURASHTRA LETTER KHA;Lo;0;L;;;;;N;;;;;
+A894;SAURASHTRA LETTER GA;Lo;0;L;;;;;N;;;;;
+A895;SAURASHTRA LETTER GHA;Lo;0;L;;;;;N;;;;;
+A896;SAURASHTRA LETTER NGA;Lo;0;L;;;;;N;;;;;
+A897;SAURASHTRA LETTER CA;Lo;0;L;;;;;N;;;;;
+A898;SAURASHTRA LETTER CHA;Lo;0;L;;;;;N;;;;;
+A899;SAURASHTRA LETTER JA;Lo;0;L;;;;;N;;;;;
+A89A;SAURASHTRA LETTER JHA;Lo;0;L;;;;;N;;;;;
+A89B;SAURASHTRA LETTER NYA;Lo;0;L;;;;;N;;;;;
+A89C;SAURASHTRA LETTER TTA;Lo;0;L;;;;;N;;;;;
+A89D;SAURASHTRA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+A89E;SAURASHTRA LETTER DDA;Lo;0;L;;;;;N;;;;;
+A89F;SAURASHTRA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+A8A0;SAURASHTRA LETTER NNA;Lo;0;L;;;;;N;;;;;
+A8A1;SAURASHTRA LETTER TA;Lo;0;L;;;;;N;;;;;
+A8A2;SAURASHTRA LETTER THA;Lo;0;L;;;;;N;;;;;
+A8A3;SAURASHTRA LETTER DA;Lo;0;L;;;;;N;;;;;
+A8A4;SAURASHTRA LETTER DHA;Lo;0;L;;;;;N;;;;;
+A8A5;SAURASHTRA LETTER NA;Lo;0;L;;;;;N;;;;;
+A8A6;SAURASHTRA LETTER PA;Lo;0;L;;;;;N;;;;;
+A8A7;SAURASHTRA LETTER PHA;Lo;0;L;;;;;N;;;;;
+A8A8;SAURASHTRA LETTER BA;Lo;0;L;;;;;N;;;;;
+A8A9;SAURASHTRA LETTER BHA;Lo;0;L;;;;;N;;;;;
+A8AA;SAURASHTRA LETTER MA;Lo;0;L;;;;;N;;;;;
+A8AB;SAURASHTRA LETTER YA;Lo;0;L;;;;;N;;;;;
+A8AC;SAURASHTRA LETTER RA;Lo;0;L;;;;;N;;;;;
+A8AD;SAURASHTRA LETTER LA;Lo;0;L;;;;;N;;;;;
+A8AE;SAURASHTRA LETTER VA;Lo;0;L;;;;;N;;;;;
+A8AF;SAURASHTRA LETTER SHA;Lo;0;L;;;;;N;;;;;
+A8B0;SAURASHTRA LETTER SSA;Lo;0;L;;;;;N;;;;;
+A8B1;SAURASHTRA LETTER SA;Lo;0;L;;;;;N;;;;;
+A8B2;SAURASHTRA LETTER HA;Lo;0;L;;;;;N;;;;;
+A8B3;SAURASHTRA LETTER LLA;Lo;0;L;;;;;N;;;;;
+A8B4;SAURASHTRA CONSONANT SIGN HAARU;Mc;0;L;;;;;N;;;;;
+A8B5;SAURASHTRA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+A8B6;SAURASHTRA VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+A8B7;SAURASHTRA VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+A8B8;SAURASHTRA VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+A8B9;SAURASHTRA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+A8BA;SAURASHTRA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+A8BB;SAURASHTRA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+A8BC;SAURASHTRA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;;
+A8BD;SAURASHTRA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;;
+A8BE;SAURASHTRA VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+A8BF;SAURASHTRA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+A8C0;SAURASHTRA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+A8C1;SAURASHTRA VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+A8C2;SAURASHTRA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+A8C3;SAURASHTRA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+A8C4;SAURASHTRA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+A8CE;SAURASHTRA DANDA;Po;0;L;;;;;N;;;;;
+A8CF;SAURASHTRA DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+A8D0;SAURASHTRA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+A8D1;SAURASHTRA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+A8D2;SAURASHTRA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+A8D3;SAURASHTRA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+A8D4;SAURASHTRA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+A8D5;SAURASHTRA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+A8D6;SAURASHTRA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+A8D7;SAURASHTRA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+A8D8;SAURASHTRA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+A8D9;SAURASHTRA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+A900;KAYAH LI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+A901;KAYAH LI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+A902;KAYAH LI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+A903;KAYAH LI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+A904;KAYAH LI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+A905;KAYAH LI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+A906;KAYAH LI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+A907;KAYAH LI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+A908;KAYAH LI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+A909;KAYAH LI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+A90A;KAYAH LI LETTER KA;Lo;0;L;;;;;N;;;;;
+A90B;KAYAH LI LETTER KHA;Lo;0;L;;;;;N;;;;;
+A90C;KAYAH LI LETTER GA;Lo;0;L;;;;;N;;;;;
+A90D;KAYAH LI LETTER NGA;Lo;0;L;;;;;N;;;;;
+A90E;KAYAH LI LETTER SA;Lo;0;L;;;;;N;;;;;
+A90F;KAYAH LI LETTER SHA;Lo;0;L;;;;;N;;;;;
+A910;KAYAH LI LETTER ZA;Lo;0;L;;;;;N;;;;;
+A911;KAYAH LI LETTER NYA;Lo;0;L;;;;;N;;;;;
+A912;KAYAH LI LETTER TA;Lo;0;L;;;;;N;;;;;
+A913;KAYAH LI LETTER HTA;Lo;0;L;;;;;N;;;;;
+A914;KAYAH LI LETTER NA;Lo;0;L;;;;;N;;;;;
+A915;KAYAH LI LETTER PA;Lo;0;L;;;;;N;;;;;
+A916;KAYAH LI LETTER PHA;Lo;0;L;;;;;N;;;;;
+A917;KAYAH LI LETTER MA;Lo;0;L;;;;;N;;;;;
+A918;KAYAH LI LETTER DA;Lo;0;L;;;;;N;;;;;
+A919;KAYAH LI LETTER BA;Lo;0;L;;;;;N;;;;;
+A91A;KAYAH LI LETTER RA;Lo;0;L;;;;;N;;;;;
+A91B;KAYAH LI LETTER YA;Lo;0;L;;;;;N;;;;;
+A91C;KAYAH LI LETTER LA;Lo;0;L;;;;;N;;;;;
+A91D;KAYAH LI LETTER WA;Lo;0;L;;;;;N;;;;;
+A91E;KAYAH LI LETTER THA;Lo;0;L;;;;;N;;;;;
+A91F;KAYAH LI LETTER HA;Lo;0;L;;;;;N;;;;;
+A920;KAYAH LI LETTER VA;Lo;0;L;;;;;N;;;;;
+A921;KAYAH LI LETTER CA;Lo;0;L;;;;;N;;;;;
+A922;KAYAH LI LETTER A;Lo;0;L;;;;;N;;;;;
+A923;KAYAH LI LETTER OE;Lo;0;L;;;;;N;;;;;
+A924;KAYAH LI LETTER I;Lo;0;L;;;;;N;;;;;
+A925;KAYAH LI LETTER OO;Lo;0;L;;;;;N;;;;;
+A926;KAYAH LI VOWEL UE;Mn;0;NSM;;;;;N;;;;;
+A927;KAYAH LI VOWEL E;Mn;0;NSM;;;;;N;;;;;
+A928;KAYAH LI VOWEL U;Mn;0;NSM;;;;;N;;;;;
+A929;KAYAH LI VOWEL EE;Mn;0;NSM;;;;;N;;;;;
+A92A;KAYAH LI VOWEL O;Mn;0;NSM;;;;;N;;;;;
+A92B;KAYAH LI TONE PLOPHU;Mn;220;NSM;;;;;N;;;;;
+A92C;KAYAH LI TONE CALYA;Mn;220;NSM;;;;;N;;;;;
+A92D;KAYAH LI TONE CALYA PLOPHU;Mn;220;NSM;;;;;N;;;;;
+A92E;KAYAH LI SIGN CWI;Po;0;L;;;;;N;;;;;
+A92F;KAYAH LI SIGN SHYA;Po;0;L;;;;;N;;;;;
+A930;REJANG LETTER KA;Lo;0;L;;;;;N;;;;;
+A931;REJANG LETTER GA;Lo;0;L;;;;;N;;;;;
+A932;REJANG LETTER NGA;Lo;0;L;;;;;N;;;;;
+A933;REJANG LETTER TA;Lo;0;L;;;;;N;;;;;
+A934;REJANG LETTER DA;Lo;0;L;;;;;N;;;;;
+A935;REJANG LETTER NA;Lo;0;L;;;;;N;;;;;
+A936;REJANG LETTER PA;Lo;0;L;;;;;N;;;;;
+A937;REJANG LETTER BA;Lo;0;L;;;;;N;;;;;
+A938;REJANG LETTER MA;Lo;0;L;;;;;N;;;;;
+A939;REJANG LETTER CA;Lo;0;L;;;;;N;;;;;
+A93A;REJANG LETTER JA;Lo;0;L;;;;;N;;;;;
+A93B;REJANG LETTER NYA;Lo;0;L;;;;;N;;;;;
+A93C;REJANG LETTER SA;Lo;0;L;;;;;N;;;;;
+A93D;REJANG LETTER RA;Lo;0;L;;;;;N;;;;;
+A93E;REJANG LETTER LA;Lo;0;L;;;;;N;;;;;
+A93F;REJANG LETTER YA;Lo;0;L;;;;;N;;;;;
+A940;REJANG LETTER WA;Lo;0;L;;;;;N;;;;;
+A941;REJANG LETTER HA;Lo;0;L;;;;;N;;;;;
+A942;REJANG LETTER MBA;Lo;0;L;;;;;N;;;;;
+A943;REJANG LETTER NGGA;Lo;0;L;;;;;N;;;;;
+A944;REJANG LETTER NDA;Lo;0;L;;;;;N;;;;;
+A945;REJANG LETTER NYJA;Lo;0;L;;;;;N;;;;;
+A946;REJANG LETTER A;Lo;0;L;;;;;N;;;;;
+A947;REJANG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+A948;REJANG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+A949;REJANG VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+A94A;REJANG VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+A94B;REJANG VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+A94C;REJANG VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+A94D;REJANG VOWEL SIGN EU;Mn;0;NSM;;;;;N;;;;;
+A94E;REJANG VOWEL SIGN EA;Mn;0;NSM;;;;;N;;;;;
+A94F;REJANG CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;;
+A950;REJANG CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;;
+A951;REJANG CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;;
+A952;REJANG CONSONANT SIGN H;Mc;0;L;;;;;N;;;;;
+A953;REJANG VIRAMA;Mc;9;L;;;;;N;;;;;
+A95F;REJANG SECTION MARK;Po;0;L;;;;;N;;;;;
+AA00;CHAM LETTER A;Lo;0;L;;;;;N;;;;;
+AA01;CHAM LETTER I;Lo;0;L;;;;;N;;;;;
+AA02;CHAM LETTER U;Lo;0;L;;;;;N;;;;;
+AA03;CHAM LETTER E;Lo;0;L;;;;;N;;;;;
+AA04;CHAM LETTER AI;Lo;0;L;;;;;N;;;;;
+AA05;CHAM LETTER O;Lo;0;L;;;;;N;;;;;
+AA06;CHAM LETTER KA;Lo;0;L;;;;;N;;;;;
+AA07;CHAM LETTER KHA;Lo;0;L;;;;;N;;;;;
+AA08;CHAM LETTER GA;Lo;0;L;;;;;N;;;;;
+AA09;CHAM LETTER GHA;Lo;0;L;;;;;N;;;;;
+AA0A;CHAM LETTER NGUE;Lo;0;L;;;;;N;;;;;
+AA0B;CHAM LETTER NGA;Lo;0;L;;;;;N;;;;;
+AA0C;CHAM LETTER CHA;Lo;0;L;;;;;N;;;;;
+AA0D;CHAM LETTER CHHA;Lo;0;L;;;;;N;;;;;
+AA0E;CHAM LETTER JA;Lo;0;L;;;;;N;;;;;
+AA0F;CHAM LETTER JHA;Lo;0;L;;;;;N;;;;;
+AA10;CHAM LETTER NHUE;Lo;0;L;;;;;N;;;;;
+AA11;CHAM LETTER NHA;Lo;0;L;;;;;N;;;;;
+AA12;CHAM LETTER NHJA;Lo;0;L;;;;;N;;;;;
+AA13;CHAM LETTER TA;Lo;0;L;;;;;N;;;;;
+AA14;CHAM LETTER THA;Lo;0;L;;;;;N;;;;;
+AA15;CHAM LETTER DA;Lo;0;L;;;;;N;;;;;
+AA16;CHAM LETTER DHA;Lo;0;L;;;;;N;;;;;
+AA17;CHAM LETTER NUE;Lo;0;L;;;;;N;;;;;
+AA18;CHAM LETTER NA;Lo;0;L;;;;;N;;;;;
+AA19;CHAM LETTER DDA;Lo;0;L;;;;;N;;;;;
+AA1A;CHAM LETTER PA;Lo;0;L;;;;;N;;;;;
+AA1B;CHAM LETTER PPA;Lo;0;L;;;;;N;;;;;
+AA1C;CHAM LETTER PHA;Lo;0;L;;;;;N;;;;;
+AA1D;CHAM LETTER BA;Lo;0;L;;;;;N;;;;;
+AA1E;CHAM LETTER BHA;Lo;0;L;;;;;N;;;;;
+AA1F;CHAM LETTER MUE;Lo;0;L;;;;;N;;;;;
+AA20;CHAM LETTER MA;Lo;0;L;;;;;N;;;;;
+AA21;CHAM LETTER BBA;Lo;0;L;;;;;N;;;;;
+AA22;CHAM LETTER YA;Lo;0;L;;;;;N;;;;;
+AA23;CHAM LETTER RA;Lo;0;L;;;;;N;;;;;
+AA24;CHAM LETTER LA;Lo;0;L;;;;;N;;;;;
+AA25;CHAM LETTER VA;Lo;0;L;;;;;N;;;;;
+AA26;CHAM LETTER SSA;Lo;0;L;;;;;N;;;;;
+AA27;CHAM LETTER SA;Lo;0;L;;;;;N;;;;;
+AA28;CHAM LETTER HA;Lo;0;L;;;;;N;;;;;
+AA29;CHAM VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;;
+AA2A;CHAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+AA2B;CHAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+AA2C;CHAM VOWEL SIGN EI;Mn;0;NSM;;;;;N;;;;;
+AA2D;CHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+AA2E;CHAM VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;;
+AA2F;CHAM VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+AA30;CHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+AA31;CHAM VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+AA32;CHAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;;
+AA33;CHAM CONSONANT SIGN YA;Mc;0;L;;;;;N;;;;;
+AA34;CHAM CONSONANT SIGN RA;Mc;0;L;;;;;N;;;;;
+AA35;CHAM CONSONANT SIGN LA;Mn;0;NSM;;;;;N;;;;;
+AA36;CHAM CONSONANT SIGN WA;Mn;0;NSM;;;;;N;;;;;
+AA40;CHAM LETTER FINAL K;Lo;0;L;;;;;N;;;;;
+AA41;CHAM LETTER FINAL G;Lo;0;L;;;;;N;;;;;
+AA42;CHAM LETTER FINAL NG;Lo;0;L;;;;;N;;;;;
+AA43;CHAM CONSONANT SIGN FINAL NG;Mn;0;NSM;;;;;N;;;;;
+AA44;CHAM LETTER FINAL CH;Lo;0;L;;;;;N;;;;;
+AA45;CHAM LETTER FINAL T;Lo;0;L;;;;;N;;;;;
+AA46;CHAM LETTER FINAL N;Lo;0;L;;;;;N;;;;;
+AA47;CHAM LETTER FINAL P;Lo;0;L;;;;;N;;;;;
+AA48;CHAM LETTER FINAL Y;Lo;0;L;;;;;N;;;;;
+AA49;CHAM LETTER FINAL R;Lo;0;L;;;;;N;;;;;
+AA4A;CHAM LETTER FINAL L;Lo;0;L;;;;;N;;;;;
+AA4B;CHAM LETTER FINAL SS;Lo;0;L;;;;;N;;;;;
+AA4C;CHAM CONSONANT SIGN FINAL M;Mn;0;NSM;;;;;N;;;;;
+AA4D;CHAM CONSONANT SIGN FINAL H;Mc;0;L;;;;;N;;;;;
+AA50;CHAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+AA51;CHAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+AA52;CHAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+AA53;CHAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+AA54;CHAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+AA55;CHAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+AA56;CHAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+AA57;CHAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+AA58;CHAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+AA59;CHAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+AA5C;CHAM PUNCTUATION SPIRAL;Po;0;L;;;;;N;;;;;
+AA5D;CHAM PUNCTUATION DANDA;Po;0;L;;;;;N;;;;;
+AA5E;CHAM PUNCTUATION DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+AA5F;CHAM PUNCTUATION TRIPLE DANDA;Po;0;L;;;;;N;;;;;
AC00;<Hangul Syllable, First>;Lo;0;L;;;;;N;;;;;
D7A3;<Hangul Syllable, Last>;Lo;0;L;;;;;N;;;;;
D800;<Non Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;;
@@ -10729,7 +13247,7 @@
F968;CJK COMPATIBILITY IDEOGRAPH-F968;Lo;0;L;6CCC;;;;N;;;;;
F969;CJK COMPATIBILITY IDEOGRAPH-F969;Lo;0;L;6578;;;;N;;;;;
F96A;CJK COMPATIBILITY IDEOGRAPH-F96A;Lo;0;L;7D22;;;;N;;;;;
-F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;;N;;;;;
+F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;3;N;;;;;
F96C;CJK COMPATIBILITY IDEOGRAPH-F96C;Lo;0;L;585E;;;;N;;;;;
F96D;CJK COMPATIBILITY IDEOGRAPH-F96D;Lo;0;L;7701;;;;N;;;;;
F96E;CJK COMPATIBILITY IDEOGRAPH-F96E;Lo;0;L;8449;;;;N;;;;;
@@ -10737,12 +13255,12 @@
F970;CJK COMPATIBILITY IDEOGRAPH-F970;Lo;0;L;6BBA;;;;N;;;;;
F971;CJK COMPATIBILITY IDEOGRAPH-F971;Lo;0;L;8FB0;;;;N;;;;;
F972;CJK COMPATIBILITY IDEOGRAPH-F972;Lo;0;L;6C88;;;;N;;;;;
-F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;;N;;;;;
+F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;10;N;;;;;
F974;CJK COMPATIBILITY IDEOGRAPH-F974;Lo;0;L;82E5;;;;N;;;;;
F975;CJK COMPATIBILITY IDEOGRAPH-F975;Lo;0;L;63A0;;;;N;;;;;
F976;CJK COMPATIBILITY IDEOGRAPH-F976;Lo;0;L;7565;;;;N;;;;;
F977;CJK COMPATIBILITY IDEOGRAPH-F977;Lo;0;L;4EAE;;;;N;;;;;
-F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;;N;;;;;
+F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;2;N;;;;;
F979;CJK COMPATIBILITY IDEOGRAPH-F979;Lo;0;L;51C9;;;;N;;;;;
F97A;CJK COMPATIBILITY IDEOGRAPH-F97A;Lo;0;L;6881;;;;N;;;;;
F97B;CJK COMPATIBILITY IDEOGRAPH-F97B;Lo;0;L;7CE7;;;;N;;;;;
@@ -10800,7 +13318,7 @@
F9AF;CJK COMPATIBILITY IDEOGRAPH-F9AF;Lo;0;L;7F9A;;;;N;;;;;
F9B0;CJK COMPATIBILITY IDEOGRAPH-F9B0;Lo;0;L;8046;;;;N;;;;;
F9B1;CJK COMPATIBILITY IDEOGRAPH-F9B1;Lo;0;L;9234;;;;N;;;;;
-F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;;N;;;;;
+F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;0;N;;;;;
F9B3;CJK COMPATIBILITY IDEOGRAPH-F9B3;Lo;0;L;9748;;;;N;;;;;
F9B4;CJK COMPATIBILITY IDEOGRAPH-F9B4;Lo;0;L;9818;;;;N;;;;;
F9B5;CJK COMPATIBILITY IDEOGRAPH-F9B5;Lo;0;L;4F8B;;;;N;;;;;
@@ -10831,9 +13349,9 @@
F9CE;CJK COMPATIBILITY IDEOGRAPH-F9CE;Lo;0;L;786B;;;;N;;;;;
F9CF;CJK COMPATIBILITY IDEOGRAPH-F9CF;Lo;0;L;7D10;;;;N;;;;;
F9D0;CJK COMPATIBILITY IDEOGRAPH-F9D0;Lo;0;L;985E;;;;N;;;;;
-F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;;N;;;;;
+F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;6;N;;;;;
F9D2;CJK COMPATIBILITY IDEOGRAPH-F9D2;Lo;0;L;622E;;;;N;;;;;
-F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;;N;;;;;
+F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;6;N;;;;;
F9D4;CJK COMPATIBILITY IDEOGRAPH-F9D4;Lo;0;L;502B;;;;N;;;;;
F9D5;CJK COMPATIBILITY IDEOGRAPH-F9D5;Lo;0;L;5D19;;;;N;;;;;
F9D6;CJK COMPATIBILITY IDEOGRAPH-F9D6;Lo;0;L;6DEA;;;;N;;;;;
@@ -10875,7 +13393,7 @@
F9FA;CJK COMPATIBILITY IDEOGRAPH-F9FA;Lo;0;L;72C0;;;;N;;;;;
F9FB;CJK COMPATIBILITY IDEOGRAPH-F9FB;Lo;0;L;7099;;;;N;;;;;
F9FC;CJK COMPATIBILITY IDEOGRAPH-F9FC;Lo;0;L;8B58;;;;N;;;;;
-F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;;N;;;;;
+F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;10;N;;;;;
F9FE;CJK COMPATIBILITY IDEOGRAPH-F9FE;Lo;0;L;8336;;;;N;;;;;
F9FF;CJK COMPATIBILITY IDEOGRAPH-F9FF;Lo;0;L;523A;;;;N;;;;;
FA00;CJK COMPATIBILITY IDEOGRAPH-FA00;Lo;0;L;5207;;;;N;;;;;
@@ -10983,6 +13501,112 @@
FA68;CJK COMPATIBILITY IDEOGRAPH-FA68;Lo;0;L;96E3;;;;N;;;;;
FA69;CJK COMPATIBILITY IDEOGRAPH-FA69;Lo;0;L;97FF;;;;N;;;;;
FA6A;CJK COMPATIBILITY IDEOGRAPH-FA6A;Lo;0;L;983B;;;;N;;;;;
+FA70;CJK COMPATIBILITY IDEOGRAPH-FA70;Lo;0;L;4E26;;;;N;;;;;
+FA71;CJK COMPATIBILITY IDEOGRAPH-FA71;Lo;0;L;51B5;;;;N;;;;;
+FA72;CJK COMPATIBILITY IDEOGRAPH-FA72;Lo;0;L;5168;;;;N;;;;;
+FA73;CJK COMPATIBILITY IDEOGRAPH-FA73;Lo;0;L;4F80;;;;N;;;;;
+FA74;CJK COMPATIBILITY IDEOGRAPH-FA74;Lo;0;L;5145;;;;N;;;;;
+FA75;CJK COMPATIBILITY IDEOGRAPH-FA75;Lo;0;L;5180;;;;N;;;;;
+FA76;CJK COMPATIBILITY IDEOGRAPH-FA76;Lo;0;L;52C7;;;;N;;;;;
+FA77;CJK COMPATIBILITY IDEOGRAPH-FA77;Lo;0;L;52FA;;;;N;;;;;
+FA78;CJK COMPATIBILITY IDEOGRAPH-FA78;Lo;0;L;559D;;;;N;;;;;
+FA79;CJK COMPATIBILITY IDEOGRAPH-FA79;Lo;0;L;5555;;;;N;;;;;
+FA7A;CJK COMPATIBILITY IDEOGRAPH-FA7A;Lo;0;L;5599;;;;N;;;;;
+FA7B;CJK COMPATIBILITY IDEOGRAPH-FA7B;Lo;0;L;55E2;;;;N;;;;;
+FA7C;CJK COMPATIBILITY IDEOGRAPH-FA7C;Lo;0;L;585A;;;;N;;;;;
+FA7D;CJK COMPATIBILITY IDEOGRAPH-FA7D;Lo;0;L;58B3;;;;N;;;;;
+FA7E;CJK COMPATIBILITY IDEOGRAPH-FA7E;Lo;0;L;5944;;;;N;;;;;
+FA7F;CJK COMPATIBILITY IDEOGRAPH-FA7F;Lo;0;L;5954;;;;N;;;;;
+FA80;CJK COMPATIBILITY IDEOGRAPH-FA80;Lo;0;L;5A62;;;;N;;;;;
+FA81;CJK COMPATIBILITY IDEOGRAPH-FA81;Lo;0;L;5B28;;;;N;;;;;
+FA82;CJK COMPATIBILITY IDEOGRAPH-FA82;Lo;0;L;5ED2;;;;N;;;;;
+FA83;CJK COMPATIBILITY IDEOGRAPH-FA83;Lo;0;L;5ED9;;;;N;;;;;
+FA84;CJK COMPATIBILITY IDEOGRAPH-FA84;Lo;0;L;5F69;;;;N;;;;;
+FA85;CJK COMPATIBILITY IDEOGRAPH-FA85;Lo;0;L;5FAD;;;;N;;;;;
+FA86;CJK COMPATIBILITY IDEOGRAPH-FA86;Lo;0;L;60D8;;;;N;;;;;
+FA87;CJK COMPATIBILITY IDEOGRAPH-FA87;Lo;0;L;614E;;;;N;;;;;
+FA88;CJK COMPATIBILITY IDEOGRAPH-FA88;Lo;0;L;6108;;;;N;;;;;
+FA89;CJK COMPATIBILITY IDEOGRAPH-FA89;Lo;0;L;618E;;;;N;;;;;
+FA8A;CJK COMPATIBILITY IDEOGRAPH-FA8A;Lo;0;L;6160;;;;N;;;;;
+FA8B;CJK COMPATIBILITY IDEOGRAPH-FA8B;Lo;0;L;61F2;;;;N;;;;;
+FA8C;CJK COMPATIBILITY IDEOGRAPH-FA8C;Lo;0;L;6234;;;;N;;;;;
+FA8D;CJK COMPATIBILITY IDEOGRAPH-FA8D;Lo;0;L;63C4;;;;N;;;;;
+FA8E;CJK COMPATIBILITY IDEOGRAPH-FA8E;Lo;0;L;641C;;;;N;;;;;
+FA8F;CJK COMPATIBILITY IDEOGRAPH-FA8F;Lo;0;L;6452;;;;N;;;;;
+FA90;CJK COMPATIBILITY IDEOGRAPH-FA90;Lo;0;L;6556;;;;N;;;;;
+FA91;CJK COMPATIBILITY IDEOGRAPH-FA91;Lo;0;L;6674;;;;N;;;;;
+FA92;CJK COMPATIBILITY IDEOGRAPH-FA92;Lo;0;L;6717;;;;N;;;;;
+FA93;CJK COMPATIBILITY IDEOGRAPH-FA93;Lo;0;L;671B;;;;N;;;;;
+FA94;CJK COMPATIBILITY IDEOGRAPH-FA94;Lo;0;L;6756;;;;N;;;;;
+FA95;CJK COMPATIBILITY IDEOGRAPH-FA95;Lo;0;L;6B79;;;;N;;;;;
+FA96;CJK COMPATIBILITY IDEOGRAPH-FA96;Lo;0;L;6BBA;;;;N;;;;;
+FA97;CJK COMPATIBILITY IDEOGRAPH-FA97;Lo;0;L;6D41;;;;N;;;;;
+FA98;CJK COMPATIBILITY IDEOGRAPH-FA98;Lo;0;L;6EDB;;;;N;;;;;
+FA99;CJK COMPATIBILITY IDEOGRAPH-FA99;Lo;0;L;6ECB;;;;N;;;;;
+FA9A;CJK COMPATIBILITY IDEOGRAPH-FA9A;Lo;0;L;6F22;;;;N;;;;;
+FA9B;CJK COMPATIBILITY IDEOGRAPH-FA9B;Lo;0;L;701E;;;;N;;;;;
+FA9C;CJK COMPATIBILITY IDEOGRAPH-FA9C;Lo;0;L;716E;;;;N;;;;;
+FA9D;CJK COMPATIBILITY IDEOGRAPH-FA9D;Lo;0;L;77A7;;;;N;;;;;
+FA9E;CJK COMPATIBILITY IDEOGRAPH-FA9E;Lo;0;L;7235;;;;N;;;;;
+FA9F;CJK COMPATIBILITY IDEOGRAPH-FA9F;Lo;0;L;72AF;;;;N;;;;;
+FAA0;CJK COMPATIBILITY IDEOGRAPH-FAA0;Lo;0;L;732A;;;;N;;;;;
+FAA1;CJK COMPATIBILITY IDEOGRAPH-FAA1;Lo;0;L;7471;;;;N;;;;;
+FAA2;CJK COMPATIBILITY IDEOGRAPH-FAA2;Lo;0;L;7506;;;;N;;;;;
+FAA3;CJK COMPATIBILITY IDEOGRAPH-FAA3;Lo;0;L;753B;;;;N;;;;;
+FAA4;CJK COMPATIBILITY IDEOGRAPH-FAA4;Lo;0;L;761D;;;;N;;;;;
+FAA5;CJK COMPATIBILITY IDEOGRAPH-FAA5;Lo;0;L;761F;;;;N;;;;;
+FAA6;CJK COMPATIBILITY IDEOGRAPH-FAA6;Lo;0;L;76CA;;;;N;;;;;
+FAA7;CJK COMPATIBILITY IDEOGRAPH-FAA7;Lo;0;L;76DB;;;;N;;;;;
+FAA8;CJK COMPATIBILITY IDEOGRAPH-FAA8;Lo;0;L;76F4;;;;N;;;;;
+FAA9;CJK COMPATIBILITY IDEOGRAPH-FAA9;Lo;0;L;774A;;;;N;;;;;
+FAAA;CJK COMPATIBILITY IDEOGRAPH-FAAA;Lo;0;L;7740;;;;N;;;;;
+FAAB;CJK COMPATIBILITY IDEOGRAPH-FAAB;Lo;0;L;78CC;;;;N;;;;;
+FAAC;CJK COMPATIBILITY IDEOGRAPH-FAAC;Lo;0;L;7AB1;;;;N;;;;;
+FAAD;CJK COMPATIBILITY IDEOGRAPH-FAAD;Lo;0;L;7BC0;;;;N;;;;;
+FAAE;CJK COMPATIBILITY IDEOGRAPH-FAAE;Lo;0;L;7C7B;;;;N;;;;;
+FAAF;CJK COMPATIBILITY IDEOGRAPH-FAAF;Lo;0;L;7D5B;;;;N;;;;;
+FAB0;CJK COMPATIBILITY IDEOGRAPH-FAB0;Lo;0;L;7DF4;;;;N;;;;;
+FAB1;CJK COMPATIBILITY IDEOGRAPH-FAB1;Lo;0;L;7F3E;;;;N;;;;;
+FAB2;CJK COMPATIBILITY IDEOGRAPH-FAB2;Lo;0;L;8005;;;;N;;;;;
+FAB3;CJK COMPATIBILITY IDEOGRAPH-FAB3;Lo;0;L;8352;;;;N;;;;;
+FAB4;CJK COMPATIBILITY IDEOGRAPH-FAB4;Lo;0;L;83EF;;;;N;;;;;
+FAB5;CJK COMPATIBILITY IDEOGRAPH-FAB5;Lo;0;L;8779;;;;N;;;;;
+FAB6;CJK COMPATIBILITY IDEOGRAPH-FAB6;Lo;0;L;8941;;;;N;;;;;
+FAB7;CJK COMPATIBILITY IDEOGRAPH-FAB7;Lo;0;L;8986;;;;N;;;;;
+FAB8;CJK COMPATIBILITY IDEOGRAPH-FAB8;Lo;0;L;8996;;;;N;;;;;
+FAB9;CJK COMPATIBILITY IDEOGRAPH-FAB9;Lo;0;L;8ABF;;;;N;;;;;
+FABA;CJK COMPATIBILITY IDEOGRAPH-FABA;Lo;0;L;8AF8;;;;N;;;;;
+FABB;CJK COMPATIBILITY IDEOGRAPH-FABB;Lo;0;L;8ACB;;;;N;;;;;
+FABC;CJK COMPATIBILITY IDEOGRAPH-FABC;Lo;0;L;8B01;;;;N;;;;;
+FABD;CJK COMPATIBILITY IDEOGRAPH-FABD;Lo;0;L;8AFE;;;;N;;;;;
+FABE;CJK COMPATIBILITY IDEOGRAPH-FABE;Lo;0;L;8AED;;;;N;;;;;
+FABF;CJK COMPATIBILITY IDEOGRAPH-FABF;Lo;0;L;8B39;;;;N;;;;;
+FAC0;CJK COMPATIBILITY IDEOGRAPH-FAC0;Lo;0;L;8B8A;;;;N;;;;;
+FAC1;CJK COMPATIBILITY IDEOGRAPH-FAC1;Lo;0;L;8D08;;;;N;;;;;
+FAC2;CJK COMPATIBILITY IDEOGRAPH-FAC2;Lo;0;L;8F38;;;;N;;;;;
+FAC3;CJK COMPATIBILITY IDEOGRAPH-FAC3;Lo;0;L;9072;;;;N;;;;;
+FAC4;CJK COMPATIBILITY IDEOGRAPH-FAC4;Lo;0;L;9199;;;;N;;;;;
+FAC5;CJK COMPATIBILITY IDEOGRAPH-FAC5;Lo;0;L;9276;;;;N;;;;;
+FAC6;CJK COMPATIBILITY IDEOGRAPH-FAC6;Lo;0;L;967C;;;;N;;;;;
+FAC7;CJK COMPATIBILITY IDEOGRAPH-FAC7;Lo;0;L;96E3;;;;N;;;;;
+FAC8;CJK COMPATIBILITY IDEOGRAPH-FAC8;Lo;0;L;9756;;;;N;;;;;
+FAC9;CJK COMPATIBILITY IDEOGRAPH-FAC9;Lo;0;L;97DB;;;;N;;;;;
+FACA;CJK COMPATIBILITY IDEOGRAPH-FACA;Lo;0;L;97FF;;;;N;;;;;
+FACB;CJK COMPATIBILITY IDEOGRAPH-FACB;Lo;0;L;980B;;;;N;;;;;
+FACC;CJK COMPATIBILITY IDEOGRAPH-FACC;Lo;0;L;983B;;;;N;;;;;
+FACD;CJK COMPATIBILITY IDEOGRAPH-FACD;Lo;0;L;9B12;;;;N;;;;;
+FACE;CJK COMPATIBILITY IDEOGRAPH-FACE;Lo;0;L;9F9C;;;;N;;;;;
+FACF;CJK COMPATIBILITY IDEOGRAPH-FACF;Lo;0;L;2284A;;;;N;;;;;
+FAD0;CJK COMPATIBILITY IDEOGRAPH-FAD0;Lo;0;L;22844;;;;N;;;;;
+FAD1;CJK COMPATIBILITY IDEOGRAPH-FAD1;Lo;0;L;233D5;;;;N;;;;;
+FAD2;CJK COMPATIBILITY IDEOGRAPH-FAD2;Lo;0;L;3B9D;;;;N;;;;;
+FAD3;CJK COMPATIBILITY IDEOGRAPH-FAD3;Lo;0;L;4018;;;;N;;;;;
+FAD4;CJK COMPATIBILITY IDEOGRAPH-FAD4;Lo;0;L;4039;;;;N;;;;;
+FAD5;CJK COMPATIBILITY IDEOGRAPH-FAD5;Lo;0;L;25249;;;;N;;;;;
+FAD6;CJK COMPATIBILITY IDEOGRAPH-FAD6;Lo;0;L;25CD0;;;;N;;;;;
+FAD7;CJK COMPATIBILITY IDEOGRAPH-FAD7;Lo;0;L;27ED3;;;;N;;;;;
+FAD8;CJK COMPATIBILITY IDEOGRAPH-FAD8;Lo;0;L;9F43;;;;N;;;;;
+FAD9;CJK COMPATIBILITY IDEOGRAPH-FAD9;Lo;0;L;9F8E;;;;N;;;;;
FB00;LATIN SMALL LIGATURE FF;Ll;0;L;<compat> 0066 0066;;;;N;;;;;
FB01;LATIN SMALL LIGATURE FI;Ll;0;L;<compat> 0066 0069;;;;N;;;;;
FB02;LATIN SMALL LIGATURE FL;Ll;0;L;<compat> 0066 006C;;;;N;;;;;
@@ -11007,7 +13631,7 @@
FB26;HEBREW LETTER WIDE FINAL MEM;Lo;0;R;<font> 05DD;;;;N;;;;;
FB27;HEBREW LETTER WIDE RESH;Lo;0;R;<font> 05E8;;;;N;;;;;
FB28;HEBREW LETTER WIDE TAV;Lo;0;R;<font> 05EA;;;;N;;;;;
-FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ET;<font> 002B;;;;N;;;;;
+FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ES;<font> 002B;;;;N;;;;;
FB2A;HEBREW LETTER SHIN WITH SHIN DOT;Lo;0;R;05E9 05C1;;;;N;;;;;
FB2B;HEBREW LETTER SHIN WITH SIN DOT;Lo;0;R;05E9 05C2;;;;N;;;;;
FB2C;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT;Lo;0;R;FB49 05C1;;;;N;;;;;
@@ -11652,10 +14276,23 @@
FE0D;VARIATION SELECTOR-14;Mn;0;NSM;;;;;N;;;;;
FE0E;VARIATION SELECTOR-15;Mn;0;NSM;;;;;N;;;;;
FE0F;VARIATION SELECTOR-16;Mn;0;NSM;;;;;N;;;;;
+FE10;PRESENTATION FORM FOR VERTICAL COMMA;Po;0;ON;<vertical> 002C;;;;N;;;;;
+FE11;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA;Po;0;ON;<vertical> 3001;;;;N;;;;;
+FE12;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP;Po;0;ON;<vertical> 3002;;;;N;;;;;
+FE13;PRESENTATION FORM FOR VERTICAL COLON;Po;0;ON;<vertical> 003A;;;;N;;;;;
+FE14;PRESENTATION FORM FOR VERTICAL SEMICOLON;Po;0;ON;<vertical> 003B;;;;N;;;;;
+FE15;PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK;Po;0;ON;<vertical> 0021;;;;N;;;;;
+FE16;PRESENTATION FORM FOR VERTICAL QUESTION MARK;Po;0;ON;<vertical> 003F;;;;N;;;;;
+FE17;PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;<vertical> 3016;;;;N;;;;;
+FE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET;Pe;0;ON;<vertical> 3017;;;;N;;;;;
+FE19;PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS;Po;0;ON;<vertical> 2026;;;;N;;;;;
FE20;COMBINING LIGATURE LEFT HALF;Mn;230;NSM;;;;;N;;;;;
FE21;COMBINING LIGATURE RIGHT HALF;Mn;230;NSM;;;;;N;;;;;
FE22;COMBINING DOUBLE TILDE LEFT HALF;Mn;230;NSM;;;;;N;;;;;
FE23;COMBINING DOUBLE TILDE RIGHT HALF;Mn;230;NSM;;;;;N;;;;;
+FE24;COMBINING MACRON LEFT HALF;Mn;230;NSM;;;;;N;;;;;
+FE25;COMBINING MACRON RIGHT HALF;Mn;230;NSM;;;;;N;;;;;
+FE26;COMBINING CONJOINING MACRON;Mn;230;NSM;;;;;N;;;;;
FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON;<vertical> 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;;
FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON;<vertical> 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;;
FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON;<vertical> 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;;
@@ -11696,19 +14333,19 @@
FE56;SMALL QUESTION MARK;Po;0;ON;<small> 003F;;;;N;;;;;
FE57;SMALL EXCLAMATION MARK;Po;0;ON;<small> 0021;;;;N;;;;;
FE58;SMALL EM DASH;Pd;0;ON;<small> 2014;;;;N;;;;;
-FE59;SMALL LEFT PARENTHESIS;Ps;0;ON;<small> 0028;;;;N;SMALL OPENING PARENTHESIS;;;;
-FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON;<small> 0029;;;;N;SMALL CLOSING PARENTHESIS;;;;
-FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON;<small> 007B;;;;N;SMALL OPENING CURLY BRACKET;;;;
-FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON;<small> 007D;;;;N;SMALL CLOSING CURLY BRACKET;;;;
-FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<small> 3014;;;;N;SMALL OPENING TORTOISE SHELL BRACKET;;;;
-FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<small> 3015;;;;N;SMALL CLOSING TORTOISE SHELL BRACKET;;;;
+FE59;SMALL LEFT PARENTHESIS;Ps;0;ON;<small> 0028;;;;Y;SMALL OPENING PARENTHESIS;;;;
+FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON;<small> 0029;;;;Y;SMALL CLOSING PARENTHESIS;;;;
+FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON;<small> 007B;;;;Y;SMALL OPENING CURLY BRACKET;;;;
+FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON;<small> 007D;;;;Y;SMALL CLOSING CURLY BRACKET;;;;
+FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<small> 3014;;;;Y;SMALL OPENING TORTOISE SHELL BRACKET;;;;
+FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<small> 3015;;;;Y;SMALL CLOSING TORTOISE SHELL BRACKET;;;;
FE5F;SMALL NUMBER SIGN;Po;0;ET;<small> 0023;;;;N;;;;;
FE60;SMALL AMPERSAND;Po;0;ON;<small> 0026;;;;N;;;;;
FE61;SMALL ASTERISK;Po;0;ON;<small> 002A;;;;N;;;;;
-FE62;SMALL PLUS SIGN;Sm;0;ET;<small> 002B;;;;N;;;;;
-FE63;SMALL HYPHEN-MINUS;Pd;0;ET;<small> 002D;;;;N;;;;;
-FE64;SMALL LESS-THAN SIGN;Sm;0;ON;<small> 003C;;;;N;;;;;
-FE65;SMALL GREATER-THAN SIGN;Sm;0;ON;<small> 003E;;;;N;;;;;
+FE62;SMALL PLUS SIGN;Sm;0;ES;<small> 002B;;;;N;;;;;
+FE63;SMALL HYPHEN-MINUS;Pd;0;ES;<small> 002D;;;;N;;;;;
+FE64;SMALL LESS-THAN SIGN;Sm;0;ON;<small> 003C;;;;Y;;;;;
+FE65;SMALL GREATER-THAN SIGN;Sm;0;ON;<small> 003E;;;;Y;;;;;
FE66;SMALL EQUALS SIGN;Sm;0;ON;<small> 003D;;;;N;;;;;
FE68;SMALL REVERSE SOLIDUS;Po;0;ON;<small> 005C;;;;N;SMALL BACKSLASH;;;;
FE69;SMALL DOLLAR SIGN;Sc;0;ET;<small> 0024;;;;N;;;;;
@@ -11865,11 +14502,11 @@
FF08;FULLWIDTH LEFT PARENTHESIS;Ps;0;ON;<wide> 0028;;;;Y;FULLWIDTH OPENING PARENTHESIS;;;;
FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON;<wide> 0029;;;;Y;FULLWIDTH CLOSING PARENTHESIS;;;;
FF0A;FULLWIDTH ASTERISK;Po;0;ON;<wide> 002A;;;;N;;;;;
-FF0B;FULLWIDTH PLUS SIGN;Sm;0;ET;<wide> 002B;;;;N;;;;;
+FF0B;FULLWIDTH PLUS SIGN;Sm;0;ES;<wide> 002B;;;;N;;;;;
FF0C;FULLWIDTH COMMA;Po;0;CS;<wide> 002C;;;;N;;;;;
-FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ET;<wide> 002D;;;;N;;;;;
+FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ES;<wide> 002D;;;;N;;;;;
FF0E;FULLWIDTH FULL STOP;Po;0;CS;<wide> 002E;;;;N;FULLWIDTH PERIOD;;;;
-FF0F;FULLWIDTH SOLIDUS;Po;0;ES;<wide> 002F;;;;N;FULLWIDTH SLASH;;;;
+FF0F;FULLWIDTH SOLIDUS;Po;0;CS;<wide> 002F;;;;N;FULLWIDTH SLASH;;;;
FF10;FULLWIDTH DIGIT ZERO;Nd;0;EN;<wide> 0030;0;0;0;N;;;;;
FF11;FULLWIDTH DIGIT ONE;Nd;0;EN;<wide> 0031;1;1;1;N;;;;;
FF12;FULLWIDTH DIGIT TWO;Nd;0;EN;<wide> 0032;2;2;2;N;;;;;
@@ -11955,7 +14592,7 @@
FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON;<narrow> 300C;;;;Y;HALFWIDTH OPENING CORNER BRACKET;;;;
FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON;<narrow> 300D;;;;Y;HALFWIDTH CLOSING CORNER BRACKET;;;;
FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON;<narrow> 3001;;;;N;;;;;
-FF65;HALFWIDTH KATAKANA MIDDLE DOT;Pc;0;ON;<narrow> 30FB;;;;N;;;;;
+FF65;HALFWIDTH KATAKANA MIDDLE DOT;Po;0;ON;<narrow> 30FB;;;;N;;;;;
FF66;HALFWIDTH KATAKANA LETTER WO;Lo;0;L;<narrow> 30F2;;;;N;;;;;
FF67;HALFWIDTH KATAKANA LETTER SMALL A;Lo;0;L;<narrow> 30A1;;;;N;;;;;
FF68;HALFWIDTH KATAKANA LETTER SMALL I;Lo;0;L;<narrow> 30A3;;;;N;;;;;
@@ -12080,9 +14717,9 @@
FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON;<narrow> 2193;;;;N;;;;;
FFED;HALFWIDTH BLACK SQUARE;So;0;ON;<narrow> 25A0;;;;N;;;;;
FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON;<narrow> 25CB;;;;N;;;;;
-FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;BN;;;;;N;;;;;
-FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;BN;;;;;N;;;;;
-FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;BN;;;;;N;;;;;
+FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;ON;;;;;N;;;;;
+FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;ON;;;;;N;;;;;
+FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;ON;;;;;N;;;;;
FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
10000;LINEAR B SYLLABLE B008 A;Lo;0;L;;;;;N;;;;;
@@ -12353,6 +14990,217 @@
1013D;AEGEAN LIQUID MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;;
1013E;AEGEAN MEASURE SECOND SUBUNIT;So;0;L;;;;;N;;;;;
1013F;AEGEAN MEASURE THIRD SUBUNIT;So;0;L;;;;;N;;;;;
+10140;GREEK ACROPHONIC ATTIC ONE QUARTER;Nl;0;ON;;;;1/4;N;;;;;
+10141;GREEK ACROPHONIC ATTIC ONE HALF;Nl;0;ON;;;;1/2;N;;;;;
+10142;GREEK ACROPHONIC ATTIC ONE DRACHMA;Nl;0;ON;;;;1;N;;;;;
+10143;GREEK ACROPHONIC ATTIC FIVE;Nl;0;ON;;;;5;N;;;;;
+10144;GREEK ACROPHONIC ATTIC FIFTY;Nl;0;ON;;;;50;N;;;;;
+10145;GREEK ACROPHONIC ATTIC FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+10146;GREEK ACROPHONIC ATTIC FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;;
+10147;GREEK ACROPHONIC ATTIC FIFTY THOUSAND;Nl;0;ON;;;;50000;N;;;;;
+10148;GREEK ACROPHONIC ATTIC FIVE TALENTS;Nl;0;ON;;;;5;N;;;;;
+10149;GREEK ACROPHONIC ATTIC TEN TALENTS;Nl;0;ON;;;;10;N;;;;;
+1014A;GREEK ACROPHONIC ATTIC FIFTY TALENTS;Nl;0;ON;;;;50;N;;;;;
+1014B;GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS;Nl;0;ON;;;;100;N;;;;;
+1014C;GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS;Nl;0;ON;;;;500;N;;;;;
+1014D;GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS;Nl;0;ON;;;;1000;N;;;;;
+1014E;GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS;Nl;0;ON;;;;5000;N;;;;;
+1014F;GREEK ACROPHONIC ATTIC FIVE STATERS;Nl;0;ON;;;;5;N;;;;;
+10150;GREEK ACROPHONIC ATTIC TEN STATERS;Nl;0;ON;;;;10;N;;;;;
+10151;GREEK ACROPHONIC ATTIC FIFTY STATERS;Nl;0;ON;;;;50;N;;;;;
+10152;GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS;Nl;0;ON;;;;100;N;;;;;
+10153;GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS;Nl;0;ON;;;;500;N;;;;;
+10154;GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS;Nl;0;ON;;;;1000;N;;;;;
+10155;GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS;Nl;0;ON;;;;10000;N;;;;;
+10156;GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS;Nl;0;ON;;;;50000;N;;;;;
+10157;GREEK ACROPHONIC ATTIC TEN MNAS;Nl;0;ON;;;;10;N;;;;;
+10158;GREEK ACROPHONIC HERAEUM ONE PLETHRON;Nl;0;ON;;;;1;N;;;;;
+10159;GREEK ACROPHONIC THESPIAN ONE;Nl;0;ON;;;;1;N;;;;;
+1015A;GREEK ACROPHONIC HERMIONIAN ONE;Nl;0;ON;;;;1;N;;;;;
+1015B;GREEK ACROPHONIC EPIDAUREAN TWO;Nl;0;ON;;;;2;N;;;;;
+1015C;GREEK ACROPHONIC THESPIAN TWO;Nl;0;ON;;;;2;N;;;;;
+1015D;GREEK ACROPHONIC CYRENAIC TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;;
+1015E;GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;;
+1015F;GREEK ACROPHONIC TROEZENIAN FIVE;Nl;0;ON;;;;5;N;;;;;
+10160;GREEK ACROPHONIC TROEZENIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10161;GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM;Nl;0;ON;;;;10;N;;;;;
+10162;GREEK ACROPHONIC HERMIONIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10163;GREEK ACROPHONIC MESSENIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10164;GREEK ACROPHONIC THESPIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10165;GREEK ACROPHONIC THESPIAN THIRTY;Nl;0;ON;;;;30;N;;;;;
+10166;GREEK ACROPHONIC TROEZENIAN FIFTY;Nl;0;ON;;;;50;N;;;;;
+10167;GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM;Nl;0;ON;;;;50;N;;;;;
+10168;GREEK ACROPHONIC HERMIONIAN FIFTY;Nl;0;ON;;;;50;N;;;;;
+10169;GREEK ACROPHONIC THESPIAN FIFTY;Nl;0;ON;;;;50;N;;;;;
+1016A;GREEK ACROPHONIC THESPIAN ONE HUNDRED;Nl;0;ON;;;;100;N;;;;;
+1016B;GREEK ACROPHONIC THESPIAN THREE HUNDRED;Nl;0;ON;;;;300;N;;;;;
+1016C;GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+1016D;GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+1016E;GREEK ACROPHONIC THESPIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+1016F;GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+10170;GREEK ACROPHONIC NAXIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+10171;GREEK ACROPHONIC THESPIAN ONE THOUSAND;Nl;0;ON;;;;1000;N;;;;;
+10172;GREEK ACROPHONIC THESPIAN FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;;
+10173;GREEK ACROPHONIC DELPHIC FIVE MNAS;Nl;0;ON;;;;5;N;;;;;
+10174;GREEK ACROPHONIC STRATIAN FIFTY MNAS;Nl;0;ON;;;;50;N;;;;;
+10175;GREEK ONE HALF SIGN;No;0;ON;;;;1/2;N;;;;;
+10176;GREEK ONE HALF SIGN ALTERNATE FORM;No;0;ON;;;;1/2;N;;;;;
+10177;GREEK TWO THIRDS SIGN;No;0;ON;;;;2/3;N;;;;;
+10178;GREEK THREE QUARTERS SIGN;No;0;ON;;;;3/4;N;;;;;
+10179;GREEK YEAR SIGN;So;0;ON;;;;;N;;;;;
+1017A;GREEK TALENT SIGN;So;0;ON;;;;;N;;;;;
+1017B;GREEK DRACHMA SIGN;So;0;ON;;;;;N;;;;;
+1017C;GREEK OBOL SIGN;So;0;ON;;;;;N;;;;;
+1017D;GREEK TWO OBOLS SIGN;So;0;ON;;;;;N;;;;;
+1017E;GREEK THREE OBOLS SIGN;So;0;ON;;;;;N;;;;;
+1017F;GREEK FOUR OBOLS SIGN;So;0;ON;;;;;N;;;;;
+10180;GREEK FIVE OBOLS SIGN;So;0;ON;;;;;N;;;;;
+10181;GREEK METRETES SIGN;So;0;ON;;;;;N;;;;;
+10182;GREEK KYATHOS BASE SIGN;So;0;ON;;;;;N;;;;;
+10183;GREEK LITRA SIGN;So;0;ON;;;;;N;;;;;
+10184;GREEK OUNKIA SIGN;So;0;ON;;;;;N;;;;;
+10185;GREEK XESTES SIGN;So;0;ON;;;;;N;;;;;
+10186;GREEK ARTABE SIGN;So;0;ON;;;;;N;;;;;
+10187;GREEK AROURA SIGN;So;0;ON;;;;;N;;;;;
+10188;GREEK GRAMMA SIGN;So;0;ON;;;;;N;;;;;
+10189;GREEK TRYBLION BASE SIGN;So;0;ON;;;;;N;;;;;
+1018A;GREEK ZERO SIGN;No;0;ON;;;;0;N;;;;;
+10190;ROMAN SEXTANS SIGN;So;0;ON;;;;;N;;;;;
+10191;ROMAN UNCIA SIGN;So;0;ON;;;;;N;;;;;
+10192;ROMAN SEMUNCIA SIGN;So;0;ON;;;;;N;;;;;
+10193;ROMAN SEXTULA SIGN;So;0;ON;;;;;N;;;;;
+10194;ROMAN DIMIDIA SEXTULA SIGN;So;0;ON;;;;;N;;;;;
+10195;ROMAN SILIQUA SIGN;So;0;ON;;;;;N;;;;;
+10196;ROMAN DENARIUS SIGN;So;0;ON;;;;;N;;;;;
+10197;ROMAN QUINARIUS SIGN;So;0;ON;;;;;N;;;;;
+10198;ROMAN SESTERTIUS SIGN;So;0;ON;;;;;N;;;;;
+10199;ROMAN DUPONDIUS SIGN;So;0;ON;;;;;N;;;;;
+1019A;ROMAN AS SIGN;So;0;ON;;;;;N;;;;;
+1019B;ROMAN CENTURIAL SIGN;So;0;ON;;;;;N;;;;;
+101D0;PHAISTOS DISC SIGN PEDESTRIAN;So;0;L;;;;;N;;;;;
+101D1;PHAISTOS DISC SIGN PLUMED HEAD;So;0;L;;;;;N;;;;;
+101D2;PHAISTOS DISC SIGN TATTOOED HEAD;So;0;L;;;;;N;;;;;
+101D3;PHAISTOS DISC SIGN CAPTIVE;So;0;L;;;;;N;;;;;
+101D4;PHAISTOS DISC SIGN CHILD;So;0;L;;;;;N;;;;;
+101D5;PHAISTOS DISC SIGN WOMAN;So;0;L;;;;;N;;;;;
+101D6;PHAISTOS DISC SIGN HELMET;So;0;L;;;;;N;;;;;
+101D7;PHAISTOS DISC SIGN GAUNTLET;So;0;L;;;;;N;;;;;
+101D8;PHAISTOS DISC SIGN TIARA;So;0;L;;;;;N;;;;;
+101D9;PHAISTOS DISC SIGN ARROW;So;0;L;;;;;N;;;;;
+101DA;PHAISTOS DISC SIGN BOW;So;0;L;;;;;N;;;;;
+101DB;PHAISTOS DISC SIGN SHIELD;So;0;L;;;;;N;;;;;
+101DC;PHAISTOS DISC SIGN CLUB;So;0;L;;;;;N;;;;;
+101DD;PHAISTOS DISC SIGN MANACLES;So;0;L;;;;;N;;;;;
+101DE;PHAISTOS DISC SIGN MATTOCK;So;0;L;;;;;N;;;;;
+101DF;PHAISTOS DISC SIGN SAW;So;0;L;;;;;N;;;;;
+101E0;PHAISTOS DISC SIGN LID;So;0;L;;;;;N;;;;;
+101E1;PHAISTOS DISC SIGN BOOMERANG;So;0;L;;;;;N;;;;;
+101E2;PHAISTOS DISC SIGN CARPENTRY PLANE;So;0;L;;;;;N;;;;;
+101E3;PHAISTOS DISC SIGN DOLIUM;So;0;L;;;;;N;;;;;
+101E4;PHAISTOS DISC SIGN COMB;So;0;L;;;;;N;;;;;
+101E5;PHAISTOS DISC SIGN SLING;So;0;L;;;;;N;;;;;
+101E6;PHAISTOS DISC SIGN COLUMN;So;0;L;;;;;N;;;;;
+101E7;PHAISTOS DISC SIGN BEEHIVE;So;0;L;;;;;N;;;;;
+101E8;PHAISTOS DISC SIGN SHIP;So;0;L;;;;;N;;;;;
+101E9;PHAISTOS DISC SIGN HORN;So;0;L;;;;;N;;;;;
+101EA;PHAISTOS DISC SIGN HIDE;So;0;L;;;;;N;;;;;
+101EB;PHAISTOS DISC SIGN BULLS LEG;So;0;L;;;;;N;;;;;
+101EC;PHAISTOS DISC SIGN CAT;So;0;L;;;;;N;;;;;
+101ED;PHAISTOS DISC SIGN RAM;So;0;L;;;;;N;;;;;
+101EE;PHAISTOS DISC SIGN EAGLE;So;0;L;;;;;N;;;;;
+101EF;PHAISTOS DISC SIGN DOVE;So;0;L;;;;;N;;;;;
+101F0;PHAISTOS DISC SIGN TUNNY;So;0;L;;;;;N;;;;;
+101F1;PHAISTOS DISC SIGN BEE;So;0;L;;;;;N;;;;;
+101F2;PHAISTOS DISC SIGN PLANE TREE;So;0;L;;;;;N;;;;;
+101F3;PHAISTOS DISC SIGN VINE;So;0;L;;;;;N;;;;;
+101F4;PHAISTOS DISC SIGN PAPYRUS;So;0;L;;;;;N;;;;;
+101F5;PHAISTOS DISC SIGN ROSETTE;So;0;L;;;;;N;;;;;
+101F6;PHAISTOS DISC SIGN LILY;So;0;L;;;;;N;;;;;
+101F7;PHAISTOS DISC SIGN OX BACK;So;0;L;;;;;N;;;;;
+101F8;PHAISTOS DISC SIGN FLUTE;So;0;L;;;;;N;;;;;
+101F9;PHAISTOS DISC SIGN GRATER;So;0;L;;;;;N;;;;;
+101FA;PHAISTOS DISC SIGN STRAINER;So;0;L;;;;;N;;;;;
+101FB;PHAISTOS DISC SIGN SMALL AXE;So;0;L;;;;;N;;;;;
+101FC;PHAISTOS DISC SIGN WAVY BAND;So;0;L;;;;;N;;;;;
+101FD;PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE;Mn;220;NSM;;;;;N;;;;;
+10280;LYCIAN LETTER A;Lo;0;L;;;;;N;;;;;
+10281;LYCIAN LETTER E;Lo;0;L;;;;;N;;;;;
+10282;LYCIAN LETTER B;Lo;0;L;;;;;N;;;;;
+10283;LYCIAN LETTER BH;Lo;0;L;;;;;N;;;;;
+10284;LYCIAN LETTER G;Lo;0;L;;;;;N;;;;;
+10285;LYCIAN LETTER D;Lo;0;L;;;;;N;;;;;
+10286;LYCIAN LETTER I;Lo;0;L;;;;;N;;;;;
+10287;LYCIAN LETTER W;Lo;0;L;;;;;N;;;;;
+10288;LYCIAN LETTER Z;Lo;0;L;;;;;N;;;;;
+10289;LYCIAN LETTER TH;Lo;0;L;;;;;N;;;;;
+1028A;LYCIAN LETTER J;Lo;0;L;;;;;N;;;;;
+1028B;LYCIAN LETTER K;Lo;0;L;;;;;N;;;;;
+1028C;LYCIAN LETTER Q;Lo;0;L;;;;;N;;;;;
+1028D;LYCIAN LETTER L;Lo;0;L;;;;;N;;;;;
+1028E;LYCIAN LETTER M;Lo;0;L;;;;;N;;;;;
+1028F;LYCIAN LETTER N;Lo;0;L;;;;;N;;;;;
+10290;LYCIAN LETTER MM;Lo;0;L;;;;;N;;;;;
+10291;LYCIAN LETTER NN;Lo;0;L;;;;;N;;;;;
+10292;LYCIAN LETTER U;Lo;0;L;;;;;N;;;;;
+10293;LYCIAN LETTER P;Lo;0;L;;;;;N;;;;;
+10294;LYCIAN LETTER KK;Lo;0;L;;;;;N;;;;;
+10295;LYCIAN LETTER R;Lo;0;L;;;;;N;;;;;
+10296;LYCIAN LETTER S;Lo;0;L;;;;;N;;;;;
+10297;LYCIAN LETTER T;Lo;0;L;;;;;N;;;;;
+10298;LYCIAN LETTER TT;Lo;0;L;;;;;N;;;;;
+10299;LYCIAN LETTER AN;Lo;0;L;;;;;N;;;;;
+1029A;LYCIAN LETTER EN;Lo;0;L;;;;;N;;;;;
+1029B;LYCIAN LETTER H;Lo;0;L;;;;;N;;;;;
+1029C;LYCIAN LETTER X;Lo;0;L;;;;;N;;;;;
+102A0;CARIAN LETTER A;Lo;0;L;;;;;N;;;;;
+102A1;CARIAN LETTER P2;Lo;0;L;;;;;N;;;;;
+102A2;CARIAN LETTER D;Lo;0;L;;;;;N;;;;;
+102A3;CARIAN LETTER L;Lo;0;L;;;;;N;;;;;
+102A4;CARIAN LETTER UUU;Lo;0;L;;;;;N;;;;;
+102A5;CARIAN LETTER R;Lo;0;L;;;;;N;;;;;
+102A6;CARIAN LETTER LD;Lo;0;L;;;;;N;;;;;
+102A7;CARIAN LETTER A2;Lo;0;L;;;;;N;;;;;
+102A8;CARIAN LETTER Q;Lo;0;L;;;;;N;;;;;
+102A9;CARIAN LETTER B;Lo;0;L;;;;;N;;;;;
+102AA;CARIAN LETTER M;Lo;0;L;;;;;N;;;;;
+102AB;CARIAN LETTER O;Lo;0;L;;;;;N;;;;;
+102AC;CARIAN LETTER D2;Lo;0;L;;;;;N;;;;;
+102AD;CARIAN LETTER T;Lo;0;L;;;;;N;;;;;
+102AE;CARIAN LETTER SH;Lo;0;L;;;;;N;;;;;
+102AF;CARIAN LETTER SH2;Lo;0;L;;;;;N;;;;;
+102B0;CARIAN LETTER S;Lo;0;L;;;;;N;;;;;
+102B1;CARIAN LETTER C-18;Lo;0;L;;;;;N;;;;;
+102B2;CARIAN LETTER U;Lo;0;L;;;;;N;;;;;
+102B3;CARIAN LETTER NN;Lo;0;L;;;;;N;;;;;
+102B4;CARIAN LETTER X;Lo;0;L;;;;;N;;;;;
+102B5;CARIAN LETTER N;Lo;0;L;;;;;N;;;;;
+102B6;CARIAN LETTER TT2;Lo;0;L;;;;;N;;;;;
+102B7;CARIAN LETTER P;Lo;0;L;;;;;N;;;;;
+102B8;CARIAN LETTER SS;Lo;0;L;;;;;N;;;;;
+102B9;CARIAN LETTER I;Lo;0;L;;;;;N;;;;;
+102BA;CARIAN LETTER E;Lo;0;L;;;;;N;;;;;
+102BB;CARIAN LETTER UUUU;Lo;0;L;;;;;N;;;;;
+102BC;CARIAN LETTER K;Lo;0;L;;;;;N;;;;;
+102BD;CARIAN LETTER K2;Lo;0;L;;;;;N;;;;;
+102BE;CARIAN LETTER ND;Lo;0;L;;;;;N;;;;;
+102BF;CARIAN LETTER UU;Lo;0;L;;;;;N;;;;;
+102C0;CARIAN LETTER G;Lo;0;L;;;;;N;;;;;
+102C1;CARIAN LETTER G2;Lo;0;L;;;;;N;;;;;
+102C2;CARIAN LETTER ST;Lo;0;L;;;;;N;;;;;
+102C3;CARIAN LETTER ST2;Lo;0;L;;;;;N;;;;;
+102C4;CARIAN LETTER NG;Lo;0;L;;;;;N;;;;;
+102C5;CARIAN LETTER II;Lo;0;L;;;;;N;;;;;
+102C6;CARIAN LETTER C-39;Lo;0;L;;;;;N;;;;;
+102C7;CARIAN LETTER TT;Lo;0;L;;;;;N;;;;;
+102C8;CARIAN LETTER UUU2;Lo;0;L;;;;;N;;;;;
+102C9;CARIAN LETTER RR;Lo;0;L;;;;;N;;;;;
+102CA;CARIAN LETTER MB;Lo;0;L;;;;;N;;;;;
+102CB;CARIAN LETTER MB2;Lo;0;L;;;;;N;;;;;
+102CC;CARIAN LETTER MB3;Lo;0;L;;;;;N;;;;;
+102CD;CARIAN LETTER MB4;Lo;0;L;;;;;N;;;;;
+102CE;CARIAN LETTER LD2;Lo;0;L;;;;;N;;;;;
+102CF;CARIAN LETTER E2;Lo;0;L;;;;;N;;;;;
+102D0;CARIAN LETTER UUU3;Lo;0;L;;;;;N;;;;;
10300;OLD ITALIC LETTER A;Lo;0;L;;;;;N;;;;;
10301;OLD ITALIC LETTER BE;Lo;0;L;;;;;N;;;;;
10302;OLD ITALIC LETTER KE;Lo;0;L;;;;;N;;;;;
@@ -12405,7 +15253,7 @@
1033E;GOTHIC LETTER JER;Lo;0;L;;;;;N;;;;;
1033F;GOTHIC LETTER URUS;Lo;0;L;;;;;N;;;;;
10340;GOTHIC LETTER PAIRTHRA;Lo;0;L;;;;;N;;;;;
-10341;GOTHIC LETTER NINETY;Lo;0;L;;;;;N;;;;;
+10341;GOTHIC LETTER NINETY;Nl;0;L;;;;90;N;;;;;
10342;GOTHIC LETTER RAIDA;Lo;0;L;;;;;N;;;;;
10343;GOTHIC LETTER SAUIL;Lo;0;L;;;;;N;;;;;
10344;GOTHIC LETTER TEIWS;Lo;0;L;;;;;N;;;;;
@@ -12414,7 +15262,7 @@
10347;GOTHIC LETTER IGGWS;Lo;0;L;;;;;N;;;;;
10348;GOTHIC LETTER HWAIR;Lo;0;L;;;;;N;;;;;
10349;GOTHIC LETTER OTHAL;Lo;0;L;;;;;N;;;;;
-1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;;N;;;;;
+1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;900;N;;;;;
10380;UGARITIC LETTER ALPA;Lo;0;L;;;;;N;;;;;
10381;UGARITIC LETTER BETA;Lo;0;L;;;;;N;;;;;
10382;UGARITIC LETTER GAMLA;Lo;0;L;;;;;N;;;;;
@@ -12446,6 +15294,56 @@
1039C;UGARITIC LETTER U;Lo;0;L;;;;;N;;;;;
1039D;UGARITIC LETTER SSU;Lo;0;L;;;;;N;;;;;
1039F;UGARITIC WORD DIVIDER;Po;0;L;;;;;N;;;;;
+103A0;OLD PERSIAN SIGN A;Lo;0;L;;;;;N;;;;;
+103A1;OLD PERSIAN SIGN I;Lo;0;L;;;;;N;;;;;
+103A2;OLD PERSIAN SIGN U;Lo;0;L;;;;;N;;;;;
+103A3;OLD PERSIAN SIGN KA;Lo;0;L;;;;;N;;;;;
+103A4;OLD PERSIAN SIGN KU;Lo;0;L;;;;;N;;;;;
+103A5;OLD PERSIAN SIGN GA;Lo;0;L;;;;;N;;;;;
+103A6;OLD PERSIAN SIGN GU;Lo;0;L;;;;;N;;;;;
+103A7;OLD PERSIAN SIGN XA;Lo;0;L;;;;;N;;;;;
+103A8;OLD PERSIAN SIGN CA;Lo;0;L;;;;;N;;;;;
+103A9;OLD PERSIAN SIGN JA;Lo;0;L;;;;;N;;;;;
+103AA;OLD PERSIAN SIGN JI;Lo;0;L;;;;;N;;;;;
+103AB;OLD PERSIAN SIGN TA;Lo;0;L;;;;;N;;;;;
+103AC;OLD PERSIAN SIGN TU;Lo;0;L;;;;;N;;;;;
+103AD;OLD PERSIAN SIGN DA;Lo;0;L;;;;;N;;;;;
+103AE;OLD PERSIAN SIGN DI;Lo;0;L;;;;;N;;;;;
+103AF;OLD PERSIAN SIGN DU;Lo;0;L;;;;;N;;;;;
+103B0;OLD PERSIAN SIGN THA;Lo;0;L;;;;;N;;;;;
+103B1;OLD PERSIAN SIGN PA;Lo;0;L;;;;;N;;;;;
+103B2;OLD PERSIAN SIGN BA;Lo;0;L;;;;;N;;;;;
+103B3;OLD PERSIAN SIGN FA;Lo;0;L;;;;;N;;;;;
+103B4;OLD PERSIAN SIGN NA;Lo;0;L;;;;;N;;;;;
+103B5;OLD PERSIAN SIGN NU;Lo;0;L;;;;;N;;;;;
+103B6;OLD PERSIAN SIGN MA;Lo;0;L;;;;;N;;;;;
+103B7;OLD PERSIAN SIGN MI;Lo;0;L;;;;;N;;;;;
+103B8;OLD PERSIAN SIGN MU;Lo;0;L;;;;;N;;;;;
+103B9;OLD PERSIAN SIGN YA;Lo;0;L;;;;;N;;;;;
+103BA;OLD PERSIAN SIGN VA;Lo;0;L;;;;;N;;;;;
+103BB;OLD PERSIAN SIGN VI;Lo;0;L;;;;;N;;;;;
+103BC;OLD PERSIAN SIGN RA;Lo;0;L;;;;;N;;;;;
+103BD;OLD PERSIAN SIGN RU;Lo;0;L;;;;;N;;;;;
+103BE;OLD PERSIAN SIGN LA;Lo;0;L;;;;;N;;;;;
+103BF;OLD PERSIAN SIGN SA;Lo;0;L;;;;;N;;;;;
+103C0;OLD PERSIAN SIGN ZA;Lo;0;L;;;;;N;;;;;
+103C1;OLD PERSIAN SIGN SHA;Lo;0;L;;;;;N;;;;;
+103C2;OLD PERSIAN SIGN SSA;Lo;0;L;;;;;N;;;;;
+103C3;OLD PERSIAN SIGN HA;Lo;0;L;;;;;N;;;;;
+103C8;OLD PERSIAN SIGN AURAMAZDAA;Lo;0;L;;;;;N;;;;;
+103C9;OLD PERSIAN SIGN AURAMAZDAA-2;Lo;0;L;;;;;N;;;;;
+103CA;OLD PERSIAN SIGN AURAMAZDAAHA;Lo;0;L;;;;;N;;;;;
+103CB;OLD PERSIAN SIGN XSHAAYATHIYA;Lo;0;L;;;;;N;;;;;
+103CC;OLD PERSIAN SIGN DAHYAAUSH;Lo;0;L;;;;;N;;;;;
+103CD;OLD PERSIAN SIGN DAHYAAUSH-2;Lo;0;L;;;;;N;;;;;
+103CE;OLD PERSIAN SIGN BAGA;Lo;0;L;;;;;N;;;;;
+103CF;OLD PERSIAN SIGN BUUMISH;Lo;0;L;;;;;N;;;;;
+103D0;OLD PERSIAN WORD DIVIDER;Po;0;L;;;;;N;;;;;
+103D1;OLD PERSIAN NUMBER ONE;Nl;0;L;;;;1;N;;;;;
+103D2;OLD PERSIAN NUMBER TWO;Nl;0;L;;;;2;N;;;;;
+103D3;OLD PERSIAN NUMBER TEN;Nl;0;L;;;;10;N;;;;;
+103D4;OLD PERSIAN NUMBER TWENTY;Nl;0;L;;;;20;N;;;;;
+103D5;OLD PERSIAN NUMBER HUNDRED;Nl;0;L;;;;100;N;;;;;
10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428;
10401;DESERET CAPITAL LETTER LONG E;Lu;0;L;;;;;N;;;;10429;
10402;DESERET CAPITAL LETTER LONG A;Lu;0;L;;;;;N;;;;1042A;
@@ -12669,6 +15567,1107 @@
10838;CYPRIOT SYLLABLE XE;Lo;0;R;;;;;N;;;;;
1083C;CYPRIOT SYLLABLE ZA;Lo;0;R;;;;;N;;;;;
1083F;CYPRIOT SYLLABLE ZO;Lo;0;R;;;;;N;;;;;
+10900;PHOENICIAN LETTER ALF;Lo;0;R;;;;;N;;;;;
+10901;PHOENICIAN LETTER BET;Lo;0;R;;;;;N;;;;;
+10902;PHOENICIAN LETTER GAML;Lo;0;R;;;;;N;;;;;
+10903;PHOENICIAN LETTER DELT;Lo;0;R;;;;;N;;;;;
+10904;PHOENICIAN LETTER HE;Lo;0;R;;;;;N;;;;;
+10905;PHOENICIAN LETTER WAU;Lo;0;R;;;;;N;;;;;
+10906;PHOENICIAN LETTER ZAI;Lo;0;R;;;;;N;;;;;
+10907;PHOENICIAN LETTER HET;Lo;0;R;;;;;N;;;;;
+10908;PHOENICIAN LETTER TET;Lo;0;R;;;;;N;;;;;
+10909;PHOENICIAN LETTER YOD;Lo;0;R;;;;;N;;;;;
+1090A;PHOENICIAN LETTER KAF;Lo;0;R;;;;;N;;;;;
+1090B;PHOENICIAN LETTER LAMD;Lo;0;R;;;;;N;;;;;
+1090C;PHOENICIAN LETTER MEM;Lo;0;R;;;;;N;;;;;
+1090D;PHOENICIAN LETTER NUN;Lo;0;R;;;;;N;;;;;
+1090E;PHOENICIAN LETTER SEMK;Lo;0;R;;;;;N;;;;;
+1090F;PHOENICIAN LETTER AIN;Lo;0;R;;;;;N;;;;;
+10910;PHOENICIAN LETTER PE;Lo;0;R;;;;;N;;;;;
+10911;PHOENICIAN LETTER SADE;Lo;0;R;;;;;N;;;;;
+10912;PHOENICIAN LETTER QOF;Lo;0;R;;;;;N;;;;;
+10913;PHOENICIAN LETTER ROSH;Lo;0;R;;;;;N;;;;;
+10914;PHOENICIAN LETTER SHIN;Lo;0;R;;;;;N;;;;;
+10915;PHOENICIAN LETTER TAU;Lo;0;R;;;;;N;;;;;
+10916;PHOENICIAN NUMBER ONE;No;0;R;;;;1;N;;;;;
+10917;PHOENICIAN NUMBER TEN;No;0;R;;;;10;N;;;;;
+10918;PHOENICIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+10919;PHOENICIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+1091F;PHOENICIAN WORD SEPARATOR;Po;0;ON;;;;;N;;;;;
+10920;LYDIAN LETTER A;Lo;0;R;;;;;N;;;;;
+10921;LYDIAN LETTER B;Lo;0;R;;;;;N;;;;;
+10922;LYDIAN LETTER G;Lo;0;R;;;;;N;;;;;
+10923;LYDIAN LETTER D;Lo;0;R;;;;;N;;;;;
+10924;LYDIAN LETTER E;Lo;0;R;;;;;N;;;;;
+10925;LYDIAN LETTER V;Lo;0;R;;;;;N;;;;;
+10926;LYDIAN LETTER I;Lo;0;R;;;;;N;;;;;
+10927;LYDIAN LETTER Y;Lo;0;R;;;;;N;;;;;
+10928;LYDIAN LETTER K;Lo;0;R;;;;;N;;;;;
+10929;LYDIAN LETTER L;Lo;0;R;;;;;N;;;;;
+1092A;LYDIAN LETTER M;Lo;0;R;;;;;N;;;;;
+1092B;LYDIAN LETTER N;Lo;0;R;;;;;N;;;;;
+1092C;LYDIAN LETTER O;Lo;0;R;;;;;N;;;;;
+1092D;LYDIAN LETTER R;Lo;0;R;;;;;N;;;;;
+1092E;LYDIAN LETTER SS;Lo;0;R;;;;;N;;;;;
+1092F;LYDIAN LETTER T;Lo;0;R;;;;;N;;;;;
+10930;LYDIAN LETTER U;Lo;0;R;;;;;N;;;;;
+10931;LYDIAN LETTER F;Lo;0;R;;;;;N;;;;;
+10932;LYDIAN LETTER Q;Lo;0;R;;;;;N;;;;;
+10933;LYDIAN LETTER S;Lo;0;R;;;;;N;;;;;
+10934;LYDIAN LETTER TT;Lo;0;R;;;;;N;;;;;
+10935;LYDIAN LETTER AN;Lo;0;R;;;;;N;;;;;
+10936;LYDIAN LETTER EN;Lo;0;R;;;;;N;;;;;
+10937;LYDIAN LETTER LY;Lo;0;R;;;;;N;;;;;
+10938;LYDIAN LETTER NN;Lo;0;R;;;;;N;;;;;
+10939;LYDIAN LETTER C;Lo;0;R;;;;;N;;;;;
+1093F;LYDIAN TRIANGULAR MARK;Po;0;R;;;;;N;;;;;
+10A00;KHAROSHTHI LETTER A;Lo;0;R;;;;;N;;;;;
+10A01;KHAROSHTHI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+10A02;KHAROSHTHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+10A03;KHAROSHTHI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+10A05;KHAROSHTHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+10A06;KHAROSHTHI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+10A0C;KHAROSHTHI VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;;
+10A0D;KHAROSHTHI SIGN DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;;
+10A0E;KHAROSHTHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+10A0F;KHAROSHTHI SIGN VISARGA;Mn;230;NSM;;;;;N;;;;;
+10A10;KHAROSHTHI LETTER KA;Lo;0;R;;;;;N;;;;;
+10A11;KHAROSHTHI LETTER KHA;Lo;0;R;;;;;N;;;;;
+10A12;KHAROSHTHI LETTER GA;Lo;0;R;;;;;N;;;;;
+10A13;KHAROSHTHI LETTER GHA;Lo;0;R;;;;;N;;;;;
+10A15;KHAROSHTHI LETTER CA;Lo;0;R;;;;;N;;;;;
+10A16;KHAROSHTHI LETTER CHA;Lo;0;R;;;;;N;;;;;
+10A17;KHAROSHTHI LETTER JA;Lo;0;R;;;;;N;;;;;
+10A19;KHAROSHTHI LETTER NYA;Lo;0;R;;;;;N;;;;;
+10A1A;KHAROSHTHI LETTER TTA;Lo;0;R;;;;;N;;;;;
+10A1B;KHAROSHTHI LETTER TTHA;Lo;0;R;;;;;N;;;;;
+10A1C;KHAROSHTHI LETTER DDA;Lo;0;R;;;;;N;;;;;
+10A1D;KHAROSHTHI LETTER DDHA;Lo;0;R;;;;;N;;;;;
+10A1E;KHAROSHTHI LETTER NNA;Lo;0;R;;;;;N;;;;;
+10A1F;KHAROSHTHI LETTER TA;Lo;0;R;;;;;N;;;;;
+10A20;KHAROSHTHI LETTER THA;Lo;0;R;;;;;N;;;;;
+10A21;KHAROSHTHI LETTER DA;Lo;0;R;;;;;N;;;;;
+10A22;KHAROSHTHI LETTER DHA;Lo;0;R;;;;;N;;;;;
+10A23;KHAROSHTHI LETTER NA;Lo;0;R;;;;;N;;;;;
+10A24;KHAROSHTHI LETTER PA;Lo;0;R;;;;;N;;;;;
+10A25;KHAROSHTHI LETTER PHA;Lo;0;R;;;;;N;;;;;
+10A26;KHAROSHTHI LETTER BA;Lo;0;R;;;;;N;;;;;
+10A27;KHAROSHTHI LETTER BHA;Lo;0;R;;;;;N;;;;;
+10A28;KHAROSHTHI LETTER MA;Lo;0;R;;;;;N;;;;;
+10A29;KHAROSHTHI LETTER YA;Lo;0;R;;;;;N;;;;;
+10A2A;KHAROSHTHI LETTER RA;Lo;0;R;;;;;N;;;;;
+10A2B;KHAROSHTHI LETTER LA;Lo;0;R;;;;;N;;;;;
+10A2C;KHAROSHTHI LETTER VA;Lo;0;R;;;;;N;;;;;
+10A2D;KHAROSHTHI LETTER SHA;Lo;0;R;;;;;N;;;;;
+10A2E;KHAROSHTHI LETTER SSA;Lo;0;R;;;;;N;;;;;
+10A2F;KHAROSHTHI LETTER SA;Lo;0;R;;;;;N;;;;;
+10A30;KHAROSHTHI LETTER ZA;Lo;0;R;;;;;N;;;;;
+10A31;KHAROSHTHI LETTER HA;Lo;0;R;;;;;N;;;;;
+10A32;KHAROSHTHI LETTER KKA;Lo;0;R;;;;;N;;;;;
+10A33;KHAROSHTHI LETTER TTTHA;Lo;0;R;;;;;N;;;;;
+10A38;KHAROSHTHI SIGN BAR ABOVE;Mn;230;NSM;;;;;N;;;;;
+10A39;KHAROSHTHI SIGN CAUDA;Mn;1;NSM;;;;;N;;;;;
+10A3A;KHAROSHTHI SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;;
+10A3F;KHAROSHTHI VIRAMA;Mn;9;NSM;;;;;N;;;;;
+10A40;KHAROSHTHI DIGIT ONE;No;0;R;;;1;1;N;;;;;
+10A41;KHAROSHTHI DIGIT TWO;No;0;R;;;2;2;N;;;;;
+10A42;KHAROSHTHI DIGIT THREE;No;0;R;;;3;3;N;;;;;
+10A43;KHAROSHTHI DIGIT FOUR;No;0;R;;;4;4;N;;;;;
+10A44;KHAROSHTHI NUMBER TEN;No;0;R;;;;10;N;;;;;
+10A45;KHAROSHTHI NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+10A46;KHAROSHTHI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+10A47;KHAROSHTHI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;;
+10A50;KHAROSHTHI PUNCTUATION DOT;Po;0;R;;;;;N;;;;;
+10A51;KHAROSHTHI PUNCTUATION SMALL CIRCLE;Po;0;R;;;;;N;;;;;
+10A52;KHAROSHTHI PUNCTUATION CIRCLE;Po;0;R;;;;;N;;;;;
+10A53;KHAROSHTHI PUNCTUATION CRESCENT BAR;Po;0;R;;;;;N;;;;;
+10A54;KHAROSHTHI PUNCTUATION MANGALAM;Po;0;R;;;;;N;;;;;
+10A55;KHAROSHTHI PUNCTUATION LOTUS;Po;0;R;;;;;N;;;;;
+10A56;KHAROSHTHI PUNCTUATION DANDA;Po;0;R;;;;;N;;;;;
+10A57;KHAROSHTHI PUNCTUATION DOUBLE DANDA;Po;0;R;;;;;N;;;;;
+10A58;KHAROSHTHI PUNCTUATION LINES;Po;0;R;;;;;N;;;;;
+12000;CUNEIFORM SIGN A;Lo;0;L;;;;;N;;;;;
+12001;CUNEIFORM SIGN A TIMES A;Lo;0;L;;;;;N;;;;;
+12002;CUNEIFORM SIGN A TIMES BAD;Lo;0;L;;;;;N;;;;;
+12003;CUNEIFORM SIGN A TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12004;CUNEIFORM SIGN A TIMES HA;Lo;0;L;;;;;N;;;;;
+12005;CUNEIFORM SIGN A TIMES IGI;Lo;0;L;;;;;N;;;;;
+12006;CUNEIFORM SIGN A TIMES LAGAR GUNU;Lo;0;L;;;;;N;;;;;
+12007;CUNEIFORM SIGN A TIMES MUSH;Lo;0;L;;;;;N;;;;;
+12008;CUNEIFORM SIGN A TIMES SAG;Lo;0;L;;;;;N;;;;;
+12009;CUNEIFORM SIGN A2;Lo;0;L;;;;;N;;;;;
+1200A;CUNEIFORM SIGN AB;Lo;0;L;;;;;N;;;;;
+1200B;CUNEIFORM SIGN AB TIMES ASH2;Lo;0;L;;;;;N;;;;;
+1200C;CUNEIFORM SIGN AB TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;;
+1200D;CUNEIFORM SIGN AB TIMES GAL;Lo;0;L;;;;;N;;;;;
+1200E;CUNEIFORM SIGN AB TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1200F;CUNEIFORM SIGN AB TIMES HA;Lo;0;L;;;;;N;;;;;
+12010;CUNEIFORM SIGN AB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+12011;CUNEIFORM SIGN AB TIMES IMIN;Lo;0;L;;;;;N;;;;;
+12012;CUNEIFORM SIGN AB TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+12013;CUNEIFORM SIGN AB TIMES SHESH;Lo;0;L;;;;;N;;;;;
+12014;CUNEIFORM SIGN AB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;;
+12015;CUNEIFORM SIGN AB GUNU;Lo;0;L;;;;;N;;;;;
+12016;CUNEIFORM SIGN AB2;Lo;0;L;;;;;N;;;;;
+12017;CUNEIFORM SIGN AB2 TIMES BALAG;Lo;0;L;;;;;N;;;;;
+12018;CUNEIFORM SIGN AB2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12019;CUNEIFORM SIGN AB2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+1201A;CUNEIFORM SIGN AB2 TIMES SHA3;Lo;0;L;;;;;N;;;;;
+1201B;CUNEIFORM SIGN AB2 TIMES TAK4;Lo;0;L;;;;;N;;;;;
+1201C;CUNEIFORM SIGN AD;Lo;0;L;;;;;N;;;;;
+1201D;CUNEIFORM SIGN AK;Lo;0;L;;;;;N;;;;;
+1201E;CUNEIFORM SIGN AK TIMES ERIN2;Lo;0;L;;;;;N;;;;;
+1201F;CUNEIFORM SIGN AK TIMES SHITA PLUS GISH;Lo;0;L;;;;;N;;;;;
+12020;CUNEIFORM SIGN AL;Lo;0;L;;;;;N;;;;;
+12021;CUNEIFORM SIGN AL TIMES AL;Lo;0;L;;;;;N;;;;;
+12022;CUNEIFORM SIGN AL TIMES DIM2;Lo;0;L;;;;;N;;;;;
+12023;CUNEIFORM SIGN AL TIMES GISH;Lo;0;L;;;;;N;;;;;
+12024;CUNEIFORM SIGN AL TIMES HA;Lo;0;L;;;;;N;;;;;
+12025;CUNEIFORM SIGN AL TIMES KAD3;Lo;0;L;;;;;N;;;;;
+12026;CUNEIFORM SIGN AL TIMES KI;Lo;0;L;;;;;N;;;;;
+12027;CUNEIFORM SIGN AL TIMES SHE;Lo;0;L;;;;;N;;;;;
+12028;CUNEIFORM SIGN AL TIMES USH;Lo;0;L;;;;;N;;;;;
+12029;CUNEIFORM SIGN ALAN;Lo;0;L;;;;;N;;;;;
+1202A;CUNEIFORM SIGN ALEPH;Lo;0;L;;;;;N;;;;;
+1202B;CUNEIFORM SIGN AMAR;Lo;0;L;;;;;N;;;;;
+1202C;CUNEIFORM SIGN AMAR TIMES SHE;Lo;0;L;;;;;N;;;;;
+1202D;CUNEIFORM SIGN AN;Lo;0;L;;;;;N;;;;;
+1202E;CUNEIFORM SIGN AN OVER AN;Lo;0;L;;;;;N;;;;;
+1202F;CUNEIFORM SIGN AN THREE TIMES;Lo;0;L;;;;;N;;;;;
+12030;CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA;Lo;0;L;;;;;N;;;;;
+12031;CUNEIFORM SIGN AN PLUS NAGA SQUARED;Lo;0;L;;;;;N;;;;;
+12032;CUNEIFORM SIGN ANSHE;Lo;0;L;;;;;N;;;;;
+12033;CUNEIFORM SIGN APIN;Lo;0;L;;;;;N;;;;;
+12034;CUNEIFORM SIGN ARAD;Lo;0;L;;;;;N;;;;;
+12035;CUNEIFORM SIGN ARAD TIMES KUR;Lo;0;L;;;;;N;;;;;
+12036;CUNEIFORM SIGN ARKAB;Lo;0;L;;;;;N;;;;;
+12037;CUNEIFORM SIGN ASAL2;Lo;0;L;;;;;N;;;;;
+12038;CUNEIFORM SIGN ASH;Lo;0;L;;;;;N;;;;;
+12039;CUNEIFORM SIGN ASH ZIDA TENU;Lo;0;L;;;;;N;;;;;
+1203A;CUNEIFORM SIGN ASH KABA TENU;Lo;0;L;;;;;N;;;;;
+1203B;CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP;Lo;0;L;;;;;N;;;;;
+1203C;CUNEIFORM SIGN ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;;
+1203D;CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;;
+1203E;CUNEIFORM SIGN ASH2;Lo;0;L;;;;;N;;;;;
+1203F;CUNEIFORM SIGN ASHGAB;Lo;0;L;;;;;N;;;;;
+12040;CUNEIFORM SIGN BA;Lo;0;L;;;;;N;;;;;
+12041;CUNEIFORM SIGN BAD;Lo;0;L;;;;;N;;;;;
+12042;CUNEIFORM SIGN BAG3;Lo;0;L;;;;;N;;;;;
+12043;CUNEIFORM SIGN BAHAR2;Lo;0;L;;;;;N;;;;;
+12044;CUNEIFORM SIGN BAL;Lo;0;L;;;;;N;;;;;
+12045;CUNEIFORM SIGN BAL OVER BAL;Lo;0;L;;;;;N;;;;;
+12046;CUNEIFORM SIGN BALAG;Lo;0;L;;;;;N;;;;;
+12047;CUNEIFORM SIGN BAR;Lo;0;L;;;;;N;;;;;
+12048;CUNEIFORM SIGN BARA2;Lo;0;L;;;;;N;;;;;
+12049;CUNEIFORM SIGN BI;Lo;0;L;;;;;N;;;;;
+1204A;CUNEIFORM SIGN BI TIMES A;Lo;0;L;;;;;N;;;;;
+1204B;CUNEIFORM SIGN BI TIMES GAR;Lo;0;L;;;;;N;;;;;
+1204C;CUNEIFORM SIGN BI TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+1204D;CUNEIFORM SIGN BU;Lo;0;L;;;;;N;;;;;
+1204E;CUNEIFORM SIGN BU OVER BU AB;Lo;0;L;;;;;N;;;;;
+1204F;CUNEIFORM SIGN BU OVER BU UN;Lo;0;L;;;;;N;;;;;
+12050;CUNEIFORM SIGN BU CROSSING BU;Lo;0;L;;;;;N;;;;;
+12051;CUNEIFORM SIGN BULUG;Lo;0;L;;;;;N;;;;;
+12052;CUNEIFORM SIGN BULUG OVER BULUG;Lo;0;L;;;;;N;;;;;
+12053;CUNEIFORM SIGN BUR;Lo;0;L;;;;;N;;;;;
+12054;CUNEIFORM SIGN BUR2;Lo;0;L;;;;;N;;;;;
+12055;CUNEIFORM SIGN DA;Lo;0;L;;;;;N;;;;;
+12056;CUNEIFORM SIGN DAG;Lo;0;L;;;;;N;;;;;
+12057;CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH;Lo;0;L;;;;;N;;;;;
+12058;CUNEIFORM SIGN DAG KISIM5 TIMES AMAR;Lo;0;L;;;;;N;;;;;
+12059;CUNEIFORM SIGN DAG KISIM5 TIMES BALAG;Lo;0;L;;;;;N;;;;;
+1205A;CUNEIFORM SIGN DAG KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;;
+1205B;CUNEIFORM SIGN DAG KISIM5 TIMES GA;Lo;0;L;;;;;N;;;;;
+1205C;CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH;Lo;0;L;;;;;N;;;;;
+1205D;CUNEIFORM SIGN DAG KISIM5 TIMES GI;Lo;0;L;;;;;N;;;;;
+1205E;CUNEIFORM SIGN DAG KISIM5 TIMES GIR2;Lo;0;L;;;;;N;;;;;
+1205F;CUNEIFORM SIGN DAG KISIM5 TIMES GUD;Lo;0;L;;;;;N;;;;;
+12060;CUNEIFORM SIGN DAG KISIM5 TIMES HA;Lo;0;L;;;;;N;;;;;
+12061;CUNEIFORM SIGN DAG KISIM5 TIMES IR;Lo;0;L;;;;;N;;;;;
+12062;CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU;Lo;0;L;;;;;N;;;;;
+12063;CUNEIFORM SIGN DAG KISIM5 TIMES KAK;Lo;0;L;;;;;N;;;;;
+12064;CUNEIFORM SIGN DAG KISIM5 TIMES LA;Lo;0;L;;;;;N;;;;;
+12065;CUNEIFORM SIGN DAG KISIM5 TIMES LU;Lo;0;L;;;;;N;;;;;
+12066;CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2;Lo;0;L;;;;;N;;;;;
+12067;CUNEIFORM SIGN DAG KISIM5 TIMES LUM;Lo;0;L;;;;;N;;;;;
+12068;CUNEIFORM SIGN DAG KISIM5 TIMES NE;Lo;0;L;;;;;N;;;;;
+12069;CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;;
+1206A;CUNEIFORM SIGN DAG KISIM5 TIMES SI;Lo;0;L;;;;;N;;;;;
+1206B;CUNEIFORM SIGN DAG KISIM5 TIMES TAK4;Lo;0;L;;;;;N;;;;;
+1206C;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2;Lo;0;L;;;;;N;;;;;
+1206D;CUNEIFORM SIGN DAG KISIM5 TIMES USH;Lo;0;L;;;;;N;;;;;
+1206E;CUNEIFORM SIGN DAM;Lo;0;L;;;;;N;;;;;
+1206F;CUNEIFORM SIGN DAR;Lo;0;L;;;;;N;;;;;
+12070;CUNEIFORM SIGN DARA3;Lo;0;L;;;;;N;;;;;
+12071;CUNEIFORM SIGN DARA4;Lo;0;L;;;;;N;;;;;
+12072;CUNEIFORM SIGN DI;Lo;0;L;;;;;N;;;;;
+12073;CUNEIFORM SIGN DIB;Lo;0;L;;;;;N;;;;;
+12074;CUNEIFORM SIGN DIM;Lo;0;L;;;;;N;;;;;
+12075;CUNEIFORM SIGN DIM TIMES SHE;Lo;0;L;;;;;N;;;;;
+12076;CUNEIFORM SIGN DIM2;Lo;0;L;;;;;N;;;;;
+12077;CUNEIFORM SIGN DIN;Lo;0;L;;;;;N;;;;;
+12078;CUNEIFORM SIGN DIN KASKAL U GUNU DISH;Lo;0;L;;;;;N;;;;;
+12079;CUNEIFORM SIGN DISH;Lo;0;L;;;;;N;;;;;
+1207A;CUNEIFORM SIGN DU;Lo;0;L;;;;;N;;;;;
+1207B;CUNEIFORM SIGN DU OVER DU;Lo;0;L;;;;;N;;;;;
+1207C;CUNEIFORM SIGN DU GUNU;Lo;0;L;;;;;N;;;;;
+1207D;CUNEIFORM SIGN DU SHESHIG;Lo;0;L;;;;;N;;;;;
+1207E;CUNEIFORM SIGN DUB;Lo;0;L;;;;;N;;;;;
+1207F;CUNEIFORM SIGN DUB TIMES ESH2;Lo;0;L;;;;;N;;;;;
+12080;CUNEIFORM SIGN DUB2;Lo;0;L;;;;;N;;;;;
+12081;CUNEIFORM SIGN DUG;Lo;0;L;;;;;N;;;;;
+12082;CUNEIFORM SIGN DUGUD;Lo;0;L;;;;;N;;;;;
+12083;CUNEIFORM SIGN DUH;Lo;0;L;;;;;N;;;;;
+12084;CUNEIFORM SIGN DUN;Lo;0;L;;;;;N;;;;;
+12085;CUNEIFORM SIGN DUN3;Lo;0;L;;;;;N;;;;;
+12086;CUNEIFORM SIGN DUN3 GUNU;Lo;0;L;;;;;N;;;;;
+12087;CUNEIFORM SIGN DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;;
+12088;CUNEIFORM SIGN DUN4;Lo;0;L;;;;;N;;;;;
+12089;CUNEIFORM SIGN DUR2;Lo;0;L;;;;;N;;;;;
+1208A;CUNEIFORM SIGN E;Lo;0;L;;;;;N;;;;;
+1208B;CUNEIFORM SIGN E TIMES PAP;Lo;0;L;;;;;N;;;;;
+1208C;CUNEIFORM SIGN E OVER E NUN OVER NUN;Lo;0;L;;;;;N;;;;;
+1208D;CUNEIFORM SIGN E2;Lo;0;L;;;;;N;;;;;
+1208E;CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA;Lo;0;L;;;;;N;;;;;
+1208F;CUNEIFORM SIGN E2 TIMES GAR;Lo;0;L;;;;;N;;;;;
+12090;CUNEIFORM SIGN E2 TIMES MI;Lo;0;L;;;;;N;;;;;
+12091;CUNEIFORM SIGN E2 TIMES SAL;Lo;0;L;;;;;N;;;;;
+12092;CUNEIFORM SIGN E2 TIMES SHE;Lo;0;L;;;;;N;;;;;
+12093;CUNEIFORM SIGN E2 TIMES U;Lo;0;L;;;;;N;;;;;
+12094;CUNEIFORM SIGN EDIN;Lo;0;L;;;;;N;;;;;
+12095;CUNEIFORM SIGN EGIR;Lo;0;L;;;;;N;;;;;
+12096;CUNEIFORM SIGN EL;Lo;0;L;;;;;N;;;;;
+12097;CUNEIFORM SIGN EN;Lo;0;L;;;;;N;;;;;
+12098;CUNEIFORM SIGN EN TIMES GAN2;Lo;0;L;;;;;N;;;;;
+12099;CUNEIFORM SIGN EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1209A;CUNEIFORM SIGN EN TIMES ME;Lo;0;L;;;;;N;;;;;
+1209B;CUNEIFORM SIGN EN CROSSING EN;Lo;0;L;;;;;N;;;;;
+1209C;CUNEIFORM SIGN EN OPPOSING EN;Lo;0;L;;;;;N;;;;;
+1209D;CUNEIFORM SIGN EN SQUARED;Lo;0;L;;;;;N;;;;;
+1209E;CUNEIFORM SIGN EREN;Lo;0;L;;;;;N;;;;;
+1209F;CUNEIFORM SIGN ERIN2;Lo;0;L;;;;;N;;;;;
+120A0;CUNEIFORM SIGN ESH2;Lo;0;L;;;;;N;;;;;
+120A1;CUNEIFORM SIGN EZEN;Lo;0;L;;;;;N;;;;;
+120A2;CUNEIFORM SIGN EZEN TIMES A;Lo;0;L;;;;;N;;;;;
+120A3;CUNEIFORM SIGN EZEN TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;;
+120A4;CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL;Lo;0;L;;;;;N;;;;;
+120A5;CUNEIFORM SIGN EZEN TIMES AN;Lo;0;L;;;;;N;;;;;
+120A6;CUNEIFORM SIGN EZEN TIMES BAD;Lo;0;L;;;;;N;;;;;
+120A7;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;;
+120A8;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;;
+120A9;CUNEIFORM SIGN EZEN TIMES HA;Lo;0;L;;;;;N;;;;;
+120AA;CUNEIFORM SIGN EZEN TIMES HA GUNU;Lo;0;L;;;;;N;;;;;
+120AB;CUNEIFORM SIGN EZEN TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+120AC;CUNEIFORM SIGN EZEN TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+120AD;CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED;Lo;0;L;;;;;N;;;;;
+120AE;CUNEIFORM SIGN EZEN TIMES KU3;Lo;0;L;;;;;N;;;;;
+120AF;CUNEIFORM SIGN EZEN TIMES LA;Lo;0;L;;;;;N;;;;;
+120B0;CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL;Lo;0;L;;;;;N;;;;;
+120B1;CUNEIFORM SIGN EZEN TIMES LI;Lo;0;L;;;;;N;;;;;
+120B2;CUNEIFORM SIGN EZEN TIMES LU;Lo;0;L;;;;;N;;;;;
+120B3;CUNEIFORM SIGN EZEN TIMES U2;Lo;0;L;;;;;N;;;;;
+120B4;CUNEIFORM SIGN EZEN TIMES UD;Lo;0;L;;;;;N;;;;;
+120B5;CUNEIFORM SIGN GA;Lo;0;L;;;;;N;;;;;
+120B6;CUNEIFORM SIGN GA GUNU;Lo;0;L;;;;;N;;;;;
+120B7;CUNEIFORM SIGN GA2;Lo;0;L;;;;;N;;;;;
+120B8;CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;;
+120B9;CUNEIFORM SIGN GA2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;;
+120BA;CUNEIFORM SIGN GA2 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;;
+120BB;CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB;Lo;0;L;;;;;N;;;;;
+120BC;CUNEIFORM SIGN GA2 TIMES AN;Lo;0;L;;;;;N;;;;;
+120BD;CUNEIFORM SIGN GA2 TIMES ASH;Lo;0;L;;;;;N;;;;;
+120BE;CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL;Lo;0;L;;;;;N;;;;;
+120BF;CUNEIFORM SIGN GA2 TIMES BAD;Lo;0;L;;;;;N;;;;;
+120C0;CUNEIFORM SIGN GA2 TIMES BAR PLUS RA;Lo;0;L;;;;;N;;;;;
+120C1;CUNEIFORM SIGN GA2 TIMES BUR;Lo;0;L;;;;;N;;;;;
+120C2;CUNEIFORM SIGN GA2 TIMES BUR PLUS RA;Lo;0;L;;;;;N;;;;;
+120C3;CUNEIFORM SIGN GA2 TIMES DA;Lo;0;L;;;;;N;;;;;
+120C4;CUNEIFORM SIGN GA2 TIMES DI;Lo;0;L;;;;;N;;;;;
+120C5;CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE;Lo;0;L;;;;;N;;;;;
+120C6;CUNEIFORM SIGN GA2 TIMES DUB;Lo;0;L;;;;;N;;;;;
+120C7;CUNEIFORM SIGN GA2 TIMES EL;Lo;0;L;;;;;N;;;;;
+120C8;CUNEIFORM SIGN GA2 TIMES EL PLUS LA;Lo;0;L;;;;;N;;;;;
+120C9;CUNEIFORM SIGN GA2 TIMES EN;Lo;0;L;;;;;N;;;;;
+120CA;CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+120CB;CUNEIFORM SIGN GA2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+120CC;CUNEIFORM SIGN GA2 TIMES GAR;Lo;0;L;;;;;N;;;;;
+120CD;CUNEIFORM SIGN GA2 TIMES GI;Lo;0;L;;;;;N;;;;;
+120CE;CUNEIFORM SIGN GA2 TIMES GI4;Lo;0;L;;;;;N;;;;;
+120CF;CUNEIFORM SIGN GA2 TIMES GI4 PLUS A;Lo;0;L;;;;;N;;;;;
+120D0;CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU;Lo;0;L;;;;;N;;;;;
+120D1;CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2;Lo;0;L;;;;;N;;;;;
+120D2;CUNEIFORM SIGN GA2 TIMES HAL;Lo;0;L;;;;;N;;;;;
+120D3;CUNEIFORM SIGN GA2 TIMES HAL PLUS LA;Lo;0;L;;;;;N;;;;;
+120D4;CUNEIFORM SIGN GA2 TIMES HI PLUS LI;Lo;0;L;;;;;N;;;;;
+120D5;CUNEIFORM SIGN GA2 TIMES HUB2;Lo;0;L;;;;;N;;;;;
+120D6;CUNEIFORM SIGN GA2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+120D7;CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH;Lo;0;L;;;;;N;;;;;
+120D8;CUNEIFORM SIGN GA2 TIMES KAK;Lo;0;L;;;;;N;;;;;
+120D9;CUNEIFORM SIGN GA2 TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+120DA;CUNEIFORM SIGN GA2 TIMES KID;Lo;0;L;;;;;N;;;;;
+120DB;CUNEIFORM SIGN GA2 TIMES KID PLUS LAL;Lo;0;L;;;;;N;;;;;
+120DC;CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN;Lo;0;L;;;;;N;;;;;
+120DD;CUNEIFORM SIGN GA2 TIMES LA;Lo;0;L;;;;;N;;;;;
+120DE;CUNEIFORM SIGN GA2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+120DF;CUNEIFORM SIGN GA2 TIMES MI;Lo;0;L;;;;;N;;;;;
+120E0;CUNEIFORM SIGN GA2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+120E1;CUNEIFORM SIGN GA2 TIMES NUN OVER NUN;Lo;0;L;;;;;N;;;;;
+120E2;CUNEIFORM SIGN GA2 TIMES PA;Lo;0;L;;;;;N;;;;;
+120E3;CUNEIFORM SIGN GA2 TIMES SAL;Lo;0;L;;;;;N;;;;;
+120E4;CUNEIFORM SIGN GA2 TIMES SAR;Lo;0;L;;;;;N;;;;;
+120E5;CUNEIFORM SIGN GA2 TIMES SHE;Lo;0;L;;;;;N;;;;;
+120E6;CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR;Lo;0;L;;;;;N;;;;;
+120E7;CUNEIFORM SIGN GA2 TIMES SHID;Lo;0;L;;;;;N;;;;;
+120E8;CUNEIFORM SIGN GA2 TIMES SUM;Lo;0;L;;;;;N;;;;;
+120E9;CUNEIFORM SIGN GA2 TIMES TAK4;Lo;0;L;;;;;N;;;;;
+120EA;CUNEIFORM SIGN GA2 TIMES U;Lo;0;L;;;;;N;;;;;
+120EB;CUNEIFORM SIGN GA2 TIMES UD;Lo;0;L;;;;;N;;;;;
+120EC;CUNEIFORM SIGN GA2 TIMES UD PLUS DU;Lo;0;L;;;;;N;;;;;
+120ED;CUNEIFORM SIGN GA2 OVER GA2;Lo;0;L;;;;;N;;;;;
+120EE;CUNEIFORM SIGN GABA;Lo;0;L;;;;;N;;;;;
+120EF;CUNEIFORM SIGN GABA CROSSING GABA;Lo;0;L;;;;;N;;;;;
+120F0;CUNEIFORM SIGN GAD;Lo;0;L;;;;;N;;;;;
+120F1;CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+120F2;CUNEIFORM SIGN GAL;Lo;0;L;;;;;N;;;;;
+120F3;CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+120F4;CUNEIFORM SIGN GALAM;Lo;0;L;;;;;N;;;;;
+120F5;CUNEIFORM SIGN GAM;Lo;0;L;;;;;N;;;;;
+120F6;CUNEIFORM SIGN GAN;Lo;0;L;;;;;N;;;;;
+120F7;CUNEIFORM SIGN GAN2;Lo;0;L;;;;;N;;;;;
+120F8;CUNEIFORM SIGN GAN2 TENU;Lo;0;L;;;;;N;;;;;
+120F9;CUNEIFORM SIGN GAN2 OVER GAN2;Lo;0;L;;;;;N;;;;;
+120FA;CUNEIFORM SIGN GAN2 CROSSING GAN2;Lo;0;L;;;;;N;;;;;
+120FB;CUNEIFORM SIGN GAR;Lo;0;L;;;;;N;;;;;
+120FC;CUNEIFORM SIGN GAR3;Lo;0;L;;;;;N;;;;;
+120FD;CUNEIFORM SIGN GASHAN;Lo;0;L;;;;;N;;;;;
+120FE;CUNEIFORM SIGN GESHTIN;Lo;0;L;;;;;N;;;;;
+120FF;CUNEIFORM SIGN GESHTIN TIMES KUR;Lo;0;L;;;;;N;;;;;
+12100;CUNEIFORM SIGN GI;Lo;0;L;;;;;N;;;;;
+12101;CUNEIFORM SIGN GI TIMES E;Lo;0;L;;;;;N;;;;;
+12102;CUNEIFORM SIGN GI TIMES U;Lo;0;L;;;;;N;;;;;
+12103;CUNEIFORM SIGN GI CROSSING GI;Lo;0;L;;;;;N;;;;;
+12104;CUNEIFORM SIGN GI4;Lo;0;L;;;;;N;;;;;
+12105;CUNEIFORM SIGN GI4 OVER GI4;Lo;0;L;;;;;N;;;;;
+12106;CUNEIFORM SIGN GI4 CROSSING GI4;Lo;0;L;;;;;N;;;;;
+12107;CUNEIFORM SIGN GIDIM;Lo;0;L;;;;;N;;;;;
+12108;CUNEIFORM SIGN GIR2;Lo;0;L;;;;;N;;;;;
+12109;CUNEIFORM SIGN GIR2 GUNU;Lo;0;L;;;;;N;;;;;
+1210A;CUNEIFORM SIGN GIR3;Lo;0;L;;;;;N;;;;;
+1210B;CUNEIFORM SIGN GIR3 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;;
+1210C;CUNEIFORM SIGN GIR3 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1210D;CUNEIFORM SIGN GIR3 TIMES IGI;Lo;0;L;;;;;N;;;;;
+1210E;CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI;Lo;0;L;;;;;N;;;;;
+1210F;CUNEIFORM SIGN GIR3 TIMES PA;Lo;0;L;;;;;N;;;;;
+12110;CUNEIFORM SIGN GISAL;Lo;0;L;;;;;N;;;;;
+12111;CUNEIFORM SIGN GISH;Lo;0;L;;;;;N;;;;;
+12112;CUNEIFORM SIGN GISH CROSSING GISH;Lo;0;L;;;;;N;;;;;
+12113;CUNEIFORM SIGN GISH TIMES BAD;Lo;0;L;;;;;N;;;;;
+12114;CUNEIFORM SIGN GISH TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12115;CUNEIFORM SIGN GISH TENU;Lo;0;L;;;;;N;;;;;
+12116;CUNEIFORM SIGN GU;Lo;0;L;;;;;N;;;;;
+12117;CUNEIFORM SIGN GU CROSSING GU;Lo;0;L;;;;;N;;;;;
+12118;CUNEIFORM SIGN GU2;Lo;0;L;;;;;N;;;;;
+12119;CUNEIFORM SIGN GU2 TIMES KAK;Lo;0;L;;;;;N;;;;;
+1211A;CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+1211B;CUNEIFORM SIGN GU2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+1211C;CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2;Lo;0;L;;;;;N;;;;;
+1211D;CUNEIFORM SIGN GU2 GUNU;Lo;0;L;;;;;N;;;;;
+1211E;CUNEIFORM SIGN GUD;Lo;0;L;;;;;N;;;;;
+1211F;CUNEIFORM SIGN GUD TIMES A PLUS KUR;Lo;0;L;;;;;N;;;;;
+12120;CUNEIFORM SIGN GUD TIMES KUR;Lo;0;L;;;;;N;;;;;
+12121;CUNEIFORM SIGN GUD OVER GUD LUGAL;Lo;0;L;;;;;N;;;;;
+12122;CUNEIFORM SIGN GUL;Lo;0;L;;;;;N;;;;;
+12123;CUNEIFORM SIGN GUM;Lo;0;L;;;;;N;;;;;
+12124;CUNEIFORM SIGN GUM TIMES SHE;Lo;0;L;;;;;N;;;;;
+12125;CUNEIFORM SIGN GUR;Lo;0;L;;;;;N;;;;;
+12126;CUNEIFORM SIGN GUR7;Lo;0;L;;;;;N;;;;;
+12127;CUNEIFORM SIGN GURUN;Lo;0;L;;;;;N;;;;;
+12128;CUNEIFORM SIGN GURUSH;Lo;0;L;;;;;N;;;;;
+12129;CUNEIFORM SIGN HA;Lo;0;L;;;;;N;;;;;
+1212A;CUNEIFORM SIGN HA TENU;Lo;0;L;;;;;N;;;;;
+1212B;CUNEIFORM SIGN HA GUNU;Lo;0;L;;;;;N;;;;;
+1212C;CUNEIFORM SIGN HAL;Lo;0;L;;;;;N;;;;;
+1212D;CUNEIFORM SIGN HI;Lo;0;L;;;;;N;;;;;
+1212E;CUNEIFORM SIGN HI TIMES ASH;Lo;0;L;;;;;N;;;;;
+1212F;CUNEIFORM SIGN HI TIMES ASH2;Lo;0;L;;;;;N;;;;;
+12130;CUNEIFORM SIGN HI TIMES BAD;Lo;0;L;;;;;N;;;;;
+12131;CUNEIFORM SIGN HI TIMES DISH;Lo;0;L;;;;;N;;;;;
+12132;CUNEIFORM SIGN HI TIMES GAD;Lo;0;L;;;;;N;;;;;
+12133;CUNEIFORM SIGN HI TIMES KIN;Lo;0;L;;;;;N;;;;;
+12134;CUNEIFORM SIGN HI TIMES NUN;Lo;0;L;;;;;N;;;;;
+12135;CUNEIFORM SIGN HI TIMES SHE;Lo;0;L;;;;;N;;;;;
+12136;CUNEIFORM SIGN HI TIMES U;Lo;0;L;;;;;N;;;;;
+12137;CUNEIFORM SIGN HU;Lo;0;L;;;;;N;;;;;
+12138;CUNEIFORM SIGN HUB2;Lo;0;L;;;;;N;;;;;
+12139;CUNEIFORM SIGN HUB2 TIMES AN;Lo;0;L;;;;;N;;;;;
+1213A;CUNEIFORM SIGN HUB2 TIMES HAL;Lo;0;L;;;;;N;;;;;
+1213B;CUNEIFORM SIGN HUB2 TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+1213C;CUNEIFORM SIGN HUB2 TIMES LISH;Lo;0;L;;;;;N;;;;;
+1213D;CUNEIFORM SIGN HUB2 TIMES UD;Lo;0;L;;;;;N;;;;;
+1213E;CUNEIFORM SIGN HUL2;Lo;0;L;;;;;N;;;;;
+1213F;CUNEIFORM SIGN I;Lo;0;L;;;;;N;;;;;
+12140;CUNEIFORM SIGN I A;Lo;0;L;;;;;N;;;;;
+12141;CUNEIFORM SIGN IB;Lo;0;L;;;;;N;;;;;
+12142;CUNEIFORM SIGN IDIM;Lo;0;L;;;;;N;;;;;
+12143;CUNEIFORM SIGN IDIM OVER IDIM BUR;Lo;0;L;;;;;N;;;;;
+12144;CUNEIFORM SIGN IDIM OVER IDIM SQUARED;Lo;0;L;;;;;N;;;;;
+12145;CUNEIFORM SIGN IG;Lo;0;L;;;;;N;;;;;
+12146;CUNEIFORM SIGN IGI;Lo;0;L;;;;;N;;;;;
+12147;CUNEIFORM SIGN IGI DIB;Lo;0;L;;;;;N;;;;;
+12148;CUNEIFORM SIGN IGI RI;Lo;0;L;;;;;N;;;;;
+12149;CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD;Lo;0;L;;;;;N;;;;;
+1214A;CUNEIFORM SIGN IGI GUNU;Lo;0;L;;;;;N;;;;;
+1214B;CUNEIFORM SIGN IL;Lo;0;L;;;;;N;;;;;
+1214C;CUNEIFORM SIGN IL TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1214D;CUNEIFORM SIGN IL2;Lo;0;L;;;;;N;;;;;
+1214E;CUNEIFORM SIGN IM;Lo;0;L;;;;;N;;;;;
+1214F;CUNEIFORM SIGN IM TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12150;CUNEIFORM SIGN IM CROSSING IM;Lo;0;L;;;;;N;;;;;
+12151;CUNEIFORM SIGN IM OPPOSING IM;Lo;0;L;;;;;N;;;;;
+12152;CUNEIFORM SIGN IM SQUARED;Lo;0;L;;;;;N;;;;;
+12153;CUNEIFORM SIGN IMIN;Lo;0;L;;;;;N;;;;;
+12154;CUNEIFORM SIGN IN;Lo;0;L;;;;;N;;;;;
+12155;CUNEIFORM SIGN IR;Lo;0;L;;;;;N;;;;;
+12156;CUNEIFORM SIGN ISH;Lo;0;L;;;;;N;;;;;
+12157;CUNEIFORM SIGN KA;Lo;0;L;;;;;N;;;;;
+12158;CUNEIFORM SIGN KA TIMES A;Lo;0;L;;;;;N;;;;;
+12159;CUNEIFORM SIGN KA TIMES AD;Lo;0;L;;;;;N;;;;;
+1215A;CUNEIFORM SIGN KA TIMES AD PLUS KU3;Lo;0;L;;;;;N;;;;;
+1215B;CUNEIFORM SIGN KA TIMES ASH2;Lo;0;L;;;;;N;;;;;
+1215C;CUNEIFORM SIGN KA TIMES BAD;Lo;0;L;;;;;N;;;;;
+1215D;CUNEIFORM SIGN KA TIMES BALAG;Lo;0;L;;;;;N;;;;;
+1215E;CUNEIFORM SIGN KA TIMES BAR;Lo;0;L;;;;;N;;;;;
+1215F;CUNEIFORM SIGN KA TIMES BI;Lo;0;L;;;;;N;;;;;
+12160;CUNEIFORM SIGN KA TIMES ERIN2;Lo;0;L;;;;;N;;;;;
+12161;CUNEIFORM SIGN KA TIMES ESH2;Lo;0;L;;;;;N;;;;;
+12162;CUNEIFORM SIGN KA TIMES GA;Lo;0;L;;;;;N;;;;;
+12163;CUNEIFORM SIGN KA TIMES GAL;Lo;0;L;;;;;N;;;;;
+12164;CUNEIFORM SIGN KA TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12165;CUNEIFORM SIGN KA TIMES GAR;Lo;0;L;;;;;N;;;;;
+12166;CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A;Lo;0;L;;;;;N;;;;;
+12167;CUNEIFORM SIGN KA TIMES GI;Lo;0;L;;;;;N;;;;;
+12168;CUNEIFORM SIGN KA TIMES GIR2;Lo;0;L;;;;;N;;;;;
+12169;CUNEIFORM SIGN KA TIMES GISH PLUS SAR;Lo;0;L;;;;;N;;;;;
+1216A;CUNEIFORM SIGN KA TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;;
+1216B;CUNEIFORM SIGN KA TIMES GU;Lo;0;L;;;;;N;;;;;
+1216C;CUNEIFORM SIGN KA TIMES GUR7;Lo;0;L;;;;;N;;;;;
+1216D;CUNEIFORM SIGN KA TIMES IGI;Lo;0;L;;;;;N;;;;;
+1216E;CUNEIFORM SIGN KA TIMES IM;Lo;0;L;;;;;N;;;;;
+1216F;CUNEIFORM SIGN KA TIMES KAK;Lo;0;L;;;;;N;;;;;
+12170;CUNEIFORM SIGN KA TIMES KI;Lo;0;L;;;;;N;;;;;
+12171;CUNEIFORM SIGN KA TIMES KID;Lo;0;L;;;;;N;;;;;
+12172;CUNEIFORM SIGN KA TIMES LI;Lo;0;L;;;;;N;;;;;
+12173;CUNEIFORM SIGN KA TIMES LU;Lo;0;L;;;;;N;;;;;
+12174;CUNEIFORM SIGN KA TIMES ME;Lo;0;L;;;;;N;;;;;
+12175;CUNEIFORM SIGN KA TIMES ME PLUS DU;Lo;0;L;;;;;N;;;;;
+12176;CUNEIFORM SIGN KA TIMES ME PLUS GI;Lo;0;L;;;;;N;;;;;
+12177;CUNEIFORM SIGN KA TIMES ME PLUS TE;Lo;0;L;;;;;N;;;;;
+12178;CUNEIFORM SIGN KA TIMES MI;Lo;0;L;;;;;N;;;;;
+12179;CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ;Lo;0;L;;;;;N;;;;;
+1217A;CUNEIFORM SIGN KA TIMES NE;Lo;0;L;;;;;N;;;;;
+1217B;CUNEIFORM SIGN KA TIMES NUN;Lo;0;L;;;;;N;;;;;
+1217C;CUNEIFORM SIGN KA TIMES PI;Lo;0;L;;;;;N;;;;;
+1217D;CUNEIFORM SIGN KA TIMES RU;Lo;0;L;;;;;N;;;;;
+1217E;CUNEIFORM SIGN KA TIMES SA;Lo;0;L;;;;;N;;;;;
+1217F;CUNEIFORM SIGN KA TIMES SAR;Lo;0;L;;;;;N;;;;;
+12180;CUNEIFORM SIGN KA TIMES SHA;Lo;0;L;;;;;N;;;;;
+12181;CUNEIFORM SIGN KA TIMES SHE;Lo;0;L;;;;;N;;;;;
+12182;CUNEIFORM SIGN KA TIMES SHID;Lo;0;L;;;;;N;;;;;
+12183;CUNEIFORM SIGN KA TIMES SHU;Lo;0;L;;;;;N;;;;;
+12184;CUNEIFORM SIGN KA TIMES SIG;Lo;0;L;;;;;N;;;;;
+12185;CUNEIFORM SIGN KA TIMES SUHUR;Lo;0;L;;;;;N;;;;;
+12186;CUNEIFORM SIGN KA TIMES TAR;Lo;0;L;;;;;N;;;;;
+12187;CUNEIFORM SIGN KA TIMES U;Lo;0;L;;;;;N;;;;;
+12188;CUNEIFORM SIGN KA TIMES U2;Lo;0;L;;;;;N;;;;;
+12189;CUNEIFORM SIGN KA TIMES UD;Lo;0;L;;;;;N;;;;;
+1218A;CUNEIFORM SIGN KA TIMES UMUM TIMES PA;Lo;0;L;;;;;N;;;;;
+1218B;CUNEIFORM SIGN KA TIMES USH;Lo;0;L;;;;;N;;;;;
+1218C;CUNEIFORM SIGN KA TIMES ZI;Lo;0;L;;;;;N;;;;;
+1218D;CUNEIFORM SIGN KA2;Lo;0;L;;;;;N;;;;;
+1218E;CUNEIFORM SIGN KA2 CROSSING KA2;Lo;0;L;;;;;N;;;;;
+1218F;CUNEIFORM SIGN KAB;Lo;0;L;;;;;N;;;;;
+12190;CUNEIFORM SIGN KAD2;Lo;0;L;;;;;N;;;;;
+12191;CUNEIFORM SIGN KAD3;Lo;0;L;;;;;N;;;;;
+12192;CUNEIFORM SIGN KAD4;Lo;0;L;;;;;N;;;;;
+12193;CUNEIFORM SIGN KAD5;Lo;0;L;;;;;N;;;;;
+12194;CUNEIFORM SIGN KAD5 OVER KAD5;Lo;0;L;;;;;N;;;;;
+12195;CUNEIFORM SIGN KAK;Lo;0;L;;;;;N;;;;;
+12196;CUNEIFORM SIGN KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+12197;CUNEIFORM SIGN KAL;Lo;0;L;;;;;N;;;;;
+12198;CUNEIFORM SIGN KAL TIMES BAD;Lo;0;L;;;;;N;;;;;
+12199;CUNEIFORM SIGN KAL CROSSING KAL;Lo;0;L;;;;;N;;;;;
+1219A;CUNEIFORM SIGN KAM2;Lo;0;L;;;;;N;;;;;
+1219B;CUNEIFORM SIGN KAM4;Lo;0;L;;;;;N;;;;;
+1219C;CUNEIFORM SIGN KASKAL;Lo;0;L;;;;;N;;;;;
+1219D;CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;;
+1219E;CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;;
+1219F;CUNEIFORM SIGN KESH2;Lo;0;L;;;;;N;;;;;
+121A0;CUNEIFORM SIGN KI;Lo;0;L;;;;;N;;;;;
+121A1;CUNEIFORM SIGN KI TIMES BAD;Lo;0;L;;;;;N;;;;;
+121A2;CUNEIFORM SIGN KI TIMES U;Lo;0;L;;;;;N;;;;;
+121A3;CUNEIFORM SIGN KI TIMES UD;Lo;0;L;;;;;N;;;;;
+121A4;CUNEIFORM SIGN KID;Lo;0;L;;;;;N;;;;;
+121A5;CUNEIFORM SIGN KIN;Lo;0;L;;;;;N;;;;;
+121A6;CUNEIFORM SIGN KISAL;Lo;0;L;;;;;N;;;;;
+121A7;CUNEIFORM SIGN KISH;Lo;0;L;;;;;N;;;;;
+121A8;CUNEIFORM SIGN KISIM5;Lo;0;L;;;;;N;;;;;
+121A9;CUNEIFORM SIGN KISIM5 OVER KISIM5;Lo;0;L;;;;;N;;;;;
+121AA;CUNEIFORM SIGN KU;Lo;0;L;;;;;N;;;;;
+121AB;CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2;Lo;0;L;;;;;N;;;;;
+121AC;CUNEIFORM SIGN KU3;Lo;0;L;;;;;N;;;;;
+121AD;CUNEIFORM SIGN KU4;Lo;0;L;;;;;N;;;;;
+121AE;CUNEIFORM SIGN KU4 VARIANT FORM;Lo;0;L;;;;;N;;;;;
+121AF;CUNEIFORM SIGN KU7;Lo;0;L;;;;;N;;;;;
+121B0;CUNEIFORM SIGN KUL;Lo;0;L;;;;;N;;;;;
+121B1;CUNEIFORM SIGN KUL GUNU;Lo;0;L;;;;;N;;;;;
+121B2;CUNEIFORM SIGN KUN;Lo;0;L;;;;;N;;;;;
+121B3;CUNEIFORM SIGN KUR;Lo;0;L;;;;;N;;;;;
+121B4;CUNEIFORM SIGN KUR OPPOSING KUR;Lo;0;L;;;;;N;;;;;
+121B5;CUNEIFORM SIGN KUSHU2;Lo;0;L;;;;;N;;;;;
+121B6;CUNEIFORM SIGN KWU318;Lo;0;L;;;;;N;;;;;
+121B7;CUNEIFORM SIGN LA;Lo;0;L;;;;;N;;;;;
+121B8;CUNEIFORM SIGN LAGAB;Lo;0;L;;;;;N;;;;;
+121B9;CUNEIFORM SIGN LAGAB TIMES A;Lo;0;L;;;;;N;;;;;
+121BA;CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;;
+121BB;CUNEIFORM SIGN LAGAB TIMES A PLUS GAR;Lo;0;L;;;;;N;;;;;
+121BC;CUNEIFORM SIGN LAGAB TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;;
+121BD;CUNEIFORM SIGN LAGAB TIMES AL;Lo;0;L;;;;;N;;;;;
+121BE;CUNEIFORM SIGN LAGAB TIMES AN;Lo;0;L;;;;;N;;;;;
+121BF;CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU;Lo;0;L;;;;;N;;;;;
+121C0;CUNEIFORM SIGN LAGAB TIMES BAD;Lo;0;L;;;;;N;;;;;
+121C1;CUNEIFORM SIGN LAGAB TIMES BI;Lo;0;L;;;;;N;;;;;
+121C2;CUNEIFORM SIGN LAGAB TIMES DAR;Lo;0;L;;;;;N;;;;;
+121C3;CUNEIFORM SIGN LAGAB TIMES EN;Lo;0;L;;;;;N;;;;;
+121C4;CUNEIFORM SIGN LAGAB TIMES GA;Lo;0;L;;;;;N;;;;;
+121C5;CUNEIFORM SIGN LAGAB TIMES GAR;Lo;0;L;;;;;N;;;;;
+121C6;CUNEIFORM SIGN LAGAB TIMES GUD;Lo;0;L;;;;;N;;;;;
+121C7;CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD;Lo;0;L;;;;;N;;;;;
+121C8;CUNEIFORM SIGN LAGAB TIMES HA;Lo;0;L;;;;;N;;;;;
+121C9;CUNEIFORM SIGN LAGAB TIMES HAL;Lo;0;L;;;;;N;;;;;
+121CA;CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN;Lo;0;L;;;;;N;;;;;
+121CB;CUNEIFORM SIGN LAGAB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+121CC;CUNEIFORM SIGN LAGAB TIMES IM;Lo;0;L;;;;;N;;;;;
+121CD;CUNEIFORM SIGN LAGAB TIMES IM PLUS HA;Lo;0;L;;;;;N;;;;;
+121CE;CUNEIFORM SIGN LAGAB TIMES IM PLUS LU;Lo;0;L;;;;;N;;;;;
+121CF;CUNEIFORM SIGN LAGAB TIMES KI;Lo;0;L;;;;;N;;;;;
+121D0;CUNEIFORM SIGN LAGAB TIMES KIN;Lo;0;L;;;;;N;;;;;
+121D1;CUNEIFORM SIGN LAGAB TIMES KU3;Lo;0;L;;;;;N;;;;;
+121D2;CUNEIFORM SIGN LAGAB TIMES KUL;Lo;0;L;;;;;N;;;;;
+121D3;CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A;Lo;0;L;;;;;N;;;;;
+121D4;CUNEIFORM SIGN LAGAB TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+121D5;CUNEIFORM SIGN LAGAB TIMES LISH;Lo;0;L;;;;;N;;;;;
+121D6;CUNEIFORM SIGN LAGAB TIMES LU;Lo;0;L;;;;;N;;;;;
+121D7;CUNEIFORM SIGN LAGAB TIMES LUL;Lo;0;L;;;;;N;;;;;
+121D8;CUNEIFORM SIGN LAGAB TIMES ME;Lo;0;L;;;;;N;;;;;
+121D9;CUNEIFORM SIGN LAGAB TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+121DA;CUNEIFORM SIGN LAGAB TIMES MUSH;Lo;0;L;;;;;N;;;;;
+121DB;CUNEIFORM SIGN LAGAB TIMES NE;Lo;0;L;;;;;N;;;;;
+121DC;CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;;
+121DD;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2;Lo;0;L;;;;;N;;;;;
+121DE;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU;Lo;0;L;;;;;N;;;;;
+121DF;CUNEIFORM SIGN LAGAB TIMES SHU2;Lo;0;L;;;;;N;;;;;
+121E0;CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2;Lo;0;L;;;;;N;;;;;
+121E1;CUNEIFORM SIGN LAGAB TIMES SUM;Lo;0;L;;;;;N;;;;;
+121E2;CUNEIFORM SIGN LAGAB TIMES TAG;Lo;0;L;;;;;N;;;;;
+121E3;CUNEIFORM SIGN LAGAB TIMES TAK4;Lo;0;L;;;;;N;;;;;
+121E4;CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA;Lo;0;L;;;;;N;;;;;
+121E5;CUNEIFORM SIGN LAGAB TIMES U;Lo;0;L;;;;;N;;;;;
+121E6;CUNEIFORM SIGN LAGAB TIMES U PLUS A;Lo;0;L;;;;;N;;;;;
+121E7;CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;;
+121E8;CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;;
+121E9;CUNEIFORM SIGN LAGAB TIMES UD;Lo;0;L;;;;;N;;;;;
+121EA;CUNEIFORM SIGN LAGAB TIMES USH;Lo;0;L;;;;;N;;;;;
+121EB;CUNEIFORM SIGN LAGAB SQUARED;Lo;0;L;;;;;N;;;;;
+121EC;CUNEIFORM SIGN LAGAR;Lo;0;L;;;;;N;;;;;
+121ED;CUNEIFORM SIGN LAGAR TIMES SHE;Lo;0;L;;;;;N;;;;;
+121EE;CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;;
+121EF;CUNEIFORM SIGN LAGAR GUNU;Lo;0;L;;;;;N;;;;;
+121F0;CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE;Lo;0;L;;;;;N;;;;;
+121F1;CUNEIFORM SIGN LAHSHU;Lo;0;L;;;;;N;;;;;
+121F2;CUNEIFORM SIGN LAL;Lo;0;L;;;;;N;;;;;
+121F3;CUNEIFORM SIGN LAL TIMES LAL;Lo;0;L;;;;;N;;;;;
+121F4;CUNEIFORM SIGN LAM;Lo;0;L;;;;;N;;;;;
+121F5;CUNEIFORM SIGN LAM TIMES KUR;Lo;0;L;;;;;N;;;;;
+121F6;CUNEIFORM SIGN LAM TIMES KUR PLUS RU;Lo;0;L;;;;;N;;;;;
+121F7;CUNEIFORM SIGN LI;Lo;0;L;;;;;N;;;;;
+121F8;CUNEIFORM SIGN LIL;Lo;0;L;;;;;N;;;;;
+121F9;CUNEIFORM SIGN LIMMU2;Lo;0;L;;;;;N;;;;;
+121FA;CUNEIFORM SIGN LISH;Lo;0;L;;;;;N;;;;;
+121FB;CUNEIFORM SIGN LU;Lo;0;L;;;;;N;;;;;
+121FC;CUNEIFORM SIGN LU TIMES BAD;Lo;0;L;;;;;N;;;;;
+121FD;CUNEIFORM SIGN LU2;Lo;0;L;;;;;N;;;;;
+121FE;CUNEIFORM SIGN LU2 TIMES AL;Lo;0;L;;;;;N;;;;;
+121FF;CUNEIFORM SIGN LU2 TIMES BAD;Lo;0;L;;;;;N;;;;;
+12200;CUNEIFORM SIGN LU2 TIMES ESH2;Lo;0;L;;;;;N;;;;;
+12201;CUNEIFORM SIGN LU2 TIMES ESH2 TENU;Lo;0;L;;;;;N;;;;;
+12202;CUNEIFORM SIGN LU2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12203;CUNEIFORM SIGN LU2 TIMES HI TIMES BAD;Lo;0;L;;;;;N;;;;;
+12204;CUNEIFORM SIGN LU2 TIMES IM;Lo;0;L;;;;;N;;;;;
+12205;CUNEIFORM SIGN LU2 TIMES KAD2;Lo;0;L;;;;;N;;;;;
+12206;CUNEIFORM SIGN LU2 TIMES KAD3;Lo;0;L;;;;;N;;;;;
+12207;CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH;Lo;0;L;;;;;N;;;;;
+12208;CUNEIFORM SIGN LU2 TIMES KI;Lo;0;L;;;;;N;;;;;
+12209;CUNEIFORM SIGN LU2 TIMES LA PLUS ASH;Lo;0;L;;;;;N;;;;;
+1220A;CUNEIFORM SIGN LU2 TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+1220B;CUNEIFORM SIGN LU2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+1220C;CUNEIFORM SIGN LU2 TIMES NE;Lo;0;L;;;;;N;;;;;
+1220D;CUNEIFORM SIGN LU2 TIMES NU;Lo;0;L;;;;;N;;;;;
+1220E;CUNEIFORM SIGN LU2 TIMES SI PLUS ASH;Lo;0;L;;;;;N;;;;;
+1220F;CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU;Lo;0;L;;;;;N;;;;;
+12210;CUNEIFORM SIGN LU2 TIMES TUG2;Lo;0;L;;;;;N;;;;;
+12211;CUNEIFORM SIGN LU2 TENU;Lo;0;L;;;;;N;;;;;
+12212;CUNEIFORM SIGN LU2 CROSSING LU2;Lo;0;L;;;;;N;;;;;
+12213;CUNEIFORM SIGN LU2 OPPOSING LU2;Lo;0;L;;;;;N;;;;;
+12214;CUNEIFORM SIGN LU2 SQUARED;Lo;0;L;;;;;N;;;;;
+12215;CUNEIFORM SIGN LU2 SHESHIG;Lo;0;L;;;;;N;;;;;
+12216;CUNEIFORM SIGN LU3;Lo;0;L;;;;;N;;;;;
+12217;CUNEIFORM SIGN LUGAL;Lo;0;L;;;;;N;;;;;
+12218;CUNEIFORM SIGN LUGAL OVER LUGAL;Lo;0;L;;;;;N;;;;;
+12219;CUNEIFORM SIGN LUGAL OPPOSING LUGAL;Lo;0;L;;;;;N;;;;;
+1221A;CUNEIFORM SIGN LUGAL SHESHIG;Lo;0;L;;;;;N;;;;;
+1221B;CUNEIFORM SIGN LUH;Lo;0;L;;;;;N;;;;;
+1221C;CUNEIFORM SIGN LUL;Lo;0;L;;;;;N;;;;;
+1221D;CUNEIFORM SIGN LUM;Lo;0;L;;;;;N;;;;;
+1221E;CUNEIFORM SIGN LUM OVER LUM;Lo;0;L;;;;;N;;;;;
+1221F;CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+12220;CUNEIFORM SIGN MA;Lo;0;L;;;;;N;;;;;
+12221;CUNEIFORM SIGN MA TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12222;CUNEIFORM SIGN MA GUNU;Lo;0;L;;;;;N;;;;;
+12223;CUNEIFORM SIGN MA2;Lo;0;L;;;;;N;;;;;
+12224;CUNEIFORM SIGN MAH;Lo;0;L;;;;;N;;;;;
+12225;CUNEIFORM SIGN MAR;Lo;0;L;;;;;N;;;;;
+12226;CUNEIFORM SIGN MASH;Lo;0;L;;;;;N;;;;;
+12227;CUNEIFORM SIGN MASH2;Lo;0;L;;;;;N;;;;;
+12228;CUNEIFORM SIGN ME;Lo;0;L;;;;;N;;;;;
+12229;CUNEIFORM SIGN MES;Lo;0;L;;;;;N;;;;;
+1222A;CUNEIFORM SIGN MI;Lo;0;L;;;;;N;;;;;
+1222B;CUNEIFORM SIGN MIN;Lo;0;L;;;;;N;;;;;
+1222C;CUNEIFORM SIGN MU;Lo;0;L;;;;;N;;;;;
+1222D;CUNEIFORM SIGN MU OVER MU;Lo;0;L;;;;;N;;;;;
+1222E;CUNEIFORM SIGN MUG;Lo;0;L;;;;;N;;;;;
+1222F;CUNEIFORM SIGN MUG GUNU;Lo;0;L;;;;;N;;;;;
+12230;CUNEIFORM SIGN MUNSUB;Lo;0;L;;;;;N;;;;;
+12231;CUNEIFORM SIGN MURGU2;Lo;0;L;;;;;N;;;;;
+12232;CUNEIFORM SIGN MUSH;Lo;0;L;;;;;N;;;;;
+12233;CUNEIFORM SIGN MUSH TIMES A;Lo;0;L;;;;;N;;;;;
+12234;CUNEIFORM SIGN MUSH TIMES KUR;Lo;0;L;;;;;N;;;;;
+12235;CUNEIFORM SIGN MUSH TIMES ZA;Lo;0;L;;;;;N;;;;;
+12236;CUNEIFORM SIGN MUSH OVER MUSH;Lo;0;L;;;;;N;;;;;
+12237;CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA;Lo;0;L;;;;;N;;;;;
+12238;CUNEIFORM SIGN MUSH CROSSING MUSH;Lo;0;L;;;;;N;;;;;
+12239;CUNEIFORM SIGN MUSH3;Lo;0;L;;;;;N;;;;;
+1223A;CUNEIFORM SIGN MUSH3 TIMES A;Lo;0;L;;;;;N;;;;;
+1223B;CUNEIFORM SIGN MUSH3 TIMES A PLUS DI;Lo;0;L;;;;;N;;;;;
+1223C;CUNEIFORM SIGN MUSH3 TIMES DI;Lo;0;L;;;;;N;;;;;
+1223D;CUNEIFORM SIGN MUSH3 GUNU;Lo;0;L;;;;;N;;;;;
+1223E;CUNEIFORM SIGN NA;Lo;0;L;;;;;N;;;;;
+1223F;CUNEIFORM SIGN NA2;Lo;0;L;;;;;N;;;;;
+12240;CUNEIFORM SIGN NAGA;Lo;0;L;;;;;N;;;;;
+12241;CUNEIFORM SIGN NAGA INVERTED;Lo;0;L;;;;;N;;;;;
+12242;CUNEIFORM SIGN NAGA TIMES SHU TENU;Lo;0;L;;;;;N;;;;;
+12243;CUNEIFORM SIGN NAGA OPPOSING NAGA;Lo;0;L;;;;;N;;;;;
+12244;CUNEIFORM SIGN NAGAR;Lo;0;L;;;;;N;;;;;
+12245;CUNEIFORM SIGN NAM NUTILLU;Lo;0;L;;;;;N;;;;;
+12246;CUNEIFORM SIGN NAM;Lo;0;L;;;;;N;;;;;
+12247;CUNEIFORM SIGN NAM2;Lo;0;L;;;;;N;;;;;
+12248;CUNEIFORM SIGN NE;Lo;0;L;;;;;N;;;;;
+12249;CUNEIFORM SIGN NE TIMES A;Lo;0;L;;;;;N;;;;;
+1224A;CUNEIFORM SIGN NE TIMES UD;Lo;0;L;;;;;N;;;;;
+1224B;CUNEIFORM SIGN NE SHESHIG;Lo;0;L;;;;;N;;;;;
+1224C;CUNEIFORM SIGN NI;Lo;0;L;;;;;N;;;;;
+1224D;CUNEIFORM SIGN NI TIMES E;Lo;0;L;;;;;N;;;;;
+1224E;CUNEIFORM SIGN NI2;Lo;0;L;;;;;N;;;;;
+1224F;CUNEIFORM SIGN NIM;Lo;0;L;;;;;N;;;;;
+12250;CUNEIFORM SIGN NIM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12251;CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12252;CUNEIFORM SIGN NINDA2;Lo;0;L;;;;;N;;;;;
+12253;CUNEIFORM SIGN NINDA2 TIMES AN;Lo;0;L;;;;;N;;;;;
+12254;CUNEIFORM SIGN NINDA2 TIMES ASH;Lo;0;L;;;;;N;;;;;
+12255;CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH;Lo;0;L;;;;;N;;;;;
+12256;CUNEIFORM SIGN NINDA2 TIMES GUD;Lo;0;L;;;;;N;;;;;
+12257;CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12258;CUNEIFORM SIGN NINDA2 TIMES NE;Lo;0;L;;;;;N;;;;;
+12259;CUNEIFORM SIGN NINDA2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+1225A;CUNEIFORM SIGN NINDA2 TIMES SHE;Lo;0;L;;;;;N;;;;;
+1225B;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN;Lo;0;L;;;;;N;;;;;
+1225C;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH;Lo;0;L;;;;;N;;;;;
+1225D;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH;Lo;0;L;;;;;N;;;;;
+1225E;CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;;
+1225F;CUNEIFORM SIGN NINDA2 TIMES USH;Lo;0;L;;;;;N;;;;;
+12260;CUNEIFORM SIGN NISAG;Lo;0;L;;;;;N;;;;;
+12261;CUNEIFORM SIGN NU;Lo;0;L;;;;;N;;;;;
+12262;CUNEIFORM SIGN NU11;Lo;0;L;;;;;N;;;;;
+12263;CUNEIFORM SIGN NUN;Lo;0;L;;;;;N;;;;;
+12264;CUNEIFORM SIGN NUN LAGAR TIMES GAR;Lo;0;L;;;;;N;;;;;
+12265;CUNEIFORM SIGN NUN LAGAR TIMES MASH;Lo;0;L;;;;;N;;;;;
+12266;CUNEIFORM SIGN NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;;
+12267;CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;;
+12268;CUNEIFORM SIGN NUN LAGAR TIMES USH;Lo;0;L;;;;;N;;;;;
+12269;CUNEIFORM SIGN NUN TENU;Lo;0;L;;;;;N;;;;;
+1226A;CUNEIFORM SIGN NUN OVER NUN;Lo;0;L;;;;;N;;;;;
+1226B;CUNEIFORM SIGN NUN CROSSING NUN;Lo;0;L;;;;;N;;;;;
+1226C;CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR;Lo;0;L;;;;;N;;;;;
+1226D;CUNEIFORM SIGN NUNUZ;Lo;0;L;;;;;N;;;;;
+1226E;CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB;Lo;0;L;;;;;N;;;;;
+1226F;CUNEIFORM SIGN NUNUZ AB2 TIMES BI;Lo;0;L;;;;;N;;;;;
+12270;CUNEIFORM SIGN NUNUZ AB2 TIMES DUG;Lo;0;L;;;;;N;;;;;
+12271;CUNEIFORM SIGN NUNUZ AB2 TIMES GUD;Lo;0;L;;;;;N;;;;;
+12272;CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+12273;CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3;Lo;0;L;;;;;N;;;;;
+12274;CUNEIFORM SIGN NUNUZ AB2 TIMES LA;Lo;0;L;;;;;N;;;;;
+12275;CUNEIFORM SIGN NUNUZ AB2 TIMES NE;Lo;0;L;;;;;N;;;;;
+12276;CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3;Lo;0;L;;;;;N;;;;;
+12277;CUNEIFORM SIGN NUNUZ AB2 TIMES U2;Lo;0;L;;;;;N;;;;;
+12278;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;;
+12279;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U;Lo;0;L;;;;;N;;;;;
+1227A;CUNEIFORM SIGN PA;Lo;0;L;;;;;N;;;;;
+1227B;CUNEIFORM SIGN PAD;Lo;0;L;;;;;N;;;;;
+1227C;CUNEIFORM SIGN PAN;Lo;0;L;;;;;N;;;;;
+1227D;CUNEIFORM SIGN PAP;Lo;0;L;;;;;N;;;;;
+1227E;CUNEIFORM SIGN PESH2;Lo;0;L;;;;;N;;;;;
+1227F;CUNEIFORM SIGN PI;Lo;0;L;;;;;N;;;;;
+12280;CUNEIFORM SIGN PI TIMES A;Lo;0;L;;;;;N;;;;;
+12281;CUNEIFORM SIGN PI TIMES AB;Lo;0;L;;;;;N;;;;;
+12282;CUNEIFORM SIGN PI TIMES BI;Lo;0;L;;;;;N;;;;;
+12283;CUNEIFORM SIGN PI TIMES BU;Lo;0;L;;;;;N;;;;;
+12284;CUNEIFORM SIGN PI TIMES E;Lo;0;L;;;;;N;;;;;
+12285;CUNEIFORM SIGN PI TIMES I;Lo;0;L;;;;;N;;;;;
+12286;CUNEIFORM SIGN PI TIMES IB;Lo;0;L;;;;;N;;;;;
+12287;CUNEIFORM SIGN PI TIMES U;Lo;0;L;;;;;N;;;;;
+12288;CUNEIFORM SIGN PI TIMES U2;Lo;0;L;;;;;N;;;;;
+12289;CUNEIFORM SIGN PI CROSSING PI;Lo;0;L;;;;;N;;;;;
+1228A;CUNEIFORM SIGN PIRIG;Lo;0;L;;;;;N;;;;;
+1228B;CUNEIFORM SIGN PIRIG TIMES KAL;Lo;0;L;;;;;N;;;;;
+1228C;CUNEIFORM SIGN PIRIG TIMES UD;Lo;0;L;;;;;N;;;;;
+1228D;CUNEIFORM SIGN PIRIG TIMES ZA;Lo;0;L;;;;;N;;;;;
+1228E;CUNEIFORM SIGN PIRIG OPPOSING PIRIG;Lo;0;L;;;;;N;;;;;
+1228F;CUNEIFORM SIGN RA;Lo;0;L;;;;;N;;;;;
+12290;CUNEIFORM SIGN RAB;Lo;0;L;;;;;N;;;;;
+12291;CUNEIFORM SIGN RI;Lo;0;L;;;;;N;;;;;
+12292;CUNEIFORM SIGN RU;Lo;0;L;;;;;N;;;;;
+12293;CUNEIFORM SIGN SA;Lo;0;L;;;;;N;;;;;
+12294;CUNEIFORM SIGN SAG NUTILLU;Lo;0;L;;;;;N;;;;;
+12295;CUNEIFORM SIGN SAG;Lo;0;L;;;;;N;;;;;
+12296;CUNEIFORM SIGN SAG TIMES A;Lo;0;L;;;;;N;;;;;
+12297;CUNEIFORM SIGN SAG TIMES DU;Lo;0;L;;;;;N;;;;;
+12298;CUNEIFORM SIGN SAG TIMES DUB;Lo;0;L;;;;;N;;;;;
+12299;CUNEIFORM SIGN SAG TIMES HA;Lo;0;L;;;;;N;;;;;
+1229A;CUNEIFORM SIGN SAG TIMES KAK;Lo;0;L;;;;;N;;;;;
+1229B;CUNEIFORM SIGN SAG TIMES KUR;Lo;0;L;;;;;N;;;;;
+1229C;CUNEIFORM SIGN SAG TIMES LUM;Lo;0;L;;;;;N;;;;;
+1229D;CUNEIFORM SIGN SAG TIMES MI;Lo;0;L;;;;;N;;;;;
+1229E;CUNEIFORM SIGN SAG TIMES NUN;Lo;0;L;;;;;N;;;;;
+1229F;CUNEIFORM SIGN SAG TIMES SAL;Lo;0;L;;;;;N;;;;;
+122A0;CUNEIFORM SIGN SAG TIMES SHID;Lo;0;L;;;;;N;;;;;
+122A1;CUNEIFORM SIGN SAG TIMES TAB;Lo;0;L;;;;;N;;;;;
+122A2;CUNEIFORM SIGN SAG TIMES U2;Lo;0;L;;;;;N;;;;;
+122A3;CUNEIFORM SIGN SAG TIMES UB;Lo;0;L;;;;;N;;;;;
+122A4;CUNEIFORM SIGN SAG TIMES UM;Lo;0;L;;;;;N;;;;;
+122A5;CUNEIFORM SIGN SAG TIMES UR;Lo;0;L;;;;;N;;;;;
+122A6;CUNEIFORM SIGN SAG TIMES USH;Lo;0;L;;;;;N;;;;;
+122A7;CUNEIFORM SIGN SAG OVER SAG;Lo;0;L;;;;;N;;;;;
+122A8;CUNEIFORM SIGN SAG GUNU;Lo;0;L;;;;;N;;;;;
+122A9;CUNEIFORM SIGN SAL;Lo;0;L;;;;;N;;;;;
+122AA;CUNEIFORM SIGN SAL LAGAB TIMES ASH2;Lo;0;L;;;;;N;;;;;
+122AB;CUNEIFORM SIGN SANGA2;Lo;0;L;;;;;N;;;;;
+122AC;CUNEIFORM SIGN SAR;Lo;0;L;;;;;N;;;;;
+122AD;CUNEIFORM SIGN SHA;Lo;0;L;;;;;N;;;;;
+122AE;CUNEIFORM SIGN SHA3;Lo;0;L;;;;;N;;;;;
+122AF;CUNEIFORM SIGN SHA3 TIMES A;Lo;0;L;;;;;N;;;;;
+122B0;CUNEIFORM SIGN SHA3 TIMES BAD;Lo;0;L;;;;;N;;;;;
+122B1;CUNEIFORM SIGN SHA3 TIMES GISH;Lo;0;L;;;;;N;;;;;
+122B2;CUNEIFORM SIGN SHA3 TIMES NE;Lo;0;L;;;;;N;;;;;
+122B3;CUNEIFORM SIGN SHA3 TIMES SHU2;Lo;0;L;;;;;N;;;;;
+122B4;CUNEIFORM SIGN SHA3 TIMES TUR;Lo;0;L;;;;;N;;;;;
+122B5;CUNEIFORM SIGN SHA3 TIMES U;Lo;0;L;;;;;N;;;;;
+122B6;CUNEIFORM SIGN SHA3 TIMES U PLUS A;Lo;0;L;;;;;N;;;;;
+122B7;CUNEIFORM SIGN SHA6;Lo;0;L;;;;;N;;;;;
+122B8;CUNEIFORM SIGN SHAB6;Lo;0;L;;;;;N;;;;;
+122B9;CUNEIFORM SIGN SHAR2;Lo;0;L;;;;;N;;;;;
+122BA;CUNEIFORM SIGN SHE;Lo;0;L;;;;;N;;;;;
+122BB;CUNEIFORM SIGN SHE HU;Lo;0;L;;;;;N;;;;;
+122BC;CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+122BD;CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+122BE;CUNEIFORM SIGN SHEG9;Lo;0;L;;;;;N;;;;;
+122BF;CUNEIFORM SIGN SHEN;Lo;0;L;;;;;N;;;;;
+122C0;CUNEIFORM SIGN SHESH;Lo;0;L;;;;;N;;;;;
+122C1;CUNEIFORM SIGN SHESH2;Lo;0;L;;;;;N;;;;;
+122C2;CUNEIFORM SIGN SHESHLAM;Lo;0;L;;;;;N;;;;;
+122C3;CUNEIFORM SIGN SHID;Lo;0;L;;;;;N;;;;;
+122C4;CUNEIFORM SIGN SHID TIMES A;Lo;0;L;;;;;N;;;;;
+122C5;CUNEIFORM SIGN SHID TIMES IM;Lo;0;L;;;;;N;;;;;
+122C6;CUNEIFORM SIGN SHIM;Lo;0;L;;;;;N;;;;;
+122C7;CUNEIFORM SIGN SHIM TIMES A;Lo;0;L;;;;;N;;;;;
+122C8;CUNEIFORM SIGN SHIM TIMES BAL;Lo;0;L;;;;;N;;;;;
+122C9;CUNEIFORM SIGN SHIM TIMES BULUG;Lo;0;L;;;;;N;;;;;
+122CA;CUNEIFORM SIGN SHIM TIMES DIN;Lo;0;L;;;;;N;;;;;
+122CB;CUNEIFORM SIGN SHIM TIMES GAR;Lo;0;L;;;;;N;;;;;
+122CC;CUNEIFORM SIGN SHIM TIMES IGI;Lo;0;L;;;;;N;;;;;
+122CD;CUNEIFORM SIGN SHIM TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+122CE;CUNEIFORM SIGN SHIM TIMES KUSHU2;Lo;0;L;;;;;N;;;;;
+122CF;CUNEIFORM SIGN SHIM TIMES LUL;Lo;0;L;;;;;N;;;;;
+122D0;CUNEIFORM SIGN SHIM TIMES MUG;Lo;0;L;;;;;N;;;;;
+122D1;CUNEIFORM SIGN SHIM TIMES SAL;Lo;0;L;;;;;N;;;;;
+122D2;CUNEIFORM SIGN SHINIG;Lo;0;L;;;;;N;;;;;
+122D3;CUNEIFORM SIGN SHIR;Lo;0;L;;;;;N;;;;;
+122D4;CUNEIFORM SIGN SHIR TENU;Lo;0;L;;;;;N;;;;;
+122D5;CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR;Lo;0;L;;;;;N;;;;;
+122D6;CUNEIFORM SIGN SHITA;Lo;0;L;;;;;N;;;;;
+122D7;CUNEIFORM SIGN SHU;Lo;0;L;;;;;N;;;;;
+122D8;CUNEIFORM SIGN SHU OVER INVERTED SHU;Lo;0;L;;;;;N;;;;;
+122D9;CUNEIFORM SIGN SHU2;Lo;0;L;;;;;N;;;;;
+122DA;CUNEIFORM SIGN SHUBUR;Lo;0;L;;;;;N;;;;;
+122DB;CUNEIFORM SIGN SI;Lo;0;L;;;;;N;;;;;
+122DC;CUNEIFORM SIGN SI GUNU;Lo;0;L;;;;;N;;;;;
+122DD;CUNEIFORM SIGN SIG;Lo;0;L;;;;;N;;;;;
+122DE;CUNEIFORM SIGN SIG4;Lo;0;L;;;;;N;;;;;
+122DF;CUNEIFORM SIGN SIG4 OVER SIG4 SHU2;Lo;0;L;;;;;N;;;;;
+122E0;CUNEIFORM SIGN SIK2;Lo;0;L;;;;;N;;;;;
+122E1;CUNEIFORM SIGN SILA3;Lo;0;L;;;;;N;;;;;
+122E2;CUNEIFORM SIGN SU;Lo;0;L;;;;;N;;;;;
+122E3;CUNEIFORM SIGN SU OVER SU;Lo;0;L;;;;;N;;;;;
+122E4;CUNEIFORM SIGN SUD;Lo;0;L;;;;;N;;;;;
+122E5;CUNEIFORM SIGN SUD2;Lo;0;L;;;;;N;;;;;
+122E6;CUNEIFORM SIGN SUHUR;Lo;0;L;;;;;N;;;;;
+122E7;CUNEIFORM SIGN SUM;Lo;0;L;;;;;N;;;;;
+122E8;CUNEIFORM SIGN SUMASH;Lo;0;L;;;;;N;;;;;
+122E9;CUNEIFORM SIGN SUR;Lo;0;L;;;;;N;;;;;
+122EA;CUNEIFORM SIGN SUR9;Lo;0;L;;;;;N;;;;;
+122EB;CUNEIFORM SIGN TA;Lo;0;L;;;;;N;;;;;
+122EC;CUNEIFORM SIGN TA ASTERISK;Lo;0;L;;;;;N;;;;;
+122ED;CUNEIFORM SIGN TA TIMES HI;Lo;0;L;;;;;N;;;;;
+122EE;CUNEIFORM SIGN TA TIMES MI;Lo;0;L;;;;;N;;;;;
+122EF;CUNEIFORM SIGN TA GUNU;Lo;0;L;;;;;N;;;;;
+122F0;CUNEIFORM SIGN TAB;Lo;0;L;;;;;N;;;;;
+122F1;CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH;Lo;0;L;;;;;N;;;;;
+122F2;CUNEIFORM SIGN TAB SQUARED;Lo;0;L;;;;;N;;;;;
+122F3;CUNEIFORM SIGN TAG;Lo;0;L;;;;;N;;;;;
+122F4;CUNEIFORM SIGN TAG TIMES BI;Lo;0;L;;;;;N;;;;;
+122F5;CUNEIFORM SIGN TAG TIMES GUD;Lo;0;L;;;;;N;;;;;
+122F6;CUNEIFORM SIGN TAG TIMES SHE;Lo;0;L;;;;;N;;;;;
+122F7;CUNEIFORM SIGN TAG TIMES SHU;Lo;0;L;;;;;N;;;;;
+122F8;CUNEIFORM SIGN TAG TIMES TUG2;Lo;0;L;;;;;N;;;;;
+122F9;CUNEIFORM SIGN TAG TIMES UD;Lo;0;L;;;;;N;;;;;
+122FA;CUNEIFORM SIGN TAK4;Lo;0;L;;;;;N;;;;;
+122FB;CUNEIFORM SIGN TAR;Lo;0;L;;;;;N;;;;;
+122FC;CUNEIFORM SIGN TE;Lo;0;L;;;;;N;;;;;
+122FD;CUNEIFORM SIGN TE GUNU;Lo;0;L;;;;;N;;;;;
+122FE;CUNEIFORM SIGN TI;Lo;0;L;;;;;N;;;;;
+122FF;CUNEIFORM SIGN TI TENU;Lo;0;L;;;;;N;;;;;
+12300;CUNEIFORM SIGN TIL;Lo;0;L;;;;;N;;;;;
+12301;CUNEIFORM SIGN TIR;Lo;0;L;;;;;N;;;;;
+12302;CUNEIFORM SIGN TIR TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12303;CUNEIFORM SIGN TIR OVER TIR;Lo;0;L;;;;;N;;;;;
+12304;CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+12305;CUNEIFORM SIGN TU;Lo;0;L;;;;;N;;;;;
+12306;CUNEIFORM SIGN TUG2;Lo;0;L;;;;;N;;;;;
+12307;CUNEIFORM SIGN TUK;Lo;0;L;;;;;N;;;;;
+12308;CUNEIFORM SIGN TUM;Lo;0;L;;;;;N;;;;;
+12309;CUNEIFORM SIGN TUR;Lo;0;L;;;;;N;;;;;
+1230A;CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA;Lo;0;L;;;;;N;;;;;
+1230B;CUNEIFORM SIGN U;Lo;0;L;;;;;N;;;;;
+1230C;CUNEIFORM SIGN U GUD;Lo;0;L;;;;;N;;;;;
+1230D;CUNEIFORM SIGN U U U;Lo;0;L;;;;;N;;;;;
+1230E;CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+1230F;CUNEIFORM SIGN U OVER U SUR OVER SUR;Lo;0;L;;;;;N;;;;;
+12310;CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED;Lo;0;L;;;;;N;;;;;
+12311;CUNEIFORM SIGN U2;Lo;0;L;;;;;N;;;;;
+12312;CUNEIFORM SIGN UB;Lo;0;L;;;;;N;;;;;
+12313;CUNEIFORM SIGN UD;Lo;0;L;;;;;N;;;;;
+12314;CUNEIFORM SIGN UD KUSHU2;Lo;0;L;;;;;N;;;;;
+12315;CUNEIFORM SIGN UD TIMES BAD;Lo;0;L;;;;;N;;;;;
+12316;CUNEIFORM SIGN UD TIMES MI;Lo;0;L;;;;;N;;;;;
+12317;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;;
+12318;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU;Lo;0;L;;;;;N;;;;;
+12319;CUNEIFORM SIGN UD GUNU;Lo;0;L;;;;;N;;;;;
+1231A;CUNEIFORM SIGN UD SHESHIG;Lo;0;L;;;;;N;;;;;
+1231B;CUNEIFORM SIGN UD SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;;
+1231C;CUNEIFORM SIGN UDUG;Lo;0;L;;;;;N;;;;;
+1231D;CUNEIFORM SIGN UM;Lo;0;L;;;;;N;;;;;
+1231E;CUNEIFORM SIGN UM TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+1231F;CUNEIFORM SIGN UM TIMES ME PLUS DA;Lo;0;L;;;;;N;;;;;
+12320;CUNEIFORM SIGN UM TIMES SHA3;Lo;0;L;;;;;N;;;;;
+12321;CUNEIFORM SIGN UM TIMES U;Lo;0;L;;;;;N;;;;;
+12322;CUNEIFORM SIGN UMBIN;Lo;0;L;;;;;N;;;;;
+12323;CUNEIFORM SIGN UMUM;Lo;0;L;;;;;N;;;;;
+12324;CUNEIFORM SIGN UMUM TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+12325;CUNEIFORM SIGN UMUM TIMES PA;Lo;0;L;;;;;N;;;;;
+12326;CUNEIFORM SIGN UN;Lo;0;L;;;;;N;;;;;
+12327;CUNEIFORM SIGN UN GUNU;Lo;0;L;;;;;N;;;;;
+12328;CUNEIFORM SIGN UR;Lo;0;L;;;;;N;;;;;
+12329;CUNEIFORM SIGN UR CROSSING UR;Lo;0;L;;;;;N;;;;;
+1232A;CUNEIFORM SIGN UR SHESHIG;Lo;0;L;;;;;N;;;;;
+1232B;CUNEIFORM SIGN UR2;Lo;0;L;;;;;N;;;;;
+1232C;CUNEIFORM SIGN UR2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;;
+1232D;CUNEIFORM SIGN UR2 TIMES A PLUS NA;Lo;0;L;;;;;N;;;;;
+1232E;CUNEIFORM SIGN UR2 TIMES AL;Lo;0;L;;;;;N;;;;;
+1232F;CUNEIFORM SIGN UR2 TIMES HA;Lo;0;L;;;;;N;;;;;
+12330;CUNEIFORM SIGN UR2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+12331;CUNEIFORM SIGN UR2 TIMES U2;Lo;0;L;;;;;N;;;;;
+12332;CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;;
+12333;CUNEIFORM SIGN UR2 TIMES U2 PLUS BI;Lo;0;L;;;;;N;;;;;
+12334;CUNEIFORM SIGN UR4;Lo;0;L;;;;;N;;;;;
+12335;CUNEIFORM SIGN URI;Lo;0;L;;;;;N;;;;;
+12336;CUNEIFORM SIGN URI3;Lo;0;L;;;;;N;;;;;
+12337;CUNEIFORM SIGN URU;Lo;0;L;;;;;N;;;;;
+12338;CUNEIFORM SIGN URU TIMES A;Lo;0;L;;;;;N;;;;;
+12339;CUNEIFORM SIGN URU TIMES ASHGAB;Lo;0;L;;;;;N;;;;;
+1233A;CUNEIFORM SIGN URU TIMES BAR;Lo;0;L;;;;;N;;;;;
+1233B;CUNEIFORM SIGN URU TIMES DUN;Lo;0;L;;;;;N;;;;;
+1233C;CUNEIFORM SIGN URU TIMES GA;Lo;0;L;;;;;N;;;;;
+1233D;CUNEIFORM SIGN URU TIMES GAL;Lo;0;L;;;;;N;;;;;
+1233E;CUNEIFORM SIGN URU TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1233F;CUNEIFORM SIGN URU TIMES GAR;Lo;0;L;;;;;N;;;;;
+12340;CUNEIFORM SIGN URU TIMES GU;Lo;0;L;;;;;N;;;;;
+12341;CUNEIFORM SIGN URU TIMES HA;Lo;0;L;;;;;N;;;;;
+12342;CUNEIFORM SIGN URU TIMES IGI;Lo;0;L;;;;;N;;;;;
+12343;CUNEIFORM SIGN URU TIMES IM;Lo;0;L;;;;;N;;;;;
+12344;CUNEIFORM SIGN URU TIMES ISH;Lo;0;L;;;;;N;;;;;
+12345;CUNEIFORM SIGN URU TIMES KI;Lo;0;L;;;;;N;;;;;
+12346;CUNEIFORM SIGN URU TIMES LUM;Lo;0;L;;;;;N;;;;;
+12347;CUNEIFORM SIGN URU TIMES MIN;Lo;0;L;;;;;N;;;;;
+12348;CUNEIFORM SIGN URU TIMES PA;Lo;0;L;;;;;N;;;;;
+12349;CUNEIFORM SIGN URU TIMES SHE;Lo;0;L;;;;;N;;;;;
+1234A;CUNEIFORM SIGN URU TIMES SIG4;Lo;0;L;;;;;N;;;;;
+1234B;CUNEIFORM SIGN URU TIMES TU;Lo;0;L;;;;;N;;;;;
+1234C;CUNEIFORM SIGN URU TIMES U PLUS GUD;Lo;0;L;;;;;N;;;;;
+1234D;CUNEIFORM SIGN URU TIMES UD;Lo;0;L;;;;;N;;;;;
+1234E;CUNEIFORM SIGN URU TIMES URUDA;Lo;0;L;;;;;N;;;;;
+1234F;CUNEIFORM SIGN URUDA;Lo;0;L;;;;;N;;;;;
+12350;CUNEIFORM SIGN URUDA TIMES U;Lo;0;L;;;;;N;;;;;
+12351;CUNEIFORM SIGN USH;Lo;0;L;;;;;N;;;;;
+12352;CUNEIFORM SIGN USH TIMES A;Lo;0;L;;;;;N;;;;;
+12353;CUNEIFORM SIGN USH TIMES KU;Lo;0;L;;;;;N;;;;;
+12354;CUNEIFORM SIGN USH TIMES KUR;Lo;0;L;;;;;N;;;;;
+12355;CUNEIFORM SIGN USH TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12356;CUNEIFORM SIGN USHX;Lo;0;L;;;;;N;;;;;
+12357;CUNEIFORM SIGN USH2;Lo;0;L;;;;;N;;;;;
+12358;CUNEIFORM SIGN USHUMX;Lo;0;L;;;;;N;;;;;
+12359;CUNEIFORM SIGN UTUKI;Lo;0;L;;;;;N;;;;;
+1235A;CUNEIFORM SIGN UZ3;Lo;0;L;;;;;N;;;;;
+1235B;CUNEIFORM SIGN UZ3 TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+1235C;CUNEIFORM SIGN UZU;Lo;0;L;;;;;N;;;;;
+1235D;CUNEIFORM SIGN ZA;Lo;0;L;;;;;N;;;;;
+1235E;CUNEIFORM SIGN ZA TENU;Lo;0;L;;;;;N;;;;;
+1235F;CUNEIFORM SIGN ZA SQUARED TIMES KUR;Lo;0;L;;;;;N;;;;;
+12360;CUNEIFORM SIGN ZAG;Lo;0;L;;;;;N;;;;;
+12361;CUNEIFORM SIGN ZAMX;Lo;0;L;;;;;N;;;;;
+12362;CUNEIFORM SIGN ZE2;Lo;0;L;;;;;N;;;;;
+12363;CUNEIFORM SIGN ZI;Lo;0;L;;;;;N;;;;;
+12364;CUNEIFORM SIGN ZI OVER ZI;Lo;0;L;;;;;N;;;;;
+12365;CUNEIFORM SIGN ZI3;Lo;0;L;;;;;N;;;;;
+12366;CUNEIFORM SIGN ZIB;Lo;0;L;;;;;N;;;;;
+12367;CUNEIFORM SIGN ZIB KABA TENU;Lo;0;L;;;;;N;;;;;
+12368;CUNEIFORM SIGN ZIG;Lo;0;L;;;;;N;;;;;
+12369;CUNEIFORM SIGN ZIZ2;Lo;0;L;;;;;N;;;;;
+1236A;CUNEIFORM SIGN ZU;Lo;0;L;;;;;N;;;;;
+1236B;CUNEIFORM SIGN ZU5;Lo;0;L;;;;;N;;;;;
+1236C;CUNEIFORM SIGN ZU5 TIMES A;Lo;0;L;;;;;N;;;;;
+1236D;CUNEIFORM SIGN ZUBUR;Lo;0;L;;;;;N;;;;;
+1236E;CUNEIFORM SIGN ZUM;Lo;0;L;;;;;N;;;;;
+12400;CUNEIFORM NUMERIC SIGN TWO ASH;Nl;0;L;;;;2;N;;;;;
+12401;CUNEIFORM NUMERIC SIGN THREE ASH;Nl;0;L;;;;3;N;;;;;
+12402;CUNEIFORM NUMERIC SIGN FOUR ASH;Nl;0;L;;;;4;N;;;;;
+12403;CUNEIFORM NUMERIC SIGN FIVE ASH;Nl;0;L;;;;5;N;;;;;
+12404;CUNEIFORM NUMERIC SIGN SIX ASH;Nl;0;L;;;;6;N;;;;;
+12405;CUNEIFORM NUMERIC SIGN SEVEN ASH;Nl;0;L;;;;7;N;;;;;
+12406;CUNEIFORM NUMERIC SIGN EIGHT ASH;Nl;0;L;;;;8;N;;;;;
+12407;CUNEIFORM NUMERIC SIGN NINE ASH;Nl;0;L;;;;9;N;;;;;
+12408;CUNEIFORM NUMERIC SIGN THREE DISH;Nl;0;L;;;;3;N;;;;;
+12409;CUNEIFORM NUMERIC SIGN FOUR DISH;Nl;0;L;;;;4;N;;;;;
+1240A;CUNEIFORM NUMERIC SIGN FIVE DISH;Nl;0;L;;;;5;N;;;;;
+1240B;CUNEIFORM NUMERIC SIGN SIX DISH;Nl;0;L;;;;6;N;;;;;
+1240C;CUNEIFORM NUMERIC SIGN SEVEN DISH;Nl;0;L;;;;7;N;;;;;
+1240D;CUNEIFORM NUMERIC SIGN EIGHT DISH;Nl;0;L;;;;8;N;;;;;
+1240E;CUNEIFORM NUMERIC SIGN NINE DISH;Nl;0;L;;;;9;N;;;;;
+1240F;CUNEIFORM NUMERIC SIGN FOUR U;Nl;0;L;;;;4;N;;;;;
+12410;CUNEIFORM NUMERIC SIGN FIVE U;Nl;0;L;;;;5;N;;;;;
+12411;CUNEIFORM NUMERIC SIGN SIX U;Nl;0;L;;;;6;N;;;;;
+12412;CUNEIFORM NUMERIC SIGN SEVEN U;Nl;0;L;;;;7;N;;;;;
+12413;CUNEIFORM NUMERIC SIGN EIGHT U;Nl;0;L;;;;8;N;;;;;
+12414;CUNEIFORM NUMERIC SIGN NINE U;Nl;0;L;;;;9;N;;;;;
+12415;CUNEIFORM NUMERIC SIGN ONE GESH2;Nl;0;L;;;;1;N;;;;;
+12416;CUNEIFORM NUMERIC SIGN TWO GESH2;Nl;0;L;;;;2;N;;;;;
+12417;CUNEIFORM NUMERIC SIGN THREE GESH2;Nl;0;L;;;;3;N;;;;;
+12418;CUNEIFORM NUMERIC SIGN FOUR GESH2;Nl;0;L;;;;4;N;;;;;
+12419;CUNEIFORM NUMERIC SIGN FIVE GESH2;Nl;0;L;;;;5;N;;;;;
+1241A;CUNEIFORM NUMERIC SIGN SIX GESH2;Nl;0;L;;;;6;N;;;;;
+1241B;CUNEIFORM NUMERIC SIGN SEVEN GESH2;Nl;0;L;;;;7;N;;;;;
+1241C;CUNEIFORM NUMERIC SIGN EIGHT GESH2;Nl;0;L;;;;8;N;;;;;
+1241D;CUNEIFORM NUMERIC SIGN NINE GESH2;Nl;0;L;;;;9;N;;;;;
+1241E;CUNEIFORM NUMERIC SIGN ONE GESHU;Nl;0;L;;;;1;N;;;;;
+1241F;CUNEIFORM NUMERIC SIGN TWO GESHU;Nl;0;L;;;;2;N;;;;;
+12420;CUNEIFORM NUMERIC SIGN THREE GESHU;Nl;0;L;;;;3;N;;;;;
+12421;CUNEIFORM NUMERIC SIGN FOUR GESHU;Nl;0;L;;;;4;N;;;;;
+12422;CUNEIFORM NUMERIC SIGN FIVE GESHU;Nl;0;L;;;;5;N;;;;;
+12423;CUNEIFORM NUMERIC SIGN TWO SHAR2;Nl;0;L;;;;2;N;;;;;
+12424;CUNEIFORM NUMERIC SIGN THREE SHAR2;Nl;0;L;;;;3;N;;;;;
+12425;CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM;Nl;0;L;;;;3;N;;;;;
+12426;CUNEIFORM NUMERIC SIGN FOUR SHAR2;Nl;0;L;;;;4;N;;;;;
+12427;CUNEIFORM NUMERIC SIGN FIVE SHAR2;Nl;0;L;;;;5;N;;;;;
+12428;CUNEIFORM NUMERIC SIGN SIX SHAR2;Nl;0;L;;;;6;N;;;;;
+12429;CUNEIFORM NUMERIC SIGN SEVEN SHAR2;Nl;0;L;;;;7;N;;;;;
+1242A;CUNEIFORM NUMERIC SIGN EIGHT SHAR2;Nl;0;L;;;;8;N;;;;;
+1242B;CUNEIFORM NUMERIC SIGN NINE SHAR2;Nl;0;L;;;;9;N;;;;;
+1242C;CUNEIFORM NUMERIC SIGN ONE SHARU;Nl;0;L;;;;1;N;;;;;
+1242D;CUNEIFORM NUMERIC SIGN TWO SHARU;Nl;0;L;;;;2;N;;;;;
+1242E;CUNEIFORM NUMERIC SIGN THREE SHARU;Nl;0;L;;;;3;N;;;;;
+1242F;CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM;Nl;0;L;;;;3;N;;;;;
+12430;CUNEIFORM NUMERIC SIGN FOUR SHARU;Nl;0;L;;;;4;N;;;;;
+12431;CUNEIFORM NUMERIC SIGN FIVE SHARU;Nl;0;L;;;;5;N;;;;;
+12432;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH;Nl;0;L;;;;;N;;;;;
+12433;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN;Nl;0;L;;;;;N;;;;;
+12434;CUNEIFORM NUMERIC SIGN ONE BURU;Nl;0;L;;;;1;N;;;;;
+12435;CUNEIFORM NUMERIC SIGN TWO BURU;Nl;0;L;;;;2;N;;;;;
+12436;CUNEIFORM NUMERIC SIGN THREE BURU;Nl;0;L;;;;3;N;;;;;
+12437;CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM;Nl;0;L;;;;3;N;;;;;
+12438;CUNEIFORM NUMERIC SIGN FOUR BURU;Nl;0;L;;;;4;N;;;;;
+12439;CUNEIFORM NUMERIC SIGN FIVE BURU;Nl;0;L;;;;5;N;;;;;
+1243A;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16;Nl;0;L;;;;3;N;;;;;
+1243B;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21;Nl;0;L;;;;3;N;;;;;
+1243C;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU;Nl;0;L;;;;4;N;;;;;
+1243D;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4;Nl;0;L;;;;4;N;;;;;
+1243E;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A;Nl;0;L;;;;4;N;;;;;
+1243F;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B;Nl;0;L;;;;4;N;;;;;
+12440;CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9;Nl;0;L;;;;6;N;;;;;
+12441;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3;Nl;0;L;;;;7;N;;;;;
+12442;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A;Nl;0;L;;;;7;N;;;;;
+12443;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B;Nl;0;L;;;;7;N;;;;;
+12444;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU;Nl;0;L;;;;8;N;;;;;
+12445;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3;Nl;0;L;;;;8;N;;;;;
+12446;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU;Nl;0;L;;;;9;N;;;;;
+12447;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3;Nl;0;L;;;;9;N;;;;;
+12448;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4;Nl;0;L;;;;9;N;;;;;
+12449;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A;Nl;0;L;;;;9;N;;;;;
+1244A;CUNEIFORM NUMERIC SIGN TWO ASH TENU;Nl;0;L;;;;2;N;;;;;
+1244B;CUNEIFORM NUMERIC SIGN THREE ASH TENU;Nl;0;L;;;;3;N;;;;;
+1244C;CUNEIFORM NUMERIC SIGN FOUR ASH TENU;Nl;0;L;;;;4;N;;;;;
+1244D;CUNEIFORM NUMERIC SIGN FIVE ASH TENU;Nl;0;L;;;;5;N;;;;;
+1244E;CUNEIFORM NUMERIC SIGN SIX ASH TENU;Nl;0;L;;;;6;N;;;;;
+1244F;CUNEIFORM NUMERIC SIGN ONE BAN2;Nl;0;L;;;;1;N;;;;;
+12450;CUNEIFORM NUMERIC SIGN TWO BAN2;Nl;0;L;;;;2;N;;;;;
+12451;CUNEIFORM NUMERIC SIGN THREE BAN2;Nl;0;L;;;;3;N;;;;;
+12452;CUNEIFORM NUMERIC SIGN FOUR BAN2;Nl;0;L;;;;4;N;;;;;
+12453;CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM;Nl;0;L;;;;4;N;;;;;
+12454;CUNEIFORM NUMERIC SIGN FIVE BAN2;Nl;0;L;;;;5;N;;;;;
+12455;CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM;Nl;0;L;;;;5;N;;;;;
+12456;CUNEIFORM NUMERIC SIGN NIGIDAMIN;Nl;0;L;;;;;N;;;;;
+12457;CUNEIFORM NUMERIC SIGN NIGIDAESH;Nl;0;L;;;;;N;;;;;
+12458;CUNEIFORM NUMERIC SIGN ONE ESHE3;Nl;0;L;;;;1;N;;;;;
+12459;CUNEIFORM NUMERIC SIGN TWO ESHE3;Nl;0;L;;;;2;N;;;;;
+1245A;CUNEIFORM NUMERIC SIGN ONE THIRD DISH;Nl;0;L;;;;1/3;N;;;;;
+1245B;CUNEIFORM NUMERIC SIGN TWO THIRDS DISH;Nl;0;L;;;;2/3;N;;;;;
+1245C;CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH;Nl;0;L;;;;5/6;N;;;;;
+1245D;CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A;Nl;0;L;;;;1/3;N;;;;;
+1245E;CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A;Nl;0;L;;;;2/3;N;;;;;
+1245F;CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH;Nl;0;L;;;;1/8;N;;;;;
+12460;CUNEIFORM NUMERIC SIGN ONE QUARTER ASH;Nl;0;L;;;;1/4;N;;;;;
+12461;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH;Nl;0;L;;;;1/6;N;;;;;
+12462;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER;Nl;0;L;;;;1/4;N;;;;;
+12470;CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER;Po;0;L;;;;;N;;;;;
+12471;CUNEIFORM PUNCTUATION SIGN VERTICAL COLON;Po;0;L;;;;;N;;;;;
+12472;CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON;Po;0;L;;;;;N;;;;;
+12473;CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON;Po;0;L;;;;;N;;;;;
1D000;BYZANTINE MUSICAL SYMBOL PSILI;So;0;L;;;;;N;;;;;
1D001;BYZANTINE MUSICAL SYMBOL DASEIA;So;0;L;;;;;N;;;;;
1D002;BYZANTINE MUSICAL SYMBOL PERISPOMENI;So;0;L;;;;;N;;;;;
@@ -12954,6 +16953,7 @@
1D124;MUSICAL SYMBOL F CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;;
1D125;MUSICAL SYMBOL DRUM CLEF-1;So;0;L;;;;;N;;;;;
1D126;MUSICAL SYMBOL DRUM CLEF-2;So;0;L;;;;;N;;;;;
+1D129;MUSICAL SYMBOL MULTIPLE MEASURE REST;So;0;L;;;;;N;;;;;
1D12A;MUSICAL SYMBOL DOUBLE SHARP;So;0;L;;;;;N;;;;;
1D12B;MUSICAL SYMBOL DOUBLE FLAT;So;0;L;;;;;N;;;;;
1D12C;MUSICAL SYMBOL FLAT UP;So;0;L;;;;;N;;;;;
@@ -13134,12 +17134,82 @@
1D1DB;MUSICAL SYMBOL SCANDICUS FLEXUS;So;0;L;;;;;N;;;;;
1D1DC;MUSICAL SYMBOL TORCULUS RESUPINUS;So;0;L;;;;;N;;;;;
1D1DD;MUSICAL SYMBOL PES SUBPUNCTIS;So;0;L;;;;;N;;;;;
-1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;;;;
-1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;;;;
-1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;;;;
-1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;;;;
-1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;;;;
-1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;;;;
+1D200;GREEK VOCAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;;
+1D201;GREEK VOCAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;;
+1D202;GREEK VOCAL NOTATION SYMBOL-3;So;0;ON;;;;;N;;;;;
+1D203;GREEK VOCAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;;
+1D204;GREEK VOCAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;;
+1D205;GREEK VOCAL NOTATION SYMBOL-6;So;0;ON;;;;;N;;;;;
+1D206;GREEK VOCAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;;
+1D207;GREEK VOCAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;;
+1D208;GREEK VOCAL NOTATION SYMBOL-9;So;0;ON;;;;;N;;;;;
+1D209;GREEK VOCAL NOTATION SYMBOL-10;So;0;ON;;;;;N;;;;;
+1D20A;GREEK VOCAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;;
+1D20B;GREEK VOCAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;;
+1D20C;GREEK VOCAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;;
+1D20D;GREEK VOCAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;;
+1D20E;GREEK VOCAL NOTATION SYMBOL-15;So;0;ON;;;;;N;;;;;
+1D20F;GREEK VOCAL NOTATION SYMBOL-16;So;0;ON;;;;;N;;;;;
+1D210;GREEK VOCAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;;
+1D211;GREEK VOCAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;;
+1D212;GREEK VOCAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;;
+1D213;GREEK VOCAL NOTATION SYMBOL-20;So;0;ON;;;;;N;;;;;
+1D214;GREEK VOCAL NOTATION SYMBOL-21;So;0;ON;;;;;N;;;;;
+1D215;GREEK VOCAL NOTATION SYMBOL-22;So;0;ON;;;;;N;;;;;
+1D216;GREEK VOCAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;;
+1D217;GREEK VOCAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;;
+1D218;GREEK VOCAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;;
+1D219;GREEK VOCAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;;
+1D21A;GREEK VOCAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;;
+1D21B;GREEK VOCAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;;
+1D21C;GREEK VOCAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;;
+1D21D;GREEK INSTRUMENTAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;;
+1D21E;GREEK INSTRUMENTAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;;
+1D21F;GREEK INSTRUMENTAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;;
+1D220;GREEK INSTRUMENTAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;;
+1D221;GREEK INSTRUMENTAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;;
+1D222;GREEK INSTRUMENTAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;;
+1D223;GREEK INSTRUMENTAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;;
+1D224;GREEK INSTRUMENTAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;;
+1D225;GREEK INSTRUMENTAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;;
+1D226;GREEK INSTRUMENTAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;;
+1D227;GREEK INSTRUMENTAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;;
+1D228;GREEK INSTRUMENTAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;;
+1D229;GREEK INSTRUMENTAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;;
+1D22A;GREEK INSTRUMENTAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;;
+1D22B;GREEK INSTRUMENTAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;;
+1D22C;GREEK INSTRUMENTAL NOTATION SYMBOL-25;So;0;ON;;;;;N;;;;;
+1D22D;GREEK INSTRUMENTAL NOTATION SYMBOL-26;So;0;ON;;;;;N;;;;;
+1D22E;GREEK INSTRUMENTAL NOTATION SYMBOL-27;So;0;ON;;;;;N;;;;;
+1D22F;GREEK INSTRUMENTAL NOTATION SYMBOL-29;So;0;ON;;;;;N;;;;;
+1D230;GREEK INSTRUMENTAL NOTATION SYMBOL-30;So;0;ON;;;;;N;;;;;
+1D231;GREEK INSTRUMENTAL NOTATION SYMBOL-32;So;0;ON;;;;;N;;;;;
+1D232;GREEK INSTRUMENTAL NOTATION SYMBOL-36;So;0;ON;;;;;N;;;;;
+1D233;GREEK INSTRUMENTAL NOTATION SYMBOL-37;So;0;ON;;;;;N;;;;;
+1D234;GREEK INSTRUMENTAL NOTATION SYMBOL-38;So;0;ON;;;;;N;;;;;
+1D235;GREEK INSTRUMENTAL NOTATION SYMBOL-39;So;0;ON;;;;;N;;;;;
+1D236;GREEK INSTRUMENTAL NOTATION SYMBOL-40;So;0;ON;;;;;N;;;;;
+1D237;GREEK INSTRUMENTAL NOTATION SYMBOL-42;So;0;ON;;;;;N;;;;;
+1D238;GREEK INSTRUMENTAL NOTATION SYMBOL-43;So;0;ON;;;;;N;;;;;
+1D239;GREEK INSTRUMENTAL NOTATION SYMBOL-45;So;0;ON;;;;;N;;;;;
+1D23A;GREEK INSTRUMENTAL NOTATION SYMBOL-47;So;0;ON;;;;;N;;;;;
+1D23B;GREEK INSTRUMENTAL NOTATION SYMBOL-48;So;0;ON;;;;;N;;;;;
+1D23C;GREEK INSTRUMENTAL NOTATION SYMBOL-49;So;0;ON;;;;;N;;;;;
+1D23D;GREEK INSTRUMENTAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;;
+1D23E;GREEK INSTRUMENTAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;;
+1D23F;GREEK INSTRUMENTAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;;
+1D240;GREEK INSTRUMENTAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;;
+1D241;GREEK INSTRUMENTAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;;
+1D242;COMBINING GREEK MUSICAL TRISEME;Mn;230;NSM;;;;;N;;;;;
+1D243;COMBINING GREEK MUSICAL TETRASEME;Mn;230;NSM;;;;;N;;;;;
+1D244;COMBINING GREEK MUSICAL PENTASEME;Mn;230;NSM;;;;;N;;;;;
+1D245;GREEK MUSICAL LEIMMA;So;0;ON;;;;;N;;;;;
+1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;ren *;;;
+1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;tian ren *;;;
+1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;di ren *;;;
+1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;ren tian *;;;
+1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;ren di *;;;
+1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;ren ren *;;;
1D306;TETRAGRAM FOR CENTRE;So;0;ON;;;;;N;;;;;
1D307;TETRAGRAM FOR FULL CIRCLE;So;0;ON;;;;;N;;;;;
1D308;TETRAGRAM FOR MIRED;So;0;ON;;;;;N;;;;;
@@ -13221,6 +17291,24 @@
1D354;TETRAGRAM FOR DIFFICULTIES;So;0;ON;;;;;N;;;;;
1D355;TETRAGRAM FOR LABOURING;So;0;ON;;;;;N;;;;;
1D356;TETRAGRAM FOR FOSTERING;So;0;ON;;;;;N;;;;;
+1D360;COUNTING ROD UNIT DIGIT ONE;No;0;L;;;;1;N;;;;;
+1D361;COUNTING ROD UNIT DIGIT TWO;No;0;L;;;;2;N;;;;;
+1D362;COUNTING ROD UNIT DIGIT THREE;No;0;L;;;;3;N;;;;;
+1D363;COUNTING ROD UNIT DIGIT FOUR;No;0;L;;;;4;N;;;;;
+1D364;COUNTING ROD UNIT DIGIT FIVE;No;0;L;;;;5;N;;;;;
+1D365;COUNTING ROD UNIT DIGIT SIX;No;0;L;;;;6;N;;;;;
+1D366;COUNTING ROD UNIT DIGIT SEVEN;No;0;L;;;;7;N;;;;;
+1D367;COUNTING ROD UNIT DIGIT EIGHT;No;0;L;;;;8;N;;;;;
+1D368;COUNTING ROD UNIT DIGIT NINE;No;0;L;;;;9;N;;;;;
+1D369;COUNTING ROD TENS DIGIT ONE;No;0;L;;;;10;N;;;;;
+1D36A;COUNTING ROD TENS DIGIT TWO;No;0;L;;;;20;N;;;;;
+1D36B;COUNTING ROD TENS DIGIT THREE;No;0;L;;;;30;N;;;;;
+1D36C;COUNTING ROD TENS DIGIT FOUR;No;0;L;;;;40;N;;;;;
+1D36D;COUNTING ROD TENS DIGIT FIVE;No;0;L;;;;50;N;;;;;
+1D36E;COUNTING ROD TENS DIGIT SIX;No;0;L;;;;60;N;;;;;
+1D36F;COUNTING ROD TENS DIGIT SEVEN;No;0;L;;;;70;N;;;;;
+1D370;COUNTING ROD TENS DIGIT EIGHT;No;0;L;;;;80;N;;;;;
+1D371;COUNTING ROD TENS DIGIT NINE;No;0;L;;;;90;N;;;;;
1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
1D401;MATHEMATICAL BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
1D402;MATHEMATICAL BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
@@ -13873,6 +17961,8 @@
1D6A1;MATHEMATICAL MONOSPACE SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
1D6A2;MATHEMATICAL MONOSPACE SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
1D6A3;MATHEMATICAL MONOSPACE SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D6A4;MATHEMATICAL ITALIC SMALL DOTLESS I;Ll;0;L;<font> 0131;;;;N;;;;;
+1D6A5;MATHEMATICAL ITALIC SMALL DOTLESS J;Ll;0;L;<font> 0237;;;;N;;;;;
1D6A8;MATHEMATICAL BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
1D6A9;MATHEMATICAL BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
1D6AA;MATHEMATICAL BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
@@ -13924,7 +18014,7 @@
1D6D8;MATHEMATICAL BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
1D6D9;MATHEMATICAL BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
1D6DA;MATHEMATICAL BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
-1D6DB;MATHEMATICAL BOLD PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;N;;;;;
+1D6DB;MATHEMATICAL BOLD PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
1D6DC;MATHEMATICAL BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
1D6DD;MATHEMATICAL BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
1D6DE;MATHEMATICAL BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
@@ -13982,7 +18072,7 @@
1D712;MATHEMATICAL ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
1D713;MATHEMATICAL ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
1D714;MATHEMATICAL ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
-1D715;MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;N;;;;;
+1D715;MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
1D716;MATHEMATICAL ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
1D717;MATHEMATICAL ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
1D718;MATHEMATICAL ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
@@ -14040,7 +18130,7 @@
1D74C;MATHEMATICAL BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
1D74D;MATHEMATICAL BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
1D74E;MATHEMATICAL BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
-1D74F;MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;N;;;;;
+1D74F;MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
1D750;MATHEMATICAL BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
1D751;MATHEMATICAL BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
1D752;MATHEMATICAL BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
@@ -14098,7 +18188,7 @@
1D786;MATHEMATICAL SANS-SERIF BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
1D787;MATHEMATICAL SANS-SERIF BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
1D788;MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
-1D789;MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;N;;;;;
+1D789;MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
1D78A;MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
1D78B;MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
1D78C;MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
@@ -14156,13 +18246,15 @@
1D7C0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
1D7C1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
1D7C2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
-1D7C3;MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;N;;;;;
+1D7C3;MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
1D7C4;MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
1D7C5;MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
1D7C6;MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
1D7C7;MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
1D7C8;MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
1D7C9;MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D7CA;MATHEMATICAL BOLD CAPITAL DIGAMMA;Lu;0;L;<font> 03DC;;;;N;;;;;
+1D7CB;MATHEMATICAL BOLD SMALL DIGAMMA;Ll;0;L;<font> 03DD;;;;N;;;;;
1D7CE;MATHEMATICAL BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
1D7CF;MATHEMATICAL BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
1D7D0;MATHEMATICAL BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
@@ -14213,6 +18305,150 @@
1D7FD;MATHEMATICAL MONOSPACE DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
1D7FE;MATHEMATICAL MONOSPACE DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
1D7FF;MATHEMATICAL MONOSPACE DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1F000;MAHJONG TILE EAST WIND;So;0;ON;;;;;N;;;;;
+1F001;MAHJONG TILE SOUTH WIND;So;0;ON;;;;;N;;;;;
+1F002;MAHJONG TILE WEST WIND;So;0;ON;;;;;N;;;;;
+1F003;MAHJONG TILE NORTH WIND;So;0;ON;;;;;N;;;;;
+1F004;MAHJONG TILE RED DRAGON;So;0;ON;;;;;N;;;;;
+1F005;MAHJONG TILE GREEN DRAGON;So;0;ON;;;;;N;;;;;
+1F006;MAHJONG TILE WHITE DRAGON;So;0;ON;;;;;N;;;;;
+1F007;MAHJONG TILE ONE OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F008;MAHJONG TILE TWO OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F009;MAHJONG TILE THREE OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00A;MAHJONG TILE FOUR OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00B;MAHJONG TILE FIVE OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00C;MAHJONG TILE SIX OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00D;MAHJONG TILE SEVEN OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00E;MAHJONG TILE EIGHT OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F00F;MAHJONG TILE NINE OF CHARACTERS;So;0;ON;;;;;N;;;;;
+1F010;MAHJONG TILE ONE OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F011;MAHJONG TILE TWO OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F012;MAHJONG TILE THREE OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F013;MAHJONG TILE FOUR OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F014;MAHJONG TILE FIVE OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F015;MAHJONG TILE SIX OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F016;MAHJONG TILE SEVEN OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F017;MAHJONG TILE EIGHT OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F018;MAHJONG TILE NINE OF BAMBOOS;So;0;ON;;;;;N;;;;;
+1F019;MAHJONG TILE ONE OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01A;MAHJONG TILE TWO OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01B;MAHJONG TILE THREE OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01C;MAHJONG TILE FOUR OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01D;MAHJONG TILE FIVE OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01E;MAHJONG TILE SIX OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F01F;MAHJONG TILE SEVEN OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F020;MAHJONG TILE EIGHT OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F021;MAHJONG TILE NINE OF CIRCLES;So;0;ON;;;;;N;;;;;
+1F022;MAHJONG TILE PLUM;So;0;ON;;;;;N;;;;;
+1F023;MAHJONG TILE ORCHID;So;0;ON;;;;;N;;;;;
+1F024;MAHJONG TILE BAMBOO;So;0;ON;;;;;N;;;;;
+1F025;MAHJONG TILE CHRYSANTHEMUM;So;0;ON;;;;;N;;;;;
+1F026;MAHJONG TILE SPRING;So;0;ON;;;;;N;;;;;
+1F027;MAHJONG TILE SUMMER;So;0;ON;;;;;N;;;;;
+1F028;MAHJONG TILE AUTUMN;So;0;ON;;;;;N;;;;;
+1F029;MAHJONG TILE WINTER;So;0;ON;;;;;N;;;;;
+1F02A;MAHJONG TILE JOKER;So;0;ON;;;;;N;;;;;
+1F02B;MAHJONG TILE BACK;So;0;ON;;;;;N;;;;;
+1F030;DOMINO TILE HORIZONTAL BACK;So;0;ON;;;;;N;;;;;
+1F031;DOMINO TILE HORIZONTAL-00-00;So;0;ON;;;;;N;;;;;
+1F032;DOMINO TILE HORIZONTAL-00-01;So;0;ON;;;;;N;;;;;
+1F033;DOMINO TILE HORIZONTAL-00-02;So;0;ON;;;;;N;;;;;
+1F034;DOMINO TILE HORIZONTAL-00-03;So;0;ON;;;;;N;;;;;
+1F035;DOMINO TILE HORIZONTAL-00-04;So;0;ON;;;;;N;;;;;
+1F036;DOMINO TILE HORIZONTAL-00-05;So;0;ON;;;;;N;;;;;
+1F037;DOMINO TILE HORIZONTAL-00-06;So;0;ON;;;;;N;;;;;
+1F038;DOMINO TILE HORIZONTAL-01-00;So;0;ON;;;;;N;;;;;
+1F039;DOMINO TILE HORIZONTAL-01-01;So;0;ON;;;;;N;;;;;
+1F03A;DOMINO TILE HORIZONTAL-01-02;So;0;ON;;;;;N;;;;;
+1F03B;DOMINO TILE HORIZONTAL-01-03;So;0;ON;;;;;N;;;;;
+1F03C;DOMINO TILE HORIZONTAL-01-04;So;0;ON;;;;;N;;;;;
+1F03D;DOMINO TILE HORIZONTAL-01-05;So;0;ON;;;;;N;;;;;
+1F03E;DOMINO TILE HORIZONTAL-01-06;So;0;ON;;;;;N;;;;;
+1F03F;DOMINO TILE HORIZONTAL-02-00;So;0;ON;;;;;N;;;;;
+1F040;DOMINO TILE HORIZONTAL-02-01;So;0;ON;;;;;N;;;;;
+1F041;DOMINO TILE HORIZONTAL-02-02;So;0;ON;;;;;N;;;;;
+1F042;DOMINO TILE HORIZONTAL-02-03;So;0;ON;;;;;N;;;;;
+1F043;DOMINO TILE HORIZONTAL-02-04;So;0;ON;;;;;N;;;;;
+1F044;DOMINO TILE HORIZONTAL-02-05;So;0;ON;;;;;N;;;;;
+1F045;DOMINO TILE HORIZONTAL-02-06;So;0;ON;;;;;N;;;;;
+1F046;DOMINO TILE HORIZONTAL-03-00;So;0;ON;;;;;N;;;;;
+1F047;DOMINO TILE HORIZONTAL-03-01;So;0;ON;;;;;N;;;;;
+1F048;DOMINO TILE HORIZONTAL-03-02;So;0;ON;;;;;N;;;;;
+1F049;DOMINO TILE HORIZONTAL-03-03;So;0;ON;;;;;N;;;;;
+1F04A;DOMINO TILE HORIZONTAL-03-04;So;0;ON;;;;;N;;;;;
+1F04B;DOMINO TILE HORIZONTAL-03-05;So;0;ON;;;;;N;;;;;
+1F04C;DOMINO TILE HORIZONTAL-03-06;So;0;ON;;;;;N;;;;;
+1F04D;DOMINO TILE HORIZONTAL-04-00;So;0;ON;;;;;N;;;;;
+1F04E;DOMINO TILE HORIZONTAL-04-01;So;0;ON;;;;;N;;;;;
+1F04F;DOMINO TILE HORIZONTAL-04-02;So;0;ON;;;;;N;;;;;
+1F050;DOMINO TILE HORIZONTAL-04-03;So;0;ON;;;;;N;;;;;
+1F051;DOMINO TILE HORIZONTAL-04-04;So;0;ON;;;;;N;;;;;
+1F052;DOMINO TILE HORIZONTAL-04-05;So;0;ON;;;;;N;;;;;
+1F053;DOMINO TILE HORIZONTAL-04-06;So;0;ON;;;;;N;;;;;
+1F054;DOMINO TILE HORIZONTAL-05-00;So;0;ON;;;;;N;;;;;
+1F055;DOMINO TILE HORIZONTAL-05-01;So;0;ON;;;;;N;;;;;
+1F056;DOMINO TILE HORIZONTAL-05-02;So;0;ON;;;;;N;;;;;
+1F057;DOMINO TILE HORIZONTAL-05-03;So;0;ON;;;;;N;;;;;
+1F058;DOMINO TILE HORIZONTAL-05-04;So;0;ON;;;;;N;;;;;
+1F059;DOMINO TILE HORIZONTAL-05-05;So;0;ON;;;;;N;;;;;
+1F05A;DOMINO TILE HORIZONTAL-05-06;So;0;ON;;;;;N;;;;;
+1F05B;DOMINO TILE HORIZONTAL-06-00;So;0;ON;;;;;N;;;;;
+1F05C;DOMINO TILE HORIZONTAL-06-01;So;0;ON;;;;;N;;;;;
+1F05D;DOMINO TILE HORIZONTAL-06-02;So;0;ON;;;;;N;;;;;
+1F05E;DOMINO TILE HORIZONTAL-06-03;So;0;ON;;;;;N;;;;;
+1F05F;DOMINO TILE HORIZONTAL-06-04;So;0;ON;;;;;N;;;;;
+1F060;DOMINO TILE HORIZONTAL-06-05;So;0;ON;;;;;N;;;;;
+1F061;DOMINO TILE HORIZONTAL-06-06;So;0;ON;;;;;N;;;;;
+1F062;DOMINO TILE VERTICAL BACK;So;0;ON;;;;;N;;;;;
+1F063;DOMINO TILE VERTICAL-00-00;So;0;ON;;;;;N;;;;;
+1F064;DOMINO TILE VERTICAL-00-01;So;0;ON;;;;;N;;;;;
+1F065;DOMINO TILE VERTICAL-00-02;So;0;ON;;;;;N;;;;;
+1F066;DOMINO TILE VERTICAL-00-03;So;0;ON;;;;;N;;;;;
+1F067;DOMINO TILE VERTICAL-00-04;So;0;ON;;;;;N;;;;;
+1F068;DOMINO TILE VERTICAL-00-05;So;0;ON;;;;;N;;;;;
+1F069;DOMINO TILE VERTICAL-00-06;So;0;ON;;;;;N;;;;;
+1F06A;DOMINO TILE VERTICAL-01-00;So;0;ON;;;;;N;;;;;
+1F06B;DOMINO TILE VERTICAL-01-01;So;0;ON;;;;;N;;;;;
+1F06C;DOMINO TILE VERTICAL-01-02;So;0;ON;;;;;N;;;;;
+1F06D;DOMINO TILE VERTICAL-01-03;So;0;ON;;;;;N;;;;;
+1F06E;DOMINO TILE VERTICAL-01-04;So;0;ON;;;;;N;;;;;
+1F06F;DOMINO TILE VERTICAL-01-05;So;0;ON;;;;;N;;;;;
+1F070;DOMINO TILE VERTICAL-01-06;So;0;ON;;;;;N;;;;;
+1F071;DOMINO TILE VERTICAL-02-00;So;0;ON;;;;;N;;;;;
+1F072;DOMINO TILE VERTICAL-02-01;So;0;ON;;;;;N;;;;;
+1F073;DOMINO TILE VERTICAL-02-02;So;0;ON;;;;;N;;;;;
+1F074;DOMINO TILE VERTICAL-02-03;So;0;ON;;;;;N;;;;;
+1F075;DOMINO TILE VERTICAL-02-04;So;0;ON;;;;;N;;;;;
+1F076;DOMINO TILE VERTICAL-02-05;So;0;ON;;;;;N;;;;;
+1F077;DOMINO TILE VERTICAL-02-06;So;0;ON;;;;;N;;;;;
+1F078;DOMINO TILE VERTICAL-03-00;So;0;ON;;;;;N;;;;;
+1F079;DOMINO TILE VERTICAL-03-01;So;0;ON;;;;;N;;;;;
+1F07A;DOMINO TILE VERTICAL-03-02;So;0;ON;;;;;N;;;;;
+1F07B;DOMINO TILE VERTICAL-03-03;So;0;ON;;;;;N;;;;;
+1F07C;DOMINO TILE VERTICAL-03-04;So;0;ON;;;;;N;;;;;
+1F07D;DOMINO TILE VERTICAL-03-05;So;0;ON;;;;;N;;;;;
+1F07E;DOMINO TILE VERTICAL-03-06;So;0;ON;;;;;N;;;;;
+1F07F;DOMINO TILE VERTICAL-04-00;So;0;ON;;;;;N;;;;;
+1F080;DOMINO TILE VERTICAL-04-01;So;0;ON;;;;;N;;;;;
+1F081;DOMINO TILE VERTICAL-04-02;So;0;ON;;;;;N;;;;;
+1F082;DOMINO TILE VERTICAL-04-03;So;0;ON;;;;;N;;;;;
+1F083;DOMINO TILE VERTICAL-04-04;So;0;ON;;;;;N;;;;;
+1F084;DOMINO TILE VERTICAL-04-05;So;0;ON;;;;;N;;;;;
+1F085;DOMINO TILE VERTICAL-04-06;So;0;ON;;;;;N;;;;;
+1F086;DOMINO TILE VERTICAL-05-00;So;0;ON;;;;;N;;;;;
+1F087;DOMINO TILE VERTICAL-05-01;So;0;ON;;;;;N;;;;;
+1F088;DOMINO TILE VERTICAL-05-02;So;0;ON;;;;;N;;;;;
+1F089;DOMINO TILE VERTICAL-05-03;So;0;ON;;;;;N;;;;;
+1F08A;DOMINO TILE VERTICAL-05-04;So;0;ON;;;;;N;;;;;
+1F08B;DOMINO TILE VERTICAL-05-05;So;0;ON;;;;;N;;;;;
+1F08C;DOMINO TILE VERTICAL-05-06;So;0;ON;;;;;N;;;;;
+1F08D;DOMINO TILE VERTICAL-06-00;So;0;ON;;;;;N;;;;;
+1F08E;DOMINO TILE VERTICAL-06-01;So;0;ON;;;;;N;;;;;
+1F08F;DOMINO TILE VERTICAL-06-02;So;0;ON;;;;;N;;;;;
+1F090;DOMINO TILE VERTICAL-06-03;So;0;ON;;;;;N;;;;;
+1F091;DOMINO TILE VERTICAL-06-04;So;0;ON;;;;;N;;;;;
+1F092;DOMINO TILE VERTICAL-06-05;So;0;ON;;;;;N;;;;;
+1F093;DOMINO TILE VERTICAL-06-06;So;0;ON;;;;;N;;;;;
20000;<CJK Ideograph Extension B, First>;Lo;0;L;;;;;N;;;;;
2A6D6;<CJK Ideograph Extension B, Last>;Lo;0;L;;;;;N;;;;;
2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;;
@@ -14359,7 +18595,7 @@
2F88D;CJK COMPATIBILITY IDEOGRAPH-2F88D;Lo;0;L;5EB6;;;;N;;;;;
2F88E;CJK COMPATIBILITY IDEOGRAPH-2F88E;Lo;0;L;5ECA;;;;N;;;;;
2F88F;CJK COMPATIBILITY IDEOGRAPH-2F88F;Lo;0;L;2A392;;;;N;;;;;
-2F890;CJK COMPATIBILITY IDEOGRAPH-2F890;Lo;0;L;5EFE;;;;N;;;;;
+2F890;CJK COMPATIBILITY IDEOGRAPH-2F890;Lo;0;L;5EFE;;;9;N;;;;;
2F891;CJK COMPATIBILITY IDEOGRAPH-2F891;Lo;0;L;22331;;;;N;;;;;
2F892;CJK COMPATIBILITY IDEOGRAPH-2F892;Lo;0;L;22331;;;;N;;;;;
2F893;CJK COMPATIBILITY IDEOGRAPH-2F893;Lo;0;L;8201;;;;N;;;;;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/tools/UnicodeData/VERSION Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,1 @@
+5.1.0
--- a/jdk/src/share/classes/com/sun/awt/AWTUtilities.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/com/sun/awt/AWTUtilities.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2008-2009 Sun Microsystems, Inc. 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
@@ -26,17 +26,37 @@
package com.sun.awt;
import java.awt.*;
+
import sun.awt.AWTAccessor;
-
+import sun.awt.SunToolkit;
/**
* A collection of utility methods for AWT.
*
* The functionality provided by the static methods of the class includes:
* <ul>
+ * <li>Setting shapes on top-level windows
+ * <li>Setting a constant alpha value for each pixel of a top-level window
+ * <li>Making a window non-opaque, after that it paints only explicitly
+ * painted pixels on the screen, with arbitrary alpha values for every pixel.
* <li>Setting a 'mixing-cutout' shape for a component.
* </ul>
* <p>
+ * A "top-level window" is an instance of the {@code Window} class (or its
+ * descendant, such as {@code JFrame}).
+ * <p>
+ * Some of the mentioned features may not be supported by the native platform.
+ * To determine whether a particular feature is supported, the user must use
+ * the {@code isTranslucencySupported()} method of the class passing a desired
+ * translucency kind (a member of the {@code Translucency} enum) as an
+ * argument.
+ * <p>
+ * The per-pixel alpha feature also requires the user to create her/his
+ * windows using a translucency-capable graphics configuration.
+ * The {@code isTranslucencyCapable()} method must
+ * be used to verify whether any given GraphicsConfiguration supports
+ * the trasnlcency effects.
+ * <p>
* <b>WARNING</b>: This class is an implementation detail and only meant
* for limited use outside of the core platform. This API may change
* drastically between update release, and it may even be
@@ -50,6 +70,344 @@
private AWTUtilities() {
}
+ /** Kinds of translucency supported by the underlying system.
+ * @see #isTranslucencySupported
+ */
+ public static enum Translucency {
+ /**
+ * Represents support in the underlying system for windows each pixel
+ * of which is guaranteed to be either completely opaque, with
+ * an alpha value of 1.0, or completely transparent, with an alpha
+ * value of 0.0.
+ */
+ PERPIXEL_TRANSPARENT,
+
+ /**
+ * Represents support in the underlying system for windows all of
+ * the pixels of which have the same alpha value between or including
+ * 0.0 and 1.0.
+ */
+ TRANSLUCENT,
+
+ /**
+ * Represents support in the underlying system for windows that
+ * contain or might contain pixels with arbitrary alpha values
+ * between and including 0.0 and 1.0.
+ */
+ PERPIXEL_TRANSLUCENT;
+ }
+
+
+ /**
+ * Returns whether the given level of translucency is supported by
+ * the underlying system.
+ *
+ * Note that this method may sometimes return the value
+ * indicating that the particular level is supported, but
+ * the native windowing system may still not support the
+ * given level of translucency (due to the bugs in
+ * the windowing system).
+ *
+ * @param translucencyKind a kind of translucency support
+ * (either PERPIXEL_TRANSPARENT,
+ * TRANSLUCENT, or PERPIXEL_TRANSLUCENT)
+ * @return whether the given translucency kind is supported
+ */
+ public static boolean isTranslucencySupported(Translucency translucencyKind) {
+ switch (translucencyKind) {
+ case PERPIXEL_TRANSPARENT:
+ return isWindowShapingSupported();
+ case TRANSLUCENT:
+ return isWindowOpacitySupported();
+ case PERPIXEL_TRANSLUCENT:
+ return isWindowTranslucencySupported();
+ }
+ return false;
+ }
+
+
+ /**
+ * Returns whether the windowing system supports changing the opacity
+ * value of top-level windows.
+ * Note that this method may sometimes return true, but the native
+ * windowing system may still not support the concept of
+ * translucency (due to the bugs in the windowing system).
+ */
+ private static boolean isWindowOpacitySupported() {
+ Toolkit curToolkit = Toolkit.getDefaultToolkit();
+ if (!(curToolkit instanceof SunToolkit)) {
+ return false;
+ }
+ return ((SunToolkit)curToolkit).isWindowOpacitySupported();
+ }
+
+ /**
+ * Set the opacity of the window. The opacity is at the range [0..1].
+ * Note that setting the opacity level of 0 may or may not disable
+ * the mouse event handling on this window. This is
+ * a platform-dependent behavior.
+ *
+ * In order for this method to enable the translucency effect,
+ * the isTranslucencySupported() method should indicate that the
+ * TRANSLUCENT level of translucency is supported.
+ *
+ * <p>Also note that the window must not be in the full-screen mode
+ * when setting the opacity value < 1.0f. Otherwise
+ * the IllegalArgumentException is thrown.
+ *
+ * @param window the window to set the opacity level to
+ * @param opacity the opacity level to set to the window
+ * @throws NullPointerException if the window argument is null
+ * @throws IllegalArgumentException if the opacity is out of
+ * the range [0..1]
+ * @throws IllegalArgumentException if the window is in full screen mode,
+ * and the opacity is less than 1.0f
+ * @throws UnsupportedOperationException if the TRANSLUCENT translucency
+ * kind is not supported
+ */
+ public static void setWindowOpacity(Window window, float opacity) {
+ if (window == null) {
+ throw new NullPointerException(
+ "The window argument should not be null.");
+ }
+
+ AWTAccessor.getWindowAccessor().setOpacity(window, opacity);
+ }
+
+ /**
+ * Get the opacity of the window. If the opacity has not
+ * yet being set, this method returns 1.0.
+ *
+ * @param window the window to get the opacity level from
+ * @throws NullPointerException if the window argument is null
+ */
+ public static float getWindowOpacity(Window window) {
+ if (window == null) {
+ throw new NullPointerException(
+ "The window argument should not be null.");
+ }
+
+ return AWTAccessor.getWindowAccessor().getOpacity(window);
+ }
+
+ /**
+ * Returns whether the windowing system supports changing the shape
+ * of top-level windows.
+ * Note that this method may sometimes return true, but the native
+ * windowing system may still not support the concept of
+ * shaping (due to the bugs in the windowing system).
+ */
+ public static boolean isWindowShapingSupported() {
+ Toolkit curToolkit = Toolkit.getDefaultToolkit();
+ if (!(curToolkit instanceof SunToolkit)) {
+ return false;
+ }
+ return ((SunToolkit)curToolkit).isWindowShapingSupported();
+ }
+
+ /**
+ * Returns an object that implements the Shape interface and represents
+ * the shape previously set with the call to the setWindowShape() method.
+ * If no shape has been set yet, or the shape has been reset to null,
+ * this method returns null.
+ *
+ * @param window the window to get the shape from
+ * @return the current shape of the window
+ * @throws NullPointerException if the window argument is null
+ */
+ public static Shape getWindowShape(Window window) {
+ if (window == null) {
+ throw new NullPointerException(
+ "The window argument should not be null.");
+ }
+ return AWTAccessor.getWindowAccessor().getShape(window);
+ }
+
+ /**
+ * Sets a shape for the given window.
+ * If the shape argument is null, this methods restores
+ * the default shape making the window rectangular.
+ * <p>Note that in order to set a shape, the window must be undecorated.
+ * If the window is decorated, this method ignores the {@code shape}
+ * argument and resets the shape to null.
+ * <p>Also note that the window must not be in the full-screen mode
+ * when setting a non-null shape. Otherwise the IllegalArgumentException
+ * is thrown.
+ * <p>Depending on the platform, the method may return without
+ * effecting the shape of the window if the window has a non-null warning
+ * string ({@link Window#getWarningString()}). In this case the passed
+ * shape object is ignored.
+ *
+ * @param window the window to set the shape to
+ * @param shape the shape to set to the window
+ * @throws NullPointerException if the window argument is null
+ * @throws IllegalArgumentException if the window is in full screen mode,
+ * and the shape is not null
+ * @throws UnsupportedOperationException if the PERPIXEL_TRANSPARENT
+ * translucency kind is not supported
+ */
+ public static void setWindowShape(Window window, Shape shape) {
+ if (window == null) {
+ throw new NullPointerException(
+ "The window argument should not be null.");
+ }
+ AWTAccessor.getWindowAccessor().setShape(window, shape);
+ }
+
+ private static boolean isWindowTranslucencySupported() {
+ /*
+ * Per-pixel alpha is supported if all the conditions are TRUE:
+ * 1. The toolkit is a sort of SunToolkit
+ * 2. The toolkit supports translucency in general
+ * (isWindowTranslucencySupported())
+ * 3. There's at least one translucency-capable
+ * GraphicsConfiguration
+ */
+
+ Toolkit curToolkit = Toolkit.getDefaultToolkit();
+ if (!(curToolkit instanceof SunToolkit)) {
+ return false;
+ }
+
+ if (!((SunToolkit)curToolkit).isWindowTranslucencySupported()) {
+ return false;
+ }
+
+ GraphicsEnvironment env =
+ GraphicsEnvironment.getLocalGraphicsEnvironment();
+
+ // If the default GC supports translucency return true.
+ // It is important to optimize the verification this way,
+ // see CR 6661196 for more details.
+ if (isTranslucencyCapable(env.getDefaultScreenDevice()
+ .getDefaultConfiguration()))
+ {
+ return true;
+ }
+
+ // ... otherwise iterate through all the GCs.
+ GraphicsDevice[] devices = env.getScreenDevices();
+
+ for (int i = 0; i < devices.length; i++) {
+ GraphicsConfiguration[] configs = devices[i].getConfigurations();
+ for (int j = 0; j < configs.length; j++) {
+ if (isTranslucencyCapable(configs[j])) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Enables the per-pixel alpha support for the given window.
+ * Once the window becomes non-opaque (the isOpaque is set to false),
+ * the drawing sub-system is starting to respect the alpha value of each
+ * separate pixel. If a pixel gets painted with alpha color component
+ * equal to zero, it becomes visually transparent, if the alpha of the
+ * pixel is equal to 255, the pixel is fully opaque. Interim values
+ * of the alpha color component make the pixel semi-transparent (i.e.
+ * translucent).
+ * <p>Note that in order for the window to support the per-pixel alpha
+ * mode, the window must be created using the GraphicsConfiguration
+ * for which the {@link #isTranslucencyCapable}
+ * method returns true.
+ * <p>Also note that some native systems enable the per-pixel translucency
+ * mode for any window created using the translucency-compatible
+ * graphics configuration. However, it is highly recommended to always
+ * invoke the setWindowOpaque() method for these windows, at least for
+ * the sake of cross-platform compatibility reasons.
+ * <p>Also note that the window must not be in the full-screen mode
+ * when making it non-opaque. Otherwise the IllegalArgumentException
+ * is thrown.
+ * <p>If the window is a {@code Frame} or a {@code Dialog}, the window must
+ * be undecorated prior to enabling the per-pixel translucency effect (see
+ * {@link Frame#setUndecorated()} and/or {@link Dialog#setUndecorated()}).
+ * If the window becomes decorated through a subsequent call to the
+ * corresponding {@code setUndecorated()} method, the per-pixel
+ * translucency effect will be disabled and the opaque property reset to
+ * {@code true}.
+ * <p>Depending on the platform, the method may return without
+ * effecting the opaque property of the window if the window has a non-null
+ * warning string ({@link Window#getWarningString()}). In this case
+ * the passed 'isOpaque' value is ignored.
+ *
+ * @param window the window to set the shape to
+ * @param isOpaque whether the window must be opaque (true),
+ * or translucent (false)
+ * @throws NullPointerException if the window argument is null
+ * @throws IllegalArgumentException if the window uses
+ * a GraphicsConfiguration for which the
+ * {@code isTranslucencyCapable()}
+ * method returns false
+ * @throws IllegalArgumentException if the window is in full screen mode,
+ * and the isOpaque is false
+ * @throws IllegalArgumentException if the window is decorated and the
+ * isOpaque argument is {@code false}.
+ * @throws UnsupportedOperationException if the PERPIXEL_TRANSLUCENT
+ * translucency kind is not supported
+ */
+ public static void setWindowOpaque(Window window, boolean isOpaque) {
+ if (window == null) {
+ throw new NullPointerException(
+ "The window argument should not be null.");
+ }
+ if (!isOpaque && !isTranslucencySupported(Translucency.PERPIXEL_TRANSLUCENT)) {
+ throw new UnsupportedOperationException(
+ "The PERPIXEL_TRANSLUCENT translucency kind is not supported");
+ }
+ AWTAccessor.getWindowAccessor().setOpaque(window, isOpaque);
+ }
+
+ /**
+ * Returns whether the window is opaque or translucent.
+ *
+ * @param window the window to set the shape to
+ * @return whether the window is currently opaque (true)
+ * or translucent (false)
+ * @throws NullPointerException if the window argument is null
+ */
+ public static boolean isWindowOpaque(Window window) {
+ if (window == null) {
+ throw new NullPointerException(
+ "The window argument should not be null.");
+ }
+
+ return AWTAccessor.getWindowAccessor().isOpaque(window);
+ }
+
+ /**
+ * Verifies whether a given GraphicsConfiguration supports
+ * the PERPIXEL_TRANSLUCENT kind of translucency.
+ * All windows that are intended to be used with the {@link #setWindowOpaque}
+ * method must be created using a GraphicsConfiguration for which this method
+ * returns true.
+ * <p>Note that some native systems enable the per-pixel translucency
+ * mode for any window created using a translucency-capable
+ * graphics configuration. However, it is highly recommended to always
+ * invoke the setWindowOpaque() method for these windows, at least
+ * for the sake of cross-platform compatibility reasons.
+ *
+ * @param gc GraphicsConfiguration
+ * @throws NullPointerException if the gc argument is null
+ * @return whether the given GraphicsConfiguration supports
+ * the translucency effects.
+ */
+ public static boolean isTranslucencyCapable(GraphicsConfiguration gc) {
+ if (gc == null) {
+ throw new NullPointerException("The gc argument should not be null");
+ }
+ /*
+ return gc.isTranslucencyCapable();
+ */
+ Toolkit curToolkit = Toolkit.getDefaultToolkit();
+ if (!(curToolkit instanceof SunToolkit)) {
+ return false;
+ }
+ return ((SunToolkit)curToolkit).isTranslucencyCapable(gc);
+ }
+
/**
* Sets a 'mixing-cutout' shape for the given component.
*
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/awt/SecurityWarning.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,169 @@
+/*
+ * Copyright 2008-2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package com.sun.awt;
+
+import java.awt.*;
+import java.awt.geom.*;
+
+import sun.awt.AWTAccessor;
+
+
+/**
+ * Security Warning control interface.
+ *
+ * This class provides a couple of methods that help a developer relocate
+ * the AWT security warning to an appropriate position relative to the current
+ * window size. A "top-level window" is an instance of the {@code Window}
+ * class (or its descendant, such as {@code JFrame}). The security warning
+ * is applied to all windows created by an untrusted code. All such windows
+ * have a non-null "warning string" (see {@link Window#getWarningString()}).
+ * <p>
+ * <b>WARNING</b>: This class is an implementation detail and only meant
+ * for limited use outside of the core platform. This API may change
+ * drastically between update release, and it may even be
+ * removed or be moved to some other packages or classes.
+ */
+public final class SecurityWarning {
+
+ /**
+ * The SecurityWarning class should not be instantiated
+ */
+ private SecurityWarning() {
+ }
+
+ /**
+ * Gets the size of the security warning.
+ *
+ * The returned value is not valid until the peer has been created. Before
+ * invoking this method a developer must call the {@link Window#pack()},
+ * {@link Window#setVisible()}, or some other method that creates the peer.
+ *
+ * @param window the window to get the security warning size for
+ *
+ * @throws NullPointerException if the window argument is null
+ * @throws IllegalArgumentException if the window is trusted (i.e.
+ * the {@code getWarningString()} returns null)
+ */
+ public static Dimension getSize(Window window) {
+ if (window == null) {
+ throw new NullPointerException(
+ "The window argument should not be null.");
+ }
+ if (window.getWarningString() == null) {
+ throw new IllegalArgumentException(
+ "The window must have a non-null warning string.");
+ }
+ // We don't check for a non-null peer since it may be destroyed
+ // after assigning a valid value to the security warning size.
+
+ return AWTAccessor.getWindowAccessor().getSecurityWarningSize(window);
+ }
+
+ /**
+ * Sets the position of the security warning.
+ * <p>
+ * The {@code alignmentX} and {@code alignmentY} arguments specify the
+ * origin of the coordinate system used to calculate the position of the
+ * security warning. The values must be in the range [0.0f...1.0f]. The
+ * {@code 0.0f} value represents the left (top) edge of the rectangular
+ * bounds of the window. The {@code 1.0f} value represents the right
+ * (bottom) edge of the bounds. Whenever the size of the window changes,
+ * the origin of the coordinate system gets relocated accordingly. For
+ * convenience a developer may use the {@code Component.*_ALIGNMENT}
+ * constants to pass predefined values for these arguments.
+ * <p>
+ * The {@code point} argument specifies the location of the security
+ * warning in the coordinate system described above. If both {@code x} and
+ * {@code y} coordinates of the point are equal to zero, the warning will
+ * be located right in the origin of the coordinate system. On the other
+ * hand, if both {@code alignmentX} and {@code alignmentY} are equal to
+ * zero (i.e. the origin of the coordinate system is placed at the top-left
+ * corner of the window), then the {@code point} argument represents the
+ * absolute location of the security warning relative to the location of
+ * the window. The "absolute" in this case means that the position of the
+ * security warning is not effected by resizing of the window.
+ * <p>
+ * Note that the security warning managment code guarantees that:
+ * <ul>
+ * <li>The security warning cannot be located farther than two pixels from
+ * the rectangular bounds of the window (see {@link Window#getBounds}), and
+ * <li>The security warning is always visible on the screen.
+ * </ul>
+ * If either of the conditions is violated, the calculated position of the
+ * security warning is adjusted by the system to meet both these
+ * conditions.
+ * <p>
+ * The default position of the security warning is in the upper-right
+ * corner of the window, two pixels to the right from the right edge. This
+ * corresponds to the following arguments passed to this method:
+ * <ul>
+ * <li>{@code alignmentX = Component.RIGHT_ALIGNMENT}
+ * <li>{@code alignmentY = Component.TOP_ALIGNMENT}
+ * <li>{@code point = (2, 0)}
+ * </ul>
+ *
+ * @param window the window to set the position of the security warning for
+ * @param alignmentX the horizontal origin of the coordinate system
+ * @param alignmentY the vertical origin of the coordinate system
+ * @param point the position of the security warning in the specified
+ * coordinate system
+ *
+ * @throws NullPointerException if the window argument is null
+ * @throws NullPointerException if the point argument is null
+ * @throws IllegalArgumentException if the window is trusted (i.e.
+ * the {@code getWarningString()} returns null
+ * @throws IllegalArgumentException if the alignmentX or alignmentY
+ * arguments are not within the range [0.0f ... 1.0f]
+ */
+ public static void setPosition(Window window, Point2D point,
+ float alignmentX, float alignmentY)
+ {
+ if (window == null) {
+ throw new NullPointerException(
+ "The window argument should not be null.");
+ }
+ if (window.getWarningString() == null) {
+ throw new IllegalArgumentException(
+ "The window must have a non-null warning string.");
+ }
+ if (point == null) {
+ throw new NullPointerException(
+ "The point argument must not be null");
+ }
+ if (alignmentX < 0.0f || alignmentX > 1.0f) {
+ throw new IllegalArgumentException(
+ "alignmentX must be in the range [0.0f ... 1.0f].");
+ }
+ if (alignmentY < 0.0f || alignmentY > 1.0f) {
+ throw new IllegalArgumentException(
+ "alignmentY must be in the range [0.0f ... 1.0f].");
+ }
+
+ AWTAccessor.getWindowAccessor().setSecurityWarningPosition(window,
+ point, alignmentX, alignmentY);
+ }
+}
+
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKIconFactory.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKIconFactory.java Mon Apr 27 12:33:57 2009 -0700
@@ -279,20 +279,22 @@
public void paintIcon(SynthContext context, Graphics g, int x, int y,
int w, int h) {
- JToolBar toolbar = (JToolBar)context.getComponent();
- Orientation orientation =
- (toolbar.getOrientation() == JToolBar.HORIZONTAL ?
- Orientation.HORIZONTAL : Orientation.VERTICAL);
+ if (context != null) {
+ JToolBar toolbar = (JToolBar)context.getComponent();
+ Orientation orientation =
+ (toolbar.getOrientation() == JToolBar.HORIZONTAL ?
+ Orientation.HORIZONTAL : Orientation.VERTICAL);
- if (style == null) {
- style = SynthLookAndFeel.getStyleFactory().getStyle(
- context.getComponent(), GTKRegion.HANDLE_BOX);
+ if (style == null) {
+ style = SynthLookAndFeel.getStyleFactory().getStyle(
+ context.getComponent(), GTKRegion.HANDLE_BOX);
+ }
+ context = new SynthContext(toolbar, GTKRegion.HANDLE_BOX,
+ style, SynthConstants.ENABLED);
+
+ GTKPainter.INSTANCE.paintIcon(context, g,
+ getMethod(), x, y, w, h, orientation);
}
- context = new SynthContext(toolbar, GTKRegion.HANDLE_BOX,
- style, SynthConstants.ENABLED);
-
- GTKPainter.INSTANCE.paintIcon(context, g,
- getMethod(), x, y, w, h, orientation);
}
public int getIconWidth(SynthContext context) {
@@ -336,12 +338,14 @@
public void paintIcon(SynthContext context, Graphics g, int x, int y,
int w, int h) {
- ArrowType arrowDir = ArrowType.RIGHT;
- if (!context.getComponent().getComponentOrientation().isLeftToRight()) {
- arrowDir = ArrowType.LEFT;
+ if (context != null) {
+ ArrowType arrowDir = ArrowType.RIGHT;
+ if (!context.getComponent().getComponentOrientation().isLeftToRight()) {
+ arrowDir = ArrowType.LEFT;
+ }
+ GTKPainter.INSTANCE.paintIcon(context, g,
+ getMethod(), x, y, w, h, arrowDir);
}
- GTKPainter.INSTANCE.paintIcon(context, g,
- getMethod(), x, y, w, h, arrowDir);
}
}
}
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java Mon Apr 27 12:33:57 2009 -0700
@@ -39,6 +39,8 @@
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.*;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import sun.awt.shell.ShellFolder;
import sun.awt.OSInfo;
@@ -1143,7 +1145,11 @@
File[] baseFolders;
if (useShellFolder) {
- baseFolders = (File[])ShellFolder.get("fileChooserComboBoxFolders");
+ baseFolders = AccessController.doPrivileged(new PrivilegedAction<File[]>() {
+ public File[] run() {
+ return (File[]) ShellFolder.get("fileChooserComboBoxFolders");
+ }
+ });
} else {
baseFolders = fsv.getRoots();
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/nio/sctp/AbstractNotificationHandler.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.nio.sctp;
+
+/**
+ * A skeletal handler that consumes notifications and continues.
+ *
+ * <P> This class trivially implements the {@code handleNotification} methods to
+ * return {@link HandlerResult#CONTINUE CONTINUE} so that all notifications are
+ * consumed and the channel continues to try and receive a message.
+ *
+ * <P> It also provides overloaded versions of the {@code handleNotification}
+ * methods, one for each of the required supported notification types, {@link
+ * AssociationChangeNotification}, {@link PeerAddressChangeNotification},
+ * {@link SendFailedNotification}, and {@link ShutdownNotification}. The
+ * appropriate method will be invoked when the notification is received.
+ *
+ * @since 1.7
+ */
+public class AbstractNotificationHandler<T>
+ implements NotificationHandler<T>
+{
+ /**
+ * Initializes a new instance of this class.
+ */
+ protected AbstractNotificationHandler() {}
+
+ /**
+ * Invoked when an implementation specific notification is received from the
+ * SCTP stack.
+ *
+ * @param notification
+ * The notification
+ *
+ * @param attachment
+ * The object attached to the {@code receive} operation when it was
+ * initiated.
+ *
+ * @return The handler result
+ */
+ @Override
+ public HandlerResult handleNotification(Notification notification,
+ T attachment) {
+ return HandlerResult.CONTINUE;
+ }
+
+ /**
+ * Invoked when an {@link AssociationChangeNotification} is received from
+ * the SCTP stack.
+ *
+ * @param notification
+ * The notification
+ *
+ * @param attachment
+ * The object attached to the {@code receive} operation when it was
+ * initiated.
+ *
+ * @return The handler result
+ */
+ public HandlerResult handleNotification(AssociationChangeNotification notification,
+ T attachment) {
+ return HandlerResult.CONTINUE;
+ }
+
+ /**
+ * Invoked when an {@link PeerAddressChangeNotification} is received from
+ * the SCTP stack.
+ *
+ * @param notification
+ * The notification
+ *
+ * @param attachment
+ * The object attached to the {@code receive} operation when it was
+ * initiated.
+ *
+ * @return The handler result
+ */
+ public HandlerResult handleNotification(PeerAddressChangeNotification notification,
+ T attachment) {
+ return HandlerResult.CONTINUE;
+ }
+
+ /**
+ * Invoked when an {@link SendFailedNotification} is received from
+ * the SCTP stack.
+ *
+ * @param notification
+ * The notification
+ *
+ * @param attachment
+ * The object attached to the {@code receive} operation when it was
+ * initiated.
+ *
+ * @return The handler result
+ */
+ public HandlerResult handleNotification(SendFailedNotification notification,
+ T attachment) {
+ return HandlerResult.CONTINUE;
+ }
+
+ /**
+ * Invoked when an {@link ShutdownNotification} is received from
+ * the SCTP stack.
+ *
+ * @param notification
+ * The notification
+ *
+ * @param attachment
+ * The object attached to the {@code receive} operation when it was
+ * initiated.
+ *
+ * @return The handler result
+ */
+ public HandlerResult handleNotification(ShutdownNotification notification,
+ T attachment) {
+ return HandlerResult.CONTINUE;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/nio/sctp/Association.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.nio.sctp;
+
+/**
+ * A class that represents an SCTP association.
+ *
+ * <P> An association exists between two SCTP endpoints. Each endpoint is
+ * represented by a list of transport addresses through which that endpoint can
+ * be reached and from which it will originate SCTP messages. The association
+ * spans over all of the possible source/destination combinations which may be
+ * generated from each endpoint's lists of addresses.
+ *
+ * <P> Associations are identified by their Association ID.
+ * Association ID's are guaranteed to be unique for the lifetime of the
+ * association. An association ID may be reused after the association has been
+ * shutdown. An association ID is not unique across multiple SCTP channels.
+ * An Association's local and remote addresses may change if the SCTP
+ * implementation supports <I>Dynamic Address Reconfiguration</I> as defined by
+ * <A HREF="http://tools.ietf.org/html/rfc5061">RFC5061</A>, see the
+ * {@code bindAddress} and {@code unbindAddress} methods of {@link SctpChannel},
+ * {@link SctpServerChannel}, and {@link SctpMultiChannel}.
+ *
+ * <P> An {@code Association} is returned from an {@link
+ * SctpChannel#association SctpChannel} or an {@link
+ * SctpMultiChannel#associations SctpMultiChannel}, as well
+ * as being given as a parameter to {@link NotificationHandler
+ * NotificationHandler} methods.
+ *
+ * @since 1.7
+ */
+public class Association {
+ private final int associationID;
+ private final int maxInStreams;
+ private final int maxOutStreams;
+
+ /**
+ * Initializes a new instance of this class.
+ */
+ protected Association(int associationID,
+ int maxInStreams,
+ int maxOutStreams) {
+ this.associationID = associationID;
+ this.maxInStreams = maxInStreams;
+ this.maxOutStreams = maxOutStreams;
+ }
+
+ /**
+ * Returns the associationID.
+ *
+ * @return The association ID
+ */
+ public final int associationID() {
+ return associationID;
+ };
+
+ /**
+ * Returns the maximum number of inbound streams that this association
+ * supports.
+ *
+ * <P> Data received on this association will be on stream number
+ * {@code s}, where {@code 0 <= s < maxInboundStreams()}.
+ *
+ * @return The maximum number of inbound streams
+ */
+ public final int maxInboundStreams() {
+ return maxInStreams;
+ };
+
+ /**
+ * Returns the maximum number of outbound streams that this association
+ * supports.
+ *
+ * <P> Data sent on this association must be on stream number
+ * {@code s}, where {@code 0 <= s < maxOutboundStreams()}.
+ *
+ * @return The maximum number of outbound streams
+ */
+ public final int maxOutboundStreams() {
+ return maxOutStreams;
+ };
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/nio/sctp/AssociationChangeNotification.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.nio.sctp;
+
+/**
+ * Notification emitted when an association has either opened or closed.
+ *
+ * @since 1.7
+ */
+public abstract class AssociationChangeNotification
+ implements Notification
+{
+ /**
+ * Defines the type of change event that happened to the association.
+ *
+ * @since 1.7
+ */
+ public enum AssocChangeEvent
+ {
+ /**
+ * A new association is now ready and data may be exchanged with this peer.
+ */
+ COMM_UP,
+
+ /**
+ * The association has failed. A series of SCTP send failed notifications
+ * will follow this notification, one for each outstanding message.
+ */
+ COMM_LOST,
+
+ /**
+ * SCTP has detected that the peer has restarted.
+ */
+ RESTART,
+
+ /**
+ * The association has gracefully closed.
+ */
+ SHUTDOWN,
+
+ /**
+ * The association failed to setup. If a message was sent on a {@link
+ * SctpMultiChannel} in non-blocking mode, an
+ * SCTP send failed notification will follow this notification for the
+ * outstanding message.
+ */
+ CANT_START
+ }
+
+ /**
+ * Initializes a new instance of this class.
+ */
+ protected AssociationChangeNotification() {}
+
+ /**
+ * Returns the association that this notification is applicable to.
+ *
+ * @return The association whose state has changed, or {@code null} if
+ * there is no association, that is {@linkplain
+ * AssocChangeEvent#CANT_START CANT_START}
+ */
+ public abstract Association association();
+
+ /**
+ * Returns the type of change event.
+ *
+ * @return The event
+ */
+ public abstract AssocChangeEvent event();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/nio/sctp/HandlerResult.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.nio.sctp;
+
+/**
+ * Defines notification handler results.
+ *
+ * <P> The {@code HandlerResult} is used to determine the behavior of the
+ * channel after it handles a notification from the SCTP stack. Essentially its
+ * value determines if the channel should try to receive another notificaiton or
+ * a message before returning.
+ *
+ * @since 1.7
+ */
+public enum HandlerResult {
+ /**
+ * Try to receieve another message or notification.
+ */
+ CONTINUE,
+
+ /**
+ * Return without trying to receive any more data.
+ */
+ RETURN;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/nio/sctp/IllegalReceiveException.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.nio.sctp;
+
+/**
+ * Unchecked exception thrown when an attempt is made to invoke the
+ * {@code receive} method of {@link SctpChannel} or {@link SctpMultiChannel}
+ * from a notification handler.
+ *
+ * @since 1.7
+ */
+public class IllegalReceiveException extends IllegalStateException {
+ private static final long serialVersionUID = 2296619040988576224L;
+
+ /**
+ * Constructs an instance of this class.
+ */
+ public IllegalReceiveException() { }
+
+ /**
+ * Constructs an instance of this class with the specified message.
+ */
+ public IllegalReceiveException(String msg) {
+ super(msg);
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/nio/sctp/IllegalUnbindException.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.nio.sctp;
+
+/**
+ * Unchecked exception thrown when an attempt is made to remove an
+ * address that is not bound to the channel, or remove an address from a
+ * channel that has only one address bound to it.
+ *
+ * @since 1.7
+ */
+public class IllegalUnbindException extends IllegalStateException {
+ private static final long serialVersionUID = -310540883995532224L;
+
+ /**
+ * Constructs an instance of this class.
+ */
+ public IllegalUnbindException() { }
+
+ /**
+ * Constructs an instance of this class with the specified detailed message.
+ */
+ public IllegalUnbindException(String msg) {
+ super(msg);
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/nio/sctp/InvalidStreamException.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.nio.sctp;
+
+/**
+ * Unchecked exception thrown when an attempt is made to send a
+ * message to an invalid stream.
+ *
+ * @since 1.7
+ */
+public class InvalidStreamException extends IllegalArgumentException {
+ private static final long serialVersionUID = -9172703378046665558L;
+
+ /**
+ * Constructs an instance of this class.
+ */
+ public InvalidStreamException() { }
+
+ /**
+ * Constructs an instance of this class with the specified detailed message.
+ */
+ public InvalidStreamException(String msg) {
+ super(msg);
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/nio/sctp/MessageInfo.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,303 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.nio.sctp;
+
+import java.net.SocketAddress;
+
+/**
+ * The {@code MessageInfo} class provides additional ancillary information about
+ * messages.
+ *
+ * <P> Received SCTP messages, returned by
+ * {@link SctpChannel#receive SctpChannel.receive} and {@link
+ * SctpMultiChannel#receive SctpMultiChannel.receive},
+ * return a {@code MessageInfo} instance that can be queried to determine
+ * ancillary information about the received message. Messages being sent should
+ * use one of the {@link #createOutgoing(java.net.SocketAddress,int)
+ * createOutgoing} methods to provide ancillary data for the message being
+ * sent, and may use the appropriate setter methods to override the default
+ * values provided for {@link #isUnordered() unordered}, {@link #timeToLive()
+ * timeToLive}, {@link #isComplete() complete} and {@link #payloadProtocolID()
+ * payloadProtocolID}, before sending the message.
+ *
+ * <P> For out going messages the {@code timeToLive} parameter is a time period
+ * that the sending side SCTP stack may expire the message if it has not been
+ * sent. This time period is an indication to the stack that the message is no
+ * longer required to be sent after the time period expires. It is not a hard
+ * timeout and may be influenced by whether the association supports the partial
+ * reliability extension, <a href=http://www.ietf.org/rfc/rfc3758.txt>RFC 3758
+ * <a>
+ *
+ * <P> {@code MessageInfo} instances are not safe for use by multiple concurrent
+ * threads. If a MessageInfo is to be used by more than one thread then access
+ * to the MessageInfo should be controlled by appropriate synchronization.
+ *
+ * @since 1.7
+ */
+public abstract class MessageInfo {
+ /**
+ * Initializes a new instance of this class.
+ */
+ protected MessageInfo() {}
+
+ /**
+ * Creates a {@code MessageInfo} instance suitable for use when
+ * sending a message.
+ *
+ * <P> The returned instance will have its {@link #isUnordered() unordered}
+ * value set to {@code false}, its {@link #timeToLive() timeToLive} value
+ * set to {@code 0}, its {@link #isComplete() complete} value set
+ * to {@code true}, and its {@link #payloadProtocolID() payloadProtocolID}
+ * value set to {@code 0}. These values, if required, can be set through
+ * the appropriate setter method before sending the message.
+ *
+ * @param address
+ * For a connected {@code SctpChannel} the address is the
+ * preferred peer address of the association to send the message
+ * to, or {@code null} to use the peer primary address. For an
+ * {@code SctpMultiChannel} the address is used to determine
+ * the association, or if no association exists with a peer of that
+ * address then one is setup.
+ *
+ * @param streamNumber
+ * The stream number that the message will be sent on
+ *
+ * @return The outgoing message info
+ *
+ * @throws IllegalArgumentException
+ * If the streamNumber is negative or greater than {@code 65536}
+ */
+ public static MessageInfo createOutgoing(SocketAddress address,
+ int streamNumber) {
+ if (streamNumber < 0 || streamNumber > 65536)
+ throw new IllegalArgumentException("Invalid stream number");
+
+ return new sun.nio.ch.SctpMessageInfoImpl(null, address, streamNumber);
+ }
+ /**
+ * Creates a {@code MessageInfo} instance suitable for use when
+ * sending a message to a given association. Typically used for
+ * {@code SctpMultiChannel} when an association has already been setup.
+ *
+ * <P> The returned instance will have its {@link #isUnordered() unordered}
+ * value set to {@code false}, its {@link #timeToLive() timeToLive} value
+ * set to {@code 0}, its {@link #isComplete() complete} value set
+ * to {@code true}, and its {@link #payloadProtocolID() payloadProtocolID}
+ * value set to {@code 0}. These values, if required, can be set through
+ * the appropriate setter method before sending the message.
+ *
+ * @param association
+ * The association to send the message on
+ *
+ * @param address
+ * The preferred peer address of the association to send the message
+ * to, or {@code null} to use the peer primary address
+ *
+ * @param streamNumber
+ * The stream number that the message will be sent on.
+ *
+ * @return The outgoing message info
+ *
+ * @throws IllegalArgumentException
+ * If {@code association} is {@code null}, or the streamNumber is
+ * negative or greater than {@code 65536}
+ */
+ public static MessageInfo createOutgoing(Association association,
+ SocketAddress address,
+ int streamNumber) {
+ if (association == null)
+ throw new IllegalArgumentException("association cannot be null");
+
+ if (streamNumber < 0 || streamNumber > 65536)
+ throw new IllegalArgumentException("Invalid stream number");
+
+ return new sun.nio.ch.SctpMessageInfoImpl(association, address,
+ streamNumber);
+ }
+
+ /**
+ * Returns the source socket address if the message has been received,
+ * otherwise the preferred destination of the message to be sent.
+ *
+ * @return The socket address, or {@code null} if this instance is to be
+ * used for sending a message and has been construced without
+ * specifying a preferred destination address
+ *
+ */
+ public abstract SocketAddress address();
+
+ /**
+ * Returns the association that the message was received on, if the message
+ * has been received, otherwise the association that the message is to be
+ * sent on.
+ *
+ * @return The association, or {@code null} if this instance is to be
+ * used for sending a message and has been construced using the
+ * the {@link #createOutgoing(SocketAddress,int)
+ * createOutgoing(SocketAddress,int)} static factory method
+ */
+ public abstract Association association();
+
+ /**
+ * Returns the number of bytes read for the received message.
+ *
+ * <P> This method is only appicable for received messages, it has no
+ * meaning for messages being sent.
+ *
+ * @return The number of bytes read, {@code -1} if the channel is an {@link
+ * SctpChannel} that has reached end-of-stream, otherwise
+ * {@code 0}
+ */
+ public abstract int bytes();
+
+ /**
+ * Tells whether or not the message is complete.
+ *
+ * <P> For received messages {@code true} indicates that the message was
+ * completely received. For messages being sent {@code true} indicates that
+ * the message is complete, {@code false} indicates that the message is not
+ * complete. How the send channel interprets this value depends on the value
+ * of its {@link SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE
+ * SCTP_EXPLICIT_COMPLETE} socket option.
+ *
+ * @return {@code true} if, and only if, the message is complete
+ */
+ public abstract boolean isComplete();
+
+ /**
+ * Sets whether or not the message is complete.
+ *
+ * <P> For messages being sent {@code true} indicates that
+ * the message is complete, {@code false} indicates that the message is not
+ * complete. How the send channel interprets this value depends on the value
+ * of its {@link SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE
+ * SCTP_EXPLICIT_COMPLETE} socket option.
+ *
+ * @param complete
+ * {@code true} if, and only if, the message is complete
+ *
+ * @return This MessageInfo
+ *
+ * @see MessageInfo#isComplete()
+ */
+ public abstract MessageInfo complete(boolean complete);
+
+ /**
+ * Tells whether or not the message is unordered. For received messages
+ * {@code true} indicates that the message was sent non-ordered. For
+ * messages being sent {@code true} requests the un-ordered delivery of the
+ * message, {@code false} indicates that the message is ordered.
+ *
+ * @return {@code true} if the message is unordered, otherwise
+ * {@code false}
+ */
+ public abstract boolean isUnordered();
+
+ /**
+ * Sets whether or not the message is unordered.
+ *
+ * @param unordered
+ * {@code true} requests the un-ordered delivery of the message,
+ * {@code false} indicates that the message is ordered.
+ *
+ * @return This MessageInfo
+ *
+ * @see MessageInfo#isUnordered()
+ */
+ public abstract MessageInfo unordered(boolean unordered);
+
+ /**
+ * Returns the payload protocol Identifier.
+ *
+ * <P> A value indicating the type of payload protocol data being
+ * transmitted/received. This value is passed as opaque data by SCTP.
+ * {@code 0} indicates an unspecified payload protocol identifier.
+ *
+ * @return The Payload Protocol Identifier
+ */
+ public abstract int payloadProtocolID();
+
+ /**
+ * Sets the payload protocol Identifier.
+ *
+ * <P> A value indicating the type of payload protocol data being
+ * transmitted. This value is passed as opaque data by SCTP.
+ *
+ * @param ppid
+ * The Payload Protocol Identifier, or {@code 0} indicate an
+ * unspecified payload protocol identifier.
+ *
+ * @return This MessageInfo
+ *
+ * @see MessageInfo#payloadProtocolID()
+ */
+ public abstract MessageInfo payloadProtocolID(int ppid);
+
+ /**
+ * Returns the stream number that the message was received on, if the
+ * message has been received, otherwise the stream number that the message
+ * is to be sent on.
+ *
+ * @return The stream number
+ */
+ public abstract int streamNumber();
+
+ /**
+ * Sets the stream number that the message is to be sent on.
+ *
+ * @param streamNumber
+ * The stream number
+ *
+ * @throws IllegalArgumentException
+ * If the streamNumber is negative or greater than {@code 65536}
+ *
+ * @return This MessageInfo
+ */
+ public abstract MessageInfo streamNumber(int streamNumber);
+
+ /**
+ * The time period that the sending side may expire the message if it has
+ * not been sent, or {@code 0} to indicate that no timeout should occur. This
+ * value is only applicable for messages being sent, it has no meaning for
+ * received messages.
+ *
+ * @return The time period in milliseconds, or {@code 0}
+ */
+ public abstract long timeToLive();
+
+ /**
+ * Sets the time period that the sending side may expire the message if it
+ * has not been sent.
+ *
+ * @param millis
+ * The time period in milliseconds, or {@code 0} to indicate that no
+ * timeout should occur
+ *
+ * @return This MessageInfo
+ *
+ * @see MessageInfo#timeToLive()
+ */
+ public abstract MessageInfo timeToLive(long millis);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/nio/sctp/Notification.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.nio.sctp;
+
+/**
+ * A notification from the SCTP stack.
+ *
+ * <P> Objects of this type are passed to the {@link NotificationHandler} when
+ * a notification is received.
+ *
+ * <P> An SCTP channel supports the following notifications: {@link
+ * AssociationChangeNotification}, {@link PeerAddressChangeNotification},
+ * {@link SendFailedNotification}, {@link ShutdownNotification}, and may support
+ * additional implementation specific notifications.
+ *
+ * @since 1.7
+ */
+public interface Notification {
+ /**
+ * Returns the association that this notification is applicable to.
+ */
+ public Association association();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/nio/sctp/NotificationHandler.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.nio.sctp;
+
+/**
+ * A handler for consuming notifications from the SCTP stack.
+ *
+ * <P> The SCTP channels defined in this package allow a notification handler to
+ * be specified to consume notifications from the SCTP stack. When a
+ * notification is received the {@linkplain #handleNotification
+ * handleNotification} method of the handler is invoked to handle that
+ * notification.
+ *
+ * <P> Additionally, an attachment object can be attached to the {@code receive}
+ * operation to provide context when consuming the notification. The
+ * attachment is important for cases where a <i>state-less</i> {@code
+ * NotificationHandler} is used to consume the result of many {@code receive}
+ * operations.
+ *
+ * <P> Handler implementations are encouraged to extend the {@link
+ * AbstractNotificationHandler} class which implements this interface and
+ * provide notification specific methods. However, an API should generally use
+ * this handler interface as the type for parameters, return type, etc. rather
+ * than the abstract class.
+ *
+ * @param T The type of the object attached to the receive operation
+ *
+ * @since 1.7
+ */
+public interface NotificationHandler<T> {
+ /**
+ * Invoked when a notification is received from the SCTP stack.
+ *
+ * @param notification
+ * The notification
+ *
+ * @param attachment
+ * The object attached to the receive operation when it was initiated.
+ *
+ * @return The handler result
+ */
+ HandlerResult handleNotification(Notification notification, T attachment);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/nio/sctp/PeerAddressChangeNotification.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.nio.sctp;
+
+import java.net.SocketAddress;
+
+/**
+ * Notification emitted when a destination address on a multi-homed peer
+ * encounters a change.
+ *
+ * @since 1.7
+ */
+public abstract class PeerAddressChangeNotification
+ implements Notification
+{
+ /**
+ * Defines the type of address change event that occurred to the destination
+ * address on a multi-homed peer when it encounters a change of interface
+ * details.
+ *
+ * <P> Some of these events types are only generated when the association
+ * supports dynamic address reconfiguration, e.g. {@code SCTP_ADDR_ADDED},
+ * {@code SCTP_ADDR_REMOVED}, etc.
+ *
+ * @since 1.7
+ */
+ public enum AddressChangeEvent {
+ /**
+ * This address is now reachable.
+ */
+ ADDR_AVAILABLE,
+
+ /**
+ * The address specified can no longer be reached. Any data sent to this
+ * address is rerouted to an alternate until this address becomes reachable.
+ */
+ ADDR_UNREACHABLE,
+
+ /**
+ * The address is no longer part of the association.
+ */
+ ADDR_REMOVED,
+
+ /**
+ * The address is now part of the association.
+ */
+ ADDR_ADDED,
+
+ /**
+ * This address has now been made to be the primary destination address.
+ */
+ ADDR_MADE_PRIMARY,
+
+ /**
+ * This address has now been confirmed as a valid address.
+ */
+ ADDR_CONFIRMED;
+ }
+
+ /**
+ * Initializes a new instance of this class.
+ */
+ protected PeerAddressChangeNotification() {}
+
+ /**
+ * Returns the peer address.
+ *
+ * @return The peer address
+ */
+ public abstract SocketAddress address();
+
+ /**
+ * Returns the association that this notification is applicable to.
+ *
+ * @return The association whose peer address changed
+ */
+ public abstract Association association();
+
+ /**
+ * Returns the type of change event.
+ *
+ * @return The event
+ */
+ public abstract AddressChangeEvent event();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/nio/sctp/SctpChannel.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,859 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.nio.sctp;
+
+import java.net.SocketAddress;
+import java.net.InetAddress;
+import java.io.IOException;
+import java.util.Set;
+import java.nio.ByteBuffer;
+import java.nio.channels.spi.AbstractSelectableChannel;
+import java.nio.channels.spi.SelectorProvider;
+import java.nio.channels.ClosedChannelException;
+import java.nio.channels.SelectionKey;
+
+/**
+ * A selectable channel for message-oriented connected SCTP sockets.
+ *
+ * <P> An SCTP channel can only control one SCTP association.
+ * An {@code SCTPChannel} is created by invoking one of the
+ * {@link #open open} methods of this class. A newly-created channel is open but
+ * not yet connected, that is, there is no association setup with a remote peer.
+ * An attempt to invoke an I/O operation upon an unconnected
+ * channel will cause a {@link java.nio.channels.NotYetConnectedException} to be
+ * thrown. An association can be setup by connecting the channel using one of
+ * its {@link #connect connect} methods. Once connected, the channel remains
+ * connected until it is closed. Whether or not a channel is connected may be
+ * determined by invoking {@link #getRemoteAddresses getRemoteAddresses}.
+ *
+ * <p> SCTP channels support <i>non-blocking connection:</i> A
+ * channel may be created and the process of establishing the link to
+ * the remote socket may be initiated via the {@link #connect connect} method
+ * for later completion by the {@link #finishConnect finishConnect} method.
+ * Whether or not a connection operation is in progress may be determined by
+ * invoking the {@link #isConnectionPending isConnectionPending} method.
+ *
+ * <p> Socket options are configured using the
+ * {@link #setOption(SctpSocketOption,Object) setOption} method. An SCTP
+ * channel support the following options:
+ * <blockquote>
+ * <table border>
+ * <tr>
+ * <th>Option Name</th>
+ * <th>Description</th>
+ * </tr>
+ * <tr>
+ * <td> {@link SctpStandardSocketOption#SCTP_DISABLE_FRAGMENTS
+ * SCTP_DISABLE_FRAGMENTS} </td>
+ * <td> Enables or disables message fragmentation </td>
+ * </tr>
+ * <tr>
+ * <td> {@link SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE
+ * SCTP_EXPLICIT_COMPLETE} </td>
+ * <td> Enables or disables explicit message completion </td>
+ * </tr>
+ * <tr>
+ * <td> {@link SctpStandardSocketOption#SCTP_FRAGMENT_INTERLEAVE
+ * SCTP_FRAGMENT_INTERLEAVE} </td>
+ * <td> Controls how the presentation of messages occur for the message
+ * receiver </td>
+ * </tr>
+ * <tr>
+ * <td> {@link SctpStandardSocketOption#SCTP_INIT_MAXSTREAMS
+ * SCTP_INIT_MAXSTREAMS} </td>
+ * <td> The maximum number of streams requested by the local endpoint during
+ * association initialization </td>
+ * </tr>
+ * <tr>
+ * <td> {@link SctpStandardSocketOption#SCTP_NODELAY SCTP_NODELAY} </td>
+ * <td> Enables or disable a Nagle-like algorithm </td>
+ * </tr>
+ * <tr>
+ * <td> {@link SctpStandardSocketOption#SCTP_PRIMARY_ADDR
+ * SCTP_PRIMARY_ADDR} </td>
+ * <td> Requests that the local SCTP stack use the given peer address as the
+ * association primary </td>
+ * </tr>
+ * <tr>
+ * <td> {@link SctpStandardSocketOption#SCTP_SET_PEER_PRIMARY_ADDR
+ * SCTP_SET_PEER_PRIMARY_ADDR} </td>
+ * <td> Requests that the peer mark the enclosed address as the association
+ * primary </td>
+ * </tr>
+ * <tr>
+ * <td> {@link SctpStandardSocketOption#SO_SNDBUF
+ * SO_SNDBUF} </td>
+ * <td> The size of the socket send buffer </td>
+ * </tr>
+ * <tr>
+ * <td> {@link SctpStandardSocketOption#SO_RCVBUF
+ * SO_RCVBUF} </td>
+ * <td> The size of the socket receive buffer </td>
+ * </tr>
+ * <tr>
+ * <td> {@link SctpStandardSocketOption#SO_LINGER
+ * SO_LINGER} </td>
+ * <td> Linger on close if data is present (when configured in blocking mode
+ * only) </td>
+ * </tr>
+ * </table>
+ * </blockquote>
+ * Additional (implementation specific) options may also be supported. The list
+ * of options supported is obtained by invoking the {@link #supportedOptions()
+ * supportedOptions} method.
+ *
+ * <p> SCTP channels are safe for use by multiple concurrent threads.
+ * They support concurrent reading and writing, though at most one thread may be
+ * reading and at most one thread may be writing at any given time. The
+ * {@link #connect connect} and {@link #finishConnect
+ * finishConnect} methods are mutually synchronized against each other, and
+ * an attempt to initiate a send or receive operation while an invocation of one
+ * of these methods is in progress will block until that invocation is complete.
+ *
+ * @since 1.7
+ */
+public abstract class SctpChannel
+ extends AbstractSelectableChannel
+{
+ /**
+ * Initializes a new instance of this class.
+ *
+ * @param provider
+ * The selector provider for this channel
+ */
+ protected SctpChannel(SelectorProvider provider) {
+ super(provider);
+ }
+
+ /**
+ * Opens an SCTP channel.
+ *
+ * <P> The new channel is unbound and unconnected.
+ *
+ * @return A new SCTP channel
+ *
+ * @throws UnsupportedOperationException
+ * If the SCTP protocol is not supported
+ *
+ * @throws IOException
+ * If an I/O error occurs
+ */
+ public static SctpChannel open() throws
+ IOException {
+ return new sun.nio.ch.SctpChannelImpl((SelectorProvider)null);
+ }
+
+ /**
+ * Opens an SCTP channel and connects it to a remote address.
+ *
+ * <P> This is a convenience method and is equivalent to evaluating the
+ * following expression:
+ * <blockquote><pre>
+ * open().connect(remote, maxOutStreams, maxInStreams);
+ * </pre></blockquote>
+ *
+ * @param remote
+ * The remote address to which the new channel is to be connected
+ *
+ * @param maxOutStreams
+ * The number of streams that the application wishes to be able
+ * to send to. Must be non negative and no larger than {@code 65536}.
+ * {@code 0} to use the endpoints default value.
+ *
+ * @param maxInStreams
+ * The maximum number of inbound streams the application is prepared
+ * to support. Must be non negative and no larger than {@code 65536}.
+ * {@code 0} to use the endpoints default value.
+ *
+ * @return A new SCTP channel connected to the given address
+ *
+ * @throws java.nio.channels.AsynchronousCloseException
+ * If another thread closes this channel
+ * while the connect operation is in progress
+ *
+ * @throws java.nio.channels.ClosedByInterruptException
+ * If another thread interrupts the current thread
+ * while the connect operation is in progress, thereby
+ * closing the channel and setting the current thread's
+ * interrupt status
+ *
+ * @throws java.nio.channels.UnresolvedAddressException
+ * If the given remote address is not fully resolved
+ *
+ * @throws java.nio.channels.UnsupportedAddressTypeException
+ * If the type of the given remote address is not supported
+ *
+ * @throws SecurityException
+ * If a security manager has been installed
+ * and it does not permit access to the given remote peer
+ *
+ * @throws UnsupportedOperationException
+ * If the SCTP protocol is not supported
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public static SctpChannel open(SocketAddress remote, int maxOutStreams,
+ int maxInStreams) throws IOException {
+ SctpChannel ssc = SctpChannel.open();
+ ssc.connect(remote, maxOutStreams, maxInStreams);
+ return ssc;
+ }
+
+ /**
+ * Returns the association on this channel's socket.
+ *
+ * @return the association, or {@code null} if the channel's socket is not
+ * connected.
+ *
+ * @throws ClosedChannelException
+ * If the channel is closed
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public abstract Association association() throws IOException;
+
+ /**
+ * Binds the channel's socket to a local address.
+ *
+ * <P> This method is used to establish a relationship between the socket
+ * and the local addresses. Once a relationship is established then
+ * the socket remains bound until the channel is closed. This relationship
+ * may not necesssarily be with the address {@code local} as it may be removed
+ * by {@link #unbindAddress unbindAddress}, but there will always be at least
+ * one local address bound to the channel's socket once an invocation of
+ * this method successfully completes.
+ *
+ * <P> Once the channel's socket has been successfully bound to a specific
+ * address, that is not automatically assigned, more addresses
+ * may be bound to it using {@link #bindAddress bindAddress}, or removed
+ * using {@link #unbindAddress unbindAddress}.
+ *
+ * @param local
+ * The local address to bind the socket, or {@code null} to
+ * bind the socket to an automatically assigned socket address
+ *
+ * @return This channel
+ *
+ * @throws java.nio.channels.AlreadyConnectedException
+ * If this channel is already connected
+ *
+ * @throws java.nio.channels.ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws java.nio.channels.ConnectionPendingException
+ * If a non-blocking connection operation is already in progress on this channel
+ *
+ * @throws java.nio.channels.AlreadyBoundException
+ * If this channel is already bound
+ *
+ * @throws java.nio.channels.UnsupportedAddressTypeException
+ * If the type of the given address is not supported
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public abstract SctpChannel bind(SocketAddress local)
+ throws IOException;
+
+ /**
+ * Adds the given address to the bound addresses for the channel's
+ * socket.
+ *
+ * <P> The given address must not be the {@link
+ * java.net.InetAddress#isAnyLocalAddress wildcard} address.
+ * The channel must be first bound using {@link #bind bind} before
+ * invoking this method, otherwise {@link
+ * java.nio.channels.NotYetBoundException} is thrown. The {@link #bind bind}
+ * method takes a {@code SocketAddress} as its argument which typically
+ * contains a port number as well as an address. Addresses subquently bound
+ * using this method are simply addresses as the SCTP port number remains
+ * the same for the lifetime of the channel.
+ *
+ * <P> Adding addresses to a connected association is optional functionality.
+ * If the endpoint supports dynamic address reconfiguration then it may
+ * send the appropriate message to the peer to change the peers address
+ * lists.
+ *
+ * @param address
+ * The address to add to the bound addresses for the socket
+ *
+ * @return This channel
+ *
+ * @throws java.nio.channels.ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws java.nio.channels.ConnectionPendingException
+ * If a non-blocking connection operation is already in progress on
+ * this channel
+ *
+ * @throws java.nio.channels.NotYetBoundException
+ * If this channel is not yet bound
+ *
+ * @throws java.nio.channels.AlreadyBoundException
+ * If this channel is already bound to the given address
+ *
+ * @throws IllegalArgumentException
+ * If address is {@code null} or the {@link
+ * java.net.InetAddress#isAnyLocalAddress wildcard} address
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public abstract SctpChannel bindAddress(InetAddress address)
+ throws IOException;
+
+ /**
+ * Removes the given address from the bound addresses for the channel's
+ * socket.
+ *
+ * <P> The given address must not be the {@link
+ * java.net.InetAddress#isAnyLocalAddress wildcard} address.
+ * The channel must be first bound using {@link #bind bind} before
+ * invoking this method, otherwise {@link java.nio.channels.NotYetBoundException}
+ * is thrown. If this method is invoked on a channel that does not have
+ * {@code address} as one of its bound addresses or that has only one
+ * local address bound to it, then this method throws
+ * {@link IllegalUnbindException}.
+ * The initial address that the channel's socket is bound to using {@link
+ * #bind bind} may be removed from the bound addresses for the channel's socket.
+ *
+ * <P> Removing addresses from a connected association is optional
+ * functionality. If the endpoint supports dynamic address reconfiguration
+ * then it may send the appropriate message to the peer to change the peers
+ * address lists.
+ *
+ * @param address
+ * The address to remove from the bound addresses for the socket
+ *
+ * @return This channel
+ *
+ * @throws java.nio.channels.ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws java.nio.channels.ConnectionPendingException
+ * If a non-blocking connection operation is already in progress on
+ * this channel
+ *
+ * @throws java.nio.channels.NotYetBoundException
+ * If this channel is not yet bound
+ *
+ * @throws IllegalArgumentException
+ * If address is {@code null} or the {@link
+ * java.net.InetAddress#isAnyLocalAddress wildcard} address
+ *
+ * @throws IllegalUnbindException
+ * If {@code address} is not bound to the channel's socket. or
+ * the channel has only one address bound to it
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public abstract SctpChannel unbindAddress(InetAddress address)
+ throws IOException;
+
+ /**
+ * Connects this channel's socket.
+ *
+ * <P> If this channel is in non-blocking mode then an invocation of this
+ * method initiates a non-blocking connection operation. If the connection
+ * is established immediately, as can happen with a local connection, then
+ * this method returns {@code true}. Otherwise this method returns
+ * {@code false} and the connection operation must later be completed by
+ * invoking the {@link #finishConnect finishConnect} method.
+ *
+ * <P> If this channel is in blocking mode then an invocation of this
+ * method will block until the connection is established or an I/O error
+ * occurs.
+ *
+ * <P> If a security manager has been installed then this method verifies
+ * that its {@link java.lang.SecurityManager#checkConnect checkConnect}
+ * method permits connecting to the address and port number of the given
+ * remote peer.
+ *
+ * <p> This method may be invoked at any time. If a {@link #send send} or
+ * {@link #receive receive} operation upon this channel is invoked while an
+ * invocation of this method is in progress then that operation will first
+ * block until this invocation is complete. If a connection attempt is
+ * initiated but fails, that is, if an invocation of this method throws a
+ * checked exception, then the channel will be closed.
+ *
+ * @param remote
+ * The remote peer to which this channel is to be connected
+ *
+ * @return {@code true} if a connection was established, {@code false} if
+ * this channel is in non-blocking mode and the connection
+ * operation is in progress
+ *
+ * @throws java.nio.channels.AlreadyConnectedException
+ * If this channel is already connected
+ *
+ * @throws java.nio.channels.ConnectionPendingException
+ * If a non-blocking connection operation is already in progress on
+ * this channel
+ *
+ * @throws java.nio.channels.ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws java.nio.channels.AsynchronousCloseException
+ * If another thread closes this channel
+ * while the connect operation is in progress
+ *
+ * @throws java.nio.channels.ClosedByInterruptException
+ * If another thread interrupts the current thread
+ * while the connect operation is in progress, thereby
+ * closing the channel and setting the current thread's
+ * interrupt status
+ *
+ * @throws java.nio.channels.UnresolvedAddressException
+ * If the given remote address is not fully resolved
+ *
+ * @throws java.nio.channels.UnsupportedAddressTypeException
+ * If the type of the given remote address is not supported
+ *
+ * @throws SecurityException
+ * If a security manager has been installed
+ * and it does not permit access to the given remote peer
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public abstract boolean connect(SocketAddress remote) throws IOException;
+
+ /**
+ * Connects this channel's socket.
+ *
+ * <P> This is a convience method and is equivalent to evaluating the
+ * following expression:
+ * <blockquote><pre>
+ * setOption(SctpStandardSocketOption.SCTP_INIT_MAXSTREAMS, SctpStandardSocketOption.InitMaxStreams.create(maxInStreams, maxOutStreams))
+ * .connect(remote);
+ * </pre></blockquote>
+ *
+ * <P> The {@code maxOutStreams} and {@code maxInStreams} parameters
+ * represent the maximum number of streams that the application wishes to be
+ * able to send to and receive from. They are negotiated with the remote
+ * peer and may be limited by the operating system.
+ *
+ * @param remote
+ * The remote peer to which this channel is to be connected
+ *
+ * @param maxOutStreams
+ * Must be non negative and no larger than {@code 65536}.
+ * {@code 0} to use the endpoints default value.
+ *
+ * @param maxInStreams
+ * Must be non negative and no larger than {@code 65536}.
+ * {@code 0} to use the endpoints default value.
+ *
+ * @return {@code true} if a connection was established, {@code false} if
+ * this channel is in non-blocking mode and the connection operation
+ * is in progress
+ *
+ * @throws java.nio.channels.AlreadyConnectedException
+ * If this channel is already connected
+ *
+ * @throws java.nio.channels.ConnectionPendingException
+ * If a non-blocking connection operation is already in progress on
+ * this channel
+ *
+ * @throws java.nio.channels.ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws java.nio.channels.AsynchronousCloseException
+ * If another thread closes this channel
+ * while the connect operation is in progress
+ *
+ * @throws java.nio.channels.ClosedByInterruptException
+ * If another thread interrupts the current thread
+ * while the connect operation is in progress, thereby
+ * closing the channel and setting the current thread's
+ * interrupt status
+ *
+ * @throws java.nio.channels.UnresolvedAddressException
+ * If the given remote address is not fully resolved
+ *
+ * @throws java.nio.channels.UnsupportedAddressTypeException
+ * If the type of the given remote address is not supported
+ *
+ * @throws SecurityException
+ * If a security manager has been installed
+ * and it does not permit access to the given remote peer
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public abstract boolean connect(SocketAddress remote,
+ int maxOutStreams,
+ int maxInStreams)
+ throws IOException;
+
+ /**
+ * Tells whether or not a connection operation is in progress on this channel.
+ *
+ * @return {@code true} if, and only if, a connection operation has been initiated
+ * on this channel but not yet completed by invoking the
+ * {@link #finishConnect} method
+ */
+ public abstract boolean isConnectionPending();
+
+ /**
+ * Finishes the process of connecting an SCTP channel.
+ *
+ * <P> A non-blocking connection operation is initiated by placing a socket
+ * channel in non-blocking mode and then invoking one of its {@link #connect
+ * connect} methods. Once the connection is established, or the attempt has
+ * failed, the channel will become connectable and this method may
+ * be invoked to complete the connection sequence. If the connection
+ * operation failed then invoking this method will cause an appropriate
+ * {@link java.io.IOException} to be thrown.
+ *
+ * <P> If this channel is already connected then this method will not block
+ * and will immediately return <tt>true</tt>. If this channel is in
+ * non-blocking mode then this method will return <tt>false</tt> if the
+ * connection process is not yet complete. If this channel is in blocking
+ * mode then this method will block until the connection either completes
+ * or fails, and will always either return <tt>true</tt> or throw a checked
+ * exception describing the failure.
+ *
+ * <P> This method may be invoked at any time. If a {@link #send send} or {@link #receive receive}
+ * operation upon this channel is invoked while an invocation of this
+ * method is in progress then that operation will first block until this
+ * invocation is complete. If a connection attempt fails, that is, if an
+ * invocation of this method throws a checked exception, then the channel
+ * will be closed.
+ *
+ * @return {@code true} if, and only if, this channel's socket is now
+ * connected
+ *
+ * @throws java.nio.channels.NoConnectionPendingException
+ * If this channel is not connected and a connection operation
+ * has not been initiated
+ *
+ * @throws java.nio.channels.ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws java.nio.channels.AsynchronousCloseException
+ * If another thread closes this channel
+ * while the connect operation is in progress
+ *
+ * @throws java.nio.channels.ClosedByInterruptException
+ * If another thread interrupts the current thread
+ * while the connect operation is in progress, thereby
+ * closing the channel and setting the current thread's
+ * interrupt status
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public abstract boolean finishConnect() throws IOException;
+
+ /**
+ * Returns all of the socket addresses to which this channel's socket is
+ * bound.
+ *
+ * @return All the socket addresses that this channel's socket is
+ * bound to, or an empty {@code Set} if the channel's socket is not
+ * bound
+ *
+ * @throws ClosedChannelException
+ * If the channel is closed
+ *
+ * @throws IOException
+ * If an I/O error occurs
+ */
+ public abstract Set<SocketAddress> getAllLocalAddresses()
+ throws IOException;
+
+ /**
+ * Returns all of the remote addresses to which this channel's socket
+ * is connected.
+ *
+ * <P> If the channel is connected to a remote peer that is bound to
+ * multiple addresses then it is these addresses that the channel's socket
+ * is connected.
+ *
+ * @return All of the remote addresses to which this channel's socket
+ * is connected, or an empty {@code Set} if the channel's socket is
+ * not connected
+ *
+ * @throws ClosedChannelException
+ * If the channel is closed
+ *
+ * @throws IOException
+ * If an I/O error occurs
+ */
+ public abstract Set<SocketAddress> getRemoteAddresses()
+ throws IOException;
+
+ /**
+ * Shutdown a connection without closing the channel.
+ *
+ * <P> Sends a shutdown command to the remote peer, effectively preventing
+ * any new data from being written to the socket by either peer. Further
+ * sends will throw {@link java.nio.channels.ClosedChannelException}. The
+ * channel remains open to allow the for any data (and notifications) to be
+ * received that may have been sent by the peer before it received the
+ * shutdown command. If the channel is already shutdown then invoking this
+ * method has no effect.
+ *
+ * @return This channel
+ *
+ * @throws java.nio.channels.NotYetConnectedException
+ * If this channel is not yet connected
+ *
+ * @throws java.nio.channels.ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public abstract SctpChannel shutdown() throws IOException;
+
+ /**
+ * Returns the value of a socket option.
+ *
+ * @param name
+ * The socket option
+ *
+ * @return The value of the socket option. A value of {@code null} may be
+ * a valid value for some socket options.
+ *
+ * @throws UnsupportedOperationException
+ * If the socket option is not supported by this channel
+ *
+ * @throws ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws IOException
+ * If an I/O error occurs
+ *
+ * @see SctpStandardSocketOption
+ */
+ public abstract <T> T getOption(SctpSocketOption<T> name)
+ throws IOException;
+
+ /**
+ * Sets the value of a socket option.
+ *
+ * @param name
+ * The socket option
+ *
+ * @param value
+ * The value of the socket option. A value of {@code null} may be
+ * a valid value for some socket options.
+ *
+ * @return This channel
+ *
+ * @throws UnsupportedOperationException
+ * If the socket option is not supported by this channel
+ *
+ * @throws IllegalArgumentException
+ * If the value is not a valid value for this socket option
+ *
+ * @throws ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws IOException
+ * If an I/O error occurs
+ *
+ * @see SctpStandardSocketOption
+ */
+ public abstract <T> SctpChannel setOption(SctpSocketOption<T> name, T value)
+ throws IOException;
+
+ /**
+ * Returns a set of the socket options supported by this channel.
+ *
+ * <P> This method will continue to return the set of options even after the
+ * channel has been closed.
+ *
+ * @return A set of the socket options supported by this channel
+ */
+ public abstract Set<SctpSocketOption<?>> supportedOptions();
+
+ /**
+ * Returns an operation set identifying this channel's supported operations.
+ *
+ * <P> SCTP channels support connecting, reading, and writing, so this
+ * method returns <tt>(</tt>{@link SelectionKey#OP_CONNECT}
+ * <tt>|</tt> {@link SelectionKey#OP_READ} <tt>|</tt> {@link
+ * SelectionKey#OP_WRITE}<tt>)</tt>. </p>
+ *
+ * @return The valid-operation set
+ */
+ @Override
+ public final int validOps() {
+ return (SelectionKey.OP_READ |
+ SelectionKey.OP_WRITE |
+ SelectionKey.OP_CONNECT);
+ }
+
+ /**
+ * Receives a message into the given buffer and/or handles a notification.
+ *
+ * <P> If a message or notification is immediately available, or if this
+ * channel is in blocking mode and one eventually becomes available, then
+ * the message or notification is returned or handled, respectively. If this
+ * channel is in non-blocking mode and a message or notification is not
+ * immediately available then this method immediately returns {@code null}.
+ *
+ * <P> If this method receives a message it is copied into the given byte
+ * buffer. The message is transferred into the given byte buffer starting at
+ * its current position and the buffers position is incremented by the
+ * number of bytes read. If there are fewer bytes remaining in the buffer
+ * than are required to hold the message, or the underlying input buffer
+ * does not contain the complete message, then an invocation of {@link
+ * MessageInfo#isComplete isComplete} on the returned {@code
+ * MessageInfo} will return {@code false}, and more invocations of this
+ * method will be necessary to completely consume the messgae. Only
+ * one message at a time will be partially delivered in any stream. The
+ * socket option {@link SctpStandardSocketOption#SCTP_FRAGMENT_INTERLEAVE
+ * SCTP_FRAGMENT_INTERLEAVE} controls various aspects of what interlacing of
+ * messages occurs.
+ *
+ * <P> If this method receives a notification then the appropriate method of
+ * the given handler, if there is one, is invoked. If the handler returns
+ * {@link HandlerResult#CONTINUE CONTINUE} then this method will try to
+ * receive another message/notification, otherwise, if {@link
+ * HandlerResult#RETURN RETURN} is returned this method will return {@code
+ * null}. If an uncaught exception is thrown by the handler it will be
+ * propagated up the stack through this method.
+ *
+ * <P> This method may be invoked at any time. If another thread has
+ * already initiated a receive operation upon this channel, then an
+ * invocation of this method will block until the first operation is
+ * complete. The given handler is invoked without holding any locks used
+ * to enforce the above synchronization policy, that way handlers
+ * will not stall other threads from receiving. A handler should not invoke
+ * the {@code receive} method of this channel, if it does an
+ * {@link IllegalReceiveException} will be thrown.
+ *
+ * @param dst
+ * The buffer into which message bytes are to be transferred
+ *
+ * @param attachment
+ * The object to attach to the receive operation; can be
+ * {@code null}
+ *
+ * @param handler
+ * A handler to handle notifications from the SCTP stack, or {@code
+ * null} to ignore any notifications.
+ *
+ * @return The {@code MessageInfo}, {@code null} if this channel is in
+ * non-blocking mode and no messages are immediately available or
+ * the notification handler returns {@link HandlerResult#RETURN
+ * RETURN} after handling a notification
+ *
+ * @throws java.nio.channels.ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws java.nio.channels.AsynchronousCloseException
+ * If another thread closes this channel
+ * while the read operation is in progress
+ *
+ * @throws java.nio.channels.ClosedByInterruptException
+ * If another thread interrupts the current thread
+ * while the read operation is in progress, thereby
+ * closing the channel and setting the current thread's
+ * interrupt status
+ *
+ * @throws java.nio.channels.NotYetConnectedException
+ * If this channel is not yet connected
+ *
+ * @throws IllegalReceiveException
+ * If the given handler invokes the {@code receive} method of this
+ * channel
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public abstract <T> MessageInfo receive(ByteBuffer dst,
+ T attachment,
+ NotificationHandler<T> handler)
+ throws IOException;
+
+ /**
+ * Sends a message via this channel.
+ *
+ * <P> If this channel is in non-blocking mode and there is sufficient room
+ * in the underlying output buffer, or if this channel is in blocking mode
+ * and sufficient room becomes available, then the remaining bytes in the
+ * given byte buffer are transmitted as a single message. Sending a message
+ * is atomic unless explicit message completion {@link
+ * SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE SCTP_EXPLICIT_COMPLETE}
+ * socket option is enabled on this channel's socket.
+ *
+ * <P> The message is transferred from the byte buffer as if by a regular
+ * {@link java.nio.channels.WritableByteChannel#write(java.nio.ByteBuffer)
+ * write} operation.
+ *
+ * <P> The bytes will be written to the stream number that is specified by
+ * {@link MessageInfo#streamNumber streamNumber} in the given {@code
+ * messageInfo}.
+ *
+ * <P> This method may be invoked at any time. If another thread has already
+ * initiated a send operation upon this channel, then an invocation of
+ * this method will block until the first operation is complete.
+ *
+ * @param src
+ * The buffer containing the message to be sent
+ *
+ * @param messageInfo
+ * Ancillary data about the message to be sent
+ *
+ * @return The number of bytes sent, which will be either the number of
+ * bytes that were remaining in the messages buffer when this method
+ * was invoked or, if this channel is non-blocking, may be zero if
+ * there was insufficient room for the message in the underlying
+ * output buffer
+ *
+ * @throws InvalidStreamExcepton
+ * If {@code streamNumner} is negative or greater than or equal to
+ * the maximum number of outgoing streams
+ *
+ * @throws java.nio.channels.ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws java.nio.channels.AsynchronousCloseException
+ * If another thread closes this channel
+ * while the read operation is in progress
+ *
+ * @throws java.nio.channels.ClosedByInterruptException
+ * If another thread interrupts the current thread
+ * while the read operation is in progress, thereby
+ * closing the channel and setting the current thread's
+ * interrupt status
+ *
+ * @throws java.nio.channels.NotYetConnectedException
+ * If this channel is not yet connected
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public abstract int send(ByteBuffer src, MessageInfo messageInfo)
+ throws IOException;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/nio/sctp/SctpMultiChannel.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,731 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.nio.sctp;
+
+import java.net.SocketAddress;
+import java.net.InetAddress;
+import java.io.IOException;
+import java.util.Set;
+import java.nio.ByteBuffer;
+import java.nio.channels.spi.AbstractSelectableChannel;
+import java.nio.channels.spi.SelectorProvider;
+import java.nio.channels.ClosedChannelException;
+import java.nio.channels.NotYetBoundException;
+import java.nio.channels.SelectionKey;
+
+/**
+ * A selectable channel for message-oriented SCTP sockets.
+ *
+ * <P> An SCTP multi channel supports many associations on a single socket.
+ * An {@code SctpMultiChannel} is created by invoking the
+ * {@link #open open} method of this class. A newly-created channel is open but
+ * not yet bound. An attempt to invoke the {@link #receive receive} method of an
+ * unbound channel will cause the {@link NotYetBoundException}
+ * to be thrown. An attempt to invoke the {@link #send send} method of an
+ * unbound channel will cause it to first invoke the {@link #bind bind} method.
+ * The address(es) that the channel's socket is bound to can be retrieved by
+ * calling {@link #getAllLocalAddresses getAllLocalAddresses}.
+ *
+ * <P> Messages may be sent and received without explicitly setting up an
+ * association with the remote peer. The channel will implicitly setup
+ * a new association whenever it sends or receives a message from a remote
+ * peer if there is not already an association with that peer. Upon successful
+ * association setup, an {@link AssociationChangeNotification
+ * association changed} notification will be put to the SCTP stack with its
+ * {@code event} parameter set to {@link
+ * AssociationChangeNotification.AssocChangeEvent#COMM_UP
+ * COMM_UP}. This notification can be received by invoking {@link #receive
+ * receive}.
+ *
+ * <P> Socket options are configured using the
+ * {@link #setOption(SctpSocketOption,Object,Association) setOption} method. An
+ * {@code SctpMultiChannel} supports the following options:
+ * <blockquote>
+ * <table border>
+ * <tr>
+ * <th>Option Name</th>
+ * <th>Description</th>
+ * </tr>
+ * <tr>
+ * <td> {@link SctpStandardSocketOption#SCTP_DISABLE_FRAGMENTS
+ * SCTP_DISABLE_FRAGMENTS} </td>
+ * <td> Enables or disables message fragmentation </td>
+ * </tr>
+ * <tr>
+ * <td> {@link SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE
+ * SCTP_EXPLICIT_COMPLETE} </td>
+ * <td> Enables or disables explicit message completion </td>
+ * </tr>
+ * <tr>
+ * <td> {@link SctpStandardSocketOption#SCTP_FRAGMENT_INTERLEAVE
+ * SCTP_FRAGMENT_INTERLEAVE} </td>
+ * <td> Controls how the presentation of messages occur for the message
+ * receiver </td>
+ * </tr>
+ * <tr>
+ * <td> {@link SctpStandardSocketOption#SCTP_INIT_MAXSTREAMS
+ * SCTP_INIT_MAXSTREAMS} </td>
+ * <td> The maximum number of streams requested by the local endpoint during
+ * association initialization </td>
+ * </tr>
+ * <tr>
+ * <td> {@link SctpStandardSocketOption#SCTP_NODELAY SCTP_NODELAY} </td>
+ * <td> Enables or disable a Nagle-like algorithm </td>
+ * </tr>
+ * <tr>
+ * <td> {@link SctpStandardSocketOption#SCTP_PRIMARY_ADDR
+ * SCTP_PRIMARY_ADDR} </td>
+ * <td> Requests that the local SCTP stack use the given peer address as the
+ * association primary </td>
+ * </tr>
+ * <tr>
+ * <td> {@link SctpStandardSocketOption#SCTP_SET_PEER_PRIMARY_ADDR
+ * SCTP_SET_PEER_PRIMARY_ADDR} </td>
+ * <td> Requests that the peer mark the enclosed address as the association
+ * primary </td>
+ * </tr>
+ * <tr>
+ * <td> {@link SctpStandardSocketOption#SO_SNDBUF
+ * SO_SNDBUF} </td>
+ * <td> The size of the socket send buffer </td>
+ * </tr>
+ * <tr>
+ * <td> {@link SctpStandardSocketOption#SO_RCVBUF
+ * SO_RCVBUF} </td>
+ * <td> The size of the socket receive buffer </td>
+ * </tr>
+ * <tr>
+ * <td> {@link SctpStandardSocketOption#SO_LINGER
+ * SO_LINGER} </td>
+ * <td> Linger on close if data is present (when configured in blocking mode
+ * only) </td>
+ * </tr>
+ * </table>
+ * </blockquote>
+ * Additional (implementation specific) options may also be supported. The list
+ * of options supported is obtained by invoking the {@link #supportedOptions()
+ * supportedOptions} method.
+ *
+ * <p> SCTP multi channels are safe for use by multiple concurrent threads.
+ * They support concurrent sending and receiving, though at most one thread may be
+ * sending and at most one thread may be receiving at any given time.
+ *
+ * @since 1.7
+ */
+public abstract class SctpMultiChannel
+ extends AbstractSelectableChannel
+{
+ /**
+ * Initializes a new instance of this class.
+ *
+ * @param provider
+ * The selector provider for this channel
+ */
+ protected SctpMultiChannel(SelectorProvider provider) {
+ super(provider);
+ }
+
+ /**
+ * Opens an SCTP multi channel.
+ *
+ * <P> The new channel is unbound.
+ *
+ * @return A new SCTP multi channel
+ *
+ * @throws UnsupportedOperationException
+ * If the SCTP protocol is not supported
+ *
+ * @throws IOException
+ * If an I/O error occurs
+ */
+ public static SctpMultiChannel open() throws
+ IOException {
+ return new sun.nio.ch.SctpMultiChannelImpl((SelectorProvider)null);
+ }
+
+ /**
+ * Returns the open associations on this channel's socket.
+ *
+ * <P> Only associations whose {@link AssociationChangeNotification.AssocChangeEvent#COMM_UP
+ * COMM_UP} association change event has been received are included
+ * in the returned set of associations. Associations for which a
+ * {@link AssociationChangeNotification.AssocChangeEvent#COMM_LOST COMM_LOST} or {@link
+ * AssociationChangeNotification.AssocChangeEvent#SHUTDOWN SHUTDOWN} association change
+ * event have been receive are removed from the set of associations.
+ *
+ * <P> The returned set of associations is a snapshot of the open
+ * associations at the time that this method is invoked.
+ *
+ * @return A {@code Set} containing the open associations, or an empty
+ * {@code Set} if there are none.
+ *
+ * @throws ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public abstract Set<Association> associations()
+ throws IOException;
+
+ /**
+ * Binds the channel's socket to a local address and configures the socket
+ * to listen for connections.
+ *
+ * <P> This method is used to establish a relationship between the socket
+ * and the local address. Once a relationship is established then
+ * the socket remains bound until the channel is closed. This relationship
+ * may not necesssarily be with the address {@code local} as it may be removed
+ * by {@link #unbindAddress unbindAddress}, but there will always be at least one local
+ * address bound to the channel's socket once an invocation of this method
+ * successfully completes.
+ *
+ * <P> Once the channel's socket has been successfully bound to a specific
+ * address, that is not automatically assigned, more addresses
+ * may be bound to it using {@link #bindAddress bindAddress}, or removed
+ * using {@link #unbindAddress unbindAddress}.
+ *
+ * <P> The backlog parameter is the maximum number of pending connections on
+ * the socket. Its exact semantics are implementation specific. An implementation
+ * may impose an implementation specific maximum length or may choose to ignore
+ * the parameter. If the backlog parameter has the value {@code 0}, or a negative
+ * value, then an implementation specific default is used.
+ *
+ * @param local
+ * The local address to bind the socket, or {@code null} to
+ * bind the socket to an automatically assigned socket address
+ *
+ * @param backlog
+ * The maximum number number of pending connections
+ *
+ * @return This channel
+ *
+ * @throws ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws java.nio.channels.AlreadyBoundException
+ * If this channel is already bound
+ *
+ * @throws java.nio.channels.UnsupportedAddressTypeException
+ * If the type of the given address is not supported
+ *
+ * @throws SecurityException
+ * If a security manager has been installed and its {@link
+ * java.lang.SecurityManager#checkListen(int) checkListen} method
+ * denies the operation
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public abstract SctpMultiChannel bind(SocketAddress local,
+ int backlog)
+ throws IOException;
+
+ /**
+ * Binds the channel's socket to a local address and configures the socket
+ * to listen for connections.
+ *
+ * <P> This method works as if invoking it were equivalent to evaluating the
+ * expression:
+ * <blockquote><pre>
+ * bind(local, 0);
+ * </pre></blockquote>
+ *
+ * @param local
+ * The local address to bind the socket, or {@code null} to
+ * bind the socket to an automatically assigned socket address
+ *
+ * @return This channel
+ *
+ * @throws ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws java.nio.channels.AlreadyBoundException
+ * If this channel is already bound
+ *
+ * @throws java.nio.channels.UnsupportedAddressTypeException
+ * If the type of the given address is not supported
+ *
+ * @throws SecurityException
+ * If a security manager has been installed and its {@link
+ * java.lang.SecurityManager#checkListen(int) checkListen} method
+ * denies the operation
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public final SctpMultiChannel bind(SocketAddress local)
+ throws IOException {
+ return bind(local, 0);
+ }
+
+ /**
+ * Adds the given address to the bound addresses for the channel's
+ * socket.
+ *
+ * <P> The given address must not be the {@link
+ * java.net.InetAddress#isAnyLocalAddress wildcard} address.
+ * The channel must be first bound using {@link #bind bind} before
+ * invoking this method, otherwise {@link NotYetBoundException} is thrown.
+ * The {@link #bind bind} method takes a {@code SocketAddress} as its
+ * argument which typically contains a port number as well as an address.
+ * Addresses subquently bound using this method are simply addresses as the
+ * SCTP port number remains the same for the lifetime of the channel.
+ *
+ * <P> New associations setup after this method successfully completes
+ * will be associated with the given address. Adding addresses to existing
+ * associations is optional functionality. If the endpoint supports
+ * dynamic address reconfiguration then it may send the appropriate message
+ * to the peer to change the peers address lists.
+ *
+ * @param address
+ * The address to add to the bound addresses for the socket
+ *
+ * @return This channel
+ *
+ * @throws ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws NotYetBoundException
+ * If this channel is not yet bound
+ *
+ * @throws java.nio.channels.AlreadyBoundException
+ * If this channel is already bound to the given address
+ *
+ * @throws IllegalArgumentException
+ * If address is {@code null} or the {@link
+ * java.net.InetAddress#isAnyLocalAddress wildcard} address
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public abstract SctpMultiChannel bindAddress(InetAddress address)
+ throws IOException;
+
+ /**
+ * Removes the given address from the bound addresses for the channel's
+ * socket.
+ *
+ * <P> The given address must not be the {@link
+ * java.net.InetAddress#isAnyLocalAddress wildcard} address.
+ * The channel must be first bound using {@link #bind bind} before
+ * invoking this method, otherwise {@link NotYetBoundException} is thrown.
+ *
+ * <P> If this method is invoked on a channel that does
+ * not have {@code address} as one of its bound addresses, or that has only
+ * one local address bound to it, then this method throws
+ * {@link IllegalUnbindException}.
+ *
+ * <P> The initial address that the channel's socket is bound to using
+ * {@link #bind bind} may be removed from the bound addresses for the
+ * channel's socket.
+ *
+ * <P> New associations setup after this method successfully completes
+ * will not be associated with the given address. Removing addresses from
+ * existing associations is optional functionality. If the endpoint supports
+ * dynamic address reconfiguration then it may send the appropriate message
+ * to the peer to change the peers address lists.
+ *
+ * @param address
+ * The address to remove from the bound addresses for the socket
+ *
+ * @return This channel
+ *
+ * @throws ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws NotYetBoundException
+ * If this channel is not yet bound
+ *
+ * @throws IllegalUnbindException
+ * {@code address} is not bound to the channel's socket, or the
+ * channel has only one address bound to it
+ *
+ * @throws IllegalArgumentException
+ * If address is {@code null} or the {@link
+ * java.net.InetAddress#isAnyLocalAddress wildcard} address
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public abstract SctpMultiChannel unbindAddress(InetAddress address)
+ throws IOException;
+
+ /**
+ * Returns all of the socket addresses to which this channel's socket is
+ * bound.
+ *
+ * @return All the socket addresses that this channel's socket is
+ * bound to, or an empty {@code Set} if the channel's socket is not
+ * bound
+ *
+ * @throws ClosedChannelException
+ * If the channel is closed
+ *
+ * @throws IOException
+ * If an I/O error occurs
+ */
+ public abstract Set<SocketAddress> getAllLocalAddresses()
+ throws IOException;
+
+ /**
+ * Returns all of the remote addresses to which the given association on
+ * this channel's socket is connected.
+ *
+ * @return All of the remote addresses for the given association, or
+ * an empty {@code Set} if the association has been shutdown
+ *
+ * @throws ClosedChannelException
+ * If the channel is closed
+ *
+ * @throws IOException
+ * If an I/O error occurs
+ */
+ public abstract Set<SocketAddress> getRemoteAddresses(Association association)
+ throws IOException;
+
+ /**
+ * Shutdown an association without closing the channel.
+ *
+ * @param association
+ * The association to shutdown
+ *
+ * @return This channel
+ *
+ * @throws ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public abstract SctpMultiChannel shutdown(Association association)
+ throws IOException;
+
+ /**
+ * Returns the value of a socket option.
+ *
+ * <P> Note that some options are retrieved on the channel's socket,
+ * therefore the {@code association} parameter is not applicable and will be
+ * ignored if given. However, if the option is association specific then the
+ * association must be given.
+ *
+ * @param name
+ * The socket option
+ *
+ * @param association
+ * The association whose option should be retrieved, or {@code null}
+ * if this option should be retrieved at the channel's socket level.
+ *
+ * @return The value of the socket option. A value of {@code null} may be
+ * a valid value for some socket options.
+ *
+ * @throws UnsupportedOperationException
+ * If the socket option is not supported by this channel
+ *
+ * @throws ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws IOException
+ * If an I/O error occurs
+ *
+ * @see SctpStandardSocketOption
+ */
+ public abstract <T> T getOption(SctpSocketOption<T> name,
+ Association association)
+ throws IOException;
+
+ /**
+ * Sets the value of a socket option.
+ *
+ * <P> Note that some options are retrieved on the channel's socket,
+ * therefore the {@code association} parameter is not applicable and will be
+ * ignored if given. However, if the option is association specific then the
+ * association must be given.
+ *
+ * @param name
+ * The socket option
+ *
+ * @param association
+ * The association whose option should be set, or {@code null}
+ * if this option should be set at the channel's socket level.
+ *
+ * @param value
+ * The value of the socket option. A value of {@code null} may be
+ * a valid value for some socket options.
+ *
+ * @return This channel
+ *
+ * @throws UnsupportedOperationException
+ * If the socket option is not supported by this channel
+ *
+ * @throws IllegalArgumentException
+ * If the value is not a valid value for this socket option
+ *
+ * @throws ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws IOException
+ * If an I/O error occurs
+ *
+ * @see SctpStandardSocketOption
+ */
+ public abstract <T> SctpMultiChannel setOption(SctpSocketOption<T> name,
+ T value,
+ Association association)
+ throws IOException;
+
+ /**
+ * Returns a set of the socket options supported by this channel.
+ *
+ * <P> This method will continue to return the set of options even after the
+ * channel has been closed.
+ *
+ * @return A set of the socket options supported by this channel
+ */
+ public abstract Set<SctpSocketOption<?>> supportedOptions();
+
+ /**
+ * Returns an operation set identifying this channel's supported operations.
+ *
+ * <P> SCTP multi channels support reading, and writing, so this
+ * method returns
+ * {@code (}{@link SelectionKey#OP_READ} {@code |} {@link
+ * SelectionKey#OP_WRITE}{@code )}. </p>
+ *
+ * @return The valid-operation set
+ */
+ @Override
+ public final int validOps() {
+ return (SelectionKey.OP_READ |
+ SelectionKey.OP_WRITE );
+ }
+
+ /**
+ * Receives a message and/or handles a notification via this channel.
+ *
+ * <P> If a message or notification is immediately available, or if this
+ * channel is in blocking mode and one eventually becomes available, then
+ * the message or notification is returned or handled, respectively. If this
+ * channel is in non-blocking mode and a message or notification is not
+ * immediately available then this method immediately returns {@code null}.
+ *
+ * <P> If this method receives a message it is copied into the given byte
+ * buffer and an {@link MessageInfo} is returned.
+ * The message is transferred into the given byte buffer starting at its
+ * current position and the buffers position is incremented by the number of
+ * bytes read. If there are fewer bytes remaining in the buffer than are
+ * required to hold the message, or the underlying input buffer does not
+ * contain the complete message, then an invocation of {@link
+ * MessageInfo#isComplete isComplete} on the returned {@code
+ * MessageInfo} will return {@code false}, and more invocations of this
+ * method will be necessary to completely consume the messgae. Only
+ * one message at a time will be partially delivered in any stream. The
+ * socket option {@link SctpStandardSocketOption#SCTP_FRAGMENT_INTERLEAVE
+ * SCTP_FRAGMENT_INTERLEAVE} controls various aspects of what interlacing of
+ * messages occurs.
+ *
+ * <P> If this method receives a notification then the appropriate method of
+ * the given handler, if there is one, is invoked. If the handler returns {@link
+ * HandlerResult#CONTINUE CONTINUE} then this method will try to receive another
+ * message/notification, otherwise, if {@link HandlerResult#RETURN RETURN} is returned
+ * this method will return {@code null}. If an uncaught exception is thrown by the
+ * handler it will be propagated up the stack through this method.
+ *
+ * <P> If a security manager has been installed then for each new association
+ * setup this method verifies that the associations source address and port
+ * number are permitted by the security manager's {@link
+ * java.lang.SecurityManager#checkAccept(String,int) checkAccept} method.
+ *
+ * <P> This method may be invoked at any time. If another thread has
+ * already initiated a receive operation upon this channel, then an
+ * invocation of this method will block until the first operation is
+ * complete. The given handler is invoked without holding any locks used
+ * to enforce the above synchronization policy, that way handlers
+ * will not stall other threads from receiving. A handler should not invoke
+ * the {@code receive} method of this channel, if it does an
+ * {@link IllegalReceiveException} will be thrown.
+ *
+ * @param buffer
+ * The buffer into which bytes are to be transferred
+ *
+ * @param attachment
+ * The object to attach to the receive operation; can be
+ * {@code null}
+ *
+ * @param handler
+ * A handler to handle notifications from the SCTP stack, or
+ * {@code null} to ignore any notifications.
+ *
+ * @return The {@code MessageInfo}, {@code null} if this channel is in
+ * non-blocking mode and no messages are immediately available or
+ * the notification handler returns {@code RETURN} after handling
+ * a notification
+ *
+ * @throws java.nio.channels.ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws java.nio.channels.AsynchronousCloseException
+ * If another thread closes this channel
+ * while the read operation is in progress
+ *
+ * @throws java.nio.channels.ClosedByInterruptException
+ * If another thread interrupts the current thread
+ * while the read operation is in progress, thereby
+ * closing the channel and setting the current thread's
+ * interrupt status
+ *
+ * @throws NotYetBoundException
+ * If this channel is not yet bound
+ *
+ * @throws IllegalReceiveException
+ * If the given handler invokes the {@code receive} method of this
+ * channel
+ *
+ * @throws SecurityException
+ * If a security manager has been installed and it does not permit
+ * new associations to be accepted from the message's sender
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public abstract <T> MessageInfo receive(ByteBuffer buffer,
+ T attachment,
+ NotificationHandler<T> handler)
+ throws IOException;
+
+ /**
+ * Sends a message via this channel.
+ *
+ * <P> If this channel is unbound then this method will invoke {@link
+ * #bind(SocketAddress, int) bind(null, 0)} before sending any data.
+ *
+ * <P> If there is no association existing between this channel's socket
+ * and the intended receiver, identified by the address in the given messageInfo, then one
+ * will be automatically setup to the intended receiver. This is considered
+ * to be Implicit Association Setup. Upon successful association setup, an
+ * {@link AssociationChangeNotification association changed}
+ * notification will be put to the SCTP stack with its {@code event} parameter set
+ * to {@link AssociationChangeNotification.AssocChangeEvent#COMM_UP COMM_UP}
+ * . This notification can be received by invoking {@link #receive
+ * receive}.
+ *
+ * <P> If this channel is in blocking mode, there is sufficient room in the
+ * underlying output buffer, then the remaining bytes in the given byte
+ * buffer are transmitted as a single message. Sending a message
+ * is atomic unless explicit message completion {@link
+ * SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE SCTP_EXPLICIT_COMPLETE}
+ * socket option is enabled on this channel's socket.
+ *
+ * <P> If this channel is in non-blocking mode, there is sufficient room
+ * in the underlying output buffer, and an implicit association setup is
+ * required, then the remaining bytes in the given byte buffer are
+ * transmitted as a single message, subject to {@link
+ * SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE SCTP_EXPLICIT_COMPLETE}.
+ * If for any reason the message cannot
+ * be delivered an {@link AssociationChangeNotification association
+ * changed} notification is put on the SCTP stack with its {@code event} parameter set
+ * to {@link AssociationChangeNotification.AssocChangeEvent#CANT_START CANT_START}.
+ *
+ * <P> The message is transferred from the byte buffer as if by a regular
+ * {@link java.nio.channels.WritableByteChannel#write(java.nio.ByteBuffer)
+ * write} operation.
+ *
+ * <P> If a security manager has been installed then for each new association
+ * setup this method verifies that the given remote peers address and port
+ * number are permitted by the security manager's {@link
+ * java.lang.SecurityManager#checkConnect(String,int) checkConnect} method.
+ *
+ * <P> This method may be invoked at any time. If another thread has already
+ * initiated a send operation upon this channel, then an invocation of
+ * this method will block until the first operation is complete.
+ *
+ * @param buffer
+ * The buffer containing the message to be sent
+ *
+ * @param messageInfo
+ * Ancillary data about the message to be sent
+ *
+ * @return The number of bytes sent, which will be either the number of
+ * bytes that were remaining in the messages buffer when this method
+ * was invoked or, if this channel is non-blocking, may be zero if
+ * there was insufficient room for the message in the underlying
+ * output buffer
+ *
+ * @throws InvalidStreamExcepton
+ * If {@code streamNumber} is negative, or if an association already
+ * exists and {@code streamNumber} is greater than the maximum number
+ * of outgoing streams
+ *
+ * @throws java.nio.channels.ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws java.nio.channels.AsynchronousCloseException
+ * If another thread closes this channel
+ * while the read operation is in progress
+ *
+ * @throws java.nio.channels.ClosedByInterruptException
+ * If another thread interrupts the current thread
+ * while the read operation is in progress, thereby
+ * closing the channel and setting the current thread's
+ * interrupt status
+ *
+ * @throws SecurityException
+ * If a security manager has been installed and it does not permit
+ * new associations to be setup with the the messages's address
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public abstract int send(ByteBuffer buffer, MessageInfo messageInfo)
+ throws IOException;
+
+ /**
+ * Branches off an association.
+ *
+ * <P> An application can invoke this method to branch off an association
+ * into a separate channel. The new bound and connected {@link SctpChannel}
+ * will be created for the association. The branched off association will no
+ * longer be part of this channel.
+ *
+ * <P> This is particularly useful when, for instance, the application
+ * wishes to have a number of sporadic message senders/receivers remain
+ * under the original SCTP multi channel but branch off those
+ * associations carrying high volume data traffic into their own
+ * separate SCTP channels.
+ *
+ * @param association
+ * The association to branch off
+ *
+ * @return The {@code SctpChannel}
+ *
+ * @throws java.nio.channels.ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public abstract SctpChannel branch(Association association)
+ throws IOException;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/nio/sctp/SctpServerChannel.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,421 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.nio.sctp;
+
+import java.net.SocketAddress;
+import java.net.InetAddress;
+import java.io.IOException;
+import java.util.Set;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.spi.SelectorProvider;
+import java.nio.channels.spi.AbstractSelectableChannel;
+
+/**
+ * A selectable channel for message-oriented listening SCTP sockets.
+ *
+ * <p> An {@code SCTPServerChannel} is created by invoking the
+ * {@link #open open} method of this class. A newly-created SCTP server
+ * channel is open but not yet bound. An attempt to invoke the
+ * {@link #accept accept} method of an unbound channel will cause the
+ * {@link java.nio.channels.NotYetBoundException} to be thrown. An SCTP server
+ * channel can be bound by invoking one of the
+ * {@link #bind(java.net.SocketAddress,int) bind} methods defined by this class.
+ *
+ * <p> Socket options are configured using the
+ * {@link #setOption(SctpSocketOption,Object) setOption} method. SCTP server socket
+ * channels support the following options:
+ * <blockquote>
+ * <table border>
+ * <tr>
+ * <th>Option Name</th>
+ * <th>Description</th>
+ * </tr>
+ * <tr>
+ * <td> {@link SctpStandardSocketOption#SCTP_INIT_MAXSTREAMS
+ * SCTP_INIT_MAXSTREAMS} </td>
+ * <td> The maximum number of streams requested by the local endpoint during
+ * association initialization </td>
+ * </tr>
+ * </table>
+ * </blockquote>
+ * Additional (implementation specific) options may also be supported. The list
+ * of options supported is obtained by invoking the {@link #supportedOptions()
+ * supportedOptions} method.
+ *
+ * <p>SCTP server channels are safe for use by multiple concurrent threads.
+ *
+ * @since 1.7
+ */
+public abstract class SctpServerChannel
+ extends AbstractSelectableChannel
+{
+ /**
+ * Initializes a new instance of this class.
+ *
+ * @param provider
+ * The selector provider for this channel
+ */
+ protected SctpServerChannel(SelectorProvider provider) {
+ super(provider);
+ }
+
+ /**
+ * Opens an SCTP server channel.
+ *
+ * <P> The new channel's socket is initially unbound; it must be bound
+ * to a specific address via one of its socket's {@link #bind bind}
+ * methods before associations can be accepted.
+ *
+ * @return A new SCTP server channel
+ *
+ * @throws UnsupportedOperationException
+ * If the SCTP protocol is not supported
+ *
+ * @throws IOException
+ * If an I/O error occurs
+ */
+ public static SctpServerChannel open() throws
+ IOException {
+ return new sun.nio.ch.SctpServerChannelImpl((SelectorProvider)null);
+ }
+
+ /**
+ * Accepts an association on this channel's socket.
+ *
+ * <P> If this channel is in non-blocking mode then this method will
+ * immediately return {@code null} if there are no pending associations.
+ * Otherwise it will block indefinitely until a new association is
+ * available or an I/O error occurs.
+ *
+ * <P> The {@code SCTPChannel} returned by this method, if any, will be in
+ * blocking mode regardless of the blocking mode of this channel.
+ *
+ * <P> If a security manager has been installed then for each new
+ * association this method verifies that the address and port number of the
+ * assocaitions's remote peer are permitted by the security manager's {@link
+ * java.lang.SecurityManager#checkAccept(String,int) checkAccept} method.
+ *
+ * @return The SCTP channel for the new association, or {@code null}
+ * if this channel is in non-blocking mode and no association is
+ * available to be accepted
+ *
+ * @throws java.nio.channels.ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws java.nio.channels.AsynchronousCloseException
+ * If another thread closes this channel
+ * while the accept operation is in progress
+ *
+ * @throws java.nio.channels.ClosedByInterruptException
+ * If another thread interrupts the current thread
+ * while the accept operation is in progress, thereby
+ * closing the channel and setting the current thread's
+ * interrupt status
+ *
+ * @throws java.nio.channels.NotYetBoundException
+ * If this channel's socket has not yet been bound
+ *
+ * @throws SecurityException
+ * If a security manager has been installed and it does not permit
+ * access to the remote peer of the new association
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public abstract SctpChannel accept() throws IOException;
+
+ /**
+ * Binds the channel's socket to a local address and configures the socket
+ * to listen for associations.
+ *
+ * <P> This method works as if invoking it were equivalent to evaluating the
+ * expression:
+ * <blockquote><pre>
+ * bind(local, 0);
+ * </pre></blockquote>
+ *
+ * @param local
+ * The local address to bind the socket, or {@code null} to
+ * bind the socket to an automatically assigned socket address
+ *
+ * @return This channel
+ *
+ * @throws java.nio.channels.ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws java.nio.channels.AlreadyBoundException
+ * If this channel is already bound
+ *
+ * @throws java.nio.channels.UnsupportedAddressTypeException
+ * If the type of the given address is not supported
+ *
+ * @throws SecurityException
+ * If a security manager has been installed and its {@link
+ * java.lang.SecurityManager#checkListen(int) checkListen} method
+ * denies the operation
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public final SctpServerChannel bind(SocketAddress local)
+ throws IOException {
+ return bind(local, 0);
+ }
+
+ /**
+ * Binds the channel's socket to a local address and configures the socket
+ * to listen for associations.
+ *
+ * <P> This method is used to establish a relationship between the socket
+ * and the local address. Once a relationship is established then
+ * the socket remains bound until the channel is closed. This relationship
+ * may not necesssarily be with the address {@code local} as it may be
+ * removed by {@link #unbindAddress unbindAddress}, but there will always be
+ * at least one local address bound to the channel's socket once an
+ * invocation of this method successfully completes.
+ *
+ * <P> Once the channel's socket has been successfully bound to a specific
+ * address, that is not automatically assigned, more addresses
+ * may be bound to it using {@link #bindAddress bindAddress}, or removed
+ * using {@link #unbindAddress unbindAddress}.
+ *
+ * <P> The backlog parameter is the maximum number of pending associations
+ * on the socket. Its exact semantics are implementation specific. An
+ * implementation may impose an implementation specific maximum length or
+ * may choose to ignore the parameter. If the backlog parameter has the
+ * value {@code 0}, or a negative value, then an implementation specific
+ * default is used.
+ *
+ * @param local
+ * The local address to bind the socket, or {@code null} to
+ * bind the socket to an automatically assigned socket address
+ *
+ * @param backlog
+ * The maximum number number of pending associations
+ *
+ * @return This channel
+ *
+ * @throws java.nio.channels.ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws java.nio.channels.AlreadyBoundException
+ * If this channel is already bound
+ *
+ * @throws java.nio.channels.UnsupportedAddressTypeException
+ * If the type of the given address is not supported
+ *
+ * @throws SecurityException
+ * If a security manager has been installed and its {@link
+ * java.lang.SecurityManager#checkListen(int) checkListen} method
+ * denies the operation
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public abstract SctpServerChannel bind(SocketAddress local,
+ int backlog)
+ throws IOException;
+
+ /**
+ * Adds the given address to the bound addresses for the channel's
+ * socket.
+ *
+ * <P> The given address must not be the {@link
+ * java.net.InetAddress#isAnyLocalAddress wildcard} address.
+ * The channel must be first bound using {@link #bind bind} before
+ * invoking this method, otherwise {@link
+ * java.nio.channels.NotYetBoundException} is thrown. The {@link #bind bind}
+ * method takes a {@code SocketAddress} as its argument which typically
+ * contains a port number as well as an address. Addresses subquently bound
+ * using this method are simply addresses as the SCTP port number remains
+ * the same for the lifetime of the channel.
+ *
+ * <P> New associations accepted after this method successfully completes
+ * will be associated with the given address.
+ *
+ * @param address
+ * The address to add to the bound addresses for the socket
+ *
+ * @return This channel
+ *
+ * @throws java.nio.channels.ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws java.nio.channels.NotYetBoundException
+ * If this channel is not yet bound
+ *
+ * @throws java.nio.channels.AlreadyBoundException
+ * If this channel is already bound to the given address
+ *
+ * @throws IllegalArgumentException
+ * If address is {@code null} or the {@link
+ * java.net.InetAddress#isAnyLocalAddress wildcard} address
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public abstract SctpServerChannel bindAddress(InetAddress address)
+ throws IOException;
+
+ /**
+ * Removes the given address from the bound addresses for the channel's
+ * socket.
+ *
+ * <P> The given address must not be the {@link
+ * java.net.InetAddress#isAnyLocalAddress wildcard} address.
+ * The channel must be first bound using {@link #bind bind} before
+ * invoking this method, otherwise
+ * {@link java.nio.channels.NotYetBoundException} is thrown.
+ * If this method is invoked on a channel that does not have
+ * {@code address} as one of its bound addresses, or that has only one
+ * local address bound to it, then this method throws {@link
+ * IllegalUnbindException}.
+ * The initial address that the channel's socket is bound to using
+ * {@link #bind bind} may be removed from the bound addresses for the
+ * channel's socket.
+ *
+ * <P> New associations accepted after this method successfully completes
+ * will not be associated with the given address.
+ *
+ * @param address
+ * The address to remove from the bound addresses for the socket
+ *
+ * @return This channel
+ *
+ * @throws java.nio.channels.ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws java.nio.channels.NotYetBoundException
+ * If this channel is not yet bound
+ *
+ * @throws IllegalArgumentException
+ * If address is {@code null} or the {@link
+ * java.net.InetAddress#isAnyLocalAddress wildcard} address
+ *
+ * @throws IllegalUnbindException
+ * If the implementation does not support removing addresses from a
+ * listening socket, {@code address} is not bound to the channel's
+ * socket, or the channel has only one address bound to it
+ *
+ * @throws IOException
+ * If some other I/O error occurs
+ */
+ public abstract SctpServerChannel unbindAddress(InetAddress address)
+ throws IOException;
+
+ /**
+ * Returns all of the socket addresses to which this channel's socket is
+ * bound.
+ *
+ * @return All the socket addresses that this channel's socket is
+ * bound to, or an empty {@code Set} if the channel's socket is not
+ * bound
+ *
+ * @throws java.nio.channels.ClosedChannelException
+ * If the channel is closed
+ *
+ * @throws IOException
+ * If an I/O error occurs
+ */
+ public abstract Set<SocketAddress> getAllLocalAddresses()
+ throws IOException;
+
+ /**
+ * Returns the value of a socket option.
+ *
+ * @param name
+ * The socket option
+ *
+ * @return The value of the socket option. A value of {@code null} may be
+ * a valid value for some socket options.
+ *
+ * @throws UnsupportedOperationException
+ * If the socket option is not supported by this channel
+ *
+ * @throws java.nio.channels.ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws IOException
+ * If an I/O error occurs
+ *
+ * @see SctpStandardSocketOption
+ */
+ public abstract <T> T getOption(SctpSocketOption<T> name) throws IOException;
+
+ /**
+ * Sets the value of a socket option.
+ *
+ * @param name
+ * The socket option
+ *
+ * @param value
+ * The value of the socket option. A value of {@code null} may be
+ * a valid value for some socket options.
+ *
+ * @return This channel
+ *
+ * @throws UnsupportedOperationException
+ * If the socket option is not supported by this channel
+ *
+ * @throws IllegalArgumentException
+ * If the value is not a valid value for this socket option
+ *
+ * @throws java.nio.channels.ClosedChannelException
+ * If this channel is closed
+ *
+ * @throws IOException
+ * If an I/O error occurs
+ *
+ * @see SctpStandardSocketOption
+ */
+ public abstract <T> SctpServerChannel setOption(SctpSocketOption<T> name,
+ T value)
+ throws IOException;
+
+ /**
+ * Returns a set of the socket options supported by this channel.
+ *
+ * <P> This method will continue to return the set of options even after the
+ * channel has been closed.
+ *
+ * @return A set of the socket options supported by this channel
+ */
+ public abstract Set<SctpSocketOption<?>> supportedOptions();
+
+ /**
+ * Returns an operation set identifying this channel's supported
+ * operations.
+ *
+ * <P> SCTP server channels only support the accepting of new
+ * associations, so this method returns
+ * {@link java.nio.channels.SelectionKey#OP_ACCEPT}.
+ *
+ * @return The valid-operation set
+ */
+ @Override
+ public final int validOps() {
+ return SelectionKey.OP_ACCEPT;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/nio/sctp/SctpSocketOption.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.nio.sctp;
+
+import java.net.SocketOption;
+
+/**
+ * A socket option associated with an SCTP channel.
+ *
+ * @param <T> The type of the socket option value.
+ *
+ * @since 1.7
+ *
+ * @see SctpStandardSocketOption
+ */
+public interface SctpSocketOption<T> extends SocketOption<T> { }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/nio/sctp/SctpStandardSocketOption.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,419 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.nio.sctp;
+
+import java.net.SocketAddress;
+import sun.nio.ch.SctpStdSocketOption;
+
+/**
+ * SCTP channels supports the socket options defined by this class
+ * (as well as those listed in the particular channel class) and may support
+ * additional Implementation specific socket options.
+ *
+ * @since 1.7
+ */
+public class SctpStandardSocketOption {
+ private SctpStandardSocketOption() {}
+ /**
+ * Enables or disables message fragmentation.
+ *
+ * <P> The value of this socket option is a {@code Boolean} that represents
+ * whether the option is enabled or disabled. If enabled no SCTP message
+ * fragmentation will be performed. Instead if a message being sent
+ * exceeds the current PMTU size, the message will NOT be sent and
+ * an error will be indicated to the user.
+ *
+ * <P> It is implementation specific whether or not this option is
+ * supported.
+ */
+ public static final SctpSocketOption<Boolean> SCTP_DISABLE_FRAGMENTS = new
+ SctpStdSocketOption<Boolean>("SCTP_DISABLE_FRAGMENTS", Boolean.class,
+ sun.nio.ch.SctpStdSocketOption.SCTP_DISABLE_FRAGMENTS);
+
+ /**
+ * Enables or disables explicit message completion.
+ *
+ * <p> The value of this socket option is a {@code Boolean} that represents
+ * whether the option is enabled or disabled. When this option is enabled,
+ * the {@code send} method may be invoked multiple times to a send message.
+ * The {@code isComplete} parameter of the {@link MessageInfo} must only
+ * be set to {@code true} for the final send to indicate that the message is
+ * complete. If this option is disabled then each individual {@code send}
+ * invocation is considered complete.
+ *
+ * <P> The default value of the option is {@code false} indicating that the
+ * option is disabled. It is implementation specific whether or not this
+ * option is supported.
+ */
+ public static final SctpSocketOption<Boolean> SCTP_EXPLICIT_COMPLETE = new
+ SctpStdSocketOption<Boolean>("SCTP_EXPLICIT_COMPLETE", Boolean.class,
+ sun.nio.ch.SctpStdSocketOption.SCTP_EXPLICIT_COMPLETE);
+
+ /**
+ * Fragmented interleave controls how the presentation of messages occur
+ * for the message receiver. There are three levels of fragment interleave
+ * defined. Two of the levels effect {@link SctpChannel}, while
+ * {@link SctpMultiChannel} is effected by all three levels.
+ *
+ * <P> This option takes an {@code Integer} value. It can be set to a value
+ * of {@code 0}, {@code 1} or {@code 2}.
+ *
+ * <P> Setting the three levels provides the following receiver
+ * interactions:
+ *
+ * <P> {@code level 0} - Prevents the interleaving of any messages. This
+ * means that when a partial delivery begins, no other messages will be
+ * received except the message being partially delivered. If another message
+ * arrives on a different stream (or association) that could be delivered,
+ * it will be blocked waiting for the user to read all of the partially
+ * delivered message.
+ *
+ * <P> {@code level 1} - Allows interleaving of messages that are from
+ * different associations. For {@code SctpChannel}, level 0 and
+ * level 1 have the same meaning since an {@code SctpChannel} always
+ * receives messages from the same association. Note that setting an {@code
+ * SctpMultiChannel} to this level may cause multiple partial
+ * delivers from different associations but for any given association, only
+ * one message will be delivered until all parts of a message have been
+ * delivered. This means that one large message, being read with an
+ * association identification of "X", will block other messages from
+ * association "X" from being delivered.
+ *
+ * <P> {@code level 2} - Allows complete interleaving of messages. This
+ * level requires that the sender carefully observe not only the peer
+ * {@code Association} but also must pay careful attention to the stream
+ * number. With this option enabled a partially delivered message may begin
+ * being delivered for association "X" stream "Y" and the next subsequent
+ * receive may return a message from association "X" stream "Z". Note that
+ * no other messages would be delivered for association "X" stream "Y"
+ * until all of stream "Y"'s partially delivered message was read.
+ * Note that this option effects both channel types. Also note that
+ * for an {@code SctpMultiChannel} not only may another streams
+ * message from the same association be delivered from the next receive,
+ * some other associations message may be delivered upon the next receive.
+ *
+ * <P> It is implementation specific whether or not this option is
+ * supported.
+ */
+ public static final SctpSocketOption<Integer> SCTP_FRAGMENT_INTERLEAVE =
+ new SctpStdSocketOption<Integer>("SCTP_FRAGMENT_INTERLEAVE",
+ Integer.class,
+ sun.nio.ch.SctpStdSocketOption.SCTP_FRAGMENT_INTERLEAVE);
+
+ /**
+ * The maximum number of streams requested by the local endpoint during
+ * association initialization.
+ *
+ * <P> The value of this socket option is an {@link
+ * SctpStandardSocketOption.InitMaxStreams InitMaxStreams}, that represents
+ * the maximum number of inbound and outbound streams that an association
+ * on the channel is prepared to support.
+ *
+ * <P> For an {@link SctpChannel} this option may only be used to
+ * change the number of inbound/outbound streams prior to connecting.
+ *
+ * <P> For an {@link SctpMultiChannel} this option determines
+ * the maximum number of inbound/outbound streams new associations setup
+ * on the channel will be prepared to support.
+ *
+ * <P> For an {@link SctpServerChannel} this option determines the
+ * maximum number of inbound/outbound streams accepted sockets will
+ * negotiate with their connecting peer.
+ *
+ * <P> In all cases the value set by this option is used in the negotiation
+ * of new associations setup on the channel's socket and the actual
+ * maximum number of inbound/outbound streams that have been negotiated
+ * with the peer can be retrieved from the appropriate {@link
+ * Association}. The {@code Association} can be retrieved from the
+ * {@link AssociationChangeNotification.AssocChangeEvent#COMM_UP COMM_UP}
+ * {@link AssociationChangeNotification} belonging to that association.
+ *
+ * <p> This value is bounded by the actual implementation. In other
+ * words the user may be able to support more streams than the Operating
+ * System. In such a case, the Operating System limit may override the
+ * value requested by the user. The default value of 0 indicates to use
+ * the endpoints default value.
+ */
+ public static final SctpSocketOption
+ <SctpStandardSocketOption.InitMaxStreams> SCTP_INIT_MAXSTREAMS =
+ new SctpStdSocketOption<SctpStandardSocketOption.InitMaxStreams>(
+ "SCTP_INIT_MAXSTREAMS", SctpStandardSocketOption.InitMaxStreams.class);
+
+ /**
+ * Enables or disables a Nagle-like algorithm.
+ *
+ * <P> The value of this socket option is a {@code Boolean} that represents
+ * whether the option is enabled or disabled. SCTP uses an algorithm like
+ * <em>The Nagle Algorithm</em> to coalesce short segments and
+ * improve network efficiency.
+ */
+ public static final SctpSocketOption<Boolean> SCTP_NODELAY =
+ new SctpStdSocketOption<Boolean>("SCTP_NODELAY", Boolean.class,
+ sun.nio.ch.SctpStdSocketOption.SCTP_NODELAY);
+
+ /**
+ * Requests that the local SCTP stack use the given peer address as
+ * the association primary.
+ *
+ * <P> The value of this socket option is a {@code SocketAddress}
+ * that represents the peer address that the local SCTP stack should use as
+ * the association primary. The address must be one of the association
+ * peer's addresses.
+ *
+ * <P> An {@code SctpMultiChannel} can control more than one
+ * association, the association parameter must be given when setting or
+ * retrieving this option.
+ *
+ * <P> Since {@code SctpChannel} only controls one association,
+ * the association parameter is not required and this option can be
+ * set or queried directly.
+ */
+ public static final SctpSocketOption<SocketAddress> SCTP_PRIMARY_ADDR =
+ new SctpStdSocketOption<SocketAddress>
+ ("SCTP_PRIMARY_ADDR", SocketAddress.class);
+
+ /**
+ * Requests that the peer mark the enclosed address as the association
+ * primary.
+ *
+ * <P> The value of this socket option is a {@code SocketAddress}
+ * that represents the local address that the peer should use as its
+ * primary address. The given address must be one of the association's
+ * locally bound addresses.
+ *
+ * <P> An {@code SctpMultiChannel} can control more than one
+ * association, the association parameter must be given when setting or
+ * retrieving this option.
+ *
+ * <P> Since {@code SctpChannel} only controls one association,
+ * the association parameter is not required and this option can be
+ * queried directly.
+ *
+ * <P> Note, this is a set only option and cannot be retrieved by {@code
+ * getOption}. It is implementation specific whether or not this
+ * option is supported.
+ */
+ public static final SctpSocketOption<SocketAddress> SCTP_SET_PEER_PRIMARY_ADDR =
+ new SctpStdSocketOption<SocketAddress>
+ ("SCTP_SET_PEER_PRIMARY_ADDR", SocketAddress.class);
+
+ /**
+ * The size of the socket send buffer.
+ *
+ * <p> The value of this socket option is an {@code Integer} that is the
+ * size of the socket send buffer in bytes. The socket send buffer is an
+ * output buffer used by the networking implementation. It may need to be
+ * increased for high-volume connections. The value of the socket option is
+ * a <em>hint</em> to the implementation to size the buffer and the actual
+ * size may differ. The socket option can be queried to retrieve the actual
+ * size.
+ *
+ * <p> For {@code SctpChannel}, this controls the amount of data
+ * the SCTP stack may have waiting in internal buffers to be sent. This
+ * option therefore bounds the maximum size of data that can be sent in a
+ * single send call.
+ *
+ * <P> For {@code SctpMultiChannel}, the effect is the same as for {@code
+ * SctpChannel}, except that it applies to all associations. The option
+ * applies to each association's window size separately.
+ *
+ * <p> An implementation allows this socket option to be set before the
+ * socket is bound or connected. Whether an implementation allows the
+ * socket send buffer to be changed after the socket is bound is system
+ * dependent.
+ */
+ public static final SctpSocketOption<Integer> SO_SNDBUF =
+ new SctpStdSocketOption<Integer>("SO_SNDBUF", Integer.class,
+ sun.nio.ch.SctpStdSocketOption.SO_SNDBUF);
+
+ /**
+ * The size of the socket receive buffer.
+ *
+ * <P> The value of this socket option is an {@code Integer} that is the
+ * size of the socket receive buffer in bytes. The socket receive buffer is
+ * an input buffer used by the networking implementation. It may need to be
+ * increased for high-volume connections or decreased to limit the possible
+ * backlog of incoming data. The value of the socket option is a
+ * <em>hint</em> to the implementation to size the buffer and the actual
+ * size may differ.
+ *
+ * <P> For {@code SctpChannel}, this controls the receiver window size.
+ *
+ * <P> For {@code SctpMultiChannel}, the meaning is implementation
+ * dependent. It might control the receive buffer for each association bound
+ * to the socket descriptor or it might control the receive buffer for the
+ * whole socket.
+ *
+ * <p> An implementation allows this socket option to be set before the
+ * socket is bound or connected. Whether an implementation allows the
+ * socket receive buffer to be changed after the socket is bound is system
+ * dependent.
+ */
+ public static final SctpSocketOption<Integer> SO_RCVBUF =
+ new SctpStdSocketOption<Integer>("SO_RCVBUF", Integer.class,
+ sun.nio.ch.SctpStdSocketOption.SO_RCVBUF);
+
+ /**
+ * Linger on close if data is present.
+ *
+ * <p> The value of this socket option is an {@code Integer} that controls
+ * the action taken when unsent data is queued on the socket and a method
+ * to close the socket is invoked. If the value of the socket option is zero
+ * or greater, then it represents a timeout value, in seconds, known as the
+ * <em>linger interval</em>. The linger interval is the timeout for the
+ * {@code close} method to block while the operating system attempts to
+ * transmit the unsent data or it decides that it is unable to transmit the
+ * data. If the value of the socket option is less than zero then the option
+ * is disabled. In that case the {@code close} method does not wait until
+ * unsent data is transmitted; if possible the operating system will transmit
+ * any unsent data before the connection is closed.
+ *
+ * <p> This socket option is intended for use with sockets that are configured
+ * in {@link java.nio.channels.SelectableChannel#isBlocking() blocking} mode
+ * only. The behavior of the {@code close} method when this option is
+ * enabled on a non-blocking socket is not defined.
+ *
+ * <p> The initial value of this socket option is a negative value, meaning
+ * that the option is disabled. The option may be enabled, or the linger
+ * interval changed, at any time. The maximum value of the linger interval
+ * is system dependent. Setting the linger interval to a value that is
+ * greater than its maximum value causes the linger interval to be set to
+ * its maximum value.
+ */
+ public static final SctpSocketOption<Integer> SO_LINGER =
+ new SctpStdSocketOption<Integer>("SO_LINGER", Integer.class,
+ sun.nio.ch.SctpStdSocketOption.SO_LINGER);
+
+ /**
+ * This class is used to set the maximum number of inbound/outbound streams
+ * used by the local endpoint during association initialization. An
+ * instance of this class is used to set the {@link
+ * SctpStandardSocketOption#SCTP_INIT_MAXSTREAMS SCTP_INIT_MAXSTREAMS}
+ * socket option.
+ *
+ * @since 1.7
+ */
+ public static class InitMaxStreams {
+ private int maxInStreams;
+ private int maxOutStreams;
+
+ private InitMaxStreams(int maxInStreams, int maxOutStreams) {
+ this.maxInStreams = maxInStreams;
+ this.maxOutStreams = maxOutStreams;
+ }
+
+ /**
+ * Creates an InitMaxStreams instance.
+ *
+ * @param maxInStreams
+ * The maximum number of inbound streams, where
+ * {@code 0 <= maxInStreams <= 65536}
+ *
+ * @param maxOutStreams
+ * The maximum number of outbound streams, where
+ * {@code 0 <= maxOutStreams <= 65536}
+ *
+ * @return An {@code InitMaxStreams} instance
+ *
+ * @throws IllegalArgumentException
+ * If an argument is outside of specified bounds
+ */
+ public static InitMaxStreams create
+ (int maxInStreams, int maxOutStreams) {
+ if (maxOutStreams < 0 || maxOutStreams > 65535)
+ throw new IllegalArgumentException(
+ "Invalid maxOutStreams value");
+ if (maxInStreams < 0 || maxInStreams > 65535)
+ throw new IllegalArgumentException(
+ "Invalid maxInStreams value");
+
+ return new InitMaxStreams(maxInStreams, maxOutStreams);
+ }
+
+ /**
+ * Returns the maximum number of inbound streams.
+ *
+ * @return Maximum inbound streams
+ */
+ public int maxInStreams() {
+ return maxInStreams;
+ }
+
+ /**
+ * Returns the maximum number of outbound streams.
+ *
+ * @return Maximum outbound streams
+ */
+ public int maxOutStreams() {
+ return maxOutStreams;
+ }
+
+ /**
+ * Returns a string representation of this init max streams, including
+ * the maximum in and out bound streams.
+ *
+ * @return A string representation of this init max streams
+ */
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append(super.toString()).append(" [");
+ sb.append("maxInStreams:").append(maxInStreams);
+ sb.append("maxOutStreams:").append(maxOutStreams).append("]");
+ return sb.toString();
+ }
+
+ /**
+ * Returns true if the specified object is another {@code InitMaxStreams}
+ * instance with the same number of in and out bound streams.
+ *
+ * @param obj
+ * The object to be compared with this init max streams
+ *
+ * @return true if the specified object is another
+ * {@code InitMaxStreams} instance with the same number of in
+ * and out bound streams
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj != null && obj instanceof InitMaxStreams) {
+ InitMaxStreams that = (InitMaxStreams) obj;
+ if (this.maxInStreams == that.maxInStreams &&
+ this.maxOutStreams == that.maxOutStreams)
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Returns a hash code value for this init max streams.
+ */
+ @Override
+ public int hashCode() {
+ int hash = 7 ^ maxInStreams ^ maxOutStreams;
+ return hash;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/nio/sctp/SendFailedNotification.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.nio.sctp;
+
+import java.nio.ByteBuffer;
+import java.net.SocketAddress;
+
+/**
+ * Notification emitted when a send failed notification has been received.
+ *
+ * <P> A send failed notification indicates that a message cannot be delivered.
+ * Typically this is because the association has been shutdown with unsent data
+ * in the socket output buffer, or in the case of a {@link SctpMultiChannel}
+ * the association failed to setup.
+ *
+ * @since 1.7
+ */
+public abstract class SendFailedNotification implements Notification {
+ /**
+ * Initializes a new instance of this class.
+ */
+ protected SendFailedNotification() {}
+
+ /**
+ * Returns the association that this notification is applicable to.
+ *
+ * @return The association that failed to send, or {@code null} if
+ * there is no association, that is, the notification follows a
+ * {@linkplain
+ * com.sun.nio.sctp.AssociationChangeNotification.AssocChangeEvent#CANT_START}
+ */
+ @Override
+ public abstract Association association();
+
+ /**
+ * Returns the address.
+ *
+ * @return The peer primary address of the association or the address that
+ * the message was sent to
+ */
+ public abstract SocketAddress address();
+
+ /**
+ * Returns the data that was to be sent.
+ *
+ * @return The user data. The buffers position will be {@code 0} and its
+ * limit will be set to the end of the data.
+ */
+ public abstract ByteBuffer buffer();
+
+ /**
+ * Returns the error code.
+ *
+ * <P> The errorCode gives the reason why the send failed, and if set, will
+ * be a SCTP protocol error code as defined in RFC2960 section 3.3.10
+ *
+ * @return The error code
+ */
+ public abstract int errorCode();
+
+ /**
+ * Returns the stream number that the messge was to be sent on.
+ *
+ * @return The stream number
+ */
+ public abstract int streamNumber();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/nio/sctp/ShutdownNotification.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.nio.sctp;
+
+/**
+ * Notification emitted when a peers shutdowns an the association.
+ *
+ * <P> When a peer sends a <i>SHUTDOWN</i>, the SCTP stack delivers this
+ * notification to inform the application that it should cease sending data.
+ *
+ * @since 1.7
+ */
+public abstract class ShutdownNotification implements Notification {
+ /**
+ * Initializes a new instance of this class.
+ */
+ protected ShutdownNotification() {}
+
+ /**
+ * Returns the association that this notification is applicable to.
+ *
+ * @return The association that received the shutdown
+ */
+ public abstract Association association();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/nio/sctp/package-info.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * A Java API for Stream Control Transport Protocol.
+ *
+ * <P> The Stream Control Transport Protocol (SCTP) is a reliable,
+ * message-oriented, transport protocol existing at an equivalent level with UDP
+ * (User Datagram Protocol) and TCP (Transmission Control Protocol). SCTP is
+ * session oriented and an association between the endpoints must be established
+ * before any data can be transmitted.
+ *
+ * <P> SCTP has direct support for multi-homing, meaning than an endpoint may be
+ * represented by more than one address and each address may be used for sending
+ * and receiving data, thus providing network redundancy. The connection between
+ * two endpoints is referred to as an association between those endpoints.
+ * Endpoints can exchange a list of addresses during association setup. One
+ * address is designated as the primary address, this is the default address that
+ * the peer will use for sending data. A single port number is used across the
+ * entire address list at an endpoint for a specific session.
+ *
+ * <P> SCTP is message based. I/O operations operate upon messages and message
+ * boundaries are preserved. Each association may support multiple independant
+ * logical streams. Each stream represents a sequence of messages within a single
+ * association and streams are independant of one another, meaning that stream
+ * identifiers and sequence numbers are included in the data packet to allow
+ * sequencing of messages on a per-stream basis.
+ *
+ * <P> This package provides two programming model styles. The one-to-one style
+ * supported by {@link com.sun.nio.sctp.SctpChannel} and {@link
+ * com.sun.nio.sctp.SctpServerChannel}, and the one-to-many
+ * style supported by {@link com.sun.nio.sctp.SctpMultiChannel}.
+ * The semantics of the one-to-one style interface are very similar to TCP.
+ * An {@code SctpChannel} can only control one SCTP association. The
+ * semantics of the one-to-many style interface are very similar to UDP. An
+ * {@code SctpMutliChannel} can control multiple SCTP associations.
+ *
+ * <P> Applications can send and receive per-message ancillary information through
+ * {@link com.sun.nio.sctp.MessageInfo}. For example, the stream number that
+ * the message it is to be sent or received from. The SCTP stack is event driven
+ * and applications can receive notifications of certain SCTP events by invoking
+ * the {@code receive} method of the SCTP channel with an appropriate {@link
+ * com.sun.nio.sctp.NotificationHandler notification handler}.
+ *
+ * <P> The SCTP protocol is defined by
+ * <A HREF="http://tools.ietf.org/html/rfc4960">RFC4960</A>, and the optional
+ * extension for <I>Dynamic Address Reconfiguration</I> is defined by
+ * <A HREF="http://tools.ietf.org/html/rfc5061">RFC5061</A>.
+ *
+ * @since 1.7
+ */
+
+package com.sun.nio.sctp;
--- a/jdk/src/share/classes/java/awt/AWTKeyStroke.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/awt/AWTKeyStroke.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2000-2009 Sun Microsystems, Inc. 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
@@ -329,6 +329,9 @@
* <li><code>java.awt.event.KeyEvent.VK_TAB</code>
* <li><code>java.awt.event.KeyEvent.VK_SPACE</code>
* </ul>
+ * Alternatively, the key code may be obtained by calling
+ * <code>java.awt.event.KeyEvent.getExtendedKeyCodeForChar</code>.
+ *
* The modifiers consist of any combination of:<ul>
* <li>java.awt.event.InputEvent.SHIFT_DOWN_MASK
* <li>java.awt.event.InputEvent.CTRL_DOWN_MASK
--- a/jdk/src/share/classes/java/awt/Canvas.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/awt/Canvas.java Mon Apr 27 12:33:57 2009 -0700
@@ -25,6 +25,7 @@
package java.awt;
import java.awt.image.BufferStrategy;
+import java.awt.peer.CanvasPeer;
import javax.accessibility.*;
/**
@@ -65,7 +66,17 @@
*/
public Canvas(GraphicsConfiguration config) {
this();
- graphicsConfig = config;
+ setGraphicsConfiguration(config);
+ }
+
+ @Override
+ void setGraphicsConfiguration(GraphicsConfiguration gc) {
+ CanvasPeer peer = (CanvasPeer)getPeer();
+ if (peer != null) {
+ gc = peer.getAppropriateGraphicsConfiguration(gc);
+ }
+
+ super.setGraphicsConfiguration(gc);
}
/**
--- a/jdk/src/share/classes/java/awt/Component.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/awt/Component.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1995-2009 Sun Microsystems, Inc. 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
@@ -300,7 +300,7 @@
* @see GraphicsConfiguration
* @see #getGraphicsConfiguration
*/
- transient GraphicsConfiguration graphicsConfig = null;
+ private transient GraphicsConfiguration graphicsConfig = null;
/**
* A reference to a <code>BufferStrategy</code> object
@@ -799,8 +799,24 @@
}
}
+ // Whether this Component has had the background erase flag
+ // specified via SunToolkit.disableBackgroundErase(). This is
+ // needed in order to make this function work on X11 platforms,
+ // where currently there is no chance to interpose on the creation
+ // of the peer and therefore the call to XSetBackground.
+ transient boolean backgroundEraseDisabled;
+
static {
AWTAccessor.setComponentAccessor(new AWTAccessor.ComponentAccessor() {
+ public void setBackgroundEraseDisabled(Component comp, boolean disabled) {
+ comp.backgroundEraseDisabled = disabled;
+ }
+ public boolean getBackgroundEraseDisabled(Component comp) {
+ return comp.backgroundEraseDisabled;
+ }
+ public Rectangle getBounds(Component comp) {
+ return new Rectangle(comp.x, comp.y, comp.width, comp.height);
+ }
public void setMixingCutoutShape(Component comp, Shape shape) {
Region region = shape == null ? null :
Region.getInstance(shape, null);
@@ -829,6 +845,22 @@
}
}
}
+
+ public void setGraphicsConfiguration(Component comp,
+ GraphicsConfiguration gc)
+ {
+ comp.setGraphicsConfiguration(gc);
+ }
+ public boolean requestFocus(Component comp, CausedFocusEvent.Cause cause) {
+ return comp.requestFocus(cause);
+ }
+ public boolean canBeFocusOwner(Component comp) {
+ return comp.canBeFocusOwner();
+ }
+
+ public boolean isVisible_NoClientCode(Component comp) {
+ return comp.isVisible_NoClientCode();
+ }
});
}
@@ -996,50 +1028,21 @@
*/
public GraphicsConfiguration getGraphicsConfiguration() {
synchronized(getTreeLock()) {
- if (graphicsConfig != null) {
- return graphicsConfig;
- } else if (getParent() != null) {
- return getParent().getGraphicsConfiguration();
- } else {
- return null;
- }
+ return getGraphicsConfiguration_NoClientCode();
}
}
final GraphicsConfiguration getGraphicsConfiguration_NoClientCode() {
- GraphicsConfiguration graphicsConfig = this.graphicsConfig;
- Container parent = this.parent;
- if (graphicsConfig != null) {
- return graphicsConfig;
- } else if (parent != null) {
- return parent.getGraphicsConfiguration_NoClientCode();
- } else {
- return null;
- }
- }
-
- /**
- * Resets this <code>Component</code>'s
- * <code>GraphicsConfiguration</code> back to a default
- * value. For most componenets, this is <code>null</code>.
- * Called from the Toolkit thread, so NO CLIENT CODE.
- */
- void resetGC() {
+ return graphicsConfig;
+ }
+
+ void setGraphicsConfiguration(GraphicsConfiguration gc) {
synchronized(getTreeLock()) {
- graphicsConfig = null;
- }
- }
-
- /*
- * Not called on Component, but needed for Canvas and Window
- */
- void setGCFromPeer() {
- synchronized(getTreeLock()) {
- if (peer != null) { // can't imagine how this will be false,
- // but just in case
- graphicsConfig = peer.getGraphicsConfiguration();
- } else {
- graphicsConfig = null;
+ graphicsConfig = gc;
+
+ ComponentPeer peer = getPeer();
+ if (peer != null) {
+ peer.updateGraphicsData(gc);
}
}
}
@@ -6663,23 +6666,7 @@
// Update stacking order
- if (parent != null && parent.peer != null) {
- ContainerPeer parentContPeer = (ContainerPeer) parent.peer;
- // if our parent is lightweight and we are not
- // we should call restack on nearest heavyweight
- // container.
- if (parentContPeer instanceof LightweightPeer
- && ! (peer instanceof LightweightPeer))
- {
- Container hwParent = getNativeContainer();
- if (hwParent != null && hwParent.peer != null) {
- parentContPeer = (ContainerPeer) hwParent.peer;
- }
- }
- if (parentContPeer.isRestackSupported()) {
- parentContPeer.restack();
- }
- }
+ peer.setZOrder(getHWPeerAboveMe());
if (!isAddNotifyComplete) {
mixOnShowing();
@@ -7170,8 +7157,8 @@
requestFocusHelper(false, true);
}
- void requestFocus(CausedFocusEvent.Cause cause) {
- requestFocusHelper(false, true, cause);
+ boolean requestFocus(CausedFocusEvent.Cause cause) {
+ return requestFocusHelper(false, true, cause);
}
/**
@@ -7456,7 +7443,7 @@
// sometimes most recent focus owner may be null, but focus owner is not
// e.g. we reset most recent focus owner if user removes focus owner
focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
- if (focusOwner != null && getContainingWindow(focusOwner) != window) {
+ if (focusOwner != null && focusOwner.getContainingWindow() != window) {
focusOwner = null;
}
}
@@ -8689,30 +8676,8 @@
* null, if component is not a part of window hierarchy
*/
Window getContainingWindow() {
- return getContainingWindow(this);
- }
- /**
- * Returns the <code>Window</code> ancestor of the component <code>comp</code>.
- * @return Window ancestor of the component or component by itself if it is Window;
- * null, if component is not a part of window hierarchy
- */
- static Window getContainingWindow(Component comp) {
- while (comp != null && !(comp instanceof Window)) {
- comp = comp.getParent();
- }
-
- return (Window)comp;
- }
-
-
-
-
-
-
-
-
-
-
+ return SunToolkit.getContainingWindow(this);
+ }
/**
* Initialize JNI field and method IDs
@@ -9575,6 +9540,27 @@
return nextAbove < 0 ? -1 : nextAbove;
}
+ final ComponentPeer getHWPeerAboveMe() {
+ checkTreeLock();
+
+ Container cont = getContainer();
+ int indexAbove = getSiblingIndexAbove();
+
+ while (cont != null) {
+ for (int i = indexAbove; i > -1; i--) {
+ Component comp = cont.getComponent(i);
+ if (comp != null && comp.isDisplayable() && !comp.isLightweight()) {
+ return comp.getPeer();
+ }
+ }
+
+ indexAbove = cont.getSiblingIndexAbove();
+ cont = cont.getContainer();
+ }
+
+ return null;
+ }
+
final int getSiblingIndexBelow() {
checkTreeLock();
Container parent = getContainer();
@@ -9827,4 +9813,29 @@
}
// ****************** END OF MIXING CODE ********************************
+
+ private static boolean doesClassImplement(Class cls, String interfaceName) {
+ if (cls == null) return false;
+
+ for (Class c : cls.getInterfaces()) {
+ if (c.getName().equals(interfaceName)) {
+ return true;
+ }
+ }
+ return doesClassImplement(cls.getSuperclass(), interfaceName);
+ }
+
+ /**
+ * Checks that the given object implements the given interface.
+ * @param obj Object to be checked
+ * @param interfaceName The name of the interface. Must be fully-qualified interface name.
+ * @return true, if this object implements the given interface,
+ * false, otherwise, or if obj or interfaceName is null
+ */
+ static boolean doesImplement(Object obj, String interfaceName) {
+ if (obj == null) return false;
+ if (interfaceName == null) return false;
+
+ return doesClassImplement(obj.getClass(), interfaceName);
+ }
}
--- a/jdk/src/share/classes/java/awt/Container.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/awt/Container.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1995-2009 Sun Microsystems, Inc. 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
@@ -167,6 +167,9 @@
transient int listeningBoundsChildren;
transient int descendantsCount;
+ /* Non-opaque window support -- see Window.setLayersOpaque */
+ transient Color preserveBackgroundColor = null;
+
/**
* JDK 1.1 serialVersionUID
*/
@@ -267,9 +270,13 @@
/**
* Gets the number of components in this panel.
+ * <p>
+ * Note: This method should be called under AWT tree lock.
+ *
* @return the number of components in this panel.
* @see #getComponent
* @since JDK1.1
+ * @see Component#getTreeLock()
*/
public int getComponentCount() {
return countComponents();
@@ -281,43 +288,65 @@
*/
@Deprecated
public int countComponents() {
- synchronized (getTreeLock()) {
- return component.size();
- }
+ // This method is not synchronized under AWT tree lock.
+ // Instead, the calling code is responsible for the
+ // synchronization. See 6784816 for details.
+ return component.size();
}
/**
* Gets the nth component in this container.
+ * <p>
+ * Note: This method should be called under AWT tree lock.
+ *
* @param n the index of the component to get.
* @return the n<sup>th</sup> component in this container.
* @exception ArrayIndexOutOfBoundsException
* if the n<sup>th</sup> value does not exist.
+ * @see Component#getTreeLock()
*/
public Component getComponent(int n) {
- synchronized (getTreeLock()) {
- if ((n < 0) || (n >= component.size())) {
- throw new ArrayIndexOutOfBoundsException("No such child: " + n);
- }
+ // This method is not synchronized under AWT tree lock.
+ // Instead, the calling code is responsible for the
+ // synchronization. See 6784816 for details.
+ try {
return component.get(n);
+ } catch (IndexOutOfBoundsException z) {
+ throw new ArrayIndexOutOfBoundsException("No such child: " + n);
}
}
/**
* Gets all the components in this container.
+ * <p>
+ * Note: This method should be called under AWT tree lock.
+ *
* @return an array of all the components in this container.
+ * @see Component#getTreeLock()
*/
public Component[] getComponents() {
+ // This method is not synchronized under AWT tree lock.
+ // Instead, the calling code is responsible for the
+ // synchronization. See 6784816 for details.
return getComponents_NoClientCode();
}
+
// NOTE: This method may be called by privileged threads.
// This functionality is implemented in a package-private method
// to insure that it cannot be overridden by client subclasses.
// DO NOT INVOKE CLIENT CODE ON THIS THREAD!
final Component[] getComponents_NoClientCode() {
+ return component.toArray(EMPTY_ARRAY);
+ }
+
+ /*
+ * Wrapper for getComponents() method with a proper synchronization.
+ */
+ Component[] getComponentsSync() {
synchronized (getTreeLock()) {
- return component.toArray(EMPTY_ARRAY);
+ return getComponents();
}
- } // getComponents_NoClientCode()
+ }
/**
* Determines the insets of this container, which indicate the size
@@ -503,6 +532,9 @@
adjustDescendants(-(comp.countHierarchyMembers()));
comp.parent = null;
+ if (needRemoveNotify) {
+ comp.setGraphicsConfiguration(null);
+ }
component.remove(index);
invalidateIfValid();
@@ -643,10 +675,7 @@
// each HW descendant independently.
return !comp.peer.isReparentSupported();
} else {
- // if container didn't change we still might need to recreate component's window as
- // changes to zorder should be reflected in native window stacking order and it might
- // not be supported by the platform. This is important only for heavyweight child
- return !((ContainerPeer)(newNativeContainer.peer)).isRestackSupported();
+ return false;
}
}
@@ -786,6 +815,7 @@
component.add(index, comp);
}
comp.parent = this;
+ comp.setGraphicsConfiguration(getGraphicsConfiguration());
adjustListeningChildren(AWTEvent.HIERARCHY_EVENT_MASK,
comp.numListening(AWTEvent.HIERARCHY_EVENT_MASK));
@@ -802,11 +832,6 @@
if (peer != null) {
if (comp.peer == null) { // Remove notify was called or it didn't have peer - create new one
comp.addNotify();
- // New created peer creates component on top of the stacking order
- Container newNativeContainer = getHeavyweightContainer();
- if (((ContainerPeer)newNativeContainer.getPeer()).isRestackSupported()) {
- ((ContainerPeer)newNativeContainer.getPeer()).restack();
- }
} else { // Both container and child have peers, it means child peer should be reparented.
// In both cases we need to reparent native widgets.
Container newNativeContainer = getHeavyweightContainer();
@@ -815,13 +840,8 @@
// Native container changed - need to reparent native widgets
newNativeContainer.reparentChild(comp);
}
- // If component still has a peer and it is either container or heavyweight
- // and restack is supported we have to restack native windows since order might have changed
- if ((!comp.isLightweight() || (comp instanceof Container))
- && ((ContainerPeer)newNativeContainer.getPeer()).isRestackSupported())
- {
- ((ContainerPeer)newNativeContainer.getPeer()).restack();
- }
+ comp.peer.setZOrder(comp.getHWPeerAboveMe());
+
if (!comp.isLightweight() && isLightweight()) {
// If component is heavyweight and one of the containers is lightweight
// the location of the component should be fixed.
@@ -1034,9 +1054,9 @@
}
checkAddToSelf(comp);
checkNotAWindow(comp);
- if (thisGC != null) {
- comp.checkGD(thisGC.getDevice().getIDstring());
- }
+ if (thisGC != null) {
+ comp.checkGD(thisGC.getDevice().getIDstring());
+ }
/* Reparent the component and tidy up the tree's state. */
if (comp.parent != null) {
@@ -1053,6 +1073,7 @@
component.add(index, comp);
}
comp.parent = this;
+ comp.setGraphicsConfiguration(thisGC);
adjustListeningChildren(AWTEvent.HIERARCHY_EVENT_MASK,
comp.numListening(AWTEvent.HIERARCHY_EVENT_MASK));
@@ -1091,6 +1112,19 @@
}
}
+ @Override
+ void setGraphicsConfiguration(GraphicsConfiguration gc) {
+ synchronized (getTreeLock()) {
+ super.setGraphicsConfiguration(gc);
+
+ for (Component comp : component) {
+ if (comp != null) {
+ comp.setGraphicsConfiguration(gc);
+ }
+ }
+ }
+ }
+
/**
* Checks that all Components that this Container contains are on
* the same GraphicsDevice as this Container. If not, throws an
@@ -1148,6 +1182,7 @@
comp.parent = null;
component.remove(index);
+ comp.setGraphicsConfiguration(null);
invalidateIfValid();
if (containerListener != null ||
@@ -1224,6 +1259,7 @@
layoutMgr.removeLayoutComponent(comp);
}
comp.parent = null;
+ comp.setGraphicsConfiguration(null);
if (containerListener != null ||
(eventMask & AWTEvent.CONTAINER_EVENT_MASK) != 0 ||
Toolkit.enabledOnToolkit(AWTEvent.CONTAINER_EVENT_MASK)) {
@@ -1339,7 +1375,7 @@
}
private int getListenersCount(int id, boolean enabledOnToolkit) {
- assert Thread.holdsLock(getTreeLock());
+ checkTreeLock();
if (enabledOnToolkit) {
return descendantsCount;
}
@@ -1357,7 +1393,7 @@
final int createHierarchyEvents(int id, Component changed,
Container changedParent, long changeFlags, boolean enabledOnToolkit)
{
- assert Thread.holdsLock(getTreeLock());
+ checkTreeLock();
int listeners = getListenersCount(id, enabledOnToolkit);
for (int count = listeners, i = 0; count > 0; i++) {
@@ -1372,7 +1408,7 @@
final void createChildHierarchyEvents(int id, long changeFlags,
boolean enabledOnToolkit)
{
- assert Thread.holdsLock(getTreeLock());
+ checkTreeLock();
if (component.isEmpty()) {
return;
}
@@ -1507,6 +1543,7 @@
* @see #validate
*/
protected void validateTree() {
+ checkTreeLock();
if (!isValid()) {
if (peer instanceof ContainerPeer) {
((ContainerPeer)peer).beginLayout();
@@ -1783,7 +1820,7 @@
// super.paint(); -- Don't bother, since it's a NOP.
GraphicsCallback.PaintCallback.getInstance().
- runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.LIGHTWEIGHTS);
+ runComponents(getComponentsSync(), g, GraphicsCallback.LIGHTWEIGHTS);
}
}
@@ -1838,7 +1875,7 @@
}
GraphicsCallback.PrintCallback.getInstance().
- runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.LIGHTWEIGHTS);
+ runComponents(getComponentsSync(), g, GraphicsCallback.LIGHTWEIGHTS);
}
}
@@ -1851,7 +1888,7 @@
public void paintComponents(Graphics g) {
if (isShowing()) {
GraphicsCallback.PaintAllCallback.getInstance().
- runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.TWO_PASSES);
+ runComponents(getComponentsSync(), g, GraphicsCallback.TWO_PASSES);
}
}
@@ -1873,8 +1910,8 @@
void paintHeavyweightComponents(Graphics g) {
if (isShowing()) {
GraphicsCallback.PaintHeavyweightComponentsCallback.getInstance().
- runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.LIGHTWEIGHTS |
- GraphicsCallback.HEAVYWEIGHTS);
+ runComponents(getComponentsSync(), g,
+ GraphicsCallback.LIGHTWEIGHTS | GraphicsCallback.HEAVYWEIGHTS);
}
}
@@ -1887,7 +1924,7 @@
public void printComponents(Graphics g) {
if (isShowing()) {
GraphicsCallback.PrintAllCallback.getInstance().
- runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.TWO_PASSES);
+ runComponents(getComponentsSync(), g, GraphicsCallback.TWO_PASSES);
}
}
@@ -1909,8 +1946,8 @@
void printHeavyweightComponents(Graphics g) {
if (isShowing()) {
GraphicsCallback.PrintHeavyweightComponentsCallback.getInstance().
- runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.LIGHTWEIGHTS |
- GraphicsCallback.HEAVYWEIGHTS);
+ runComponents(getComponentsSync(), g,
+ GraphicsCallback.LIGHTWEIGHTS | GraphicsCallback.HEAVYWEIGHTS);
}
}
@@ -2460,9 +2497,7 @@
* @since 1.2
*/
public Component findComponentAt(int x, int y) {
- synchronized (getTreeLock()) {
- return findComponentAt(x, y, true);
- }
+ return findComponentAt(x, y, true);
}
/**
@@ -2475,58 +2510,60 @@
* The addition of this feature is temporary, pending the
* adoption of new, public API which exports this feature.
*/
- final Component findComponentAt(int x, int y, boolean ignoreEnabled)
- {
- if (isRecursivelyVisible()){
- return findComponentAtImpl(x, y, ignoreEnabled);
+ final Component findComponentAt(int x, int y, boolean ignoreEnabled) {
+ synchronized (getTreeLock()) {
+ if (isRecursivelyVisible()){
+ return findComponentAtImpl(x, y, ignoreEnabled);
+ }
}
return null;
}
final Component findComponentAtImpl(int x, int y, boolean ignoreEnabled){
+ checkTreeLock();
+
if (!(contains(x, y) && visible && (ignoreEnabled || enabled))) {
return null;
}
// Two passes: see comment in sun.awt.SunGraphicsCallback
- synchronized (getTreeLock()) {
- for (int i = 0; i < component.size(); i++) {
- Component comp = component.get(i);
- if (comp != null &&
- !(comp.peer instanceof LightweightPeer)) {
- if (comp instanceof Container) {
- comp = ((Container)comp).findComponentAtImpl(x - comp.x,
- y - comp.y,
- ignoreEnabled);
- } else {
- comp = comp.locate(x - comp.x, y - comp.y);
- }
- if (comp != null && comp.visible &&
- (ignoreEnabled || comp.enabled))
- {
- return comp;
- }
+ for (int i = 0; i < component.size(); i++) {
+ Component comp = component.get(i);
+ if (comp != null &&
+ !(comp.peer instanceof LightweightPeer)) {
+ if (comp instanceof Container) {
+ comp = ((Container)comp).findComponentAtImpl(x - comp.x,
+ y - comp.y,
+ ignoreEnabled);
+ } else {
+ comp = comp.locate(x - comp.x, y - comp.y);
}
- }
- for (int i = 0; i < component.size(); i++) {
- Component comp = component.get(i);
- if (comp != null &&
- comp.peer instanceof LightweightPeer) {
- if (comp instanceof Container) {
- comp = ((Container)comp).findComponentAtImpl(x - comp.x,
- y - comp.y,
- ignoreEnabled);
- } else {
- comp = comp.locate(x - comp.x, y - comp.y);
- }
- if (comp != null && comp.visible &&
- (ignoreEnabled || comp.enabled))
- {
- return comp;
- }
+ if (comp != null && comp.visible &&
+ (ignoreEnabled || comp.enabled))
+ {
+ return comp;
}
}
}
+ for (int i = 0; i < component.size(); i++) {
+ Component comp = component.get(i);
+ if (comp != null &&
+ comp.peer instanceof LightweightPeer) {
+ if (comp instanceof Container) {
+ comp = ((Container)comp).findComponentAtImpl(x - comp.x,
+ y - comp.y,
+ ignoreEnabled);
+ } else {
+ comp = comp.locate(x - comp.x, y - comp.y);
+ }
+ if (comp != null && comp.visible &&
+ (ignoreEnabled || comp.enabled))
+ {
+ return comp;
+ }
+ }
+ }
+
return this;
}
@@ -2584,13 +2621,6 @@
for (int i = 0; i < component.size(); i++) {
component.get(i).addNotify();
}
- // Update stacking order if native platform allows
- ContainerPeer cpeer = (ContainerPeer)peer;
- if (cpeer.isRestackSupported()) {
- cpeer.restack();
- }
-
-
}
}
@@ -3488,7 +3518,7 @@
private void writeObject(ObjectOutputStream s) throws IOException {
ObjectOutputStream.PutField f = s.putFields();
f.put("ncomponents", component.size());
- f.put("component", component.toArray(EMPTY_ARRAY));
+ f.put("component", getComponentsSync());
f.put("layoutMgr", layoutMgr);
f.put("dispatcher", dispatcher);
f.put("maxSize", maxSize);
--- a/jdk/src/share/classes/java/awt/DefaultKeyboardFocusManager.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/awt/DefaultKeyboardFocusManager.java Mon Apr 27 12:33:57 2009 -0700
@@ -479,7 +479,7 @@
// that a Component outside of the focused Window receives a
// FOCUS_GAINED event. We synthesize a WINDOW_GAINED_FOCUS
// event in that case.
- final Window newFocusedWindow = Component.getContainingWindow(newFocusOwner);
+ final Window newFocusedWindow = SunToolkit.getContainingWindow(newFocusOwner);
final Window currentFocusedWindow = getGlobalFocusedWindow();
if (newFocusedWindow != null &&
newFocusedWindow != currentFocusedWindow)
--- a/jdk/src/share/classes/java/awt/Dialog.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/awt/Dialog.java Mon Apr 27 12:33:57 2009 -0700
@@ -1226,7 +1226,7 @@
synchronized (getTreeLock()) {
if (keepBlockingEDT) {
keepBlockingEDT = false;
- PeerEvent wakingEvent = new PeerEvent(this, new WakingRunnable(), PeerEvent.PRIORITY_EVENT);
+ PeerEvent wakingEvent = new PeerEvent(getToolkit(), new WakingRunnable(), PeerEvent.PRIORITY_EVENT);
AppContext curAppContext = AppContext.getAppContext();
if (showAppContext != curAppContext) {
// Wake up event dispatch thread on which the dialog was
--- a/jdk/src/share/classes/java/awt/Frame.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/awt/Frame.java Mon Apr 27 12:33:57 2009 -0700
@@ -36,6 +36,7 @@
import java.io.IOException;
import sun.awt.AppContext;
import sun.awt.SunToolkit;
+import sun.awt.AWTAccessor;
import java.lang.ref.WeakReference;
import javax.accessibility.*;
@@ -738,11 +739,15 @@
* @since 1.4
* @see java.awt.Window#addWindowStateListener
*/
- public synchronized void setExtendedState(int state) {
+ public void setExtendedState(int state) {
if ( !isFrameStateSupported( state ) ) {
return;
}
- this.state = state;
+ synchronized (getObjectLock()) {
+ this.state = state;
+ }
+ // peer.setState must be called outside of object lock
+ // synchronization block to avoid possible deadlock
FramePeer peer = (FramePeer)this.peer;
if (peer != null) {
peer.setState(state);
@@ -804,12 +809,27 @@
* @see #setExtendedState(int)
* @since 1.4
*/
- public synchronized int getExtendedState() {
- FramePeer peer = (FramePeer)this.peer;
- if (peer != null) {
- state = peer.getState();
+ public int getExtendedState() {
+ synchronized (getObjectLock()) {
+ return state;
}
- return state;
+ }
+
+ static {
+ AWTAccessor.setFrameAccessor(
+ new AWTAccessor.FrameAccessor() {
+ public void setExtendedState(Frame frame, int state) {
+ synchronized(frame.getObjectLock()) {
+ frame.state = state;
+ }
+ }
+ public int getExtendedState(Frame frame) {
+ synchronized(frame.getObjectLock()) {
+ return frame.state;
+ }
+ }
+ }
+ );
}
/**
@@ -967,7 +987,7 @@
if (resizable) {
str += ",resizable";
}
- getExtendedState(); // sync with peer
+ int state = getExtendedState();
if (state == NORMAL) {
str += ",normal";
}
--- a/jdk/src/share/classes/java/awt/GraphicsConfiguration.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/awt/GraphicsConfiguration.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -434,4 +434,20 @@
}
return defaultImageCaps;
}
+
+ /**
+ * Returns whether this GraphicsConfiguration supports
+ * the {@link GraphicsDevice.WindowTranslucency#PERPIXEL_TRANSLUCENT
+ * PERPIXEL_TRANSLUCENT} kind of translucency.
+ *
+ * @param gc GraphicsConfiguration
+ * @throws NullPointerException if the gc argument is null
+ * @return whether the given GraphicsConfiguration supports
+ * the translucency effects.
+ * @see Window#setBackground(Color)
+ */
+ /*public */boolean isTranslucencyCapable() {
+ // Overridden in subclasses
+ return false;
}
+}
--- a/jdk/src/share/classes/java/awt/GraphicsDevice.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/awt/GraphicsDevice.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,7 +27,10 @@
package java.awt;
import java.awt.image.ColorModel;
+
+import sun.awt.AWTAccessor;
import sun.awt.AppContext;
+import sun.awt.SunToolkit;
/**
* The <code>GraphicsDevice</code> class describes the graphics devices
@@ -109,6 +112,31 @@
*/
public final static int TYPE_IMAGE_BUFFER = 2;
+ /** Kinds of translucency supported by the underlying system.
+ * @see #isTranslucencySupported
+ */
+ /*public */static enum WindowTranslucency {
+ /**
+ * Represents support in the underlying system for windows each pixel
+ * of which is guaranteed to be either completely opaque, with
+ * an alpha value of 1.0, or completely transparent, with an alpha
+ * value of 0.0.
+ */
+ PERPIXEL_TRANSPARENT,
+ /**
+ * Represents support in the underlying system for windows all of
+ * the pixels of which have the same alpha value between or including
+ * 0.0 and 1.0.
+ */
+ TRANSLUCENT,
+ /**
+ * Represents support in the underlying system for windows that
+ * contain or might contain pixels with arbitrary alpha values
+ * between and including 0.0 and 1.0.
+ */
+ PERPIXEL_TRANSLUCENT;
+ }
+
/**
* Returns the type of this <code>GraphicsDevice</code>.
* @return the type of this <code>GraphicsDevice</code>, which can
@@ -235,6 +263,21 @@
* @since 1.4
*/
public void setFullScreenWindow(Window w) {
+ if (w != null) {
+ //XXX: The actions should be documented in some non-update release.
+ /*
+ if (w.getShape() != null) {
+ w.setShape(w, null);
+ }
+ if (!w.isOpaque()) {
+ w.setOpaque(false);
+ }
+ if (w.getOpacity() < 1.0f) {
+ w.setOpacity(1.0f);
+ }
+ */
+ }
+
if (fullScreenWindow != null && windowedModeBounds != null) {
// if the window went into fs mode before it was realized it may
// have (0,0) dimensions
@@ -424,4 +467,94 @@
public int getAvailableAcceleratedMemory() {
return -1;
}
+
+ /**
+ * Returns whether the given level of translucency is supported
+ * this graphics device.
+ *
+ * @param translucencyKind a kind of translucency support
+ * @return whether the given translucency kind is supported
+ */
+ /*public */boolean isWindowTranslucencySupported(WindowTranslucency translucencyKind) {
+ switch (translucencyKind) {
+ case PERPIXEL_TRANSPARENT:
+ return isWindowShapingSupported();
+ case TRANSLUCENT:
+ return isWindowOpacitySupported();
+ case PERPIXEL_TRANSLUCENT:
+ return isWindowPerpixelTranslucencySupported();
+ }
+ return false;
+ }
+
+ /**
+ * Returns whether the windowing system supports changing the shape
+ * of top-level windows.
+ * Note that this method may sometimes return true, but the native
+ * windowing system may still not support the concept of
+ * shaping (due to the bugs in the windowing system).
+ */
+ static boolean isWindowShapingSupported() {
+ Toolkit curToolkit = Toolkit.getDefaultToolkit();
+ if (!(curToolkit instanceof SunToolkit)) {
+ return false;
+ }
+ return ((SunToolkit)curToolkit).isWindowShapingSupported();
+ }
+
+ /**
+ * Returns whether the windowing system supports changing the opacity
+ * value of top-level windows.
+ * Note that this method may sometimes return true, but the native
+ * windowing system may still not support the concept of
+ * translucency (due to the bugs in the windowing system).
+ */
+ static boolean isWindowOpacitySupported() {
+ Toolkit curToolkit = Toolkit.getDefaultToolkit();
+ if (!(curToolkit instanceof SunToolkit)) {
+ return false;
+ }
+ return ((SunToolkit)curToolkit).isWindowOpacitySupported();
+ }
+
+ boolean isWindowPerpixelTranslucencySupported() {
+ /*
+ * Per-pixel alpha is supported if all the conditions are TRUE:
+ * 1. The toolkit is a sort of SunToolkit
+ * 2. The toolkit supports translucency in general
+ * (isWindowTranslucencySupported())
+ * 3. There's at least one translucency-capable
+ * GraphicsConfiguration
+ */
+ Toolkit curToolkit = Toolkit.getDefaultToolkit();
+ if (!(curToolkit instanceof SunToolkit)) {
+ return false;
+ }
+ if (!((SunToolkit)curToolkit).isWindowTranslucencySupported()) {
+ return false;
+ }
+
+ // TODO: cache translucency capable GC
+ return getTranslucencyCapableGC() != null;
+ }
+
+ GraphicsConfiguration getTranslucencyCapableGC() {
+ // If the default GC supports translucency return true.
+ // It is important to optimize the verification this way,
+ // see CR 6661196 for more details.
+ GraphicsConfiguration defaultGC = getDefaultConfiguration();
+ if (defaultGC.isTranslucencyCapable()) {
+ return defaultGC;
+ }
+
+ // ... otherwise iterate through all the GCs.
+ GraphicsConfiguration[] configs = getConfigurations();
+ for (int j = 0; j < configs.length; j++) {
+ if (configs[j].isTranslucencyCapable()) {
+ return configs[j];
+ }
+ }
+
+ return null;
+ }
}
--- a/jdk/src/share/classes/java/awt/KeyboardFocusManager.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/awt/KeyboardFocusManager.java Mon Apr 27 12:33:57 2009 -0700
@@ -61,6 +61,7 @@
import sun.awt.SunToolkit;
import sun.awt.CausedFocusEvent;
import sun.awt.KeyboardFocusManagerPeerProvider;
+import sun.awt.AWTAccessor;
/**
* The KeyboardFocusManager is responsible for managing the active and focused
@@ -118,6 +119,32 @@
if (!GraphicsEnvironment.isHeadless()) {
initIDs();
}
+ AWTAccessor.setKeyboardFocusManagerAccessor(
+ new AWTAccessor.KeyboardFocusManagerAccessor() {
+ public int shouldNativelyFocusHeavyweight(Component heavyweight,
+ Component descendant,
+ boolean temporary,
+ boolean focusedWindowChangeAllowed,
+ long time,
+ CausedFocusEvent.Cause cause)
+ {
+ return KeyboardFocusManager.shouldNativelyFocusHeavyweight(
+ heavyweight, descendant, temporary, focusedWindowChangeAllowed, time, cause);
+ }
+ public boolean processSynchronousLightweightTransfer(Component heavyweight,
+ Component descendant,
+ boolean temporary,
+ boolean focusedWindowChangeAllowed,
+ long time)
+ {
+ return KeyboardFocusManager.processSynchronousLightweightTransfer(
+ heavyweight, descendant, temporary, focusedWindowChangeAllowed, time);
+ }
+ public void removeLastFocusRequest(Component heavyweight) {
+ KeyboardFocusManager.removeLastFocusRequest(heavyweight);
+ }
+ }
+ );
}
transient KeyboardFocusManagerPeer peer;
@@ -2208,7 +2235,7 @@
boolean temporary, boolean focusedWindowChangeAllowed,
long time)
{
- Window parentWindow = Component.getContainingWindow(heavyweight);
+ Window parentWindow = SunToolkit.getContainingWindow(heavyweight);
if (parentWindow == null || !parentWindow.syncLWRequests) {
return false;
}
@@ -2443,79 +2470,7 @@
}
}
}
- static void heavyweightButtonDown(Component heavyweight, long time) {
- heavyweightButtonDown(heavyweight, time, false);
- }
- static void heavyweightButtonDown(Component heavyweight, long time, boolean acceptDuplicates) {
- if (log.isLoggable(Level.FINE)) {
- if (heavyweight == null) {
- log.log(Level.FINE, "Assertion (heavyweight != null) failed");
- }
- if (time == 0) {
- log.log(Level.FINE, "Assertion (time != 0) failed");
- }
- }
- KeyboardFocusManager manager = getCurrentKeyboardFocusManager(SunToolkit.targetToAppContext(heavyweight));
- synchronized (heavyweightRequests) {
- HeavyweightFocusRequest hwFocusRequest = getLastHWRequest();
- Component currentNativeFocusOwner = (hwFocusRequest == null)
- ? manager.getNativeFocusOwner()
- : hwFocusRequest.heavyweight;
-
- // Behavior for all use cases:
- // 1. Heavyweight leaf Components (e.g., Button, Checkbox, Choice,
- // List, TextComponent, Canvas) that respond to button down.
- //
- // Native platform will generate a FOCUS_GAINED if and only if
- // the Component is not the focus owner (or, will not be the
- // focus owner when all outstanding focus requests are
- // processed).
- //
- // 2. Panel with no descendants.
- //
- // Same as (1).
- //
- // 3. Panel with at least one heavyweight descendant.
- //
- // This function should NOT be called for this case!
- //
- // 4. Panel with only lightweight descendants.
- //
- // Native platform will generate a FOCUS_GAINED if and only if
- // neither the Panel, nor any of its recursive, lightweight
- // descendants, is the focus owner. However, we want a
- // requestFocus() for any lightweight descendant to win out over
- // the focus request for the Panel. To accomplish this, we
- // differ from the algorithm for shouldNativelyFocusHeavyweight
- // as follows:
- // a. If the requestFocus() for a lightweight descendant has
- // been fully handled by the time this function is invoked,
- // then 'hwFocusRequest' will be null and 'heavyweight'
- // will be the native focus owner. Do *not* synthesize a
- // focus transfer to the Panel.
- // b. If the requestFocus() for a lightweight descendant has
- // been recorded, but not handled, then 'hwFocusRequest'
- // will be non-null and 'hwFocusRequest.heavyweight' will
- // equal 'heavyweight'. Do *not* append 'heavyweight' to
- // hwFocusRequest.lightweightRequests.
- // c. If the requestFocus() for a lightweight descendant is
- // yet to be made, then post a new HeavyweightFocusRequest.
- // If no lightweight descendant ever requests focus, then
- // the Panel will get focus. If some descendant does, then
- // the descendant will get focus by either a synthetic
- // focus transfer, or a lightweightRequests focus transfer.
-
- if (acceptDuplicates || heavyweight != currentNativeFocusOwner) {
- getCurrentKeyboardFocusManager
- (SunToolkit.targetToAppContext(heavyweight)).
- enqueueKeyEvents(time, heavyweight);
- heavyweightRequests.add
- (new HeavyweightFocusRequest(heavyweight, heavyweight,
- false, CausedFocusEvent.Cause.MOUSE_EVENT));
- }
- }
- }
/**
* Returns the Window which will be active after processing this request,
* or null if this is a duplicate request. The active Window is useful
@@ -2542,7 +2497,7 @@
(HeavyweightFocusRequest.CLEAR_GLOBAL_FOCUS_OWNER);
Component activeWindow = ((hwFocusRequest != null)
- ? Component.getContainingWindow(hwFocusRequest.heavyweight)
+ ? SunToolkit.getContainingWindow(hwFocusRequest.heavyweight)
: nativeFocusedWindow);
while (activeWindow != null &&
!((activeWindow instanceof Frame) ||
@@ -3013,8 +2968,8 @@
}
private static boolean focusedWindowChanged(Component to, Component from) {
- Window wto = Component.getContainingWindow(to);
- Window wfrom = Component.getContainingWindow(from);
+ Window wto = SunToolkit.getContainingWindow(to);
+ Window wfrom = SunToolkit.getContainingWindow(from);
if (wto == null && wfrom == null) {
return true;
}
@@ -3028,8 +2983,8 @@
}
private static boolean isTemporary(Component to, Component from) {
- Window wto = Component.getContainingWindow(to);
- Window wfrom = Component.getContainingWindow(from);
+ Window wto = SunToolkit.getContainingWindow(to);
+ Window wfrom = SunToolkit.getContainingWindow(from);
if (wto == null && wfrom == null) {
return false;
}
--- a/jdk/src/share/classes/java/awt/MenuItem.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/awt/MenuItem.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1995-2009 Sun Microsystems, Inc. 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
@@ -398,9 +398,11 @@
boolean handleShortcut(KeyEvent e) {
MenuShortcut s = new MenuShortcut(e.getKeyCode(),
(e.getModifiers() & InputEvent.SHIFT_MASK) > 0);
+ MenuShortcut sE = new MenuShortcut(e.getExtendedKeyCode(),
+ (e.getModifiers() & InputEvent.SHIFT_MASK) > 0);
// Fix For 6185151: Menu shortcuts of all menuitems within a menu
// should be disabled when the menu itself is disabled
- if (s.equals(shortcut) && isItemEnabled()) {
+ if ((s.equals(shortcut) || sE.equals(shortcut)) && isItemEnabled()) {
// MenuShortcut match -- issue an event on keydown.
if (e.getID() == KeyEvent.KEY_PRESSED) {
doMenuEvent(e.getWhen(), e.getModifiers());
--- a/jdk/src/share/classes/java/awt/MenuShortcut.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/awt/MenuShortcut.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2003 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -34,7 +34,21 @@
* For example, a menu shortcut for Ctrl-a (assuming that Control is
* the accelerator key) would be created with code like the following:
* <p>
- * MenuShortcut ms = new MenuShortcut(KeyEvent.VK_A, false);
+ * <code>MenuShortcut ms = new MenuShortcut(KeyEvent.VK_A, false);</code>
+ * <p> or alternatively
+ * <p>
+ * <code>MenuShortcut ms = new MenuShortcut(KeyEvent.getExtendedKeyCodeForChar('A'), false);</code>
+ * <p>
+ * Menu shortcuts may also be constructed for a wider set of keycodes
+ * using the <code>java.awt.event.KeyEvent.getExtendedKeyCodeForChar</code> call.
+ * For example, a menu shortcut for "Ctrl+cyrillic ef" is created by
+ * <p>
+ * <code>MenuShortcut ms = new MenuShortcut(KeyEvent.getExtendedKeyCodeForChar('\u0444'), false);</code>
+ * <p>
+ * Note that shortcuts created with a keycode or an extended keycode defined as a constant in <code>KeyEvent</code>
+ * work regardless of the current keyboard layout. However, a shortcut made of
+ * an extended keycode not listed in <code>KeyEvent</code>
+ * only work if the current keyboard layout produces a corresponding letter.
* <p>
* The accelerator key is platform-dependent and may be obtained
* via {@link Toolkit#getMenuShortcutKeyMask}.
--- a/jdk/src/share/classes/java/awt/Window.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/awt/Window.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1995-2009 Sun Microsystems, Inc. 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,8 +25,10 @@
package java.awt;
import java.awt.event.*;
+import java.awt.geom.Point2D;
import java.awt.im.InputContext;
import java.awt.image.BufferStrategy;
+import java.awt.image.BufferedImage;
import java.awt.peer.ComponentPeer;
import java.awt.peer.WindowPeer;
import java.beans.PropertyChangeListener;
@@ -49,6 +51,7 @@
import java.util.logging.Logger;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.accessibility.*;
+import sun.awt.AWTAccessor;
import sun.awt.AppContext;
import sun.awt.CausedFocusEvent;
import sun.awt.SunToolkit;
@@ -291,6 +294,25 @@
*/
transient boolean isInShow = false;
+ /*
+ * Opacity level of the window
+ *
+ * @see #setOpacity(float)
+ * @see #getOpacity()
+ * @since 1.7
+ */
+ private float opacity = 1.0f;
+
+ /*
+ * The shape assigned to this window. This field is set to null if
+ * no shape is set (rectangular window).
+ *
+ * @see #getShape()
+ * @see #setShape(Shape)
+ * @since 1.7
+ */
+ private Shape shape = null;
+
private static final String base = "win";
private static int nameCounter = 0;
@@ -305,6 +327,23 @@
transient boolean isTrayIconWindow = false;
+ /**
+ * These fields are initialized in the native peer code
+ * or via AWTAccessor's WindowAccessor.
+ */
+ private transient volatile int securityWarningWidth = 0;
+ private transient volatile int securityWarningHeight = 0;
+
+ /**
+ * These fields represent the desired location for the security
+ * warning if this window is untrusted.
+ * See com.sun.awt.SecurityWarning for more details.
+ */
+ private transient double securityWarningPointX = 2.0;
+ private transient double securityWarningPointY = 0.0;
+ private transient float securityWarningAlignmentX = RIGHT_ALIGNMENT;
+ private transient float securityWarningAlignmentY = TOP_ALIGNMENT;
+
static {
/* ensure that the necessary native libraries are loaded */
Toolkit.loadLibraries();
@@ -373,6 +412,18 @@
}
}
+ private GraphicsConfiguration initGC(GraphicsConfiguration gc) {
+ GraphicsEnvironment.checkHeadless();
+
+ if (gc == null) {
+ gc = GraphicsEnvironment.getLocalGraphicsEnvironment().
+ getDefaultScreenDevice().getDefaultConfiguration();
+ }
+ setGraphicsConfiguration(gc);
+
+ return gc;
+ }
+
private void init(GraphicsConfiguration gc) {
GraphicsEnvironment.checkHeadless();
@@ -384,14 +435,10 @@
setWarningString();
this.cursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
this.visible = false;
- if (gc == null) {
- this.graphicsConfig =
- GraphicsEnvironment.getLocalGraphicsEnvironment().
- getDefaultScreenDevice().getDefaultConfiguration();
- } else {
- this.graphicsConfig = gc;
- }
- if (graphicsConfig.getDevice().getType() !=
+
+ gc = initGC(gc);
+
+ if (gc.getDevice().getType() !=
GraphicsDevice.TYPE_RASTER_SCREEN) {
throw new IllegalArgumentException("not a screen device");
}
@@ -399,8 +446,8 @@
/* offset the initial location with the original of the screen */
/* and any insets */
- Rectangle screenBounds = graphicsConfig.getBounds();
- Insets screenInsets = getToolkit().getScreenInsets(graphicsConfig);
+ Rectangle screenBounds = gc.getBounds();
+ Insets screenInsets = getToolkit().getScreenInsets(gc);
int x = getX() + screenBounds.x + screenInsets.left;
int y = getY() + screenBounds.y + screenInsets.top;
if (x != this.x || y != this.y) {
@@ -2744,7 +2791,7 @@
sun.java2d.Disposer.addRecord(anchor, new WindowDisposerRecord(appContext, this));
addToWindowList();
-
+ initGC(null);
}
private void deserializeResources(ObjectInputStream s)
@@ -2849,6 +2896,15 @@
if(aot) {
setAlwaysOnTop(aot); // since 1.5; subject to permission check
}
+ shape = (Shape)f.get("shape", null);
+ opacity = (Float)f.get("opacity", 1.0f);
+
+ this.securityWarningWidth = 0;
+ this.securityWarningHeight = 0;
+ this.securityWarningPointX = 2.0;
+ this.securityWarningPointY = 0.0;
+ this.securityWarningAlignmentX = RIGHT_ALIGNMENT;
+ this.securityWarningAlignmentY = TOP_ALIGNMENT;
deserializeResources(s);
}
@@ -2916,41 +2972,18 @@
} // inner class AccessibleAWTWindow
- /**
- * This method returns the GraphicsConfiguration used by this Window.
- * @since 1.3
- */
- public GraphicsConfiguration getGraphicsConfiguration() {
- //NOTE: for multiscreen, this will need to take into account
- //which screen the window is on/mostly on instead of returning the
- //default or constructor argument config.
- synchronized(getTreeLock()) {
- if (graphicsConfig == null && !GraphicsEnvironment.isHeadless()) {
- graphicsConfig =
- GraphicsEnvironment. getLocalGraphicsEnvironment().
- getDefaultScreenDevice().
- getDefaultConfiguration();
- }
- return graphicsConfig;
- }
- }
-
- /**
- * Reset this Window's GraphicsConfiguration to match its peer.
- */
- void resetGC() {
- if (!GraphicsEnvironment.isHeadless()) {
- // use the peer's GC
- setGCFromPeer();
- // if it's still null, use the default
- if (graphicsConfig == null) {
- graphicsConfig = GraphicsEnvironment.
+ @Override
+ void setGraphicsConfiguration(GraphicsConfiguration gc) {
+ if (gc == null) {
+ gc = GraphicsEnvironment.
getLocalGraphicsEnvironment().
getDefaultScreenDevice().
getDefaultConfiguration();
- }
+ }
+ synchronized (getTreeLock()) {
+ super.setGraphicsConfiguration(gc);
if (log.isLoggable(Level.FINER)) {
- log.finer("+ Window.resetGC(): new GC is \n+ " + graphicsConfig + "\n+ this is " + this);
+ log.finer("+ Window.setGraphicsConfiguration(): new GC is \n+ " + getGraphicsConfiguration_NoClientCode() + "\n+ this is " + this);
}
}
}
@@ -3010,13 +3043,13 @@
// target location
int dx = 0, dy = 0;
// target GC
- GraphicsConfiguration gc = this.graphicsConfig;
+ GraphicsConfiguration gc = getGraphicsConfiguration_NoClientCode();
Rectangle gcBounds = gc.getBounds();
Dimension windowSize = getSize();
// search a top-level of c
- Window componentWindow = Component.getContainingWindow(c);
+ Window componentWindow = SunToolkit.getContainingWindow(c);
if ((c == null) || (componentWindow == null)) {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
@@ -3304,6 +3337,225 @@
}
+ // ******************** SHAPES & TRANSPARENCY CODE ********************
+
+ /**
+ * JavaDoc
+ */
+ /*public */float getOpacity() {
+ synchronized (getTreeLock()) {
+ return opacity;
+ }
+ }
+
+ /**
+ * JavaDoc
+ */
+ /*public */void setOpacity(float opacity) {
+ synchronized (getTreeLock()) {
+ if (opacity < 0.0f || opacity > 1.0f) {
+ throw new IllegalArgumentException(
+ "The value of opacity should be in the range [0.0f .. 1.0f].");
+ }
+ GraphicsConfiguration gc = getGraphicsConfiguration();
+ GraphicsDevice gd = gc.getDevice();
+ if (!gd.isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.TRANSLUCENT)) {
+ throw new UnsupportedOperationException(
+ "TRANSLUCENT translucency is not supported.");
+ }
+ if ((gc.getDevice().getFullScreenWindow() == this) && (opacity < 1.0f)) {
+ throw new IllegalArgumentException(
+ "Setting opacity for full-screen window is not supported.");
+ }
+ this.opacity = opacity;
+ WindowPeer peer = (WindowPeer)getPeer();
+ if (peer != null) {
+ peer.setOpacity(opacity);
+ }
+ }
+ }
+
+ /**
+ * JavaDoc
+ */
+ /*public */Shape getShape() {
+ synchronized (getTreeLock()) {
+ return shape;
+ }
+ }
+
+ /**
+ * JavaDoc
+ *
+ * @param window the window to set the shape to
+ * @param shape the shape to set to the window
+ * @throws IllegalArgumentException if the window is in full screen mode,
+ * and the shape is not null
+ */
+ /*public */void setShape(Shape shape) {
+ synchronized (getTreeLock()) {
+ GraphicsConfiguration gc = getGraphicsConfiguration();
+ GraphicsDevice gd = gc.getDevice();
+ if (!gd.isWindowTranslucencySupported(
+ GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSPARENT))
+ {
+ throw new UnsupportedOperationException(
+ "PERPIXEL_TRANSPARENT translucency is not supported.");
+ }
+ if ((gc.getDevice().getFullScreenWindow() == this) && (shape != null)) {
+ throw new IllegalArgumentException(
+ "Setting shape for full-screen window is not supported.");
+ }
+ this.shape = shape;
+ WindowPeer peer = (WindowPeer)getPeer();
+ if (peer != null) {
+ peer.applyShape(shape == null ? null : Region.getInstance(shape, null));
+ }
+ }
+ }
+
+ /**
+ * JavaDoc
+ */
+/*
+ @Override
+ public void setBackground(Color bgColor) {
+ int alpha = bgColor.getAlpha();
+ if (alpha < 255) { // non-opaque window
+ GraphicsConfiguration gc = getGraphicsConfiguration();
+ GraphicsDevice gd = gc.getDevice();
+ if (gc.getDevice().getFullScreenWindow() == this) {
+ throw new IllegalArgumentException(
+ "Making full-screen window non opaque is not supported.");
+ }
+ if (!gc.isTranslucencyCapable()) {
+ GraphicsConfiguration capableGC = gd.getTranslucencyCapableGC();
+ if (capableGC == null) {
+ throw new IllegalArgumentException(
+ "PERPIXEL_TRANSLUCENT translucency is not supported");
+ }
+ // TODO: change GC
+ }
+ setLayersOpaque(this, false);
+ }
+
+ super.setBackground(bgColor);
+
+ WindowPeer peer = (WindowPeer)getPeer();
+ if (peer != null) {
+ peer.setOpaque(alpha == 255);
+ }
+ }
+*/
+
+ private transient boolean opaque = true;
+
+ void setOpaque(boolean opaque) {
+ synchronized (getTreeLock()) {
+ GraphicsConfiguration gc = getGraphicsConfiguration();
+ if (!opaque && !com.sun.awt.AWTUtilities.isTranslucencyCapable(gc)) {
+ throw new IllegalArgumentException(
+ "The window must use a translucency-compatible graphics configuration");
+ }
+ if (!com.sun.awt.AWTUtilities.isTranslucencySupported(
+ com.sun.awt.AWTUtilities.Translucency.PERPIXEL_TRANSLUCENT))
+ {
+ throw new UnsupportedOperationException(
+ "PERPIXEL_TRANSLUCENT translucency is not supported.");
+ }
+ if ((gc.getDevice().getFullScreenWindow() == this) && !opaque) {
+ throw new IllegalArgumentException(
+ "Making full-screen window non opaque is not supported.");
+ }
+ setLayersOpaque(this, opaque);
+ this.opaque = opaque;
+ WindowPeer peer = (WindowPeer)getPeer();
+ if (peer != null) {
+ peer.setOpaque(opaque);
+ }
+ }
+ }
+
+ private void updateWindow(BufferedImage backBuffer) {
+ synchronized (getTreeLock()) {
+ WindowPeer peer = (WindowPeer)getPeer();
+ if (peer != null) {
+ peer.updateWindow(backBuffer);
+ }
+ }
+ }
+
+ private static final Color TRANSPARENT_BACKGROUND_COLOR = new Color(0, 0, 0, 0);
+
+ private static void setLayersOpaque(Component component, boolean isOpaque) {
+ // Shouldn't use instanceof to avoid loading Swing classes
+ // if it's a pure AWT application.
+ if (Component.doesImplement(component, "javax.swing.RootPaneContainer")) {
+ javax.swing.RootPaneContainer rpc = (javax.swing.RootPaneContainer)component;
+ javax.swing.JRootPane root = rpc.getRootPane();
+ javax.swing.JLayeredPane lp = root.getLayeredPane();
+ Container c = root.getContentPane();
+ javax.swing.JComponent content =
+ (c instanceof javax.swing.JComponent) ? (javax.swing.JComponent)c : null;
+ javax.swing.JComponent gp =
+ (rpc.getGlassPane() instanceof javax.swing.JComponent) ?
+ (javax.swing.JComponent)rpc.getGlassPane() : null;
+ if (gp != null) {
+ gp.setDoubleBuffered(isOpaque);
+ }
+ lp.setOpaque(isOpaque);
+ root.setOpaque(isOpaque);
+ root.setDoubleBuffered(isOpaque); //XXX: the "white rect" workaround
+ if (content != null) {
+ content.setOpaque(isOpaque);
+ content.setDoubleBuffered(isOpaque); //XXX: the "white rect" workaround
+
+ // Iterate down one level to see whether we have a JApplet
+ // (which is also a RootPaneContainer) which requires processing
+ int numChildren = content.getComponentCount();
+ if (numChildren > 0) {
+ Component child = content.getComponent(0);
+ // It's OK to use instanceof here because we've
+ // already loaded the RootPaneContainer class by now
+ if (child instanceof javax.swing.RootPaneContainer) {
+ setLayersOpaque(child, isOpaque);
+ }
+ }
+ }
+ }
+
+ Color bg = component.getBackground();
+ boolean hasTransparentBg = TRANSPARENT_BACKGROUND_COLOR.equals(bg);
+
+ Container container = null;
+ if (component instanceof Container) {
+ container = (Container) component;
+ }
+
+ if (isOpaque) {
+ if (hasTransparentBg) {
+ // Note: we use the SystemColor.window color as the default.
+ // This color is used in the WindowPeer implementations to
+ // initialize the background color of the window if it is null.
+ // (This might not be the right thing to do for other
+ // RootPaneContainers we might be invoked with)
+ Color newColor = null;
+ if (container != null && container.preserveBackgroundColor != null) {
+ newColor = container.preserveBackgroundColor;
+ } else {
+ newColor = SystemColor.window;
+ }
+ component.setBackground(newColor);
+ }
+ } else {
+ if (!hasTransparentBg && container != null) {
+ container.preserveBackgroundColor = bg;
+ }
+ component.setBackground(TRANSPARENT_BACKGROUND_COLOR);
+ }
+ }
+
+
// ************************** MIXING CODE *******************************
// A window has a parent, but it does NOT have a container
@@ -3341,6 +3593,87 @@
// ****************** END OF MIXING CODE ********************************
+ // This method gets the window location/size as reported by the native
+ // system since the locally cached values may represent outdated data.
+ // NOTE: this method is invoked on the toolkit thread, and therefore
+ // is not supposed to become public/user-overridable.
+ private Point2D calculateSecurityWarningPosition(double x, double y,
+ double w, double h)
+ {
+ return new Point2D.Double(
+ x + w * securityWarningAlignmentX + securityWarningPointX,
+ y + h * securityWarningAlignmentY + securityWarningPointY);
+ }
+
+ static {
+ AWTAccessor.setWindowAccessor(new AWTAccessor.WindowAccessor() {
+ public float getOpacity(Window window) {
+ return window.opacity;
+ }
+ public void setOpacity(Window window, float opacity) {
+ window.setOpacity(opacity);
+ }
+ public Shape getShape(Window window) {
+ return window.getShape();
+ }
+ public void setShape(Window window, Shape shape) {
+ window.setShape(shape);
+ }
+ public boolean isOpaque(Window window) {
+ /*
+ return window.getBackground().getAlpha() < 255;
+ */
+ synchronized (window.getTreeLock()) {
+ return window.opaque;
+ }
+ }
+ public void setOpaque(Window window, boolean opaque) {
+ /*
+ Color bg = window.getBackground();
+ window.setBackground(new Color(bg.getRed(), bg.getGreen(), bg.getBlue(),
+ opaque ? 255 : 0));
+ */
+ window.setOpaque(opaque);
+ }
+ public void updateWindow(Window window, BufferedImage backBuffer) {
+ window.updateWindow(backBuffer);
+ }
+
+ public Dimension getSecurityWarningSize(Window window) {
+ return new Dimension(window.securityWarningWidth,
+ window.securityWarningHeight);
+ }
+
+ public void setSecurityWarningSize(Window window, int width, int height)
+ {
+ window.securityWarningWidth = width;
+ window.securityWarningHeight = height;
+ }
+
+ public void setSecurityWarningPosition(Window window,
+ Point2D point, float alignmentX, float alignmentY)
+ {
+ window.securityWarningPointX = point.getX();
+ window.securityWarningPointY = point.getY();
+ window.securityWarningAlignmentX = alignmentX;
+ window.securityWarningAlignmentY = alignmentY;
+
+ synchronized (window.getTreeLock()) {
+ WindowPeer peer = (WindowPeer)window.getPeer();
+ if (peer != null) {
+ peer.repositionSecurityWarning();
+ }
+ }
+ }
+
+ public Point2D calculateSecurityWarningPosition(Window window,
+ double x, double y, double w, double h)
+ {
+ return window.calculateSecurityWarningPosition(x, y, w, h);
+ }
+ }); // WindowAccessor
+ } // static
+
} // class Window
--- a/jdk/src/share/classes/java/awt/event/KeyEvent.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/awt/event/KeyEvent.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -65,15 +65,16 @@
* <p>
* For key pressed and key released events, the getKeyCode method returns
* the event's keyCode. For key typed events, the getKeyCode method
- * always returns VK_UNDEFINED.
+ * always returns {@code VK_UNDEFINED}. The {@code getExtendedKeyCode} method
+ * may also be used with many international keyboard layouts.
*
* <p>
* <em>"Key pressed" and "key released" events</em> are lower-level and depend
* on the platform and keyboard layout. They are generated whenever a key is
* pressed or released, and are the only way to find out about keys that don't
* generate character input (e.g., action keys, modifier keys, etc.). The key
- * being pressed or released is indicated by the getKeyCode method, which returns
- * a virtual key code.
+ * being pressed or released is indicated by the {@code getKeyCode} and {@code getExtendedKeyCode}
+ * methods, which return a virtual key code.
*
* <p>
* <em>Virtual key codes</em> are used to report which keyboard key has
@@ -111,6 +112,11 @@
* platform and keyboard layout. For example, the key that generates VK_Q
* when using a U.S. keyboard layout will generate VK_A when using a French
* keyboard layout.
+ * <li>The key that generates {@code VK_Q} when using a U.S. keyboard layout also
+ * generates a unique code for Russian or Hebrew layout. There is no a
+ * {@code VK_} constant for these and many other codes in various layouts. These codes
+ * may be obtained by using {@code getExtendedKeyCode} and are used whenever
+ * a {@code VK_} constant is used.
* <li>Not all characters have a keycode associated with them. For example,
* there is no keycode for the question mark because there is no keyboard
* for which it appears on the primary layer.
@@ -891,6 +897,12 @@
*/
int keyLocation;
+ //set from native code.
+ private transient long rawCode = 0;
+ private transient long primaryLevelUnicode = 0;
+ private transient long scancode = 0; // for MS Windows only
+ private transient long extendedKeyCode = 0;
+
/*
* JDK 1.1 serialVersionUID
*/
@@ -1315,6 +1327,9 @@
return numpad + "-" + c;
}
+ if ((keyCode & 0x01000000) != 0) {
+ return String.valueOf((char)(keyCode ^ 0x01000000 ));
+ }
String unknown = Toolkit.getProperty("AWT.unknown", "Unknown");
return unknown + " keyCode: 0x" + Integer.toString(keyCode, 16);
}
@@ -1551,9 +1566,44 @@
str.append("KEY_LOCATION_UNKNOWN");
break;
}
+ str.append(",rawCode=").append(rawCode);
+ str.append(",primaryLevelUnicode=").append(primaryLevelUnicode);
+ str.append(",scancode=").append(scancode);
+ str.append(",extendedKeyCode=0x").append(Long.toHexString(extendedKeyCode));
return str.toString();
}
+ /**
+ * Returns an extended key code for the event.
+ * The extended key code is a unique id assigned to a key on the keyboard
+ * just like {@code keyCode}. However, unlike {@code keyCode}, this value depends on the
+ * current keyboard layout. For instance, pressing the left topmost letter key
+ * in a common English layout produces the same value as {@code keyCode}, {@code VK_Q}.
+ * Pressing the same key in a regular Russian layout gives another code, unique for the
+ * letter "Cyrillic I short".
+ *
+ * @since 1.7
+ *
+ */
+ public int getExtendedKeyCode() {
+ return (int)extendedKeyCode;
+ }
+ /**
+ * Returns an extended key code for a unicode character.
+ *
+ * @return for a unicode character with a corresponding {@code VK_} constant -- this
+ * {@code VK_} constant; for a character appearing on the primary
+ * level of a known keyboard layout -- a unique integer.
+ * If a character does not appear on the primary level of a known keyboard,
+ * {@code VK_UNDEFINED} is returned.
+ *
+ * @since 1.7
+ *
+ */
+ public static int getExtendedKeyCodeForChar(int c) {
+ // Return a keycode (if any) associated with a character.
+ return sun.awt.ExtendedKeyCodes.getExtendedKeyCodeForChar(c);
+ }
/**
* Sets new modifiers by the old ones. The key modifiers
--- a/jdk/src/share/classes/java/awt/peer/CanvasPeer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/awt/peer/CanvasPeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -25,6 +25,7 @@
package java.awt.peer;
import java.awt.Canvas;
+import java.awt.GraphicsConfiguration;
/**
* The peer interface for {@link Canvas}.
@@ -36,4 +37,13 @@
* instances.
*/
public interface CanvasPeer extends ComponentPeer {
+ /**
+ * Requests a GC that best suits this Canvas. The returned GC may differ
+ * from the requested GC passed as the argument to this method. This method
+ * must return a non-null value (given the argument is non-null as well).
+ *
+ * @since 1.7
+ */
+ GraphicsConfiguration getAppropriateGraphicsConfiguration(
+ GraphicsConfiguration gc);
}
--- a/jdk/src/share/classes/java/awt/peer/ComponentPeer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/awt/peer/ComponentPeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -539,4 +539,16 @@
*/
void applyShape(Region shape);
+ /**
+ * Lowers this component at the bottom of the above HW peer. If the above parameter
+ * is null then the method places this component at the top of the Z-order.
+ */
+ void setZOrder(ComponentPeer above);
+
+ /**
+ * Updates internal data structures related to the component's GC.
+ *
+ * @since 1.7
+ */
+ void updateGraphicsData(GraphicsConfiguration gc);
}
--- a/jdk/src/share/classes/java/awt/peer/ContainerPeer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/awt/peer/ContainerPeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -76,21 +76,4 @@
* @see Container#validateTree()
*/
void endLayout();
-
- /**
- * Restacks native windows - children of this native window - according to
- * Java container order.
- *
- * @since 1.5
- */
- void restack();
-
- /**
- * Indicates availability of restacking operation in this container.
- *
- * @return Returns true if restack is supported, false otherwise
- *
- * @since 1.5
- */
- boolean isRestackSupported();
}
--- a/jdk/src/share/classes/java/awt/peer/WindowPeer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/awt/peer/WindowPeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1995-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1995-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,8 @@
import java.awt.*;
+import java.awt.image.BufferedImage;
+
/**
* The peer interface for {@link Window}.
*
@@ -92,4 +94,31 @@
* @see Window#setIconImages(java.util.List)
*/
void updateIconImages();
+
+ /**
+ * Sets the level of opacity for the window.
+ *
+ * @see Window#setOpacity(float)
+ */
+ void setOpacity(float opacity);
+
+ /**
+ * Enables the per-pixel alpha support for the window.
+ *
+ * @see Window#setBackground(Color)
+ */
+ void setOpaque(boolean isOpaque);
+
+ /**
+ * Updates the native part of non-opaque window using
+ * the given image with color+alpha values for each pixel.
+ *
+ * @see Window#setBackground(Color)
+ */
+ void updateWindow(BufferedImage backBuffer);
+
+ /**
+ * Instructs the peer to update the position of the security warning.
+ */
+ void repositionSecurityWarning();
}
--- a/jdk/src/share/classes/java/beans/Beans.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/beans/Beans.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,26 +27,41 @@
import com.sun.beans.finder.ClassFinder;
-import java.applet.*;
+import java.applet.Applet;
+import java.applet.AppletContext;
+import java.applet.AppletStub;
+import java.applet.AudioClip;
-import java.awt.*;
-
-import java.beans.AppletInitializer;
+import java.awt.GraphicsEnvironment;
+import java.awt.Image;
import java.beans.beancontext.BeanContext;
-import java.io.*;
-
-import java.lang.reflect.Constructor;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectStreamClass;
+import java.io.StreamCorruptedException;
import java.net.URL;
-import java.lang.reflect.Array;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Vector;
+
+import sun.awt.AppContext;
/**
* This class provides some general purpose beans control methods.
*/
public class Beans {
+ private static final Object DESIGN_TIME = new Object();
+ private static final Object GUI_AVAILABLE = new Object();
/**
* <p>
@@ -59,12 +74,12 @@
* @param beanName the name of the bean within the class-loader.
* For example "sun.beanbox.foobah"
*
- * @exception java.lang.ClassNotFoundException if the class of a serialized
+ * @exception ClassNotFoundException if the class of a serialized
* object could not be found.
- * @exception java.io.IOException if an I/O error occurs.
+ * @exception IOException if an I/O error occurs.
*/
- public static Object instantiate(ClassLoader cls, String beanName) throws java.io.IOException, ClassNotFoundException {
+ public static Object instantiate(ClassLoader cls, String beanName) throws IOException, ClassNotFoundException {
return Beans.instantiate(cls, beanName, null, null);
}
@@ -80,12 +95,12 @@
* For example "sun.beanbox.foobah"
* @param beanContext The BeanContext in which to nest the new bean
*
- * @exception java.lang.ClassNotFoundException if the class of a serialized
+ * @exception ClassNotFoundException if the class of a serialized
* object could not be found.
- * @exception java.io.IOException if an I/O error occurs.
+ * @exception IOException if an I/O error occurs.
*/
- public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext) throws java.io.IOException, ClassNotFoundException {
+ public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext) throws IOException, ClassNotFoundException {
return Beans.instantiate(cls, beanName, beanContext, null);
}
@@ -135,19 +150,19 @@
* @param beanContext The BeanContext in which to nest the new bean
* @param initializer The AppletInitializer for the new bean
*
- * @exception java.lang.ClassNotFoundException if the class of a serialized
+ * @exception ClassNotFoundException if the class of a serialized
* object could not be found.
- * @exception java.io.IOException if an I/O error occurs.
+ * @exception IOException if an I/O error occurs.
*/
public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext, AppletInitializer initializer)
- throws java.io.IOException, ClassNotFoundException {
+ throws IOException, ClassNotFoundException {
- java.io.InputStream ins;
- java.io.ObjectInputStream oins = null;
+ InputStream ins;
+ ObjectInputStream oins = null;
Object result = null;
boolean serialized = false;
- java.io.IOException serex = null;
+ IOException serex = null;
// If the given classloader is null, we check if an
// system classloader is available and (if so)
@@ -166,8 +181,8 @@
// Try to find a serialized object with this name
final String serName = beanName.replace('.','/').concat(".ser");
final ClassLoader loader = cls;
- ins = (InputStream)java.security.AccessController.doPrivileged
- (new java.security.PrivilegedAction() {
+ ins = (InputStream)AccessController.doPrivileged
+ (new PrivilegedAction() {
public Object run() {
if (loader == null)
return ClassLoader.getSystemResourceAsStream(serName);
@@ -185,7 +200,7 @@
result = oins.readObject();
serialized = true;
oins.close();
- } catch (java.io.IOException ex) {
+ } catch (IOException ex) {
ins.close();
// Drop through and try opening the class. But remember
// the exception in case we can't find the class either.
@@ -264,8 +279,8 @@
final ClassLoader cloader = cls;
objectUrl = (URL)
- java.security.AccessController.doPrivileged
- (new java.security.PrivilegedAction() {
+ AccessController.doPrivileged
+ (new PrivilegedAction() {
public Object run() {
if (cloader == null)
return ClassLoader.getSystemResource
@@ -377,10 +392,11 @@
* @return True if we are running in an application construction
* environment.
*
- * @see java.beans.DesignMode
+ * @see DesignMode
*/
public static boolean isDesignTime() {
- return designTime;
+ Object value = AppContext.getAppContext().get(DESIGN_TIME);
+ return (value instanceof Boolean) && (Boolean) value;
}
/**
@@ -393,11 +409,12 @@
* false in a server environment or if an application is
* running as part of a batch job.
*
- * @see java.beans.Visibility
+ * @see Visibility
*
*/
public static boolean isGuiAvailable() {
- return guiAvailable;
+ Object value = AppContext.getAppContext().get(GUI_AVAILABLE);
+ return (value instanceof Boolean) ? (Boolean) value : !GraphicsEnvironment.isHeadless();
}
/**
@@ -423,7 +440,7 @@
if (sm != null) {
sm.checkPropertiesAccess();
}
- designTime = isDesignTime;
+ AppContext.getAppContext().put(DESIGN_TIME, Boolean.valueOf(isDesignTime));
}
/**
@@ -449,14 +466,7 @@
if (sm != null) {
sm.checkPropertiesAccess();
}
- guiAvailable = isGuiAvailable;
- }
-
-
- private static boolean designTime;
- private static boolean guiAvailable;
- static {
- guiAvailable = !GraphicsEnvironment.isHeadless();
+ AppContext.getAppContext().put(GUI_AVAILABLE, Boolean.valueOf(isGuiAvailable));
}
}
@@ -501,7 +511,7 @@
class BeansAppletContext implements AppletContext {
Applet target;
- java.util.Hashtable imageCache = new java.util.Hashtable();
+ Hashtable imageCache = new Hashtable();
BeansAppletContext(Applet target) {
this.target = target;
@@ -546,8 +556,8 @@
return null;
}
- public java.util.Enumeration getApplets() {
- java.util.Vector applets = new java.util.Vector();
+ public Enumeration getApplets() {
+ Vector applets = new Vector();
applets.addElement(target);
return applets.elements();
}
@@ -573,7 +583,7 @@
return null;
}
- public java.util.Iterator getStreamKeys(){
+ public Iterator getStreamKeys(){
// We do nothing.
return null;
}
--- a/jdk/src/share/classes/java/beans/IndexedPropertyChangeEvent.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/beans/IndexedPropertyChangeEvent.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -41,6 +41,7 @@
* @author Mark Davidson
*/
public class IndexedPropertyChangeEvent extends PropertyChangeEvent {
+ private static final long serialVersionUID = -320227448495806870L;
private int index;
--- a/jdk/src/share/classes/java/beans/IntrospectionException.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/beans/IntrospectionException.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-1998 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -36,6 +36,7 @@
public
class IntrospectionException extends Exception {
+ private static final long serialVersionUID = -3728150539969542619L;
/**
* Constructs an <code>IntrospectionException</code> with a
--- a/jdk/src/share/classes/java/beans/PropertyChangeEvent.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/beans/PropertyChangeEvent.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -44,6 +44,7 @@
*/
public class PropertyChangeEvent extends java.util.EventObject {
+ private static final long serialVersionUID = 7042693688939648123L;
/**
* Constructs a new <code>PropertyChangeEvent</code>.
--- a/jdk/src/share/classes/java/beans/PropertyVetoException.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/beans/PropertyVetoException.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-1998 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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,7 +33,7 @@
public
class PropertyVetoException extends Exception {
-
+ private static final long serialVersionUID = 129596057694162164L;
/**
* Constructs a <code>PropertyVetoException</code> with a
--- a/jdk/src/share/classes/java/beans/beancontext/BeanContextEvent.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/beans/beancontext/BeanContextEvent.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2003 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -48,6 +48,7 @@
*/
public abstract class BeanContextEvent extends EventObject {
+ private static final long serialVersionUID = 7267998073569045052L;
/**
* Contruct a BeanContextEvent
--- a/jdk/src/share/classes/java/beans/beancontext/BeanContextMembershipEvent.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/beans/beancontext/BeanContextMembershipEvent.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2004 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -55,6 +55,7 @@
* @see java.beans.beancontext.BeanContextMembershipListener
*/
public class BeanContextMembershipEvent extends BeanContextEvent {
+ private static final long serialVersionUID = 3499346510334590959L;
/**
* Contruct a BeanContextMembershipEvent
--- a/jdk/src/share/classes/java/beans/beancontext/BeanContextServiceAvailableEvent.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/beans/beancontext/BeanContextServiceAvailableEvent.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1998-2004 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1998-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -40,6 +40,7 @@
*/
public class BeanContextServiceAvailableEvent extends BeanContextEvent {
+ private static final long serialVersionUID = -5333985775656400778L;
/**
* Construct a <code>BeanContextAvailableServiceEvent</code>.
--- a/jdk/src/share/classes/java/beans/beancontext/BeanContextServiceRevokedEvent.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/beans/beancontext/BeanContextServiceRevokedEvent.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1998-2004 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1998-2009 Sun Microsystems, Inc. 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,6 +37,7 @@
* </p>
*/
public class BeanContextServiceRevokedEvent extends BeanContextEvent {
+ private static final long serialVersionUID = -1295543154724961754L;
/**
* Construct a <code>BeanContextServiceEvent</code>.
--- a/jdk/src/share/classes/java/beans/beancontext/BeanContextServicesSupport.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/beans/beancontext/BeanContextServicesSupport.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1998-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -60,6 +60,7 @@
public class BeanContextServicesSupport extends BeanContextSupport
implements BeanContextServices {
+ private static final long serialVersionUID = -8494482757288719206L;
/**
* <p>
@@ -594,6 +595,7 @@
*/
protected static class BCSSServiceProvider implements Serializable {
+ private static final long serialVersionUID = 861278251667444782L;
BCSSServiceProvider(Class sc, BeanContextServiceProvider bcsp) {
super();
--- a/jdk/src/share/classes/java/lang/Character.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/lang/Character.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2002-2009 Sun Microsystems, Inc. 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
@@ -920,9 +920,9 @@
*/
public static final UnicodeBlock COMBINING_MARKS_FOR_SYMBOLS =
new UnicodeBlock("COMBINING_MARKS_FOR_SYMBOLS", new String[] {"Combining Diacritical Marks for Symbols",
- "CombiningDiacriticalMarksforSymbols",
- "Combining Marks for Symbols",
- "CombiningMarksforSymbols" });
+ "CombiningDiacriticalMarksforSymbols",
+ "Combining Marks for Symbols",
+ "CombiningMarksforSymbols" });
/**
* Constant for the "Letterlike Symbols" Unicode character block.
@@ -1332,8 +1332,11 @@
* @since 1.5
*/
public static final UnicodeBlock CYRILLIC_SUPPLEMENTARY =
- new UnicodeBlock("CYRILLIC_SUPPLEMENTARY", new String[] {"Cyrillic Supplementary",
- "CyrillicSupplementary"});
+ new UnicodeBlock("CYRILLIC_SUPPLEMENTARY",
+ new String[] {"Cyrillic Supplementary",
+ "CyrillicSupplementary",
+ "Cyrillic Supplement",
+ "CyrillicSupplement"});
/**
* Constant for the "Tagalog" Unicode character block.
@@ -1641,157 +1644,579 @@
public static final UnicodeBlock LOW_SURROGATES =
new UnicodeBlock("LOW_SURROGATES", new String[] {"Low Surrogates", "LowSurrogates"});
+ /**
+ * Constant for the "Arabic Supplement" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock ARABIC_SUPPLEMENT =
+ new UnicodeBlock("ARABIC_SUPPLEMENT",
+ new String[] { "Arabic Supplement",
+ "ArabicSupplement"});
+
+ /**
+ * Constant for the "NKo" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock NKO = new UnicodeBlock("NKO");
+
+ /**
+ * Constant for the "Ethiopic Supplement" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock ETHIOPIC_SUPPLEMENT =
+ new UnicodeBlock("ETHIOPIC_SUPPLEMENT",
+ new String[] { "Ethiopic Supplement",
+ "EthiopicSupplement"});
+
+ /**
+ * Constant for the "New Tai Lue" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock NEW_TAI_LUE =
+ new UnicodeBlock("NEW_TAI_LUE",
+ new String[] { "New Tai Lue",
+ "NewTaiLue"});
+
+ /**
+ * Constant for the "Buginese" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock BUGINESE =
+ new UnicodeBlock("BUGINESE");
+
+ /**
+ * Constant for the "Balinese" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock BALINESE =
+ new UnicodeBlock("BALINESE");
+
+ /**
+ * Constant for the "Sundanese" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock SUNDANESE =
+ new UnicodeBlock("SUNDANESE");
+
+ /**
+ * Constant for the "Lepcha" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock LEPCHA = new UnicodeBlock("LEPCHA");
+
+ /**
+ * Constant for the "Ol Chiki" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock OL_CHIKI =
+ new UnicodeBlock("OL_CHIKI",
+ new String[] { "Ol Chiki",
+ "OlChiki"});
+
+ /**
+ * Constant for the "Phonetic Extensions Supplement" Unicode character
+ * block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock PHONETIC_EXTENSIONS_SUPPLEMENT =
+ new UnicodeBlock("PHONETIC_EXTENSIONS_SUPPLEMENT",
+ new String[] { "Phonetic Extensions Supplement",
+ "PhoneticExtensionsSupplement"});
+
+ /**
+ * Constant for the "Combining Diacritical Marks Supplement" Unicode
+ * character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock COMBINING_DIACRITICAL_MARKS_SUPPLEMENT =
+ new UnicodeBlock("COMBINING_DIACRITICAL_MARKS_SUPPLEMENT",
+ new String[] { "Combining Diacritical Marks Supplement",
+ "CombiningDiacriticalMarksSupplement"});
+
+ /**
+ * Constant for the "Glagolitic" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock GLAGOLITIC =
+ new UnicodeBlock("GLAGOLITIC");
+
+ /**
+ * Constant for the "Latin Extended-C" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock LATIN_EXTENDED_C =
+ new UnicodeBlock("LATIN_EXTENDED_C",
+ new String[] { "Latin Extended-C",
+ "LatinExtended-C"});
+
+ /**
+ * Constant for the "Coptic" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock COPTIC = new UnicodeBlock("COPTIC");
+
+ /**
+ * Constant for the "Georgian Supplement" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock GEORGIAN_SUPPLEMENT =
+ new UnicodeBlock("GEORGIAN_SUPPLEMENT",
+ new String[] { "Georgian Supplement",
+ "GeorgianSupplement"});
+
+ /**
+ * Constant for the "Tifinagh" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock TIFINAGH =
+ new UnicodeBlock("TIFINAGH");
+
+ /**
+ * Constant for the "Ethiopic Extended" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock ETHIOPIC_EXTENDED =
+ new UnicodeBlock("ETHIOPIC_EXTENDED",
+ new String[] { "Ethiopic Extended",
+ "EthiopicExtended"});
+
+ /**
+ * Constant for the "Cyrillic Extended-A" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock CYRILLIC_EXTENDED_A =
+ new UnicodeBlock("CYRILLIC_EXTENDED_A",
+ new String[] { "Cyrillic Extended-A",
+ "CyrillicExtended-A"});
+
+ /**
+ * Constant for the "Supplemental Punctuation" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock SUPPLEMENTAL_PUNCTUATION =
+ new UnicodeBlock("SUPPLEMENTAL_PUNCTUATION",
+ new String[] { "Supplemental Punctuation",
+ "SupplementalPunctuation"});
+
+ /**
+ * Constant for the "CJK Strokes" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock CJK_STROKES =
+ new UnicodeBlock("CJK_STROKES",
+ new String[] { "CJK Strokes",
+ "CJKStrokes"});
+
+ /**
+ * Constant for the "Vai" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock VAI = new UnicodeBlock("VAI");
+
+ /**
+ * Constant for the "Cyrillic Extended-B" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock CYRILLIC_EXTENDED_B =
+ new UnicodeBlock("CYRILLIC_EXTENDED_B",
+ new String[] { "Cyrillic Extended-B",
+ "CyrillicExtended-B"});
+
+ /**
+ * Constant for the "Modifier Tone Letters" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock MODIFIER_TONE_LETTERS =
+ new UnicodeBlock("MODIFIER_TONE_LETTERS",
+ new String[] { "Modifier Tone Letters",
+ "ModifierToneLetters"});
+
+ /**
+ * Constant for the "Latin Extended-D" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock LATIN_EXTENDED_D =
+ new UnicodeBlock("LATIN_EXTENDED_D",
+ new String[] { "Latin Extended-D",
+ "LatinExtended-D"});
+
+ /**
+ * Constant for the "Syloti Nagri" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock SYLOTI_NAGRI =
+ new UnicodeBlock("SYLOTI_NAGRI",
+ new String[] { "Syloti Nagri",
+ "SylotiNagri"});
+
+ /**
+ * Constant for the "Phags-pa" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock PHAGS_PA =
+ new UnicodeBlock("PHAGS_PA", new String[] { "Phags-pa"});
+
+ /**
+ * Constant for the "Saurashtra" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock SAURASHTRA =
+ new UnicodeBlock("SAURASHTRA");
+
+ /**
+ * Constant for the "Kayah Li" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock KAYAH_LI =
+ new UnicodeBlock("KAYAH_LI",
+ new String[] { "Kayah Li",
+ "KayahLi"});
+
+ /**
+ * Constant for the "Rejang" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock REJANG = new UnicodeBlock("REJANG");
+
+ /**
+ * Constant for the "Cham" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock CHAM = new UnicodeBlock("CHAM");
+
+ /**
+ * Constant for the "Vertical Forms" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock VERTICAL_FORMS =
+ new UnicodeBlock("VERTICAL_FORMS",
+ new String[] { "Vertical Forms",
+ "VerticalForms"});
+
+ /**
+ * Constant for the "Ancient Greek Numbers" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock ANCIENT_GREEK_NUMBERS =
+ new UnicodeBlock("ANCIENT_GREEK_NUMBERS",
+ new String[] { "Ancient Greek Numbers",
+ "AncientGreekNumbers"});
+
+ /**
+ * Constant for the "Ancient Symbols" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock ANCIENT_SYMBOLS =
+ new UnicodeBlock("ANCIENT_SYMBOLS",
+ new String[] { "Ancient Symbols",
+ "AncientSymbols"});
+
+ /**
+ * Constant for the "Phaistos Disc" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock PHAISTOS_DISC =
+ new UnicodeBlock("PHAISTOS_DISC",
+ new String[] { "Phaistos Disc",
+ "PhaistosDisc"});
+
+ /**
+ * Constant for the "Lycian" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock LYCIAN = new UnicodeBlock("LYCIAN");
+
+ /**
+ * Constant for the "Carian" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock CARIAN = new UnicodeBlock("CARIAN");
+
+ /**
+ * Constant for the "Old Persian" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock OLD_PERSIAN =
+ new UnicodeBlock("OLD_PERSIAN",
+ new String[] { "Old Persian",
+ "OldPersian"});
+
+ /**
+ * Constant for the "Phoenician" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock PHOENICIAN =
+ new UnicodeBlock("PHOENICIAN");
+
+ /**
+ * Constant for the "Lydian" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock LYDIAN = new UnicodeBlock("LYDIAN");
+
+ /**
+ * Constant for the "Kharoshthi" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock KHAROSHTHI =
+ new UnicodeBlock("KHAROSHTHI");
+
+ /**
+ * Constant for the "Cuneiform" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock CUNEIFORM =
+ new UnicodeBlock("CUNEIFORM");
+
+ /**
+ * Constant for the "Cuneiform Numbers and Punctuation" Unicode
+ * character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock CUNEIFORM_NUMBERS_AND_PUNCTUATION =
+ new UnicodeBlock("CUNEIFORM_NUMBERS_AND_PUNCTUATION",
+ new String[] { "Cuneiform Numbers and Punctuation",
+ "CuneiformNumbersandPunctuation"});
+
+ /**
+ * Constant for the "Ancient Greek Musical Notation" Unicode character
+ * block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock ANCIENT_GREEK_MUSICAL_NOTATION =
+ new UnicodeBlock("ANCIENT_GREEK_MUSICAL_NOTATION",
+ new String[] { "Ancient Greek Musical Notation",
+ "AncientGreekMusicalNotation"});
+
+ /**
+ * Constant for the "Counting Rod Numerals" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock COUNTING_ROD_NUMERALS =
+ new UnicodeBlock("COUNTING_ROD_NUMERALS",
+ new String[] { "Counting Rod Numerals",
+ "CountingRodNumerals"});
+
+ /**
+ * Constant for the "Mahjong Tiles" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock MAHJONG_TILES =
+ new UnicodeBlock("MAHJONG_TILES",
+ new String[] { "Mahjong Tiles",
+ "MahjongTiles"});
+
+ /**
+ * Constant for the "Domino Tiles" Unicode character block.
+ * @since 1.7
+ */
+ public static final UnicodeBlock DOMINO_TILES =
+ new UnicodeBlock("DOMINO_TILES",
+ new String[] { "Domino Tiles",
+ "DominoTiles"});
+
private static final int blockStarts[] = {
- 0x0000, // Basic Latin
- 0x0080, // Latin-1 Supplement
- 0x0100, // Latin Extended-A
- 0x0180, // Latin Extended-B
- 0x0250, // IPA Extensions
- 0x02B0, // Spacing Modifier Letters
- 0x0300, // Combining Diacritical Marks
- 0x0370, // Greek and Coptic
- 0x0400, // Cyrillic
- 0x0500, // Cyrillic Supplementary
- 0x0530, // Armenian
- 0x0590, // Hebrew
- 0x0600, // Arabic
- 0x0700, // Syriac
- 0x0750, // unassigned
- 0x0780, // Thaana
- 0x07C0, // unassigned
- 0x0900, // Devanagari
- 0x0980, // Bengali
- 0x0A00, // Gurmukhi
- 0x0A80, // Gujarati
- 0x0B00, // Oriya
- 0x0B80, // Tamil
- 0x0C00, // Telugu
- 0x0C80, // Kannada
- 0x0D00, // Malayalam
- 0x0D80, // Sinhala
- 0x0E00, // Thai
- 0x0E80, // Lao
- 0x0F00, // Tibetan
- 0x1000, // Myanmar
- 0x10A0, // Georgian
- 0x1100, // Hangul Jamo
- 0x1200, // Ethiopic
- 0x1380, // unassigned
- 0x13A0, // Cherokee
- 0x1400, // Unified Canadian Aboriginal Syllabics
- 0x1680, // Ogham
- 0x16A0, // Runic
- 0x1700, // Tagalog
- 0x1720, // Hanunoo
- 0x1740, // Buhid
- 0x1760, // Tagbanwa
- 0x1780, // Khmer
- 0x1800, // Mongolian
- 0x18B0, // unassigned
- 0x1900, // Limbu
- 0x1950, // Tai Le
- 0x1980, // unassigned
- 0x19E0, // Khmer Symbols
- 0x1A00, // unassigned
- 0x1D00, // Phonetic Extensions
- 0x1D80, // unassigned
- 0x1E00, // Latin Extended Additional
- 0x1F00, // Greek Extended
- 0x2000, // General Punctuation
- 0x2070, // Superscripts and Subscripts
- 0x20A0, // Currency Symbols
- 0x20D0, // Combining Diacritical Marks for Symbols
- 0x2100, // Letterlike Symbols
- 0x2150, // Number Forms
- 0x2190, // Arrows
- 0x2200, // Mathematical Operators
- 0x2300, // Miscellaneous Technical
- 0x2400, // Control Pictures
- 0x2440, // Optical Character Recognition
- 0x2460, // Enclosed Alphanumerics
- 0x2500, // Box Drawing
- 0x2580, // Block Elements
- 0x25A0, // Geometric Shapes
- 0x2600, // Miscellaneous Symbols
- 0x2700, // Dingbats
- 0x27C0, // Miscellaneous Mathematical Symbols-A
- 0x27F0, // Supplemental Arrows-A
- 0x2800, // Braille Patterns
- 0x2900, // Supplemental Arrows-B
- 0x2980, // Miscellaneous Mathematical Symbols-B
- 0x2A00, // Supplemental Mathematical Operators
- 0x2B00, // Miscellaneous Symbols and Arrows
- 0x2C00, // unassigned
- 0x2E80, // CJK Radicals Supplement
- 0x2F00, // Kangxi Radicals
- 0x2FE0, // unassigned
- 0x2FF0, // Ideographic Description Characters
- 0x3000, // CJK Symbols and Punctuation
- 0x3040, // Hiragana
- 0x30A0, // Katakana
- 0x3100, // Bopomofo
- 0x3130, // Hangul Compatibility Jamo
- 0x3190, // Kanbun
- 0x31A0, // Bopomofo Extended
- 0x31C0, // unassigned
- 0x31F0, // Katakana Phonetic Extensions
- 0x3200, // Enclosed CJK Letters and Months
- 0x3300, // CJK Compatibility
- 0x3400, // CJK Unified Ideographs Extension A
- 0x4DC0, // Yijing Hexagram Symbols
- 0x4E00, // CJK Unified Ideographs
- 0xA000, // Yi Syllables
- 0xA490, // Yi Radicals
- 0xA4D0, // unassigned
- 0xAC00, // Hangul Syllables
- 0xD7B0, // unassigned
- 0xD800, // High Surrogates
- 0xDB80, // High Private Use Surrogates
- 0xDC00, // Low Surrogates
- 0xE000, // Private Use
- 0xF900, // CJK Compatibility Ideographs
- 0xFB00, // Alphabetic Presentation Forms
- 0xFB50, // Arabic Presentation Forms-A
- 0xFE00, // Variation Selectors
- 0xFE10, // unassigned
- 0xFE20, // Combining Half Marks
- 0xFE30, // CJK Compatibility Forms
- 0xFE50, // Small Form Variants
- 0xFE70, // Arabic Presentation Forms-B
- 0xFF00, // Halfwidth and Fullwidth Forms
- 0xFFF0, // Specials
- 0x10000, // Linear B Syllabary
- 0x10080, // Linear B Ideograms
- 0x10100, // Aegean Numbers
- 0x10140, // unassigned
- 0x10300, // Old Italic
- 0x10330, // Gothic
- 0x10350, // unassigned
- 0x10380, // Ugaritic
- 0x103A0, // unassigned
- 0x10400, // Deseret
- 0x10450, // Shavian
- 0x10480, // Osmanya
- 0x104B0, // unassigned
- 0x10800, // Cypriot Syllabary
- 0x10840, // unassigned
- 0x1D000, // Byzantine Musical Symbols
- 0x1D100, // Musical Symbols
- 0x1D200, // unassigned
- 0x1D300, // Tai Xuan Jing Symbols
- 0x1D360, // unassigned
- 0x1D400, // Mathematical Alphanumeric Symbols
- 0x1D800, // unassigned
- 0x20000, // CJK Unified Ideographs Extension B
- 0x2A6E0, // unassigned
- 0x2F800, // CJK Compatibility Ideographs Supplement
- 0x2FA20, // unassigned
- 0xE0000, // Tags
- 0xE0080, // unassigned
- 0xE0100, // Variation Selectors Supplement
- 0xE01F0, // unassigned
- 0xF0000, // Supplementary Private Use Area-A
- 0x100000, // Supplementary Private Use Area-B
+ 0x0000, // 0000..007F; Basic Latin
+ 0x0080, // 0080..00FF; Latin-1 Supplement
+ 0x0100, // 0100..017F; Latin Extended-A
+ 0x0180, // 0180..024F; Latin Extended-B
+ 0x0250, // 0250..02AF; IPA Extensions
+ 0x02B0, // 02B0..02FF; Spacing Modifier Letters
+ 0x0300, // 0300..036F; Combining Diacritical Marks
+ 0x0370, // 0370..03FF; Greek and Coptic
+ 0x0400, // 0400..04FF; Cyrillic
+ 0x0500, // 0500..052F; Cyrillic Supplement
+ 0x0530, // 0530..058F; Armenian
+ 0x0590, // 0590..05FF; Hebrew
+ 0x0600, // 0600..06FF; Arabic
+ 0x0700, // 0700..074F; Syria
+ 0x0750, // 0750..077F; Arabic Supplement
+ 0x0780, // 0780..07BF; Thaana
+ 0x07C0, // 07C0..07FF; NKo
+ 0x0800, // unassigned
+ 0x0900, // 0900..097F; Devanagari
+ 0x0980, // 0980..09FF; Bengali
+ 0x0A00, // 0A00..0A7F; Gurmukhi
+ 0x0A80, // 0A80..0AFF; Gujarati
+ 0x0B00, // 0B00..0B7F; Oriya
+ 0x0B80, // 0B80..0BFF; Tamil
+ 0x0C00, // 0C00..0C7F; Telugu
+ 0x0C80, // 0C80..0CFF; Kannada
+ 0x0D00, // 0D00..0D7F; Malayalam
+ 0x0D80, // 0D80..0DFF; Sinhala
+ 0x0E00, // 0E00..0E7F; Thai
+ 0x0E80, // 0E80..0EFF; Lao
+ 0x0F00, // 0F00..0FFF; Tibetan
+ 0x1000, // 1000..109F; Myanmar
+ 0x10A0, // 10A0..10FF; Georgian
+ 0x1100, // 1100..11FF; Hangul Jamo
+ 0x1200, // 1200..137F; Ethiopic
+ 0x1380, // 1380..139F; Ethiopic Supplement
+ 0x13A0, // 13A0..13FF; Cherokee
+ 0x1400, // 1400..167F; Unified Canadian Aboriginal Syllabics
+ 0x1680, // 1680..169F; Ogham
+ 0x16A0, // 16A0..16FF; Runic
+ 0x1700, // 1700..171F; Tagalog
+ 0x1720, // 1720..173F; Hanunoo
+ 0x1740, // 1740..175F; Buhid
+ 0x1760, // 1760..177F; Tagbanwa
+ 0x1780, // 1780..17FF; Khmer
+ 0x1800, // 1800..18AF; Mongolian
+ 0x18B0, // unassigned
+ 0x1900, // 1900..194F; Limbu
+ 0x1950, // 1950..197F; Tai Le
+ 0x1980, // 1980..19DF; New Tai Lue
+ 0x19E0, // 19E0..19FF; Khmer Symbols
+ 0x1A00, // 1A00..1A1F; Buginese
+ 0x1A20, // unassigned
+ 0x1B00, // 1B00..1B7F; Balinese
+ 0x1B80, // 1B80..1BBF; Sundanese
+ 0x1BC0, // unassigned
+ 0x1C00, // 1C00..1C4F; Lepcha
+ 0x1C50, // 1C50..1C7F; Ol Chiki
+ 0x1C80, // unassigned
+ 0x1D00, // 1D00..1D7F; Phonetic Extensions
+ 0x1D80, // 1D80..1DBF; Phonetic Extensions Supplement
+ 0x1DC0, // 1DC0..1DFF; Combining Diacritical Marks Supplement
+ 0x1E00, // 1E00..1EFF; Latin Extended Additional
+ 0x1F00, // 1F00..1FFF; Greek Extended
+ 0x2000, // 2000..206F; General Punctuation
+ 0x2070, // 2070..209F; Superscripts and Subscripts
+ 0x20A0, // 20A0..20CF; Currency Symbols
+ 0x20D0, // 20D0..20FF; Combining Diacritical Marks for Symbols
+ 0x2100, // 2100..214F; Letterlike Symbols
+ 0x2150, // 2150..218F; Number Forms
+ 0x2190, // 2190..21FF; Arrows
+ 0x2200, // 2200..22FF; Mathematical Operators
+ 0x2300, // 2300..23FF; Miscellaneous Technical
+ 0x2400, // 2400..243F; Control Pictures
+ 0x2440, // 2440..245F; Optical Character Recognition
+ 0x2460, // 2460..24FF; Enclosed Alphanumerics
+ 0x2500, // 2500..257F; Box Drawing
+ 0x2580, // 2580..259F; Block Elements
+ 0x25A0, // 25A0..25FF; Geometric Shapes
+ 0x2600, // 2600..26FF; Miscellaneous Symbols
+ 0x2700, // 2700..27BF; Dingbats
+ 0x27C0, // 27C0..27EF; Miscellaneous Mathematical Symbols-A
+ 0x27F0, // 27F0..27FF; Supplemental Arrows-A
+ 0x2800, // 2800..28FF; Braille Patterns
+ 0x2900, // 2900..297F; Supplemental Arrows-B
+ 0x2980, // 2980..29FF; Miscellaneous Mathematical Symbols-B
+ 0x2A00, // 2A00..2AFF; Supplemental Mathematical Operators
+ 0x2B00, // 2B00..2BFF; Miscellaneous Symbols and Arrows
+ 0x2C00, // 2C00..2C5F; Glagolitic
+ 0x2C60, // 2C60..2C7F; Latin Extended-C
+ 0x2C80, // 2C80..2CFF; Coptic
+ 0x2D00, // 2D00..2D2F; Georgian Supplement
+ 0x2D30, // 2D30..2D7F; Tifinagh
+ 0x2D80, // 2D80..2DDF; Ethiopic Extended
+ 0x2DE0, // 2DE0..2DFF; Cyrillic Extended-A
+ 0x2E00, // 2E00..2E7F; Supplemental Punctuation
+ 0x2E80, // 2E80..2EFF; CJK Radicals Supplement
+ 0x2F00, // 2F00..2FDF; Kangxi Radicals
+ 0x2FE0, // unassigned
+ 0x2FF0, // 2FF0..2FFF; Ideographic Description Characters
+ 0x3000, // 3000..303F; CJK Symbols and Punctuation
+ 0x3040, // 3040..309F; Hiragana
+ 0x30A0, // 30A0..30FF; Katakana
+ 0x3100, // 3100..312F; Bopomofo
+ 0x3130, // 3130..318F; Hangul Compatibility Jamo
+ 0x3190, // 3190..319F; Kanbun
+ 0x31A0, // 31A0..31BF; Bopomofo Extended
+ 0x31C0, // 31C0..31EF; CJK Strokes
+ 0x31F0, // 31F0..31FF; Katakana Phonetic Extensions
+ 0x3200, // 3200..32FF; Enclosed CJK Letters and Months
+ 0x3300, // 3300..33FF; CJK Compatibility
+ 0x3400, // 3400..4DBF; CJK Unified Ideographs Extension A
+ 0x4DC0, // 4DC0..4DFF; Yijing Hexagram Symbols
+ 0x4E00, // 4E00..9FFF; CJK Unified Ideograph
+ 0xA000, // A000..A48F; Yi Syllables
+ 0xA490, // A490..A4CF; Yi Radicals
+ 0xA4D0, // unassigned
+ 0xA500, // A500..A63F; Vai
+ 0xA640, // A640..A69F; Cyrillic Extended-B
+ 0xA6A0, // unassigned
+ 0xA700, // A700..A71F; Modifier Tone Letters
+ 0xA720, // A720..A7FF; Latin Extended-D
+ 0xA800, // A800..A82F; Syloti Nagri
+ 0xA830, // unassigned
+ 0xA840, // A840..A87F; Phags-pa
+ 0xA880, // A880..A8DF; Saurashtra
+ 0xA8E0, // unassigned
+ 0xA900, // A900..A92F; Kayah Li
+ 0xA930, // A930..A95F; Rejang
+ 0xA960, // unassigned
+ 0xAA00, // AA00..AA5F; Cham
+ 0xAA60, // unassigned
+ 0xAC00, // AC00..D7AF; Hangul Syllables
+ 0xD7B0, // unassigned
+ 0xD800, // D800..DB7F; High Surrogates
+ 0xDB80, // DB80..DBFF; High Private Use Surrogates
+ 0xDC00, // DC00..DFFF; Low Surrogates
+ 0xE000, // E000..F8FF; Private Use Area
+ 0xF900, // F900..FAFF; CJK Compatibility Ideographs
+ 0xFB00, // FB00..FB4F; Alphabetic Presentation Forms
+ 0xFB50, // FB50..FDFF; Arabic Presentation Forms-A
+ 0xFE00, // FE00..FE0F; Variation Selectors
+ 0xFE10, // FE10..FE1F; Vertical Forms
+ 0xFE20, // FE20..FE2F; Combining Half Marks
+ 0xFE30, // FE30..FE4F; CJK Compatibility Forms
+ 0xFE50, // FE50..FE6F; Small Form Variants
+ 0xFE70, // FE70..FEFF; Arabic Presentation Forms-B
+ 0xFF00, // FF00..FFEF; Halfwidth and Fullwidth Forms
+ 0xFFF0, // FFF0..FFFF; Specials
+ 0x10000, // 10000..1007F; Linear B Syllabary
+ 0x10080, // 10080..100FF; Linear B Ideograms
+ 0x10100, // 10100..1013F; Aegean Numbers
+ 0x10140, // 10140..1018F; Ancient Greek Numbers
+ 0x10190, // 10190..101CF; Ancient Symbols
+ 0x101D0, // 101D0..101FF; Phaistos Disc
+ 0x10200, // unassigned
+ 0x10280, // 10280..1029F; Lycian
+ 0x102A0, // 102A0..102DF; Carian
+ 0x102E0, // unassigned
+ 0x10300, // 10300..1032F; Old Italic
+ 0x10330, // 10330..1034F; Gothic
+ 0x10350, // unassigned
+ 0x10380, // 10380..1039F; Ugaritic
+ 0x103A0, // 103A0..103DF; Old Persian
+ 0x103E0, // unassigned
+ 0x10400, // 10400..1044F; Desere
+ 0x10450, // 10450..1047F; Shavian
+ 0x10480, // 10480..104AF; Osmanya
+ 0x104B0, // unassigned
+ 0x10800, // 10800..1083F; Cypriot Syllabary
+ 0x10840, // unassigned
+ 0x10900, // 10900..1091F; Phoenician
+ 0x10920, // 10920..1093F; Lydian
+ 0x10940, // unassigned
+ 0x10A00, // 10A00..10A5F; Kharoshthi
+ 0x10A60, // unassigned
+ 0x12000, // 12000..123FF; Cuneiform
+ 0x12400, // 12400..1247F; Cuneiform Numbers and Punctuation
+ 0x12480, // unassigned
+ 0x1D000, // 1D000..1D0FF; Byzantine Musical Symbols
+ 0x1D100, // 1D100..1D1FF; Musical Symbols
+ 0x1D200, // 1D200..1D24F; Ancient Greek Musical Notation
+ 0x1D250, // unassigned
+ 0x1D300, // 1D300..1D35F; Tai Xuan Jing Symbols
+ 0x1D360, // 1D360..1D37F; Counting Rod Numerals
+ 0x1D380, // unassigned
+ 0x1D400, // 1D400..1D7FF; Mathematical Alphanumeric Symbols
+ 0x1D800, // unassigned
+ 0x1F000, // 1F000..1F02F; Mahjong Tiles
+ 0x1F030, // 1F030..1F09F; Domino Tiles
+ 0x1F0A0, // unassigned
+ 0x20000, // 20000..2A6DF; CJK Unified Ideographs Extension B
+ 0x2A6E0, // unassigned
+ 0x2F800, // 2F800..2FA1F; CJK Compatibility Ideographs Supplement
+ 0x2FA20, // unassigned
+ 0xE0000, // E0000..E007F; Tags
+ 0xE0080, // unassigned
+ 0xE0100, // E0100..E01EF; Variation Selectors Supplement
+ 0xE01F0, // unassigned
+ 0xF0000, // F0000..FFFFF; Supplementary Private Use Area-A
+ 0x100000, // 100000..10FFFF; Supplementary Private Use Area-B
};
private static final UnicodeBlock[] blocks = {
@@ -1809,8 +2234,9 @@
HEBREW,
ARABIC,
SYRIAC,
- null,
+ ARABIC_SUPPLEMENT,
THAANA,
+ NKO,
null,
DEVANAGARI,
BENGALI,
@@ -1829,7 +2255,7 @@
GEORGIAN,
HANGUL_JAMO,
ETHIOPIC,
- null,
+ ETHIOPIC_SUPPLEMENT,
CHEROKEE,
UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS,
OGHAM,
@@ -1843,11 +2269,19 @@
null,
LIMBU,
TAI_LE,
+ NEW_TAI_LUE,
+ KHMER_SYMBOLS,
+ BUGINESE,
null,
- KHMER_SYMBOLS,
+ BALINESE,
+ SUNDANESE,
+ null,
+ LEPCHA,
+ OL_CHIKI,
null,
PHONETIC_EXTENSIONS,
- null,
+ PHONETIC_EXTENSIONS_SUPPLEMENT,
+ COMBINING_DIACRITICAL_MARKS_SUPPLEMENT,
LATIN_EXTENDED_ADDITIONAL,
GREEK_EXTENDED,
GENERAL_PUNCTUATION,
@@ -1874,7 +2308,14 @@
MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B,
SUPPLEMENTAL_MATHEMATICAL_OPERATORS,
MISCELLANEOUS_SYMBOLS_AND_ARROWS,
- null,
+ GLAGOLITIC,
+ LATIN_EXTENDED_C,
+ COPTIC,
+ GEORGIAN_SUPPLEMENT,
+ TIFINAGH,
+ ETHIOPIC_EXTENDED,
+ CYRILLIC_EXTENDED_A,
+ SUPPLEMENTAL_PUNCTUATION,
CJK_RADICALS_SUPPLEMENT,
KANGXI_RADICALS,
null,
@@ -1886,7 +2327,7 @@
HANGUL_COMPATIBILITY_JAMO,
KANBUN,
BOPOMOFO_EXTENDED,
- null,
+ CJK_STROKES,
KATAKANA_PHONETIC_EXTENSIONS,
ENCLOSED_CJK_LETTERS_AND_MONTHS,
CJK_COMPATIBILITY,
@@ -1896,6 +2337,21 @@
YI_SYLLABLES,
YI_RADICALS,
null,
+ VAI,
+ CYRILLIC_EXTENDED_B,
+ null,
+ MODIFIER_TONE_LETTERS,
+ LATIN_EXTENDED_D,
+ SYLOTI_NAGRI,
+ null,
+ PHAGS_PA,
+ SAURASHTRA,
+ null,
+ KAYAH_LI,
+ REJANG,
+ null,
+ CHAM,
+ null,
HANGUL_SYLLABLES,
null,
HIGH_SURROGATES,
@@ -1906,7 +2362,7 @@
ALPHABETIC_PRESENTATION_FORMS,
ARABIC_PRESENTATION_FORMS_A,
VARIATION_SELECTORS,
- null,
+ VERTICAL_FORMS,
COMBINING_HALF_MARKS,
CJK_COMPATIBILITY_FORMS,
SMALL_FORM_VARIANTS,
@@ -1916,11 +2372,18 @@
LINEAR_B_SYLLABARY,
LINEAR_B_IDEOGRAMS,
AEGEAN_NUMBERS,
+ ANCIENT_GREEK_NUMBERS,
+ ANCIENT_SYMBOLS,
+ PHAISTOS_DISC,
+ null,
+ LYCIAN,
+ CARIAN,
null,
OLD_ITALIC,
GOTHIC,
null,
UGARITIC,
+ OLD_PERSIAN,
null,
DESERET,
SHAVIAN,
@@ -1928,13 +2391,26 @@
null,
CYPRIOT_SYLLABARY,
null,
+ PHOENICIAN,
+ LYDIAN,
+ null,
+ KHAROSHTHI,
+ null,
+ CUNEIFORM,
+ CUNEIFORM_NUMBERS_AND_PUNCTUATION,
+ null,
BYZANTINE_MUSICAL_SYMBOLS,
MUSICAL_SYMBOLS,
+ ANCIENT_GREEK_MUSICAL_NOTATION,
null,
TAI_XUAN_JING_SYMBOLS,
+ COUNTING_ROD_NUMERALS,
null,
MATHEMATICAL_ALPHANUMERIC_SYMBOLS,
null,
+ MAHJONG_TILES,
+ DOMINO_TILES,
+ null,
CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B,
null,
CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT,
--- a/jdk/src/share/classes/java/lang/Class.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/lang/Class.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1994-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1994-2009 Sun Microsystems, Inc. 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
@@ -2846,14 +2846,14 @@
if (loader == null)
return desiredAssertionStatus0(this);
- synchronized(loader) {
- // If the classloader has been initialized with
- // the assertion directives, ask it. Otherwise,
- // ask the VM.
- return (loader.classAssertionStatus == null ?
- desiredAssertionStatus0(this) :
- loader.desiredAssertionStatus(getName()));
+ // If the classloader has been initialized with the assertion
+ // directives, ask it. Otherwise, ask the VM.
+ synchronized(loader.assertionLock) {
+ if (loader.classAssertionStatus != null) {
+ return loader.desiredAssertionStatus(getName());
+ }
}
+ return desiredAssertionStatus0(this);
}
// Retrieves the desired assertion status of this class from the VM
--- a/jdk/src/share/classes/java/lang/ClassLoader.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/lang/ClassLoader.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1994-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1994-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -40,14 +40,17 @@
import java.security.PrivilegedExceptionAction;
import java.security.ProtectionDomain;
import java.security.cert.Certificate;
+import java.util.Collections;
import java.util.Enumeration;
-import java.util.Hashtable;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.Stack;
import java.util.Map;
import java.util.Vector;
+import java.util.Hashtable;
+import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentHashMap;
import sun.misc.ClassFileTransformer;
import sun.misc.CompoundEnumeration;
import sun.misc.Resource;
@@ -91,6 +94,17 @@
* called the "bootstrap class loader", does not itself have a parent but may
* serve as the parent of a <tt>ClassLoader</tt> instance.
*
+ * <p> Class loaders that support concurrent loading of classes are known as
+ * <em>parallel capable</em> class loaders and are required to register
+ * themselves at their class initialization time by invoking the
+ * {@link
+ * #registerAsParallelCapable <tt>ClassLoader.registerAsParallelCapable</tt>}
+ * method. In environments in which the delegation model is not strictly
+ * hierarchical, class loaders need to be parallel capable, otherise class
+ * loading can lead to deadlocks because the loader lock is held for the
+ * duration of the class loading process (see {@link #loadClass
+ * <tt>loadClass</tt>} methods).
+ *
* <p> Normally, the Java virtual machine loads classes from the local file
* system in a platform-dependent manner. For example, on UNIX systems, the
* virtual machine loads classes from the directory defined by the
@@ -160,31 +174,51 @@
public abstract class ClassLoader {
private static native void registerNatives();
+
+ // Set of classes which are registered as parallel capable class loaders
+ private static final Set<Class<? extends ClassLoader>> parallelLoaders
+ = Collections.newSetFromMap(Collections.synchronizedMap
+ (new WeakHashMap<Class<? extends ClassLoader>, Boolean>()));
+
static {
registerNatives();
+ parallelLoaders.add(ClassLoader.class);
}
// If initialization succeed this is set to true and security checks will
// succeed. Otherwise the object is not initialized and the object is
// useless.
- private boolean initialized = false;
+ private final boolean initialized;
// The parent class loader for delegation
- private ClassLoader parent;
+ // Note: VM hardcoded the offset of this field, thus all new fields
+ // must be added *after* it.
+ private final ClassLoader parent;
+
+ // Maps class name to the corresponding lock object when the current
+ // class loader is parallel capable.
+ // Note: VM also uses this field to decide if the current class loader
+ // is parallel capable and the appropriate lock object for class loading.
+ private final ConcurrentHashMap<String, Object> parallelLockMap;
// Hashtable that maps packages to certs
- private Hashtable<String, Certificate[]> package2certs
- = new Hashtable<String, Certificate[]>(11);
+ private final Map <String, Certificate[]> package2certs;
// Shared among all packages with unsigned classes
- Certificate[] nocerts;
+ private static final Certificate[] nocerts = new Certificate[0];
+
+ // The classes loaded by this class loader. The only purpose of this table
+ // is to keep the classes from being GC'ed until the loader is GC'ed.
+ private final Vector<Class<?>> classes = new Vector<Class<?>>();
- // The classes loaded by this class loader. The only purpose of this table
- // is to keep the classes from being GC'ed until the loader is GC'ed.
- private Vector<Class<?>> classes = new Vector<Class<?>>();
+ // The "default" domain. Set as the default ProtectionDomain on newly
+ // created classes.
+ private final ProtectionDomain defaultDomain =
+ new ProtectionDomain(new CodeSource(null, (Certificate[]) null),
+ null, this, null);
// The initiating protection domains for all classes loaded by this loader
- private Set<ProtectionDomain> domains = new HashSet<ProtectionDomain>();
+ private final Set<ProtectionDomain> domains;
// Invoked by the VM to record every loaded class with this loader.
void addClass(Class c) {
@@ -193,7 +227,9 @@
// The packages defined in this class loader. Each package name is mapped
// to its corresponding Package object.
- private HashMap<String, Package> packages = new HashMap<String, Package>();
+ // @GuardedBy("itself")
+ private final HashMap<String, Package> packages =
+ new HashMap<String, Package>();
/**
* Creates a new class loader using the specified parent class loader for
@@ -220,6 +256,19 @@
security.checkCreateClassLoader();
}
this.parent = parent;
+ if (parallelLoaders.contains(this.getClass())) {
+ parallelLockMap = new ConcurrentHashMap<String, Object>();
+ package2certs = new ConcurrentHashMap<String, Certificate[]>();
+ domains =
+ Collections.synchronizedSet(new HashSet<ProtectionDomain>());
+ assertionLock = new Object();
+ } else {
+ // no finer-grained lock; lock on the classloader instance
+ parallelLockMap = null;
+ package2certs = new Hashtable<String, Certificate[]>();
+ domains = new HashSet<ProtectionDomain>();
+ assertionLock = this;
+ }
initialized = true;
}
@@ -244,10 +293,22 @@
security.checkCreateClassLoader();
}
this.parent = getSystemClassLoader();
+ if (parallelLoaders.contains(this.getClass())) {
+ parallelLockMap = new ConcurrentHashMap<String, Object>();
+ package2certs = new ConcurrentHashMap<String, Certificate[]>();
+ domains =
+ Collections.synchronizedSet(new HashSet<ProtectionDomain>());
+ assertionLock = new Object();
+ } else {
+ // no finer-grained lock; lock on the classloader instance
+ parallelLockMap = null;
+ package2certs = new Hashtable<String, Certificate[]>();
+ domains = new HashSet<ProtectionDomain>();
+ assertionLock = this;
+ }
initialized = true;
}
-
// -- Class --
/**
@@ -296,6 +357,10 @@
* <p> Subclasses of <tt>ClassLoader</tt> are encouraged to override {@link
* #findClass(String)}, rather than this method. </p>
*
+ * <p> Unless overridden, this method synchronizes on the result of
+ * {@link #getClassLoadingLock <tt>getClassLoadingLock</tt>} method
+ * during the entire class loading process.
+ *
* @param name
* The <a href="#name">binary name</a> of the class
*
@@ -307,37 +372,80 @@
* @throws ClassNotFoundException
* If the class could not be found
*/
- protected synchronized Class<?> loadClass(String name, boolean resolve)
+ protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
- // First, check if the class has already been loaded
- Class c = findLoadedClass(name);
- if (c == null) {
- try {
- if (parent != null) {
- c = parent.loadClass(name, false);
- } else {
- c = findBootstrapClass0(name);
+ synchronized (getClassLoadingLock(name)) {
+ // First, check if the class has already been loaded
+ Class c = findLoadedClass(name);
+ if (c == null) {
+ try {
+ if (parent != null) {
+ c = parent.loadClass(name, false);
+ } else {
+ c = findBootstrapClass0(name);
+ }
+ } catch (ClassNotFoundException e) {
+ // If still not found, then invoke findClass in order
+ // to find the class.
+ c = findClass(name);
}
- } catch (ClassNotFoundException e) {
- // If still not found, then invoke findClass in order
- // to find the class.
- c = findClass(name);
+ }
+ if (resolve) {
+ resolveClass(c);
+ }
+ return c;
+ }
+ }
+
+ /**
+ * Returns the lock object for class loading operations.
+ * For backward compatibility, the default implementation of this method
+ * behaves as follows. If this ClassLoader object is registered as
+ * parallel capable, the method returns a dedicated object associated
+ * with the specified class name. Otherwise, the method returns this
+ * ClassLoader object. </p>
+ *
+ * @param className
+ * The name of the to-be-loaded class
+ *
+ * @return the lock for class loading operations
+ *
+ * @throws NullPointerException
+ * If registered as parallel capable and <tt>className</tt> is null
+ *
+ * @see #loadClass(String, boolean)
+ *
+ * @since 1.7
+ */
+ protected Object getClassLoadingLock(String className) {
+ Object lock = this;
+ if (parallelLockMap != null) {
+ Object newLock = new Object();
+ lock = parallelLockMap.putIfAbsent(className, newLock);
+ if (lock == null) {
+ lock = newLock;
}
}
- if (resolve) {
- resolveClass(c);
- }
- return c;
+ return lock;
}
// This method is invoked by the virtual machine to load a class.
- private synchronized Class loadClassInternal(String name)
+ private Class loadClassInternal(String name)
throws ClassNotFoundException
{
- return loadClass(name);
+ // For backward compatibility, explicitly lock on 'this' when
+ // the current class loader is not parallel capable.
+ if (parallelLockMap == null) {
+ synchronized (this) {
+ return loadClass(name);
+ }
+ } else {
+ return loadClass(name);
+ }
}
+ // Invoked by the VM after loading class with this loader.
private void checkPackageAccess(Class cls, ProtectionDomain pd) {
final SecurityManager sm = System.getSecurityManager();
if (sm != null) {
@@ -486,31 +594,32 @@
/* Determine protection domain, and check that:
- not define java.* class,
- - signer of this class matches signers for the rest of the classes in package.
+ - signer of this class matches signers for the rest of the classes in
+ package.
*/
private ProtectionDomain preDefineClass(String name,
- ProtectionDomain protectionDomain)
+ ProtectionDomain pd)
{
if (!checkName(name))
throw new NoClassDefFoundError("IllegalName: " + name);
if ((name != null) && name.startsWith("java.")) {
- throw new SecurityException("Prohibited package name: " +
- name.substring(0, name.lastIndexOf('.')));
+ throw new SecurityException
+ ("Prohibited package name: " +
+ name.substring(0, name.lastIndexOf('.')));
}
- if (protectionDomain == null) {
- protectionDomain = getDefaultDomain();
+ if (pd == null) {
+ pd = defaultDomain;
}
- if (name != null)
- checkCerts(name, protectionDomain.getCodeSource());
+ if (name != null) checkCerts(name, pd.getCodeSource());
- return protectionDomain;
+ return pd;
}
- private String defineClassSourceLocation(ProtectionDomain protectionDomain)
+ private String defineClassSourceLocation(ProtectionDomain pd)
{
- CodeSource cs = protectionDomain.getCodeSource();
+ CodeSource cs = pd.getCodeSource();
String source = null;
if (cs != null && cs.getLocation() != null) {
source = cs.getLocation().toString();
@@ -519,14 +628,15 @@
}
private Class defineTransformedClass(String name, byte[] b, int off, int len,
- ProtectionDomain protectionDomain,
+ ProtectionDomain pd,
ClassFormatError cfe, String source)
throws ClassFormatError
{
// Class format error - try to transform the bytecode and
// define the class again
//
- ClassFileTransformer[] transformers = ClassFileTransformer.getTransformers();
+ ClassFileTransformer[] transformers =
+ ClassFileTransformer.getTransformers();
Class c = null;
if (transformers != null) {
@@ -535,7 +645,7 @@
// Transform byte code using transformer
byte[] tb = transformer.transform(b, off, len);
c = defineClass1(name, tb, 0, tb.length,
- protectionDomain, source);
+ pd, source);
break;
} catch (ClassFormatError cfe2) {
// If ClassFormatError occurs, try next transformer
@@ -552,11 +662,10 @@
return c;
}
- private void postDefineClass(Class c, ProtectionDomain protectionDomain)
+ private void postDefineClass(Class c, ProtectionDomain pd)
{
- if (protectionDomain.getCodeSource() != null) {
- Certificate certs[] =
- protectionDomain.getCodeSource().getCertificates();
+ if (pd.getCodeSource() != null) {
+ Certificate certs[] = pd.getCodeSource().getCertificates();
if (certs != null)
setSigners(c, certs);
}
@@ -641,7 +750,8 @@
try {
c = defineClass1(name, b, off, len, protectionDomain, source);
} catch (ClassFormatError cfe) {
- c = defineTransformedClass(name, b, off, len, protectionDomain, cfe, source);
+ c = defineTransformedClass(name, b, off, len, protectionDomain, cfe,
+ source);
}
postDefineClass(c, protectionDomain);
@@ -656,10 +766,10 @@
* specified in the documentation for {@link #defineClass(String, byte[],
* int, int)}. Before the class can be used it must be resolved.
*
- * <p>The rules about the first class defined in a package determining the set of
- * certificates for the package, and the restrictions on class names are identical
- * to those specified in the documentation for {@link #defineClass(String, byte[],
- * int, int, ProtectionDomain)}.
+ * <p>The rules about the first class defined in a package determining the
+ * set of certificates for the package, and the restrictions on class names
+ * are identical to those specified in the documentation for {@link
+ * #defineClass(String, byte[], int, int, ProtectionDomain)}.
*
* <p> An invocation of this method of the form
* <i>cl</i><tt>.defineClass(</tt><i>name</i><tt>,</tt>
@@ -668,12 +778,13 @@
*
* <blockquote><tt>
* ...<br>
- * byte[] temp = new byte[</tt><i>bBuffer</i><tt>.{@link java.nio.ByteBuffer#remaining
- * remaining}()];<br>
+ * byte[] temp = new byte[</tt><i>bBuffer</i><tt>.{@link
+ * java.nio.ByteBuffer#remaining remaining}()];<br>
* </tt><i>bBuffer</i><tt>.{@link java.nio.ByteBuffer#get(byte[])
* get}(temp);<br>
* return {@link #defineClass(String, byte[], int, int, ProtectionDomain)
- * </tt><i>cl</i><tt>.defineClass}(</tt><i>name</i><tt>, temp, 0, temp.length, </tt><i>pd</i><tt>);<br>
+ * </tt><i>cl</i><tt>.defineClass}(</tt><i>name</i><tt>, temp, 0,
+ * temp.length, </tt><i>pd</i><tt>);<br>
* </tt></blockquote>
*
* @param name
@@ -682,9 +793,9 @@
*
* @param b
* The bytes that make up the class data. The bytes from positions
- * <tt>b.position()</tt> through <tt>b.position() + b.limit() -1 </tt>
- * should have the format of a valid class file as defined by the <a
- * href="http://java.sun.com/docs/books/vmspec/">Java Virtual
+ * <tt>b.position()</tt> through <tt>b.position() + b.limit() -1
+ * </tt> should have the format of a valid class file as defined by
+ * the <a href="http://java.sun.com/docs/books/vmspec/">Java Virtual
* Machine Specification</a>.
*
* @param protectionDomain
@@ -738,11 +849,13 @@
String source = defineClassSourceLocation(protectionDomain);
try {
- c = defineClass2(name, b, b.position(), len, protectionDomain, source);
+ c = defineClass2(name, b, b.position(), len, protectionDomain,
+ source);
} catch (ClassFormatError cfe) {
byte[] tb = new byte[len];
b.get(tb); // get bytes out of byte buffer.
- c = defineTransformedClass(name, tb, 0, len, protectionDomain, cfe, source);
+ c = defineTransformedClass(name, tb, 0, len, protectionDomain, cfe,
+ source);
}
postDefineClass(c, protectionDomain);
@@ -769,33 +882,29 @@
return true;
}
- private synchronized void checkCerts(String name, CodeSource cs) {
+ private void checkCerts(String name, CodeSource cs) {
int i = name.lastIndexOf('.');
String pname = (i == -1) ? "" : name.substring(0, i);
- Certificate[] pcerts = package2certs.get(pname);
- if (pcerts == null) {
- // first class in this package gets to define which
- // certificates must be the same for all other classes
- // in this package
- if (cs != null) {
- pcerts = cs.getCertificates();
+
+ Certificate[] certs = null;
+ if (cs != null) {
+ certs = cs.getCertificates();
+ }
+ Certificate[] pcerts = null;
+ if (parallelLockMap == null) {
+ synchronized (this) {
+ pcerts = package2certs.get(pname);
+ if (pcerts == null) {
+ package2certs.put(pname, (certs == null? nocerts:certs));
+ }
}
- if (pcerts == null) {
- if (nocerts == null)
- nocerts = new Certificate[0];
- pcerts = nocerts;
- }
- package2certs.put(pname, pcerts);
} else {
- Certificate[] certs = null;
- if (cs != null) {
- certs = cs.getCertificates();
- }
-
- if (!compareCerts(pcerts, certs)) {
- throw new SecurityException("class \""+ name +
- "\"'s signer information does not match signer information of other classes in the same package");
- }
+ pcerts = ((ConcurrentHashMap<String, Certificate[]>)package2certs).
+ putIfAbsent(pname, (certs == null? nocerts:certs));
+ }
+ if (pcerts != null && !compareCerts(pcerts, certs)) {
+ throw new SecurityException("class \""+ name +
+ "\"'s signer information does not match signer information of other classes in the same package");
}
}
@@ -1075,6 +1184,47 @@
return java.util.Collections.emptyEnumeration();
}
+ // index 0: java.lang.ClassLoader.class
+ // index 1: the immediate caller of index 0.
+ // index 2: the immediate caller of index 1.
+ private static native Class<? extends ClassLoader> getCaller(int index);
+
+ /**
+ * Registers the caller class loader as parallel capable.
+ * In order for the registration to succeed, all super classes
+ * of the caller class loader must also be registered as
+ * parallel capable when this method is called. </p>
+ * Note that once a class loader is registered as
+ * parallel capable, there is no way to change it back.
+ * In addition, registration should be done statically before
+ * any instance of the caller classloader being constructed. </p>
+ *
+ * @return true if the caller is successfully registered as
+ * parallel capable and false if otherwise.
+ *
+ * @since 1.7
+ */
+ protected static boolean registerAsParallelCapable() {
+ Class<? extends ClassLoader> caller = getCaller(1);
+ Class superCls = caller.getSuperclass();
+ boolean result = false;
+ // Explicit synchronization needed for composite action
+ synchronized (parallelLoaders) {
+ if (!parallelLoaders.contains(caller)) {
+ if (parallelLoaders.contains(superCls)) {
+ // register the immediate caller as parallel capable
+ // if and only if all of its super classes are.
+ // Note: given current classloading sequence, if
+ // the immediate super class is parallel capable,
+ // all the super classes higher up must be too.
+ result = true;
+ parallelLoaders.add(caller);
+ }
+ } else result = true;
+ }
+ return result;
+ }
+
/**
* Find a resource of the specified name from the search path used to load
* classes. This method locates the resource through the system class
@@ -1141,7 +1291,8 @@
private static Enumeration<URL> getBootstrapResources(String name)
throws IOException
{
- final Enumeration<Resource> e = getBootstrapClassPath().getResources(name);
+ final Enumeration<Resource> e =
+ getBootstrapClassPath().getResources(name);
return new Enumeration<URL> () {
public URL nextElement() {
return e.nextElement().getURL();
@@ -1377,9 +1528,11 @@
}
// The class loader for the system
+ // @GuardedBy("ClassLoader.class")
private static ClassLoader scl;
// Set to true once the system class loader has been set
+ // @GuardedBy("ClassLoader.class")
private static boolean sclSet;
@@ -1592,19 +1745,6 @@
}
}
- // The "default" domain. Set as the default ProtectionDomain on newly
- // created classes.
- private ProtectionDomain defaultDomain = null;
-
- // Returns (and initializes) the default domain.
- private synchronized ProtectionDomain getDefaultDomain() {
- if (defaultDomain == null) {
- CodeSource cs = new CodeSource(null, (Certificate[]) null);
- defaultDomain = new ProtectionDomain(cs, null, this, null);
- }
- return defaultDomain;
- }
-
// All native library names we've loaded.
private static Vector<String> loadedLibraryNames
= new Vector<String>();
@@ -1622,8 +1762,8 @@
= new Stack<NativeLibrary>();
// The paths searched for libraries
- static private String usr_paths[];
- static private String sys_paths[];
+ private static String usr_paths[];
+ private static String sys_paths[];
private static String[] initializePath(String propname) {
String ldpath = System.getProperty(propname, "");
@@ -1803,7 +1943,10 @@
// -- Assertion management --
+ final Object assertionLock;
+
// The default toggle for assertion checking.
+ // @GuardedBy("assertionLock")
private boolean defaultAssertionStatus = false;
// Maps String packageName to Boolean package default assertion status Note
@@ -1811,12 +1954,14 @@
// is null then we are delegating assertion status queries to the VM, i.e.,
// none of this ClassLoader's assertion status modification methods have
// been invoked.
+ // @GuardedBy("assertionLock")
private Map<String, Boolean> packageAssertionStatus = null;
// Maps String fullyQualifiedClassName to Boolean assertionStatus If this
// field is null then we are delegating assertion status queries to the VM,
// i.e., none of this ClassLoader's assertion status modification methods
// have been invoked.
+ // @GuardedBy("assertionLock")
Map<String, Boolean> classAssertionStatus = null;
/**
@@ -1834,11 +1979,13 @@
*
* @since 1.4
*/
- public synchronized void setDefaultAssertionStatus(boolean enabled) {
- if (classAssertionStatus == null)
- initializeJavaAssertionMaps();
+ public void setDefaultAssertionStatus(boolean enabled) {
+ synchronized (assertionLock) {
+ if (classAssertionStatus == null)
+ initializeJavaAssertionMaps();
- defaultAssertionStatus = enabled;
+ defaultAssertionStatus = enabled;
+ }
}
/**
@@ -1878,13 +2025,14 @@
*
* @since 1.4
*/
- public synchronized void setPackageAssertionStatus(String packageName,
- boolean enabled)
- {
- if (packageAssertionStatus == null)
- initializeJavaAssertionMaps();
+ public void setPackageAssertionStatus(String packageName,
+ boolean enabled) {
+ synchronized (assertionLock) {
+ if (packageAssertionStatus == null)
+ initializeJavaAssertionMaps();
- packageAssertionStatus.put(packageName, enabled);
+ packageAssertionStatus.put(packageName, enabled);
+ }
}
/**
@@ -1909,13 +2057,13 @@
*
* @since 1.4
*/
- public synchronized void setClassAssertionStatus(String className,
- boolean enabled)
- {
- if (classAssertionStatus == null)
- initializeJavaAssertionMaps();
+ public void setClassAssertionStatus(String className, boolean enabled) {
+ synchronized (assertionLock) {
+ if (classAssertionStatus == null)
+ initializeJavaAssertionMaps();
- classAssertionStatus.put(className, enabled);
+ classAssertionStatus.put(className, enabled);
+ }
}
/**
@@ -1928,15 +2076,16 @@
*
* @since 1.4
*/
- public synchronized void clearAssertionStatus() {
+ public void clearAssertionStatus() {
/*
* Whether or not "Java assertion maps" are initialized, set
* them to empty maps, effectively ignoring any present settings.
*/
- classAssertionStatus = new HashMap<String, Boolean>();
- packageAssertionStatus = new HashMap<String, Boolean>();
-
- defaultAssertionStatus = false;
+ synchronized (assertionLock) {
+ classAssertionStatus = new HashMap<String, Boolean>();
+ packageAssertionStatus = new HashMap<String, Boolean>();
+ defaultAssertionStatus = false;
+ }
}
/**
@@ -1961,39 +2110,40 @@
*
* @since 1.4
*/
- synchronized boolean desiredAssertionStatus(String className) {
- Boolean result;
-
- // assert classAssertionStatus != null;
- // assert packageAssertionStatus != null;
+ boolean desiredAssertionStatus(String className) {
+ synchronized (assertionLock) {
+ // assert classAssertionStatus != null;
+ // assert packageAssertionStatus != null;
- // Check for a class entry
- result = classAssertionStatus.get(className);
- if (result != null)
- return result.booleanValue();
-
- // Check for most specific package entry
- int dotIndex = className.lastIndexOf(".");
- if (dotIndex < 0) { // default package
- result = packageAssertionStatus.get(null);
+ // Check for a class entry
+ Boolean result = classAssertionStatus.get(className);
if (result != null)
return result.booleanValue();
+
+ // Check for most specific package entry
+ int dotIndex = className.lastIndexOf(".");
+ if (dotIndex < 0) { // default package
+ result = packageAssertionStatus.get(null);
+ if (result != null)
+ return result.booleanValue();
+ }
+ while(dotIndex > 0) {
+ className = className.substring(0, dotIndex);
+ result = packageAssertionStatus.get(className);
+ if (result != null)
+ return result.booleanValue();
+ dotIndex = className.lastIndexOf(".", dotIndex-1);
+ }
+
+ // Return the classloader default
+ return defaultAssertionStatus;
}
- while(dotIndex > 0) {
- className = className.substring(0, dotIndex);
- result = packageAssertionStatus.get(className);
- if (result != null)
- return result.booleanValue();
- dotIndex = className.lastIndexOf(".", dotIndex-1);
- }
-
- // Return the classloader default
- return defaultAssertionStatus;
}
// Set up the assertions with information provided by the VM.
+ // Note: Should only be called inside a synchronized block
private void initializeJavaAssertionMaps() {
- // assert Thread.holdsLock(this);
+ // assert Thread.holdsLock(assertionLock);
classAssertionStatus = new HashMap<String, Boolean>();
packageAssertionStatus = new HashMap<String, Boolean>();
--- a/jdk/src/share/classes/java/lang/ConditionalSpecialCasing.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/lang/ConditionalSpecialCasing.java Mon Apr 27 12:33:57 2009 -0700
@@ -74,6 +74,7 @@
new Entry(0x00CC, new char[]{0x0069, 0x0307, 0x0300}, new char[]{0x00CC}, "lt", 0), // # LATIN CAPITAL LETTER I WITH GRAVE
new Entry(0x00CD, new char[]{0x0069, 0x0307, 0x0301}, new char[]{0x00CD}, "lt", 0), // # LATIN CAPITAL LETTER I WITH ACUTE
new Entry(0x0128, new char[]{0x0069, 0x0307, 0x0303}, new char[]{0x0128}, "lt", 0), // # LATIN CAPITAL LETTER I WITH TILDE
+ new Entry(0x0130, new char[]{0x0069, 0x0307}, new char[]{0x0130}, "lt", 0), // # LATIN CAPITAL LETTER I WITH DOT ABOVE
//# ================================================================================
//# Turkish and Azeri
@@ -84,7 +85,10 @@
new Entry(0x0049, new char[]{0x0131}, new char[]{0x0049}, "tr", NOT_BEFORE_DOT), // # LATIN CAPITAL LETTER I
new Entry(0x0049, new char[]{0x0131}, new char[]{0x0049}, "az", NOT_BEFORE_DOT), // # LATIN CAPITAL LETTER I
new Entry(0x0069, new char[]{0x0069}, new char[]{0x0130}, "tr", 0), // # LATIN SMALL LETTER I
- new Entry(0x0069, new char[]{0x0069}, new char[]{0x0130}, "az", 0) // # LATIN SMALL LETTER I
+ new Entry(0x0069, new char[]{0x0069}, new char[]{0x0130}, "az", 0), // # LATIN SMALL LETTER I
+ //# ================================================================================
+ //# Other
+ new Entry(0x0130, new char[]{0x0069, 0x0307}, new char[]{0x0130}, "en", 0), // # LATIN CAPITALLETTER I WITH DOT ABOVE
};
// A hash table that contains the above entries
--- a/jdk/src/share/classes/java/lang/Integer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/lang/Integer.java Mon Apr 27 12:33:57 2009 -0700
@@ -25,6 +25,8 @@
package java.lang;
+import java.util.Properties;
+
/**
* The {@code Integer} class wraps a value of the primitive type
* {@code int} in an object. An object of type {@code Integer}
@@ -442,6 +444,12 @@
public static int parseInt(String s, int radix)
throws NumberFormatException
{
+ /*
+ * WARNING: This method may be invoked early during VM initialization
+ * before IntegerCache is initialized. Care must be taken to not use
+ * the valueOf method.
+ */
+
if (s == null) {
throw new NumberFormatException("null");
}
@@ -545,7 +553,7 @@
* does not contain a parsable {@code int}.
*/
public static Integer valueOf(String s, int radix) throws NumberFormatException {
- return new Integer(parseInt(s,radix));
+ return Integer.valueOf(parseInt(s,radix));
}
/**
@@ -570,20 +578,56 @@
* @exception NumberFormatException if the string cannot be parsed
* as an integer.
*/
- public static Integer valueOf(String s) throws NumberFormatException
- {
- return new Integer(parseInt(s, 10));
+ public static Integer valueOf(String s) throws NumberFormatException {
+ return Integer.valueOf(parseInt(s, 10));
+ }
+
+ /**
+ * Cache to support the object identity semantics of autoboxing for values between
+ * -128 and 127 (inclusive) as required by JLS.
+ *
+ * The cache is initialized on first usage. During VM initialization the
+ * getAndRemoveCacheProperties method may be used to get and remove any system
+ * properites that configure the cache size. At this time, the size of the
+ * cache may be controlled by the -XX:AutoBoxCacheMax=<size> option.
+ */
+
+ // value of java.lang.Integer.IntegerCache.high property (obtained during VM init)
+ private static String integerCacheHighPropValue;
+
+ static void getAndRemoveCacheProperties() {
+ if (!sun.misc.VM.isBooted()) {
+ Properties props = System.getProperties();
+ integerCacheHighPropValue =
+ (String)props.remove("java.lang.Integer.IntegerCache.high");
+ if (integerCacheHighPropValue != null)
+ System.setProperties(props); // remove from system props
+ }
}
private static class IntegerCache {
- private IntegerCache(){}
-
- static final Integer cache[] = new Integer[-(-128) + 127 + 1];
+ static final int low = -128;
+ static final int high;
+ static final Integer cache[];
static {
- for(int i = 0; i < cache.length; i++)
- cache[i] = new Integer(i - 128);
+ // high value may be configured by property
+ int h = 127;
+ if (integerCacheHighPropValue != null) {
+ int i = parseInt(integerCacheHighPropValue);
+ i = Math.max(i, 127);
+ // Maximum array size is Integer.MAX_VALUE
+ h = Math.min(i, Integer.MAX_VALUE - (-low));
+ }
+ high = h;
+
+ cache = new Integer[(high - low) + 1];
+ int j = low;
+ for(int k = 0; k < cache.length; k++)
+ cache[k] = new Integer(j++);
}
+
+ private IntegerCache() {}
}
/**
@@ -599,10 +643,9 @@
* @since 1.5
*/
public static Integer valueOf(int i) {
- final int offset = 128;
- if (i >= -128 && i <= 127) { // must cache
- return IntegerCache.cache[i + offset];
- }
+ assert IntegerCache.high >= 127;
+ if (i >= IntegerCache.low && i <= IntegerCache.high)
+ return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
@@ -806,7 +849,7 @@
*/
public static Integer getInteger(String nm, int val) {
Integer result = getInteger(nm, null);
- return (result == null) ? new Integer(val) : result;
+ return (result == null) ? Integer.valueOf(val) : result;
}
/**
@@ -938,7 +981,7 @@
try {
result = Integer.valueOf(nm.substring(index), radix);
- result = negative ? new Integer(-result.intValue()) : result;
+ result = negative ? Integer.valueOf(-result.intValue()) : result;
} catch (NumberFormatException e) {
// If number is Integer.MIN_VALUE, we'll end up here. The next line
// handles this case, and causes any genuine format error to be
--- a/jdk/src/share/classes/java/lang/Long.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/lang/Long.java Mon Apr 27 12:33:57 2009 -0700
@@ -510,7 +510,7 @@
* contain a parsable {@code long}.
*/
public static Long valueOf(String s, int radix) throws NumberFormatException {
- return new Long(parseLong(s, radix));
+ return Long.valueOf(parseLong(s, radix));
}
/**
@@ -537,7 +537,7 @@
*/
public static Long valueOf(String s) throws NumberFormatException
{
- return new Long(parseLong(s, 10));
+ return Long.valueOf(parseLong(s, 10));
}
private static class LongCache {
@@ -650,7 +650,7 @@
try {
result = Long.valueOf(nm.substring(index), radix);
- result = negative ? new Long(-result.longValue()) : result;
+ result = negative ? Long.valueOf(-result.longValue()) : result;
} catch (NumberFormatException e) {
// If number is Long.MIN_VALUE, we'll end up here. The next line
// handles this case, and causes any genuine format error to be
@@ -869,7 +869,7 @@
*/
public static Long getLong(String nm, long val) {
Long result = Long.getLong(nm, null);
- return (result == null) ? new Long(val) : result;
+ return (result == null) ? Long.valueOf(val) : result;
}
/**
--- a/jdk/src/share/classes/java/lang/String.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/lang/String.java Mon Apr 27 12:33:57 2009 -0700
@@ -2451,14 +2451,21 @@
}
if (localeDependent || srcChar == '\u03A3') { // GREEK CAPITAL LETTER SIGMA
lowerChar = ConditionalSpecialCasing.toLowerCaseEx(this, i, locale);
+ } else if (srcChar == '\u0130') { // LATIN CAPITAL LETTER I DOT
+ lowerChar = Character.ERROR;
} else {
lowerChar = Character.toLowerCase(srcChar);
}
if ((lowerChar == Character.ERROR) ||
(lowerChar >= Character.MIN_SUPPLEMENTARY_CODE_POINT)) {
if (lowerChar == Character.ERROR) {
- lowerCharArray =
- ConditionalSpecialCasing.toLowerCaseCharArray(this, i, locale);
+ if (!localeDependent && srcChar == '\u0130') {
+ lowerCharArray =
+ ConditionalSpecialCasing.toLowerCaseCharArray(this, i, Locale.ENGLISH);
+ } else {
+ lowerCharArray =
+ ConditionalSpecialCasing.toLowerCaseCharArray(this, i, locale);
+ }
} else if (srcCount == 2) {
resultOffset += Character.toChars(lowerChar, result, i + resultOffset) - srcCount;
continue;
--- a/jdk/src/share/classes/java/lang/System.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/lang/System.java Mon Apr 27 12:33:57 2009 -0700
@@ -1105,6 +1105,13 @@
props = new Properties();
initProperties(props);
sun.misc.Version.init();
+
+ // Gets and removes system properties that configure the Integer
+ // cache used to support the object identity semantics of autoboxing.
+ // At this time, the size of the cache may be controlled by the
+ // -XX:AutoBoxCacheMax=<size> option.
+ Integer.getAndRemoveCacheProperties();
+
FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
--- a/jdk/src/share/classes/java/lang/ref/ReferenceQueue.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/lang/ref/ReferenceQueue.java Mon Apr 27 12:33:57 2009 -0700
@@ -51,7 +51,7 @@
static private class Lock { };
private Lock lock = new Lock();
- private Reference<? extends T> head = null;
+ private volatile Reference<? extends T> head = null;
private long queueLength = 0;
boolean enqueue(Reference<? extends T> r) { /* Called only by Reference class */
@@ -95,6 +95,8 @@
* otherwise <code>null</code>
*/
public Reference<? extends T> poll() {
+ if (head == null)
+ return null;
synchronized (lock) {
return reallyPoll();
}
--- a/jdk/src/share/classes/java/lang/ref/SoftReference.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/lang/ref/SoftReference.java Mon Apr 27 12:33:57 2009 -0700
@@ -63,11 +63,13 @@
public class SoftReference<T> extends Reference<T> {
- /* Timestamp clock, updated by the garbage collector
+ /**
+ * Timestamp clock, updated by the garbage collector
*/
static private long clock;
- /* Timestamp updated by each invocation of the get method. The VM may use
+ /**
+ * Timestamp updated by each invocation of the get method. The VM may use
* this field when selecting soft references to be cleared, but it is not
* required to do so.
*/
@@ -108,7 +110,8 @@
*/
public T get() {
T o = super.get();
- if (o != null) this.timestamp = clock;
+ if (o != null && this.timestamp != clock)
+ this.timestamp = clock;
return o;
}
--- a/jdk/src/share/classes/java/net/AbstractPlainSocketImpl.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/net/AbstractPlainSocketImpl.java Mon Apr 27 12:33:57 2009 -0700
@@ -33,6 +33,7 @@
import java.io.ByteArrayOutputStream;
import sun.net.ConnectionResetException;
+import sun.net.NetHooks;
/**
* Default Socket Implementation. This implementation does
@@ -304,6 +305,11 @@
*/
synchronized void doConnect(InetAddress address, int port, int timeout) throws IOException {
+ synchronized (fdLock) {
+ if (!closePending && (socket == null || !socket.isBound())) {
+ NetHooks.beforeTcpConnect(fd, address, port);
+ }
+ }
try {
FileDescriptor fd = acquireFD();
try {
@@ -339,6 +345,11 @@
protected synchronized void bind(InetAddress address, int lport)
throws IOException
{
+ synchronized (fdLock) {
+ if (!closePending && (socket == null || !socket.isBound())) {
+ NetHooks.beforeTcpBind(fd, address, lport);
+ }
+ }
socketBind(address, lport);
if (socket != null)
socket.setBound();
--- a/jdk/src/share/classes/java/net/URLClassLoader.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/net/URLClassLoader.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -74,10 +74,10 @@
*/
public class URLClassLoader extends SecureClassLoader implements Closeable {
/* The search path for classes and resources */
- URLClassPath ucp;
+ private final URLClassPath ucp;
/* The context to be used when loading classes and resources */
- private AccessControlContext acc;
+ private final AccessControlContext acc;
/**
* Constructs a new URLClassLoader for the given URLs. The URLs will be
@@ -105,7 +105,19 @@
security.checkCreateClassLoader();
}
ucp = new URLClassPath(urls);
- acc = AccessController.getContext();
+ this.acc = AccessController.getContext();
+ }
+
+ URLClassLoader(URL[] urls, ClassLoader parent,
+ AccessControlContext acc) {
+ super(parent);
+ // this is to make the stack depth consistent with 1.1
+ SecurityManager security = System.getSecurityManager();
+ if (security != null) {
+ security.checkCreateClassLoader();
+ }
+ ucp = new URLClassPath(urls);
+ this.acc = acc;
}
/**
@@ -136,7 +148,18 @@
security.checkCreateClassLoader();
}
ucp = new URLClassPath(urls);
- acc = AccessController.getContext();
+ this.acc = AccessController.getContext();
+ }
+
+ URLClassLoader(URL[] urls, AccessControlContext acc) {
+ super();
+ // this is to make the stack depth consistent with 1.1
+ SecurityManager security = System.getSecurityManager();
+ if (security != null) {
+ security.checkCreateClassLoader();
+ }
+ ucp = new URLClassPath(urls);
+ this.acc = acc;
}
/**
@@ -599,17 +622,14 @@
public static URLClassLoader newInstance(final URL[] urls,
final ClassLoader parent) {
// Save the caller's context
- AccessControlContext acc = AccessController.getContext();
+ final AccessControlContext acc = AccessController.getContext();
// Need a privileged block to create the class loader
URLClassLoader ucl = AccessController.doPrivileged(
new PrivilegedAction<URLClassLoader>() {
public URLClassLoader run() {
- return new FactoryURLClassLoader(urls, parent);
+ return new FactoryURLClassLoader(urls, parent, acc);
}
});
- // Now set the context on the loader using the one we saved,
- // not the one inside the privileged block...
- ucl.acc = acc;
return ucl;
}
@@ -626,18 +646,14 @@
*/
public static URLClassLoader newInstance(final URL[] urls) {
// Save the caller's context
- AccessControlContext acc = AccessController.getContext();
+ final AccessControlContext acc = AccessController.getContext();
// Need a privileged block to create the class loader
URLClassLoader ucl = AccessController.doPrivileged(
new PrivilegedAction<URLClassLoader>() {
public URLClassLoader run() {
- return new FactoryURLClassLoader(urls);
+ return new FactoryURLClassLoader(urls, acc);
}
});
-
- // Now set the context on the loader using the one we saved,
- // not the one inside the privileged block...
- ucl.acc = acc;
return ucl;
}
@@ -649,20 +665,26 @@
}
}
);
+ ClassLoader.registerAsParallelCapable();
}
}
final class FactoryURLClassLoader extends URLClassLoader {
- FactoryURLClassLoader(URL[] urls, ClassLoader parent) {
- super(urls, parent);
+ static {
+ ClassLoader.registerAsParallelCapable();
}
- FactoryURLClassLoader(URL[] urls) {
- super(urls);
+ FactoryURLClassLoader(URL[] urls, ClassLoader parent,
+ AccessControlContext acc) {
+ super(urls, parent, acc);
}
- public final synchronized Class loadClass(String name, boolean resolve)
+ FactoryURLClassLoader(URL[] urls, AccessControlContext acc) {
+ super(urls, acc);
+ }
+
+ public final Class loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
// First check if we have permission to access the package. This
--- a/jdk/src/share/classes/java/nio/channels/DatagramChannel.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/nio/channels/DatagramChannel.java Mon Apr 27 12:33:57 2009 -0700
@@ -261,7 +261,10 @@
*
* <p> This method may be invoked at any time. It will not have any effect
* on read or write operations that are already in progress at the moment
- * that it is invoked. </p>
+ * that it is invoked. If this channel's socket is not bound then this method
+ * will first cause the socket to be bound to an address that is assigned
+ * automatically, as if invoking the {@link #bind bind} method with a
+ * parameter of {@code null}. </p>
*
* @param remote
* The remote address to which this channel is to be connected
@@ -356,7 +359,10 @@
* <p> This method may be invoked at any time. If another thread has
* already initiated a read operation upon this channel, however, then an
* invocation of this method will block until the first operation is
- * complete. </p>
+ * complete. If this channel's socket is not bound then this method will
+ * first cause the socket to be bound to an address that is assigned
+ * automatically, as if invoking the {@link #bind bind} method with a
+ * parameter of {@code null}. </p>
*
* @param dst
* The buffer into which the datagram is to be transferred
@@ -413,7 +419,10 @@
* <p> This method may be invoked at any time. If another thread has
* already initiated a write operation upon this channel, however, then an
* invocation of this method will block until the first operation is
- * complete. </p>
+ * complete. If this channel's socket is not bound then this method will
+ * first cause the socket to be bound to an address that is assigned
+ * automatically, as if by invoking the {@link #bind bind) method with a
+ * parameter of {@code null}. </p>
*
* @param src
* The buffer containing the datagram to be sent
--- a/jdk/src/share/classes/java/security/SecureClassLoader.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/security/SecureClassLoader.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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,14 +45,19 @@
* succeed. Otherwise the object is not initialized and the object is
* useless.
*/
- private boolean initialized = false;
+ private final boolean initialized;
// HashMap that maps CodeSource to ProtectionDomain
- private HashMap<CodeSource, ProtectionDomain> pdcache =
+ // @GuardedBy("pdcache")
+ private final HashMap<CodeSource, ProtectionDomain> pdcache =
new HashMap<CodeSource, ProtectionDomain>(11);
private static final Debug debug = Debug.getInstance("scl");
+ static {
+ ClassLoader.registerAsParallelCapable();
+ }
+
/**
* Creates a new SecureClassLoader using the specified parent
* class loader for delegation.
@@ -136,10 +141,7 @@
byte[] b, int off, int len,
CodeSource cs)
{
- if (cs == null)
- return defineClass(name, b, off, len);
- else
- return defineClass(name, b, off, len, getProtectionDomain(cs));
+ return defineClass(name, b, off, len, getProtectionDomain(cs));
}
/**
@@ -172,10 +174,7 @@
protected final Class<?> defineClass(String name, java.nio.ByteBuffer b,
CodeSource cs)
{
- if (cs == null)
- return defineClass(name, b, (ProtectionDomain)null);
- else
- return defineClass(name, b, getProtectionDomain(cs));
+ return defineClass(name, b, getProtectionDomain(cs));
}
/**
@@ -209,12 +208,10 @@
if (pd == null) {
PermissionCollection perms = getPermissions(cs);
pd = new ProtectionDomain(cs, perms, this, null);
- if (pd != null) {
- pdcache.put(cs, pd);
- if (debug != null) {
- debug.println(" getPermissions "+ pd);
- debug.println("");
- }
+ pdcache.put(cs, pd);
+ if (debug != null) {
+ debug.println(" getPermissions "+ pd);
+ debug.println("");
}
}
}
--- a/jdk/src/share/classes/java/util/TreeMap.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/util/TreeMap.java Mon Apr 27 12:33:57 2009 -0700
@@ -1068,14 +1068,14 @@
}
public NavigableSet<E> subSet(E fromElement, boolean fromInclusive,
E toElement, boolean toInclusive) {
- return new TreeSet<E>(m.subMap(fromElement, fromInclusive,
- toElement, toInclusive));
+ return new KeySet<E>(m.subMap(fromElement, fromInclusive,
+ toElement, toInclusive));
}
public NavigableSet<E> headSet(E toElement, boolean inclusive) {
- return new TreeSet<E>(m.headMap(toElement, inclusive));
+ return new KeySet<E>(m.headMap(toElement, inclusive));
}
public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
- return new TreeSet<E>(m.tailMap(fromElement, inclusive));
+ return new KeySet<E>(m.tailMap(fromElement, inclusive));
}
public SortedSet<E> subSet(E fromElement, E toElement) {
return subSet(fromElement, true, toElement, false);
@@ -1087,7 +1087,7 @@
return tailSet(fromElement, true);
}
public NavigableSet<E> descendingSet() {
- return new TreeSet(m.descendingMap());
+ return new KeySet(m.descendingMap());
}
}
--- a/jdk/src/share/classes/java/util/concurrent/ConcurrentSkipListMap.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/util/concurrent/ConcurrentSkipListMap.java Mon Apr 27 12:33:57 2009 -0700
@@ -2394,15 +2394,14 @@
boolean fromInclusive,
E toElement,
boolean toInclusive) {
- return new ConcurrentSkipListSet<E>
- (m.subMap(fromElement, fromInclusive,
- toElement, toInclusive));
+ return new KeySet<E>(m.subMap(fromElement, fromInclusive,
+ toElement, toInclusive));
}
public NavigableSet<E> headSet(E toElement, boolean inclusive) {
- return new ConcurrentSkipListSet<E>(m.headMap(toElement, inclusive));
+ return new KeySet<E>(m.headMap(toElement, inclusive));
}
public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
- return new ConcurrentSkipListSet<E>(m.tailMap(fromElement, inclusive));
+ return new KeySet<E>(m.tailMap(fromElement, inclusive));
}
public NavigableSet<E> subSet(E fromElement, E toElement) {
return subSet(fromElement, true, toElement, false);
@@ -2414,7 +2413,7 @@
return tailSet(fromElement, true);
}
public NavigableSet<E> descendingSet() {
- return new ConcurrentSkipListSet(m.descendingMap());
+ return new KeySet(m.descendingMap());
}
}
--- a/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java Mon Apr 27 12:33:57 2009 -0700
@@ -166,6 +166,11 @@
static final int SIGNAL = -1;
/** waitStatus value to indicate thread is waiting on condition */
static final int CONDITION = -2;
+ /**
+ * waitStatus value to indicate the next acquireShared should
+ * unconditionally propagate
+ */
+ static final int PROPAGATE = -3;
/**
* Status field, taking on only the values:
@@ -180,10 +185,16 @@
* Nodes never leave this state. In particular,
* a thread with cancelled node never again blocks.
* CONDITION: This node is currently on a condition queue.
- * It will not be used as a sync queue node until
- * transferred. (Use of this value here
- * has nothing to do with the other uses
- * of the field, but simplifies mechanics.)
+ * It will not be used as a sync queue node
+ * until transferred, at which time the status
+ * will be set to 0. (Use of this value here has
+ * nothing to do with the other uses of the
+ * field, but simplifies mechanics.)
+ * PROPAGATE: A releaseShared should be propagated to other
+ * nodes. This is set (for head node only) in
+ * doReleaseShared to ensure propagation
+ * continues, even if other operations have
+ * since intervened.
* 0: None of the above
*
* The values are arranged numerically to simplify use.
@@ -403,10 +414,13 @@
*/
private void unparkSuccessor(Node node) {
/*
- * Try to clear status in anticipation of signalling. It is
- * OK if this fails or if status is changed by waiting thread.
+ * If status is negative (i.e., possibly needing signal) try
+ * to clear in anticipation of signalling. It is OK if this
+ * fails or if status is changed by waiting thread.
*/
- compareAndSetWaitStatus(node, Node.SIGNAL, 0);
+ int ws = node.waitStatus;
+ if (ws < 0)
+ compareAndSetWaitStatus(node, ws, 0);
/*
* Thread to unpark is held in successor, which is normally
@@ -426,23 +440,70 @@
}
/**
+ * Release action for shared mode -- signal successor and ensure
+ * propagation. (Note: For exclusive mode, release just amounts
+ * to calling unparkSuccessor of head if it needs signal.)
+ */
+ private void doReleaseShared() {
+ /*
+ * Ensure that a release propagates, even if there are other
+ * in-progress acquires/releases. This proceeds in the usual
+ * way of trying to unparkSuccessor of head if it needs
+ * signal. But if it does not, status is set to PROPAGATE to
+ * ensure that upon release, propagation continues.
+ * Additionally, we must loop in case a new node is added
+ * while we are doing this. Also, unlike other uses of
+ * unparkSuccessor, we need to know if CAS to reset status
+ * fails, if so rechecking.
+ */
+ for (;;) {
+ Node h = head;
+ if (h != null && h != tail) {
+ int ws = h.waitStatus;
+ if (ws == Node.SIGNAL) {
+ if (!compareAndSetWaitStatus(h, Node.SIGNAL, 0))
+ continue; // loop to recheck cases
+ unparkSuccessor(h);
+ }
+ else if (ws == 0 &&
+ !compareAndSetWaitStatus(h, 0, Node.PROPAGATE))
+ continue; // loop on failed CAS
+ }
+ if (h == head) // loop if head changed
+ break;
+ }
+ }
+
+ /**
* Sets head of queue, and checks if successor may be waiting
- * in shared mode, if so propagating if propagate > 0.
+ * in shared mode, if so propagating if either propagate > 0 or
+ * PROPAGATE status was set.
*
- * @param pred the node holding waitStatus for node
* @param node the node
* @param propagate the return value from a tryAcquireShared
*/
private void setHeadAndPropagate(Node node, long propagate) {
+ Node h = head; // Record old head for check below
setHead(node);
- if (propagate > 0 && node.waitStatus != 0) {
- /*
- * Don't bother fully figuring out successor. If it
- * looks null, call unparkSuccessor anyway to be safe.
- */
+ /*
+ * Try to signal next queued node if:
+ * Propagation was indicated by caller,
+ * or was recorded (as h.waitStatus) by a previous operation
+ * (note: this uses sign-check of waitStatus because
+ * PROPAGATE status may transition to SIGNAL.)
+ * and
+ * The next node is waiting in shared mode,
+ * or we don't know, because it appears null
+ *
+ * The conservatism in both of these checks may cause
+ * unnecessary wake-ups, but only when there are multiple
+ * racing acquires/releases, so most need signals now or soon
+ * anyway.
+ */
+ if (propagate > 0 || h == null || h.waitStatus < 0) {
Node s = node.next;
if (s == null || s.isShared())
- unparkSuccessor(node);
+ doReleaseShared();
}
}
@@ -465,23 +526,27 @@
while (pred.waitStatus > 0)
node.prev = pred = pred.prev;
- // Getting this before setting waitStatus ensures staleness
+ // predNext is the apparent node to unsplice. CASes below will
+ // fail if not, in which case, we lost race vs another cancel
+ // or signal, so no further action is necessary.
Node predNext = pred.next;
- // Can use unconditional write instead of CAS here
+ // Can use unconditional write instead of CAS here.
+ // After this atomic step, other Nodes can skip past us.
+ // Before, we are free of interference from other threads.
node.waitStatus = Node.CANCELLED;
- // If we are the tail, remove ourselves
+ // If we are the tail, remove ourselves.
if (node == tail && compareAndSetTail(node, pred)) {
compareAndSetNext(pred, predNext, null);
} else {
- // If "active" predecessor found...
- if (pred != head
- && (pred.waitStatus == Node.SIGNAL
- || compareAndSetWaitStatus(pred, 0, Node.SIGNAL))
- && pred.thread != null) {
-
- // If successor is active, set predecessor's next link
+ // If successor needs signal, try to set pred's next-link
+ // so it will get one. Otherwise wake it up to propagate.
+ int ws;
+ if (pred != head &&
+ ((ws = pred.waitStatus) == Node.SIGNAL ||
+ (ws <= 0 && compareAndSetWaitStatus(pred, ws, Node.SIGNAL))) &&
+ pred.thread != null) {
Node next = node.next;
if (next != null && next.waitStatus <= 0)
compareAndSetNext(pred, predNext, next);
@@ -503,14 +568,14 @@
* @return {@code true} if thread should block
*/
private static boolean shouldParkAfterFailedAcquire(Node pred, Node node) {
- int s = pred.waitStatus;
- if (s < 0)
+ int ws = pred.waitStatus;
+ if (ws == Node.SIGNAL)
/*
* This node has already set status asking a release
* to signal it, so it can safely park.
*/
return true;
- if (s > 0) {
+ if (ws > 0) {
/*
* Predecessor was cancelled. Skip over predecessors and
* indicate retry.
@@ -519,14 +584,14 @@
node.prev = pred = pred.prev;
} while (pred.waitStatus > 0);
pred.next = node;
- }
- else
+ } else {
/*
- * Indicate that we need a signal, but don't park yet. Caller
- * will need to retry to make sure it cannot acquire before
- * parking.
+ * waitStatus must be 0 or PROPAGATE. Indicate that we
+ * need a signal, but don't park yet. Caller will need to
+ * retry to make sure it cannot acquire before parking.
*/
- compareAndSetWaitStatus(pred, 0, Node.SIGNAL);
+ compareAndSetWaitStatus(pred, ws, Node.SIGNAL);
+ }
return false;
}
@@ -1046,9 +1111,7 @@
*/
public final boolean releaseShared(long arg) {
if (tryReleaseShared(arg)) {
- Node h = head;
- if (h != null && h.waitStatus != 0)
- unparkSuccessor(h);
+ doReleaseShared();
return true;
}
return false;
@@ -1390,8 +1453,8 @@
* case the waitStatus can be transiently and harmlessly wrong).
*/
Node p = enq(node);
- int c = p.waitStatus;
- if (c > 0 || !compareAndSetWaitStatus(p, c, Node.SIGNAL))
+ int ws = p.waitStatus;
+ if (ws > 0 || !compareAndSetWaitStatus(p, ws, Node.SIGNAL))
LockSupport.unpark(node.thread);
return true;
}
--- a/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java Mon Apr 27 12:33:57 2009 -0700
@@ -389,6 +389,11 @@
static final int SIGNAL = -1;
/** waitStatus value to indicate thread is waiting on condition */
static final int CONDITION = -2;
+ /**
+ * waitStatus value to indicate the next acquireShared should
+ * unconditionally propagate
+ */
+ static final int PROPAGATE = -3;
/**
* Status field, taking on only the values:
@@ -403,10 +408,16 @@
* Nodes never leave this state. In particular,
* a thread with cancelled node never again blocks.
* CONDITION: This node is currently on a condition queue.
- * It will not be used as a sync queue node until
- * transferred. (Use of this value here
- * has nothing to do with the other uses
- * of the field, but simplifies mechanics.)
+ * It will not be used as a sync queue node
+ * until transferred, at which time the status
+ * will be set to 0. (Use of this value here has
+ * nothing to do with the other uses of the
+ * field, but simplifies mechanics.)
+ * PROPAGATE: A releaseShared should be propagated to other
+ * nodes. This is set (for head node only) in
+ * doReleaseShared to ensure propagation
+ * continues, even if other operations have
+ * since intervened.
* 0: None of the above
*
* The values are arranged numerically to simplify use.
@@ -626,10 +637,13 @@
*/
private void unparkSuccessor(Node node) {
/*
- * Try to clear status in anticipation of signalling. It is
- * OK if this fails or if status is changed by waiting thread.
+ * If status is negative (i.e., possibly needing signal) try
+ * to clear in anticipation of signalling. It is OK if this
+ * fails or if status is changed by waiting thread.
*/
- compareAndSetWaitStatus(node, Node.SIGNAL, 0);
+ int ws = node.waitStatus;
+ if (ws < 0)
+ compareAndSetWaitStatus(node, ws, 0);
/*
* Thread to unpark is held in successor, which is normally
@@ -649,23 +663,70 @@
}
/**
+ * Release action for shared mode -- signal successor and ensure
+ * propagation. (Note: For exclusive mode, release just amounts
+ * to calling unparkSuccessor of head if it needs signal.)
+ */
+ private void doReleaseShared() {
+ /*
+ * Ensure that a release propagates, even if there are other
+ * in-progress acquires/releases. This proceeds in the usual
+ * way of trying to unparkSuccessor of head if it needs
+ * signal. But if it does not, status is set to PROPAGATE to
+ * ensure that upon release, propagation continues.
+ * Additionally, we must loop in case a new node is added
+ * while we are doing this. Also, unlike other uses of
+ * unparkSuccessor, we need to know if CAS to reset status
+ * fails, if so rechecking.
+ */
+ for (;;) {
+ Node h = head;
+ if (h != null && h != tail) {
+ int ws = h.waitStatus;
+ if (ws == Node.SIGNAL) {
+ if (!compareAndSetWaitStatus(h, Node.SIGNAL, 0))
+ continue; // loop to recheck cases
+ unparkSuccessor(h);
+ }
+ else if (ws == 0 &&
+ !compareAndSetWaitStatus(h, 0, Node.PROPAGATE))
+ continue; // loop on failed CAS
+ }
+ if (h == head) // loop if head changed
+ break;
+ }
+ }
+
+ /**
* Sets head of queue, and checks if successor may be waiting
- * in shared mode, if so propagating if propagate > 0.
+ * in shared mode, if so propagating if either propagate > 0 or
+ * PROPAGATE status was set.
*
- * @param pred the node holding waitStatus for node
* @param node the node
* @param propagate the return value from a tryAcquireShared
*/
private void setHeadAndPropagate(Node node, int propagate) {
+ Node h = head; // Record old head for check below
setHead(node);
- if (propagate > 0 && node.waitStatus != 0) {
- /*
- * Don't bother fully figuring out successor. If it
- * looks null, call unparkSuccessor anyway to be safe.
- */
+ /*
+ * Try to signal next queued node if:
+ * Propagation was indicated by caller,
+ * or was recorded (as h.waitStatus) by a previous operation
+ * (note: this uses sign-check of waitStatus because
+ * PROPAGATE status may transition to SIGNAL.)
+ * and
+ * The next node is waiting in shared mode,
+ * or we don't know, because it appears null
+ *
+ * The conservatism in both of these checks may cause
+ * unnecessary wake-ups, but only when there are multiple
+ * racing acquires/releases, so most need signals now or soon
+ * anyway.
+ */
+ if (propagate > 0 || h == null || h.waitStatus < 0) {
Node s = node.next;
if (s == null || s.isShared())
- unparkSuccessor(node);
+ doReleaseShared();
}
}
@@ -688,23 +749,27 @@
while (pred.waitStatus > 0)
node.prev = pred = pred.prev;
- // Getting this before setting waitStatus ensures staleness
+ // predNext is the apparent node to unsplice. CASes below will
+ // fail if not, in which case, we lost race vs another cancel
+ // or signal, so no further action is necessary.
Node predNext = pred.next;
- // Can use unconditional write instead of CAS here
+ // Can use unconditional write instead of CAS here.
+ // After this atomic step, other Nodes can skip past us.
+ // Before, we are free of interference from other threads.
node.waitStatus = Node.CANCELLED;
- // If we are the tail, remove ourselves
+ // If we are the tail, remove ourselves.
if (node == tail && compareAndSetTail(node, pred)) {
compareAndSetNext(pred, predNext, null);
} else {
- // If "active" predecessor found...
- if (pred != head
- && (pred.waitStatus == Node.SIGNAL
- || compareAndSetWaitStatus(pred, 0, Node.SIGNAL))
- && pred.thread != null) {
-
- // If successor is active, set predecessor's next link
+ // If successor needs signal, try to set pred's next-link
+ // so it will get one. Otherwise wake it up to propagate.
+ int ws;
+ if (pred != head &&
+ ((ws = pred.waitStatus) == Node.SIGNAL ||
+ (ws <= 0 && compareAndSetWaitStatus(pred, ws, Node.SIGNAL))) &&
+ pred.thread != null) {
Node next = node.next;
if (next != null && next.waitStatus <= 0)
compareAndSetNext(pred, predNext, next);
@@ -726,14 +791,14 @@
* @return {@code true} if thread should block
*/
private static boolean shouldParkAfterFailedAcquire(Node pred, Node node) {
- int s = pred.waitStatus;
- if (s < 0)
+ int ws = pred.waitStatus;
+ if (ws == Node.SIGNAL)
/*
* This node has already set status asking a release
* to signal it, so it can safely park.
*/
return true;
- if (s > 0) {
+ if (ws > 0) {
/*
* Predecessor was cancelled. Skip over predecessors and
* indicate retry.
@@ -742,14 +807,14 @@
node.prev = pred = pred.prev;
} while (pred.waitStatus > 0);
pred.next = node;
- }
- else
+ } else {
/*
- * Indicate that we need a signal, but don't park yet. Caller
- * will need to retry to make sure it cannot acquire before
- * parking.
+ * waitStatus must be 0 or PROPAGATE. Indicate that we
+ * need a signal, but don't park yet. Caller will need to
+ * retry to make sure it cannot acquire before parking.
*/
- compareAndSetWaitStatus(pred, 0, Node.SIGNAL);
+ compareAndSetWaitStatus(pred, ws, Node.SIGNAL);
+ }
return false;
}
@@ -1269,9 +1334,7 @@
*/
public final boolean releaseShared(int arg) {
if (tryReleaseShared(arg)) {
- Node h = head;
- if (h != null && h.waitStatus != 0)
- unparkSuccessor(h);
+ doReleaseShared();
return true;
}
return false;
@@ -1613,8 +1676,8 @@
* case the waitStatus can be transiently and harmlessly wrong).
*/
Node p = enq(node);
- int c = p.waitStatus;
- if (c > 0 || !compareAndSetWaitStatus(p, c, Node.SIGNAL))
+ int ws = p.waitStatus;
+ if (ws > 0 || !compareAndSetWaitStatus(p, ws, Node.SIGNAL))
LockSupport.unpark(node.thread);
return true;
}
--- a/jdk/src/share/classes/java/util/concurrent/locks/ReentrantReadWriteLock.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/util/concurrent/locks/ReentrantReadWriteLock.java Mon Apr 27 12:33:57 2009 -0700
@@ -276,7 +276,7 @@
* Maintained as a ThreadLocal; cached in cachedHoldCounter
*/
static final class HoldCounter {
- int count;
+ int count = 0;
// Use id, not reference, to avoid garbage retention
final long tid = Thread.currentThread().getId();
}
@@ -293,8 +293,9 @@
}
/**
- * The number of read locks held by current thread.
+ * The number of reentrant read locks held by current thread.
* Initialized only in constructor and readObject.
+ * Removed whenever a thread's read hold count drops to 0.
*/
private transient ThreadLocalHoldCounter readHolds;
@@ -304,17 +305,35 @@
* where the next thread to release is the last one to
* acquire. This is non-volatile since it is just used
* as a heuristic, and would be great for threads to cache.
+ *
+ * <p>Can outlive the Thread for which it is caching the read
+ * hold count, but avoids garbage retention by not retaining a
+ * reference to the Thread.
+ *
+ * <p>Accessed via a benign data race; relies on the memory
+ * model's final field and out-of-thin-air guarantees.
*/
private transient HoldCounter cachedHoldCounter;
/**
* firstReader is the first thread to have acquired the read lock.
* firstReaderHoldCount is firstReader's hold count.
- * This allows tracking of read holds for uncontended read
+ *
+ * <p>More precisely, firstReader is the unique thread that last
+ * changed the shared count from 0 to 1, and has not released the
+ * read lock since then; null if there is no such thread.
+ *
+ * <p>Cannot cause garbage retention unless the thread terminated
+ * without relinquishing its read locks, since tryReleaseShared
+ * sets it to null.
+ *
+ * <p>Accessed via a benign data race; relies on the memory
+ * model's out-of-thin-air guarantees for references.
+ *
+ * <p>This allows tracking of read holds for uncontended read
* locks to be very cheap.
*/
- private final static long INVALID_THREAD_ID = -1;
- private transient long firstReader = INVALID_THREAD_ID;
+ private transient Thread firstReader = null;
private transient int firstReaderHoldCount;
Sync() {
@@ -393,16 +412,16 @@
}
protected final boolean tryReleaseShared(int unused) {
- long tid = Thread.currentThread().getId();
- if (firstReader == tid) {
+ Thread current = Thread.currentThread();
+ if (firstReader == current) {
// assert firstReaderHoldCount > 0;
if (firstReaderHoldCount == 1)
- firstReader = INVALID_THREAD_ID;
+ firstReader = null;
else
firstReaderHoldCount--;
} else {
HoldCounter rh = cachedHoldCounter;
- if (rh == null || rh.tid != tid)
+ if (rh == null || rh.tid != current.getId())
rh = readHolds.get();
int count = rh.count;
if (count <= 1) {
@@ -416,6 +435,9 @@
int c = getState();
int nextc = c - SHARED_UNIT;
if (compareAndSetState(c, nextc))
+ // Releasing the read lock has no effect on readers,
+ // but it may allow waiting writers to proceed if
+ // both read and write locks are now free.
return nextc == 0;
}
}
@@ -450,15 +472,14 @@
if (!readerShouldBlock() &&
r < MAX_COUNT &&
compareAndSetState(c, c + SHARED_UNIT)) {
- long tid = current.getId();
if (r == 0) {
- firstReader = tid;
+ firstReader = current;
firstReaderHoldCount = 1;
- } else if (firstReader == tid) {
+ } else if (firstReader == current) {
firstReaderHoldCount++;
} else {
HoldCounter rh = cachedHoldCounter;
- if (rh == null || rh.tid != tid)
+ if (rh == null || rh.tid != current.getId())
cachedHoldCounter = rh = readHolds.get();
else if (rh.count == 0)
readHolds.set(rh);
@@ -485,19 +506,17 @@
int c = getState();
if (exclusiveCount(c) != 0) {
if (getExclusiveOwnerThread() != current)
- //if (removeNeeded) readHolds.remove();
return -1;
// else we hold the exclusive lock; blocking here
// would cause deadlock.
} else if (readerShouldBlock()) {
// Make sure we're not acquiring read lock reentrantly
- long tid = current.getId();
- if (firstReader == tid) {
+ if (firstReader == current) {
// assert firstReaderHoldCount > 0;
} else {
if (rh == null) {
rh = cachedHoldCounter;
- if (rh == null || rh.tid != tid) {
+ if (rh == null || rh.tid != current.getId()) {
rh = readHolds.get();
if (rh.count == 0)
readHolds.remove();
@@ -510,25 +529,20 @@
if (sharedCount(c) == MAX_COUNT)
throw new Error("Maximum lock count exceeded");
if (compareAndSetState(c, c + SHARED_UNIT)) {
- long tid = current.getId();
if (sharedCount(c) == 0) {
- firstReader = tid;
+ firstReader = current;
firstReaderHoldCount = 1;
- } else if (firstReader == tid) {
+ } else if (firstReader == current) {
firstReaderHoldCount++;
} else {
- if (rh == null) {
+ if (rh == null)
rh = cachedHoldCounter;
- if (rh != null && rh.tid == tid) {
- if (rh.count == 0)
- readHolds.set(rh);
- } else {
- rh = readHolds.get();
- }
- } else if (rh.count == 0)
+ if (rh == null || rh.tid != current.getId())
+ rh = readHolds.get();
+ else if (rh.count == 0)
readHolds.set(rh);
+ rh.count++;
cachedHoldCounter = rh; // cache for release
- rh.count++;
}
return 1;
}
@@ -572,15 +586,14 @@
if (r == MAX_COUNT)
throw new Error("Maximum lock count exceeded");
if (compareAndSetState(c, c + SHARED_UNIT)) {
- long tid = current.getId();
if (r == 0) {
- firstReader = tid;
+ firstReader = current;
firstReaderHoldCount = 1;
- } else if (firstReader == tid) {
+ } else if (firstReader == current) {
firstReaderHoldCount++;
} else {
HoldCounter rh = cachedHoldCounter;
- if (rh == null || rh.tid != tid)
+ if (rh == null || rh.tid != current.getId())
cachedHoldCounter = rh = readHolds.get();
else if (rh.count == 0)
readHolds.set(rh);
@@ -626,12 +639,12 @@
if (getReadLockCount() == 0)
return 0;
- long tid = Thread.currentThread().getId();
- if (firstReader == tid)
+ Thread current = Thread.currentThread();
+ if (firstReader == current)
return firstReaderHoldCount;
HoldCounter rh = cachedHoldCounter;
- if (rh != null && rh.tid == tid)
+ if (rh != null && rh.tid == current.getId())
return rh.count;
int count = readHolds.get().count;
@@ -647,7 +660,6 @@
throws java.io.IOException, ClassNotFoundException {
s.defaultReadObject();
readHolds = new ThreadLocalHoldCounter();
- firstReader = INVALID_THREAD_ID;
setState(0); // reset to unlocked state
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/java/util/zip/ZipConstants64.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,77 @@
+/*
+ * Copyright 1995-1996 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package java.util.zip;
+
+/*
+ * This class defines the constants that are used by the classes
+ * which manipulate Zip64 files.
+ */
+
+class ZipConstants64 {
+
+ /*
+ * ZIP64 constants
+ */
+ static final long ZIP64_ENDSIG = 0x06064b50L; // "PK\006\006"
+ static final long ZIP64_LOCSIG = 0x07064b50L; // "PK\006\007"
+ static final int ZIP64_ENDHDR = 56; // ZIP64 end header size
+ static final int ZIP64_LOCHDR = 20; // ZIP64 end loc header size
+ static final int ZIP64_EXTHDR = 24; // EXT header size
+ static final int ZIP64_EXTID = 0x0001; // Extra field Zip64 header ID
+
+ static final int ZIP64_MAGICCOUNT = 0xFFFF;
+ static final long ZIP64_MAGICVAL = 0xFFFFFFFFL;
+
+ /*
+ * Zip64 End of central directory (END) header field offsets
+ */
+ static final int ZIP64_ENDLEN = 4; // size of zip64 end of central dir
+ static final int ZIP64_ENDVEM = 12; // version made by
+ static final int ZIP64_ENDVER = 14; // version needed to extract
+ static final int ZIP64_ENDNMD = 16; // number of this disk
+ static final int ZIP64_ENDDSK = 20; // disk number of start
+ static final int ZIP64_ENDTOD = 24; // total number of entries on this disk
+ static final int ZIP64_ENDTOT = 32; // total number of entries
+ static final int ZIP64_ENDSIZ = 40; // central directory size in bytes
+ static final int ZIP64_ENDOFF = 48; // offset of first CEN header
+ static final int ZIP64_ENDEXT = 56; // zip64 extensible data sector
+
+ /*
+ * Zip64 End of central directory locator field offsets
+ */
+ static final int ZIP64_LOCDSK = 4; // disk number start
+ static final int ZIP64_LOCOFF = 8; // offset of zip64 end
+ static final int ZIP64_LOCTOT = 16; // total number of disks
+
+ /*
+ * Zip64 Extra local (EXT) header field offsets
+ */
+ static final int ZIP64_EXTCRC = 4; // uncompressed file crc-32 value
+ static final int ZIP64_EXTSIZ = 8; // compressed size, 8-byte
+ static final int ZIP64_EXTLEN = 16; // uncompressed size, 8-byte
+
+ private ZipConstants64() {}
+}
--- a/jdk/src/share/classes/java/util/zip/ZipEntry.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/util/zip/ZipEntry.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1995-2005 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1995-2009 Sun Microsystems, Inc. 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
@@ -144,11 +144,13 @@
* Sets the uncompressed size of the entry data.
* @param size the uncompressed size in bytes
* @exception IllegalArgumentException if the specified size is less
- * than 0 or greater than 0xFFFFFFFF bytes
+ * than 0, is greater than 0xFFFFFFFF when
+ * <a href="package-summary.html#zip64">ZIP64 format</a> is not supported,
+ * or is less than 0 when ZIP64 is supported
* @see #getSize()
*/
public void setSize(long size) {
- if (size < 0 || size > 0xFFFFFFFFL) {
+ if (size < 0) {
throw new IllegalArgumentException("invalid entry size");
}
this.size = size;
--- a/jdk/src/share/classes/java/util/zip/ZipInputStream.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/util/zip/ZipInputStream.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -29,6 +29,7 @@
import java.io.IOException;
import java.io.EOFException;
import java.io.PushbackInputStream;
+import static java.util.zip.ZipConstants64.*;
/**
* This class implements an input stream filter for reading files in the
@@ -285,6 +286,29 @@
byte[] bb = new byte[len];
readFully(bb, 0, len);
e.setExtra(bb);
+ // extra fields are in "HeaderID(2)DataSize(2)Data... format
+ if (e.csize == ZIP64_MAGICVAL || e.size == ZIP64_MAGICVAL) {
+ int off = 0;
+ while (off + 4 < len) {
+ int sz = get16(bb, off + 2);
+ if (get16(bb, off) == ZIP64_EXTID) {
+ off += 4;
+ // LOC extra zip64 entry MUST include BOTH original and
+ // compressed file size fields
+ if (sz < 16 || (off + sz) > len ) {
+ // Invalid zip64 extra fields, simply skip. Even it's
+ // rare, it's possible the entry size happens to be
+ // the magic value and it "accidnetly" has some bytes
+ // in extra match the id.
+ return e;
+ }
+ e.size = get64(bb, off);
+ e.csize = get64(bb, off + 8);
+ break;
+ }
+ off += (sz + 4);
+ }
+ }
}
return e;
}
@@ -375,18 +399,36 @@
}
if ((flag & 8) == 8) {
/* "Data Descriptor" present */
- readFully(tmpbuf, 0, EXTHDR);
- long sig = get32(tmpbuf, 0);
- if (sig != EXTSIG) { // no EXTSIG present
- e.crc = sig;
- e.csize = get32(tmpbuf, EXTSIZ - EXTCRC);
- e.size = get32(tmpbuf, EXTLEN - EXTCRC);
- ((PushbackInputStream)in).unread(
- tmpbuf, EXTHDR - EXTCRC - 1, EXTCRC);
+ if (inf.getBytesWritten() > ZIP64_MAGICVAL ||
+ inf.getBytesRead() > ZIP64_MAGICVAL) {
+ // ZIP64 format
+ readFully(tmpbuf, 0, ZIP64_EXTHDR);
+ long sig = get32(tmpbuf, 0);
+ if (sig != EXTSIG) { // no EXTSIG present
+ e.crc = sig;
+ e.csize = get64(tmpbuf, ZIP64_EXTSIZ - ZIP64_EXTCRC);
+ e.size = get64(tmpbuf, ZIP64_EXTLEN - ZIP64_EXTCRC);
+ ((PushbackInputStream)in).unread(
+ tmpbuf, ZIP64_EXTHDR - ZIP64_EXTCRC - 1, ZIP64_EXTCRC);
+ } else {
+ e.crc = get32(tmpbuf, ZIP64_EXTCRC);
+ e.csize = get64(tmpbuf, ZIP64_EXTSIZ);
+ e.size = get64(tmpbuf, ZIP64_EXTLEN);
+ }
} else {
- e.crc = get32(tmpbuf, EXTCRC);
- e.csize = get32(tmpbuf, EXTSIZ);
- e.size = get32(tmpbuf, EXTLEN);
+ readFully(tmpbuf, 0, EXTHDR);
+ long sig = get32(tmpbuf, 0);
+ if (sig != EXTSIG) { // no EXTSIG present
+ e.crc = sig;
+ e.csize = get32(tmpbuf, EXTSIZ - EXTCRC);
+ e.size = get32(tmpbuf, EXTLEN - EXTCRC);
+ ((PushbackInputStream)in).unread(
+ tmpbuf, EXTHDR - EXTCRC - 1, EXTCRC);
+ } else {
+ e.crc = get32(tmpbuf, EXTCRC);
+ e.csize = get32(tmpbuf, EXTSIZ);
+ e.size = get32(tmpbuf, EXTLEN);
+ }
}
}
if (e.size != inf.getBytesWritten()) {
@@ -433,6 +475,14 @@
* The bytes are assumed to be in Intel (little-endian) byte order.
*/
private static final long get32(byte b[], int off) {
- return get16(b, off) | ((long)get16(b, off+2) << 16);
+ return (get16(b, off) | ((long)get16(b, off+2) << 16)) & 0xffffffffL;
+ }
+
+ /*
+ * Fetches signed 64-bit value from byte array at specified offset.
+ * The bytes are assumed to be in Intel (little-endian) byte order.
+ */
+ private static final long get64(byte b[], int off) {
+ return get32(b, off) | (get32(b, off+4) << 32);
}
}
--- a/jdk/src/share/classes/java/util/zip/ZipOutputStream.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/util/zip/ZipOutputStream.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -29,6 +29,7 @@
import java.io.IOException;
import java.util.Vector;
import java.util.HashSet;
+import static java.util.zip.ZipConstants64.*;
/**
* This class implements an output stream filter for writing files in the
@@ -343,26 +344,52 @@
private void writeLOC(XEntry xentry) throws IOException {
ZipEntry e = xentry.entry;
int flag = xentry.flag;
+ int elen = (e.extra != null) ? e.extra.length : 0;
+ boolean hasZip64 = false;
+
writeInt(LOCSIG); // LOC header signature
- writeShort(version(e)); // version needed to extract
- writeShort(flag); // general purpose bit flag
- writeShort(e.method); // compression method
- writeInt(e.time); // last modification time
+
if ((flag & 8) == 8) {
+ writeShort(version(e)); // version needed to extract
+ writeShort(flag); // general purpose bit flag
+ writeShort(e.method); // compression method
+ writeInt(e.time); // last modification time
+
// store size, uncompressed size, and crc-32 in data descriptor
// immediately following compressed entry data
writeInt(0);
writeInt(0);
writeInt(0);
} else {
- writeInt(e.crc); // crc-32
- writeInt(e.csize); // compressed size
- writeInt(e.size); // uncompressed size
+ if (e.csize >= ZIP64_MAGICVAL || e.size >= ZIP64_MAGICVAL) {
+ hasZip64 = true;
+ writeShort(45); // ver 4.5 for zip64
+ } else {
+ writeShort(version(e)); // version needed to extract
+ }
+ writeShort(flag); // general purpose bit flag
+ writeShort(e.method); // compression method
+ writeInt(e.time); // last modification time
+ writeInt(e.crc); // crc-32
+ if (hasZip64) {
+ writeInt(ZIP64_MAGICVAL);
+ writeInt(ZIP64_MAGICVAL);
+ elen += 20; //headid(2) + size(2) + size(8) + csize(8)
+ } else {
+ writeInt(e.csize); // compressed size
+ writeInt(e.size); // uncompressed size
+ }
}
byte[] nameBytes = getUTF8Bytes(e.name);
writeShort(nameBytes.length);
- writeShort(e.extra != null ? e.extra.length : 0);
+ writeShort(elen);
writeBytes(nameBytes, 0, nameBytes.length);
+ if (hasZip64) {
+ writeShort(ZIP64_EXTID);
+ writeShort(16);
+ writeLong(e.size);
+ writeLong(e.csize);
+ }
if (e.extra != null) {
writeBytes(e.extra, 0, e.extra.length);
}
@@ -375,8 +402,13 @@
private void writeEXT(ZipEntry e) throws IOException {
writeInt(EXTSIG); // EXT header signature
writeInt(e.crc); // crc-32
- writeInt(e.csize); // compressed size
- writeInt(e.size); // uncompressed size
+ if (e.csize >= ZIP64_MAGICVAL || e.size >= ZIP64_MAGICVAL) {
+ writeLong(e.csize);
+ writeLong(e.size);
+ } else {
+ writeInt(e.csize); // compressed size
+ writeInt(e.size); // uncompressed size
+ }
}
/*
@@ -387,18 +419,49 @@
ZipEntry e = xentry.entry;
int flag = xentry.flag;
int version = version(e);
+
+ long csize = e.csize;
+ long size = e.size;
+ long offset = xentry.offset;
+ int e64len = 0;
+ boolean hasZip64 = false;
+ if (e.csize >= ZIP64_MAGICVAL) {
+ csize = ZIP64_MAGICVAL;
+ e64len += 8; // csize(8)
+ hasZip64 = true;
+ }
+ if (e.size >= ZIP64_MAGICVAL) {
+ size = ZIP64_MAGICVAL; // size(8)
+ e64len += 8;
+ hasZip64 = true;
+ }
+ if (xentry.offset >= ZIP64_MAGICVAL) {
+ offset = ZIP64_MAGICVAL;
+ e64len += 8; // offset(8)
+ hasZip64 = true;
+ }
writeInt(CENSIG); // CEN header signature
- writeShort(version); // version made by
- writeShort(version); // version needed to extract
+ if (hasZip64) {
+ writeShort(45); // ver 4.5 for zip64
+ writeShort(45);
+ } else {
+ writeShort(version); // version made by
+ writeShort(version); // version needed to extract
+ }
writeShort(flag); // general purpose bit flag
writeShort(e.method); // compression method
writeInt(e.time); // last modification time
writeInt(e.crc); // crc-32
- writeInt(e.csize); // compressed size
- writeInt(e.size); // uncompressed size
+ writeInt(csize); // compressed size
+ writeInt(size); // uncompressed size
byte[] nameBytes = getUTF8Bytes(e.name);
writeShort(nameBytes.length);
- writeShort(e.extra != null ? e.extra.length : 0);
+ if (hasZip64) {
+ // + headid(2) + datasize(2)
+ writeShort(e64len + 4 + (e.extra != null ? e.extra.length : 0));
+ } else {
+ writeShort(e.extra != null ? e.extra.length : 0);
+ }
byte[] commentBytes;
if (e.comment != null) {
commentBytes = getUTF8Bytes(e.comment);
@@ -410,8 +473,18 @@
writeShort(0); // starting disk number
writeShort(0); // internal file attributes (unused)
writeInt(0); // external file attributes (unused)
- writeInt(xentry.offset); // relative offset of local header
+ writeInt(offset); // relative offset of local header
writeBytes(nameBytes, 0, nameBytes.length);
+ if (hasZip64) {
+ writeShort(ZIP64_EXTID);// Zip64 extra
+ writeShort(e64len);
+ if (size == ZIP64_MAGICVAL)
+ writeLong(e.size);
+ if (csize == ZIP64_MAGICVAL)
+ writeLong(e.csize);
+ if (offset == ZIP64_MAGICVAL)
+ writeLong(xentry.offset);
+ }
if (e.extra != null) {
writeBytes(e.extra, 0, e.extra.length);
}
@@ -424,15 +497,50 @@
* Writes end of central directory (END) header.
*/
private void writeEND(long off, long len) throws IOException {
+ boolean hasZip64 = false;
+ long xlen = len;
+ long xoff = off;
+ if (xlen >= ZIP64_MAGICVAL) {
+ xlen = ZIP64_MAGICVAL;
+ hasZip64 = true;
+ }
+ if (xoff >= ZIP64_MAGICVAL) {
+ xoff = ZIP64_MAGICVAL;
+ hasZip64 = true;
+ }
int count = xentries.size();
- writeInt(ENDSIG); // END record signature
- writeShort(0); // number of this disk
- writeShort(0); // central directory start disk
- writeShort(count); // number of directory entries on disk
- writeShort(count); // total number of directory entries
- writeInt(len); // length of central directory
- writeInt(off); // offset of central directory
- if (comment != null) { // zip file comment
+ if (count >= ZIP64_MAGICCOUNT) {
+ count = ZIP64_MAGICCOUNT;
+ hasZip64 = true;
+ }
+ if (hasZip64) {
+ long off64 = written;
+ //zip64 end of central directory record
+ writeInt(ZIP64_ENDSIG); // zip64 END record signature
+ writeLong(ZIP64_ENDHDR - 12); // size of zip64 end
+ writeShort(45); // version made by
+ writeShort(45); // version needed to extract
+ writeInt(0); // number of this disk
+ writeInt(0); // central directory start disk
+ writeLong(xentries.size()); // number of directory entires on disk
+ writeLong(xentries.size()); // number of directory entires
+ writeLong(len); // length of central directory
+ writeLong(off); // offset of central directory
+
+ //zip64 end of central directory locator
+ writeInt(ZIP64_LOCSIG); // zip64 END locator signature
+ writeInt(0); // zip64 END start disk
+ writeLong(off64); // offset of zip64 END
+ writeInt(1); // total number of disks (?)
+ }
+ writeInt(ENDSIG); // END record signature
+ writeShort(0); // number of this disk
+ writeShort(0); // central directory start disk
+ writeShort(count); // number of directory entries on disk
+ writeShort(count); // total number of directory entries
+ writeInt(xlen); // length of central directory
+ writeInt(xoff); // offset of central directory
+ if (comment != null) { // zip file comment
byte[] b = getUTF8Bytes(comment);
writeShort(b.length);
writeBytes(b, 0, b.length);
@@ -464,6 +572,22 @@
}
/*
+ * Writes a 64-bit int to the output stream in little-endian byte order.
+ */
+ private void writeLong(long v) throws IOException {
+ OutputStream out = this.out;
+ out.write((int)((v >>> 0) & 0xff));
+ out.write((int)((v >>> 8) & 0xff));
+ out.write((int)((v >>> 16) & 0xff));
+ out.write((int)((v >>> 24) & 0xff));
+ out.write((int)((v >>> 32) & 0xff));
+ out.write((int)((v >>> 40) & 0xff));
+ out.write((int)((v >>> 48) & 0xff));
+ out.write((int)((v >>> 56) & 0xff));
+ written += 8;
+ }
+
+ /*
* Writes an array of bytes to the output stream.
*/
private void writeBytes(byte[] b, int off, int len) throws IOException {
--- a/jdk/src/share/classes/java/util/zip/package.html Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/java/util/zip/package.html Mon Apr 27 12:33:57 2009 -0700
@@ -46,6 +46,13 @@
</a> - a detailed description of the Info-ZIP format upon which
the <code>java.util.zip</code> classes are based.
<p>
+ <a name="zip64">
+ <li>An implementation may optionally support the ZIP64(tm) format extensions
+ defined by the
+ <a href="http://www.pkware.com/documents/casestudies/APPNOTE.TXT">
+ PKWARE ZIP File Format Specification</a>. The ZIP64(tm) format extensions
+ are used to overcome the size limitations of the original ZIP format.
+<p>
<li><a href="http://www.isi.edu/in-notes/rfc1950.txt">
ZLIB Compressed Data Format Specification version 3.3</a>
@@ -70,7 +77,6 @@
<li>CRC-32 checksum is described in RFC 1952 (above)
<p>
<li>Adler-32 checksum is described in RFC 1950 (above)
-
</ul>
--- a/jdk/src/share/classes/javax/swing/AbstractButton.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/javax/swing/AbstractButton.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -1545,6 +1545,9 @@
* A mnemonic must correspond to a single key on the keyboard
* and should be specified using one of the <code>VK_XXX</code>
* keycodes defined in <code>java.awt.event.KeyEvent</code>.
+ * These codes and the wider array of codes for international
+ * keyboards may be obtained through
+ * <code>java.awt.event.KeyEvent.getExtendedKeyCodeForChar</code>.
* Mnemonics are case-insensitive, therefore a key event
* with the corresponding keycode would cause the button to be
* activated whether or not the Shift modifier was pressed.
--- a/jdk/src/share/classes/javax/swing/Action.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/javax/swing/Action.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -272,7 +272,9 @@
* one of the <code>KeyEvent</code> key codes. The value is
* commonly used to specify a mnemonic. For example:
* <code>myAction.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_A)</code>
- * sets the mnemonic of <code>myAction</code> to 'a'.
+ * sets the mnemonic of <code>myAction</code> to 'a', while
+ * <code>myAction.putValue(Action.MNEMONIC_KEY, KeyEvent.getExtendedKeyCodeForChar('\u0444'))</code>
+ * sets the mnemonic of <code>myAction</code> to Cyrillic letter "Ef".
*
* @since 1.3
*/
--- a/jdk/src/share/classes/javax/swing/JComponent.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/javax/swing/JComponent.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -2888,7 +2888,10 @@
return false;
}
// Get the KeyStroke
+ // There may be two keystrokes associated with a low-level key event;
+ // in this case a keystroke made of an extended key code has a priority.
KeyStroke ks;
+ KeyStroke ksE = null;
if (e.getID() == KeyEvent.KEY_TYPED) {
ks = KeyStroke.getKeyStroke(e.getKeyChar());
@@ -2896,9 +2899,18 @@
else {
ks = KeyStroke.getKeyStroke(e.getKeyCode(),e.getModifiers(),
(pressed ? false:true));
+ if (e.getKeyCode() != e.getExtendedKeyCode()) {
+ ksE = KeyStroke.getKeyStroke(e.getExtendedKeyCode(),e.getModifiers(),
+ (pressed ? false:true));
+ }
}
- /* Do we have a key binding for e? */
+ // Do we have a key binding for e?
+ // If we have a binding by an extended code, use it.
+ // If not, check for regular code binding.
+ if(ksE != null && processKeyBinding(ksE, e, WHEN_FOCUSED, pressed)) {
+ return true;
+ }
if(processKeyBinding(ks, e, WHEN_FOCUSED, pressed))
return true;
@@ -2910,6 +2922,9 @@
while (parent != null && !(parent instanceof Window) &&
!(parent instanceof Applet)) {
if(parent instanceof JComponent) {
+ if(ksE != null && ((JComponent)parent).processKeyBinding(ksE, e,
+ WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, pressed))
+ return true;
if(((JComponent)parent).processKeyBinding(ks, e,
WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, pressed))
return true;
--- a/jdk/src/share/classes/javax/swing/JLabel.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/javax/swing/JLabel.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -503,10 +503,10 @@
* @see #setDisplayedMnemonic(int)
*/
public void setDisplayedMnemonic(char aChar) {
- int vk = (int) aChar;
- if(vk >= 'a' && vk <='z')
- vk -= ('a' - 'A');
- setDisplayedMnemonic(vk);
+ int vk = java.awt.event.KeyEvent.getExtendedKeyCodeForChar(aChar);
+ if (vk != java.awt.event.KeyEvent.VK_UNDEFINED) {
+ setDisplayedMnemonic(vk);
+ }
}
--- a/jdk/src/share/classes/javax/swing/JTabbedPane.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/javax/swing/JTabbedPane.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -1628,7 +1628,9 @@
* <p>
* A mnemonic must correspond to a single key on the keyboard
* and should be specified using one of the <code>VK_XXX</code>
- * keycodes defined in <code>java.awt.event.KeyEvent</code>.
+ * keycodes defined in <code>java.awt.event.KeyEvent</code>
+ * or one of the extended keycodes obtained through
+ * <code>java.awt.event.KeyEvent.getExtendedKeyCodeForChar</code>.
* Mnemonics are case-insensitive, therefore a key event
* with the corresponding keycode would cause the button to be
* activated whether or not the Shift modifier was pressed.
--- a/jdk/src/share/classes/javax/swing/KeyStroke.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/javax/swing/KeyStroke.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -162,6 +162,9 @@
* <li>java.awt.event.KeyEvent.VK_TAB
* <li>java.awt.event.KeyEvent.VK_SPACE
* </ul>
+ * Alternatively, the key code may be obtained by calling
+ * <code>java.awt.event.KeyEvent.getExtendedKeyCodeForChar</code>.
+ *
* The modifiers consist of any combination of:<ul>
* <li>java.awt.event.InputEvent.SHIFT_DOWN_MASK
* <li>java.awt.event.InputEvent.CTRL_DOWN_MASK
@@ -210,6 +213,9 @@
* <li>java.awt.event.KeyEvent.VK_TAB
* <li>java.awt.event.KeyEvent.VK_SPACE
* </ul>
+ * Alternatively, the key code may be obtained by calling
+ * <code>java.awt.event.KeyEvent.getExtendedKeyCodeForChar</code>.
+ *
* The modifiers consist of any combination of:<ul>
* <li>java.awt.event.InputEvent.SHIFT_DOWN_MASK
* <li>java.awt.event.InputEvent.CTRL_DOWN_MASK
--- a/jdk/src/share/classes/javax/swing/KeyboardManager.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/javax/swing/KeyboardManager.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1998-2009 Sun Microsystems, Inc. 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
@@ -212,19 +212,35 @@
Thread.dumpStack();
}
+ // There may be two keystrokes associated with a low-level key event;
+ // in this case a keystroke made of an extended key code has a priority.
KeyStroke ks;
+ KeyStroke ksE = null;
if(e.getID() == KeyEvent.KEY_TYPED) {
ks=KeyStroke.getKeyStroke(e.getKeyChar());
} else {
+ if(e.getKeyCode() != e.getExtendedKeyCode()) {
+ ksE=KeyStroke.getKeyStroke(e.getExtendedKeyCode(), e.getModifiers(), !pressed);
+ }
ks=KeyStroke.getKeyStroke(e.getKeyCode(), e.getModifiers(), !pressed);
}
Hashtable keyMap = containerMap.get(topAncestor);
if (keyMap != null) { // this container isn't registered, so bail
- Object tmp = keyMap.get(ks);
+ Object tmp = null;
+ // extended code has priority
+ if( ksE != null ) {
+ tmp = keyMap.get(ksE);
+ if( tmp != null ) {
+ ks = ksE;
+ }
+ }
+ if( tmp == null ) {
+ tmp = keyMap.get(ks);
+ }
if (tmp == null) {
// don't do anything
@@ -269,7 +285,12 @@
while (iter.hasMoreElements()) {
JMenuBar mb = (JMenuBar)iter.nextElement();
if ( mb.isShowing() && mb.isEnabled() ) { // don't want to give these out
- fireBinding(mb, ks, e, pressed);
+ if( !(ks.equals(ksE)) ) {
+ fireBinding(mb, ksE, e, pressed);
+ }
+ if(ks.equals(ksE) || !e.isConsumed()) {
+ fireBinding(mb, ks, e, pressed);
+ }
if (e.isConsumed()) {
return true;
}
--- a/jdk/src/share/classes/javax/swing/PopupFactory.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/javax/swing/PopupFactory.java Mon Apr 27 12:33:57 2009 -0700
@@ -552,14 +552,15 @@
boolean result = false;
Component component = getComponent();
if (owner != null && component != null) {
- Container parent = (Container) SwingUtilities.getRoot(owner);
int popupWidth = component.getWidth();
int popupHeight = component.getHeight();
- Rectangle parentBounds = parent.getBounds();
+
+ Container parent = (Container) SwingUtilities.getRoot(owner);
if (parent instanceof JFrame ||
parent instanceof JDialog ||
parent instanceof JWindow) {
+ Rectangle parentBounds = parent.getBounds();
Insets i = parent.getInsets();
parentBounds.x += i.left;
parentBounds.y += i.top;
@@ -577,11 +578,11 @@
.contains(x, y, popupWidth, popupHeight);
}
} else if (parent instanceof JApplet) {
+ Rectangle parentBounds = parent.getBounds();
Point p = parent.getLocationOnScreen();
parentBounds.x = p.x;
parentBounds.y = p.y;
- result = parentBounds
- .contains(x, y, popupWidth, popupHeight);
+ result = parentBounds.contains(x, y, popupWidth, popupHeight);
}
}
return result;
--- a/jdk/src/share/classes/javax/swing/RepaintManager.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/javax/swing/RepaintManager.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -34,6 +34,7 @@
import java.util.*;
import java.applet.*;
+import sun.awt.AWTAccessor;
import sun.awt.AppContext;
import sun.awt.DisplayChangedListener;
import sun.awt.SunToolkit;
@@ -716,6 +717,44 @@
}
}
+ private Map<Component,Rectangle>
+ updateWindows(Map<Component,Rectangle> dirtyComponents)
+ {
+ Toolkit toolkit = Toolkit.getDefaultToolkit();
+ if (!(toolkit instanceof SunToolkit &&
+ ((SunToolkit)toolkit).needUpdateWindow()))
+ {
+ return dirtyComponents;
+ }
+
+ Set<Window> windows = new HashSet<Window>();
+ Set<Component> dirtyComps = dirtyComponents.keySet();
+ for (Iterator<Component> it = dirtyComps.iterator(); it.hasNext();) {
+ Component dirty = it.next();
+ Window window = dirty instanceof Window ?
+ (Window)dirty :
+ SwingUtilities.getWindowAncestor(dirty);
+
+ if (window != null &&
+ !AWTAccessor.getWindowAccessor().isOpaque(window))
+ {
+ // if this component's toplevel is perpixel translucent, it will
+ // be repainted below
+ it.remove();
+ // add to the set of windows to update (so that we don't update
+ // the window many times for each component to be repainted that
+ // belongs to this window)
+ windows.add(window);
+ }
+ }
+
+ for (Window window : windows) {
+ AWTAccessor.getWindowAccessor().updateWindow(window, null);
+ }
+
+ return dirtyComponents;
+ }
+
/**
* Paint all of the components that have been marked dirty.
*
@@ -749,6 +788,10 @@
int localBoundsW;
Enumeration keys;
+ // the components belonging to perpixel-translucent windows will be
+ // removed from the list
+ tmpDirtyComponents = updateWindows(tmpDirtyComponents);
+
roots = new ArrayList<Component>(count);
for (Component dirty : tmpDirtyComponents.keySet()) {
--- a/jdk/src/share/classes/javax/swing/SwingUtilities.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/javax/swing/SwingUtilities.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -1589,15 +1589,6 @@
* processing the key bindings associated with JComponents.
*/
static boolean isValidKeyEventForKeyBindings(KeyEvent e) {
- if (e.getID() == KeyEvent.KEY_TYPED) {
- int mod = e.getModifiers();
- if (((mod & ActionEvent.ALT_MASK) != 0) &&
- ((mod & ActionEvent.CTRL_MASK) == 0)) {
- // filter out typed "alt-?" keys, but not those created
- // with AltGr, and not control characters
- return false;
- }
- }
return true;
}
--- a/jdk/src/share/classes/javax/swing/SwingWorker.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/javax/swing/SwingWorker.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2005-2009 Sun Microsystems, Inc. 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
@@ -778,35 +778,33 @@
threadFactory);
appContext.put(SwingWorker.class, executorService);
- //register shutdown hook for this executor service
+ // Don't use ShutdownHook here as it's not enough. We should track
+ // AppContext disposal instead of JVM shutdown, see 6799345 for details
final ExecutorService es = executorService;
- final Runnable shutdownHook =
- new Runnable() {
- final WeakReference<ExecutorService> executorServiceRef =
- new WeakReference<ExecutorService>(es);
- public void run() {
- final ExecutorService executorService =
- executorServiceRef.get();
- if (executorService != null) {
- AccessController.doPrivileged(
- new PrivilegedAction<Void>() {
- public Void run() {
- executorService.shutdown();
- return null;
+ appContext.addPropertyChangeListener(AppContext.DISPOSED_PROPERTY_NAME,
+ new PropertyChangeListener() {
+ @Override
+ public void propertyChange(PropertyChangeEvent pce) {
+ boolean disposed = (Boolean)pce.getNewValue();
+ if (disposed) {
+ final WeakReference<ExecutorService> executorServiceRef =
+ new WeakReference<ExecutorService>(es);
+ final ExecutorService executorService =
+ executorServiceRef.get();
+ if (executorService != null) {
+ AccessController.doPrivileged(
+ new PrivilegedAction<Void>() {
+ public Void run() {
+ executorService.shutdown();
+ return null;
+ }
}
- });
+ );
+ }
}
}
- };
-
- AccessController.doPrivileged(
- new PrivilegedAction<Void>() {
- public Void run() {
- Runtime.getRuntime().addShutdownHook(
- new Thread(shutdownHook));
- return null;
- }
- });
+ }
+ );
}
return executorService;
}
--- a/jdk/src/share/classes/javax/swing/TimerQueue.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/javax/swing/TimerQueue.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -191,7 +191,12 @@
} finally {
timer.getLock().unlock();
}
- } catch (InterruptedException ignore) {
+ } catch (InterruptedException ie) {
+ // Shouldn't ignore InterruptedExceptions here, so AppContext
+ // is disposed gracefully, see 6799345 for details
+ if (AppContext.getAppContext().isDisposed()) {
+ break;
+ }
}
}
}
--- a/jdk/src/share/classes/javax/swing/UIManager.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/javax/swing/UIManager.java Mon Apr 27 12:33:57 2009 -0700
@@ -58,6 +58,8 @@
import sun.security.action.GetPropertyAction;
import sun.swing.SwingUtilities2;
import java.lang.reflect.Method;
+import java.util.HashMap;
+import sun.awt.AppContext;
/**
@@ -1323,19 +1325,29 @@
return;
}
- String metalLnf = getCrossPlatformLookAndFeelClassName();
- String lnfDefault = metalLnf;
+ // Try to get default LAF from system property, then from AppContext
+ // (6653395), then use cross-platform one by default.
+ String lafName = null;
+ HashMap lafData =
+ (HashMap) AppContext.getAppContext().remove("swing.lafdata");
+ if (lafData != null) {
+ lafName = (String) lafData.remove("defaultlaf");
+ }
+ if (lafName == null) {
+ lafName = getCrossPlatformLookAndFeelClassName();
+ }
+ lafName = swingProps.getProperty(defaultLAFKey, lafName);
- String lnfName = "<undefined>" ;
try {
- lnfName = swingProps.getProperty(defaultLAFKey, lnfDefault);
- setLookAndFeel(lnfName);
+ setLookAndFeel(lafName);
} catch (Exception e) {
- try {
- lnfName = swingProps.getProperty(defaultLAFKey, metalLnf);
- setLookAndFeel(lnfName);
- } catch (Exception e2) {
- throw new Error("can't load " + lnfName);
+ throw new Error("Cannot load " + lafName);
+ }
+
+ // Set any properties passed through AppContext (6653395).
+ if (lafData != null) {
+ for (Object key: lafData.keySet()) {
+ UIManager.put(key, lafData.get(key));
}
}
}
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicDirectoryModel.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicDirectoryModel.java Mon Apr 27 12:33:57 2009 -0700
@@ -27,6 +27,7 @@
import java.io.File;
import java.util.*;
+import java.util.concurrent.Callable;
import javax.swing.*;
import javax.swing.filechooser.*;
import javax.swing.event.*;
@@ -223,113 +224,115 @@
this.fid = fid;
}
- private void invokeLater(DoChangeContents runnable) {
- runnables.addElement(runnable);
- SwingUtilities.invokeLater(runnable);
- }
-
public void run() {
run0();
setBusy(false, fid);
}
public void run0() {
- FileSystemView fileSystem = filechooser.getFileSystemView();
+ DoChangeContents doChangeContents = ShellFolder.getInvoker().invoke(new Callable<DoChangeContents>() {
+ public DoChangeContents call() throws Exception {
+ FileSystemView fileSystem = filechooser.getFileSystemView();
- File[] list = fileSystem.getFiles(currentDirectory, filechooser.isFileHidingEnabled());
+ File[] list = fileSystem.getFiles(currentDirectory, filechooser.isFileHidingEnabled());
- Vector<File> acceptsList = new Vector<File>();
+ Vector<File> acceptsList = new Vector<File>();
- if (isInterrupted()) {
- return;
- }
+ if (isInterrupted()) {
+ return null;
+ }
- // run through the file list, add directories and selectable files to fileCache
- for (File file : list) {
- if (filechooser.accept(file)) {
- acceptsList.addElement(file);
- }
- }
+ // run through the file list, add directories and selectable files to fileCache
+ for (File file : list) {
+ if (filechooser.accept(file)) {
+ acceptsList.addElement(file);
+ }
+ }
- if (isInterrupted()) {
- return;
- }
+ if (isInterrupted()) {
+ return null;
+ }
- // First sort alphabetically by filename
- sort(acceptsList);
+ // First sort alphabetically by filename
+ sort(acceptsList);
- Vector<File> newDirectories = new Vector<File>(50);
- Vector<File> newFiles = new Vector<File>();
- // run through list grabbing directories in chunks of ten
- for(int i = 0; i < acceptsList.size(); i++) {
- File f = acceptsList.elementAt(i);
- boolean isTraversable = filechooser.isTraversable(f);
- if (isTraversable) {
- newDirectories.addElement(f);
- } else if (!isTraversable && filechooser.isFileSelectionEnabled()) {
- newFiles.addElement(f);
- }
- if(isInterrupted()) {
- return;
- }
- }
+ Vector<File> newDirectories = new Vector<File>(50);
+ Vector<File> newFiles = new Vector<File>();
+ // run through list grabbing directories in chunks of ten
+ for (int i = 0; i < acceptsList.size(); i++) {
+ File f = acceptsList.elementAt(i);
+ boolean isTraversable = filechooser.isTraversable(f);
+ if (isTraversable) {
+ newDirectories.addElement(f);
+ } else if (!isTraversable && filechooser.isFileSelectionEnabled()) {
+ newFiles.addElement(f);
+ }
+ if (isInterrupted()) {
+ return null;
+ }
+ }
- Vector<File> newFileCache = new Vector<File>(newDirectories);
- newFileCache.addAll(newFiles);
+ Vector<File> newFileCache = new Vector<File>(newDirectories);
+ newFileCache.addAll(newFiles);
- int newSize = newFileCache.size();
- int oldSize = fileCache.size();
+ int newSize = newFileCache.size();
+ int oldSize = fileCache.size();
- if (newSize > oldSize) {
- //see if interval is added
- int start = oldSize;
- int end = newSize;
- for (int i = 0; i < oldSize; i++) {
- if (!newFileCache.get(i).equals(fileCache.get(i))) {
- start = i;
- for (int j = i; j < newSize; j++) {
- if (newFileCache.get(j).equals(fileCache.get(i))) {
- end = j;
+ if (newSize > oldSize) {
+ //see if interval is added
+ int start = oldSize;
+ int end = newSize;
+ for (int i = 0; i < oldSize; i++) {
+ if (!newFileCache.get(i).equals(fileCache.get(i))) {
+ start = i;
+ for (int j = i; j < newSize; j++) {
+ if (newFileCache.get(j).equals(fileCache.get(i))) {
+ end = j;
+ break;
+ }
+ }
break;
}
}
- break;
+ if (start >= 0 && end > start
+ && newFileCache.subList(end, newSize).equals(fileCache.subList(start, oldSize))) {
+ if (isInterrupted()) {
+ return null;
+ }
+ return new DoChangeContents(newFileCache.subList(start, end), start, null, 0, fid);
+ }
+ } else if (newSize < oldSize) {
+ //see if interval is removed
+ int start = -1;
+ int end = -1;
+ for (int i = 0; i < newSize; i++) {
+ if (!newFileCache.get(i).equals(fileCache.get(i))) {
+ start = i;
+ end = i + oldSize - newSize;
+ break;
+ }
+ }
+ if (start >= 0 && end > start
+ && fileCache.subList(end, oldSize).equals(newFileCache.subList(start, newSize))) {
+ if (isInterrupted()) {
+ return null;
+ }
+ return new DoChangeContents(null, 0, new Vector(fileCache.subList(start, end)), start, fid);
+ }
}
- }
- if (start >= 0 && end > start
- && newFileCache.subList(end, newSize).equals(fileCache.subList(start, oldSize))) {
- if(isInterrupted()) {
- return;
+ if (!fileCache.equals(newFileCache)) {
+ if (isInterrupted()) {
+ cancelRunnables(runnables);
+ }
+ return new DoChangeContents(newFileCache, 0, fileCache, 0, fid);
}
- invokeLater(new DoChangeContents(newFileCache.subList(start, end), start, null, 0, fid));
- newFileCache = null;
+ return null;
}
- } else if (newSize < oldSize) {
- //see if interval is removed
- int start = -1;
- int end = -1;
- for (int i = 0; i < newSize; i++) {
- if (!newFileCache.get(i).equals(fileCache.get(i))) {
- start = i;
- end = i + oldSize - newSize;
- break;
- }
- }
- if (start >= 0 && end > start
- && fileCache.subList(end, oldSize).equals(newFileCache.subList(start, newSize))) {
- if(isInterrupted()) {
- return;
- }
- invokeLater(new DoChangeContents(null, 0, new Vector<File>(fileCache.subList(start, end)),
- start, fid));
- newFileCache = null;
- }
- }
- if (newFileCache != null && !fileCache.equals(newFileCache)) {
- if (isInterrupted()) {
- cancelRunnables(runnables);
- }
- invokeLater(new DoChangeContents(newFileCache, 0, fileCache, 0, fid));
+ });
+
+ if (doChangeContents != null) {
+ runnables.addElement(doChangeContents);
+ SwingUtilities.invokeLater(doChangeContents);
}
}
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java Mon Apr 27 12:33:57 2009 -0700
@@ -1004,47 +1004,62 @@
g.setColor(DefaultLookup.getColor(slider, this, "Slider.tickColor", Color.black));
if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
- g.translate( 0, tickBounds.y);
+ g.translate(0, tickBounds.y);
- int value = slider.getMinimum();
- int xPos;
+ if (slider.getMinorTickSpacing() > 0) {
+ int value = slider.getMinimum();
- if ( slider.getMinorTickSpacing() > 0 ) {
while ( value <= slider.getMaximum() ) {
- xPos = xPositionForValue( value );
+ int xPos = xPositionForValue(value);
paintMinorTickForHorizSlider( g, tickBounds, xPos );
+
+ // Overflow checking
+ if (Integer.MAX_VALUE - slider.getMinorTickSpacing() < value) {
+ break;
+ }
+
value += slider.getMinorTickSpacing();
}
}
- if ( slider.getMajorTickSpacing() > 0 ) {
- value = slider.getMinimum();
+ if (slider.getMajorTickSpacing() > 0) {
+ int value = slider.getMinimum();
while ( value <= slider.getMaximum() ) {
- xPos = xPositionForValue( value );
+ int xPos = xPositionForValue(value);
paintMajorTickForHorizSlider( g, tickBounds, xPos );
+
+ // Overflow checking
+ if (Integer.MAX_VALUE - slider.getMajorTickSpacing() < value) {
+ break;
+ }
+
value += slider.getMajorTickSpacing();
}
}
g.translate( 0, -tickBounds.y);
- }
- else {
- g.translate(tickBounds.x, 0);
+ } else {
+ g.translate(tickBounds.x, 0);
- int value = slider.getMinimum();
- int yPos;
-
- if ( slider.getMinorTickSpacing() > 0 ) {
+ if (slider.getMinorTickSpacing() > 0) {
int offset = 0;
if(!BasicGraphicsUtils.isLeftToRight(slider)) {
offset = tickBounds.width - tickBounds.width / 2;
g.translate(offset, 0);
}
- while ( value <= slider.getMaximum() ) {
- yPos = yPositionForValue( value );
+ int value = slider.getMinimum();
+
+ while (value <= slider.getMaximum()) {
+ int yPos = yPositionForValue(value);
paintMinorTickForVertSlider( g, tickBounds, yPos );
+
+ // Overflow checking
+ if (Integer.MAX_VALUE - slider.getMinorTickSpacing() < value) {
+ break;
+ }
+
value += slider.getMinorTickSpacing();
}
@@ -1053,15 +1068,22 @@
}
}
- if ( slider.getMajorTickSpacing() > 0 ) {
- value = slider.getMinimum();
+ if (slider.getMajorTickSpacing() > 0) {
if(!BasicGraphicsUtils.isLeftToRight(slider)) {
g.translate(2, 0);
}
- while ( value <= slider.getMaximum() ) {
- yPos = yPositionForValue( value );
+ int value = slider.getMinimum();
+
+ while (value <= slider.getMaximum()) {
+ int yPos = yPositionForValue(value);
paintMajorTickForVertSlider( g, tickBounds, yPos );
+
+ // Overflow checking
+ if (Integer.MAX_VALUE - slider.getMajorTickSpacing() < value) {
+ break;
+ }
+
value += slider.getMajorTickSpacing();
}
@@ -1775,8 +1797,6 @@
thumbMiddle = thumbLeft + halfThumbWidth;
slider.setValue(valueForXPosition(thumbMiddle));
break;
- default:
- return;
}
}
--- a/jdk/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java Mon Apr 27 12:33:57 2009 -0700
@@ -38,6 +38,8 @@
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.*;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import javax.accessibility.*;
import sun.awt.shell.ShellFolder;
@@ -937,7 +939,11 @@
File[] baseFolders;
if (useShellFolder) {
- baseFolders = (File[])ShellFolder.get("fileChooserComboBoxFolders");
+ baseFolders = AccessController.doPrivileged(new PrivilegedAction<File[]>() {
+ public File[] run() {
+ return (File[]) ShellFolder.get("fileChooserComboBoxFolders");
+ }
+ });
} else {
baseFolders = fsv.getRoots();
}
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTabbedPaneUI.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTabbedPaneUI.java Mon Apr 27 12:33:57 2009 -0700
@@ -233,7 +233,7 @@
tabContext.getStyle().getGraphicsUtils(tabContext).layoutText(
tabContext, metrics, title, icon, SwingUtilities.CENTER,
SwingUtilities.CENTER, SwingUtilities.LEADING,
- SwingUtilities.TRAILING, calcRect,
+ SwingUtilities.CENTER, calcRect,
iconRect, textRect, textIconGap);
return textRect.y + metrics.getAscent() + getBaselineOffset();
}
@@ -426,7 +426,7 @@
ss.getStyle().getGraphicsUtils(ss).layoutText(ss, metrics, title,
icon, SwingUtilities.CENTER, SwingUtilities.CENTER,
- SwingUtilities.LEADING, SwingUtilities.TRAILING,
+ SwingUtilities.LEADING, SwingUtilities.CENTER,
tabRect, iconRect, textRect, textIconGap);
tabPane.putClientProperty("html", null);
--- a/jdk/src/share/classes/javax/swing/text/GlyphView.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/javax/swing/text/GlyphView.java Mon Apr 27 12:33:57 2009 -0700
@@ -30,6 +30,7 @@
import java.util.BitSet;
import java.util.Locale;
+import javax.swing.UIManager;
import sun.swing.SwingUtilities2;
/**
@@ -382,11 +383,10 @@
Color bg = getBackground();
Color fg = getForeground();
- if (c instanceof JTextComponent) {
- JTextComponent tc = (JTextComponent) c;
- if (!tc.isEnabled()) {
- fg = tc.getDisabledTextColor();
- }
+ if (c != null && ! c.isEnabled()) {
+ fg = (c instanceof JTextComponent ?
+ ((JTextComponent)c).getDisabledTextColor() :
+ UIManager.getColor("textInactiveText"));
}
if (bg != null) {
g.setColor(bg);
--- a/jdk/src/share/classes/javax/swing/text/html/ImageView.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/javax/swing/text/html/ImageView.java Mon Apr 27 12:33:57 2009 -0700
@@ -25,9 +25,7 @@
package javax.swing.text.html;
import java.awt.*;
-import java.awt.event.*;
import java.awt.image.ImageObserver;
-import java.io.*;
import java.net.*;
import java.util.Dictionary;
import javax.swing.*;
@@ -97,6 +95,7 @@
private AttributeSet attr;
private Image image;
+ private Image disabledImage;
private int width;
private int height;
/** Bitmask containing some of the above bitmask values. Because the
@@ -193,6 +192,17 @@
return image;
}
+ private Image getImage(boolean enabled) {
+ Image img = getImage();
+ if (! enabled) {
+ if (disabledImage == null) {
+ disabledImage = GrayFilter.createDisabledImage(img);
+ }
+ img = disabledImage;
+ }
+ return img;
+ }
+
/**
* Sets how the image is loaded. If <code>newValue</code> is true,
* the image we be loaded when first asked for, otherwise it will
@@ -338,8 +348,6 @@
Rectangle rect = (a instanceof Rectangle) ? (Rectangle)a :
a.getBounds();
-
- Image image = getImage();
Rectangle clip = g.getClipBounds();
fBounds.setBounds(rect);
@@ -350,29 +358,29 @@
rect.width - leftInset - rightInset,
rect.height - topInset - bottomInset);
}
- if (image != null) {
- if (!hasPixels(image)) {
+
+ Container host = getContainer();
+ Image img = getImage(host == null || host.isEnabled());
+ if (img != null) {
+ if (! hasPixels(img)) {
// No pixels yet, use the default
- Icon icon = (image == null) ? getNoImageIcon() :
- getLoadingImageIcon();
-
+ Icon icon = getLoadingImageIcon();
if (icon != null) {
- icon.paintIcon(getContainer(), g, rect.x + leftInset,
- rect.y + topInset);
+ icon.paintIcon(host, g,
+ rect.x + leftInset, rect.y + topInset);
}
}
else {
// Draw the image
- g.drawImage(image, rect.x + leftInset, rect.y + topInset,
+ g.drawImage(img, rect.x + leftInset, rect.y + topInset,
width, height, imageObserver);
}
}
else {
Icon icon = getNoImageIcon();
-
if (icon != null) {
- icon.paintIcon(getContainer(), g, rect.x + leftInset,
- rect.y + topInset);
+ icon.paintIcon(host, g,
+ rect.x + leftInset, rect.y + topInset);
}
View view = getAltView();
// Paint the view representing the alt text, if its non-null
@@ -855,7 +863,9 @@
// it will pick up the new height/width, if necessary.
public boolean imageUpdate(Image img, int flags, int x, int y,
int newWidth, int newHeight ) {
- if (image == null || image != img || getParent() == null) {
+ if (img != image && img != disabledImage ||
+ image == null || getParent() == null) {
+
return false;
}
@@ -873,6 +883,8 @@
if ((state & HEIGHT_FLAG) != HEIGHT_FLAG) {
height = DEFAULT_HEIGHT;
}
+ } else {
+ disabledImage = null;
}
if ((state & LOADING_FLAG) == LOADING_FLAG) {
// No need to resize or repaint, still in the process
@@ -885,38 +897,37 @@
return false;
}
- // Resize image if necessary:
- short changed = 0;
- if ((flags & ImageObserver.HEIGHT) != 0 && !getElement().
- getAttributes().isDefined(HTML.Attribute.HEIGHT)) {
- changed |= 1;
- }
- if ((flags & ImageObserver.WIDTH) != 0 && !getElement().
- getAttributes().isDefined(HTML.Attribute.WIDTH)) {
- changed |= 2;
- }
+ if (image == img) {
+ // Resize image if necessary:
+ short changed = 0;
+ if ((flags & ImageObserver.HEIGHT) != 0 && !getElement().
+ getAttributes().isDefined(HTML.Attribute.HEIGHT)) {
+ changed |= 1;
+ }
+ if ((flags & ImageObserver.WIDTH) != 0 && !getElement().
+ getAttributes().isDefined(HTML.Attribute.WIDTH)) {
+ changed |= 2;
+ }
- synchronized(ImageView.this) {
- if (image != img) {
- return false;
- }
- if ((changed & 1) == 1 && (state & WIDTH_FLAG) == 0) {
- width = newWidth;
+ synchronized(ImageView.this) {
+ if ((changed & 1) == 1 && (state & WIDTH_FLAG) == 0) {
+ width = newWidth;
+ }
+ if ((changed & 2) == 2 && (state & HEIGHT_FLAG) == 0) {
+ height = newHeight;
+ }
+ if ((state & LOADING_FLAG) == LOADING_FLAG) {
+ // No need to resize or repaint, still in the process of
+ // loading.
+ return true;
+ }
}
- if ((changed & 2) == 2 && (state & HEIGHT_FLAG) == 0) {
- height = newHeight;
- }
- if ((state & LOADING_FLAG) == LOADING_FLAG) {
- // No need to resize or repaint, still in the process of
- // loading.
+ if (changed != 0) {
+ // May need to resize myself, asynchronously:
+ safePreferenceChanged();
return true;
}
}
- if (changed != 0) {
- // May need to resize myself, asynchronously:
- safePreferenceChanged();
- return true;
- }
// Repaint when done or when new pixels arrive:
if ((flags & (FRAMEBITS|ALLBITS)) != 0) {
--- a/jdk/src/share/classes/javax/swing/text/html/StyleSheet.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/javax/swing/text/html/StyleSheet.java Mon Apr 27 12:33:57 2009 -0700
@@ -31,6 +31,7 @@
import java.net.*;
import javax.swing.Icon;
import javax.swing.ImageIcon;
+import javax.swing.UIManager;
import javax.swing.border.*;
import javax.swing.event.ChangeListener;
import javax.swing.text.*;
@@ -2161,6 +2162,7 @@
*/
public void paint(Graphics g, float x, float y, float w, float h, View v, int item) {
View cv = v.getView(item);
+ Container host = v.getContainer();
Object name = cv.getElement().getAttributes().getAttribute
(StyleConstants.NameAttribute);
// Only draw something if the View is a list item. This won't
@@ -2171,7 +2173,7 @@
}
// deside on what side draw bullets, etc.
isLeftToRight =
- cv.getContainer().getComponentOrientation().isLeftToRight();
+ host.getComponentOrientation().isLeftToRight();
// How the list indicator is aligned is not specified, it is
// left up to the UA. IE and NS differ on this behavior.
@@ -2200,15 +2202,15 @@
}
// set the color of a decoration
- if (ss != null) {
- g.setColor(ss.getForeground(cv.getAttributes()));
- } else {
- g.setColor(Color.black);
- }
+ Color c = (host.isEnabled()
+ ? (ss != null
+ ? ss.getForeground(cv.getAttributes())
+ : host.getForeground())
+ : UIManager.getColor("textInactiveText"));
+ g.setColor(c);
if (img != null) {
- drawIcon(g, (int) x, (int) y, (int) w, (int) h, align,
- v.getContainer());
+ drawIcon(g, (int) x, (int) y, (int) w, (int) h, align, host);
return;
}
CSS.Value childtype = getChildType(cv);
--- a/jdk/src/share/classes/sun/awt/AWTAccessor.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/awt/AWTAccessor.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2008-2009 Sun Microsystems, Inc. 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
@@ -26,46 +26,229 @@
package sun.awt;
import java.awt.*;
+import java.awt.geom.Point2D;
+import java.awt.image.BufferedImage;
+
import sun.misc.Unsafe;
-/** The AWTAccessor utility class.
+/**
+ * The AWTAccessor utility class.
* The main purpose of this class is to enable accessing
* private and package-private fields of classes from
* different classes/packages. See sun.misc.SharedSecretes
* for another example.
*/
public final class AWTAccessor {
+
private static final Unsafe unsafe = Unsafe.getUnsafe();
- /** We don't need any objects of this class.
+ /*
+ * We don't need any objects of this class.
* It's rather a collection of static methods
* and interfaces.
*/
private AWTAccessor() {
}
- /** An accessor for the java.awt.Component class.
+ /*
+ * An interface of accessor for the java.awt.Component class.
*/
public interface ComponentAccessor {
- // See 6797587
- // Also see: 6776743, 6768307, and 6768332.
- /**
+ /*
+ * Sets whether the native background erase for a component
+ * has been disabled via SunToolkit.disableBackgroundErase().
+ */
+ void setBackgroundEraseDisabled(Component comp, boolean disabled);
+ /*
+ * Indicates whether the native background erase for a
+ * component has been disabled via
+ * SunToolkit.disableBackgroundErase().
+ */
+ boolean getBackgroundEraseDisabled(Component comp);
+ /*
+ *
+ * Gets the bounds of this component in the form of a
+ * <code>Rectangle</code> object. The bounds specify this
+ * component's width, height, and location relative to
+ * its parent.
+ */
+ Rectangle getBounds(Component comp);
+ /*
* Sets the shape of a lw component to cut out from hw components.
+ *
+ * See 6797587, 6776743, 6768307, and 6768332 for details
*/
void setMixingCutoutShape(Component comp, Shape shape);
+
+ /**
+ * Sets GraphicsConfiguration value for the component.
+ */
+ void setGraphicsConfiguration(Component comp, GraphicsConfiguration gc);
+ /*
+ * Requests focus to the component.
+ */
+ boolean requestFocus(Component comp, CausedFocusEvent.Cause cause);
+ /*
+ * Determines if the component can gain focus.
+ */
+ boolean canBeFocusOwner(Component comp);
+
+ /**
+ * Returns whether the component is visible without invoking
+ * any client code.
+ */
+ boolean isVisible_NoClientCode(Component comp);
}
- /* The java.awt.Component class accessor object.
+ /*
+ * An interface of accessor for java.awt.Window class.
+ */
+ public interface WindowAccessor {
+ /*
+ * Get opacity level of the given window.
+ */
+ float getOpacity(Window window);
+ /*
+ * Set opacity level to the given window.
+ */
+ void setOpacity(Window window, float opacity);
+ /*
+ * Get a shape assigned to the given window.
+ */
+ Shape getShape(Window window);
+ /*
+ * Set a shape to the given window.
+ */
+ void setShape(Window window, Shape shape);
+ /*
+ * Identify whether the given window is opaque (true)
+ * or translucent (false).
+ */
+ boolean isOpaque(Window window);
+ /*
+ * Set the opaque preoperty to the given window.
+ */
+ void setOpaque(Window window, boolean isOpaque);
+ /*
+ * Update the image of a non-opaque (translucent) window.
+ */
+ void updateWindow(Window window, BufferedImage backBuffer);
+
+ /** Get the size of the security warning.
+ */
+ Dimension getSecurityWarningSize(Window w);
+
+ /**
+ * Set the size of the security warning.
+ */
+ void setSecurityWarningSize(Window w, int width, int height);
+
+ /** Set the position of the security warning.
+ */
+ void setSecurityWarningPosition(Window w, Point2D point,
+ float alignmentX, float alignmentY);
+
+ /** Request to recalculate the new position of the security warning for
+ * the given window size/location as reported by the native system.
+ */
+ Point2D calculateSecurityWarningPosition(Window window,
+ double x, double y, double w, double h);
+ }
+
+ /*
+ * An accessor for the AWTEvent class.
+ */
+ public interface AWTEventAccessor {
+ /*
+ *
+ * Sets the flag on this AWTEvent indicating that it was
+ * generated by the system.
+ */
+ void setSystemGenerated(AWTEvent ev);
+ /*
+ *
+ * Indicates whether this AWTEvent was generated by the system.
+ */
+ boolean isSystemGenerated(AWTEvent ev);
+ }
+
+ /*
+ * An accessor for the java.awt.Frame class.
+ */
+ public interface FrameAccessor {
+ /*
+ * Sets the state of this frame.
+ */
+ void setExtendedState(Frame frame, int state);
+ /*
+ * Gets the state of this frame.
+ */
+ int getExtendedState(Frame frame);
+ }
+
+ /*
+ * An interface of accessor for the java.awt.KeyboardFocusManager class.
+ */
+ public interface KeyboardFocusManagerAccessor {
+ /*
+ * Indicates whether the native implementation should
+ * proceed with a pending focus request for the heavyweight.
+ */
+ int shouldNativelyFocusHeavyweight(Component heavyweight,
+ Component descendant,
+ boolean temporary,
+ boolean focusedWindowChangeAllowed,
+ long time,
+ CausedFocusEvent.Cause cause);
+ /*
+ * Delivers focus for the lightweight descendant of the heavyweight
+ * synchronously.
+ */
+ boolean processSynchronousLightweightTransfer(Component heavyweight,
+ Component descendant,
+ boolean temporary,
+ boolean focusedWindowChangeAllowed,
+ long time);
+ /*
+ * Removes the last focus request for the heavyweight from the queue.
+ */
+ void removeLastFocusRequest(Component heavyweight);
+ }
+
+ /*
+ * The java.awt.Component class accessor object.
*/
private static ComponentAccessor componentAccessor;
- /** Set an accessor object for the java.awt.Component class.
+ /*
+ * The java.awt.Window class accessor object.
+ */
+ private static WindowAccessor windowAccessor;
+
+ /*
+ * The java.awt.AWTEvent class accessor object.
+ */
+ private static AWTEventAccessor awtEventAccessor;
+
+ /*
+ * The java.awt.Frame class accessor object.
+ */
+ private static FrameAccessor frameAccessor;
+
+ /*
+ * The java.awt.KeyboardFocusManager class accessor object.
+ */
+ private static KeyboardFocusManagerAccessor kfmAccessor;
+
+ /*
+ * Set an accessor object for the java.awt.Component class.
*/
public static void setComponentAccessor(ComponentAccessor ca) {
componentAccessor = ca;
}
- /** Retrieve the accessor object for the java.awt.Window class.
+ /*
+ * Retrieve the accessor object for the java.awt.Window class.
*/
public static ComponentAccessor getComponentAccessor() {
if (componentAccessor == null) {
@@ -74,4 +257,69 @@
return componentAccessor;
}
+
+ /*
+ * Set an accessor object for the java.awt.Window class.
+ */
+ public static void setWindowAccessor(WindowAccessor wa) {
+ windowAccessor = wa;
+ }
+
+ /*
+ * Retrieve the accessor object for the java.awt.Window class.
+ */
+ public static WindowAccessor getWindowAccessor() {
+ if (windowAccessor == null) {
+ unsafe.ensureClassInitialized(Window.class);
+ }
+ return windowAccessor;
+ }
+
+ /*
+ * Set an accessor object for the java.awt.AWTEvent class.
+ */
+ public static void setAWTEventAccessor(AWTEventAccessor aea) {
+ awtEventAccessor = aea;
+ }
+
+ /*
+ * Retrieve the accessor object for the java.awt.AWTEvent class.
+ */
+ public static AWTEventAccessor getAWTEventAccessor() {
+ return awtEventAccessor;
+ }
+
+ /*
+ * Set an accessor object for the java.awt.Frame class.
+ */
+ public static void setFrameAccessor(FrameAccessor fa) {
+ frameAccessor = fa;
+ }
+
+ /*
+ * Retrieve the accessor object for the java.awt.Frame class.
+ */
+ public static FrameAccessor getFrameAccessor() {
+ if (frameAccessor == null) {
+ unsafe.ensureClassInitialized(Frame.class);
+ }
+ return frameAccessor;
+ }
+
+ /*
+ * Set an accessor object for the java.awt.KeyboardFocusManager class.
+ */
+ public static void setKeyboardFocusManagerAccessor(KeyboardFocusManagerAccessor kfma) {
+ kfmAccessor = kfma;
+ }
+
+ /*
+ * Retrieve the accessor object for the java.awt.KeyboardFocusManager class.
+ */
+ public static KeyboardFocusManagerAccessor getKeyboardFocusManagerAccessor() {
+ if (kfmAccessor == null) {
+ unsafe.ensureClassInitialized(KeyboardFocusManager.class);
+ }
+ return kfmAccessor;
+ }
}
--- a/jdk/src/share/classes/sun/awt/ComponentAccessor.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/awt/ComponentAccessor.java Mon Apr 27 12:33:57 2009 -0700
@@ -73,7 +73,6 @@
private static Field fieldPacked;
private static Field fieldIgnoreRepaint;
private static Field fieldPeer;
- private static Method methodResetGC;
private static Field fieldVisible;
private static Method methodIsEnabledImpl;
private static Method methodGetCursorNoClientCode;
@@ -124,9 +123,6 @@
fieldPeer = componentClass.getDeclaredField("peer");
fieldPeer.setAccessible(true);
- methodResetGC = componentClass.getDeclaredMethod("resetGC", (Class[]) null);
- methodResetGC.setAccessible(true);
-
fieldVisible = componentClass.getDeclaredField("visible");
fieldVisible.setAccessible(true);
@@ -425,18 +421,6 @@
return false;
}
- public static void resetGC(Component c) {
- try {
- methodResetGC.invoke(c, (Object[]) null);
- }
- catch (IllegalAccessException e) {
- log.log(Level.FINE, "Unable to access the Component object", e);
- }
- catch (InvocationTargetException e) {
- log.log(Level.FINE, "Unable to invoke on the Component object", e);
- }
- }
-
public static boolean getVisible(Component c) {
try {
return fieldVisible.getBoolean(c);
--- a/jdk/src/share/classes/sun/awt/EmbeddedFrame.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/awt/EmbeddedFrame.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -585,5 +585,14 @@
}
public void updateMinimumSize() {
}
- }
+
+ public void setOpacity(float opacity) {
+ }
+ public void setOpaque(boolean isOpaque) {
+ }
+ public void updateWindow(BufferedImage backBuffer) {
+ }
+ public void repositionSecurityWarning() {
+ }
+ }
} // class EmbeddedFrame
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/sun/awt/ExtendedKeyCodes.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,670 @@
+package sun.awt;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.awt.event.KeyEvent;
+
+public class ExtendedKeyCodes {
+ /**
+ * ATTN: These are the readonly hashes with load factor == 1;
+ * adding a value, please set the inital capacity to exact number of items
+ * or higher.
+ */
+ // Keycodes declared in KeyEvent.java with corresponding Unicode values.
+ private final static HashMap<Integer, Integer> regularKeyCodesMap =
+ new HashMap<Integer,Integer>(122, 1.0f);
+
+ // Keycodes derived from Unicode values. Here should be collected codes
+ // for characters appearing on the primary layer of at least one
+ // known keyboard layout. For instance, sterling sign is on the primary layer
+ // of the Mac Italian layout.
+ private final static HashSet<Integer> extendedKeyCodesSet =
+ new HashSet<Integer>(501, 1.0f);
+ final public static int getExtendedKeyCodeForChar( int c ) {
+ int rc = KeyEvent.VK_UNDEFINED;
+ int uc = Character.toUpperCase( c );
+ int lc = Character.toLowerCase( c );
+ if (regularKeyCodesMap.containsKey( c )) {
+ if(regularKeyCodesMap.containsKey(uc)) {
+ return regularKeyCodesMap.get( uc );
+ }
+ return regularKeyCodesMap.get( c );
+ }
+ uc += 0x01000000;
+ lc += 0x01000000;
+ if (extendedKeyCodesSet.contains( uc )) {
+ return uc;
+ }else if (extendedKeyCodesSet.contains( lc )) {
+ return lc;
+ }
+ return rc;
+ }
+ static {
+ regularKeyCodesMap.put(0x0a, KeyEvent.VK_ENTER);
+ regularKeyCodesMap.put(0x08, KeyEvent.VK_BACK_SPACE);
+ regularKeyCodesMap.put(0x09, KeyEvent.VK_TAB);
+ regularKeyCodesMap.put(0x1B, KeyEvent.VK_ESCAPE);
+ regularKeyCodesMap.put(0x20, KeyEvent.VK_SPACE);
+ regularKeyCodesMap.put(0x21, KeyEvent.VK_PAGE_UP);
+ regularKeyCodesMap.put(0x22, KeyEvent.VK_PAGE_DOWN);
+ regularKeyCodesMap.put(0x23, KeyEvent.VK_END);
+ regularKeyCodesMap.put(0x24, KeyEvent.VK_HOME);
+ regularKeyCodesMap.put(0x25, KeyEvent.VK_LEFT);
+ regularKeyCodesMap.put(0x26, KeyEvent.VK_UP);
+ regularKeyCodesMap.put(0x27, KeyEvent.VK_RIGHT);
+ regularKeyCodesMap.put(0x28, KeyEvent.VK_DOWN);
+ regularKeyCodesMap.put(0x2C, KeyEvent.VK_COMMA);
+ regularKeyCodesMap.put(0x2D, KeyEvent.VK_MINUS);
+ regularKeyCodesMap.put(0x2E, KeyEvent.VK_PERIOD);
+ regularKeyCodesMap.put(0x2F, KeyEvent.VK_SLASH);
+ regularKeyCodesMap.put(0x30, KeyEvent.VK_0);
+ regularKeyCodesMap.put(0x31, KeyEvent.VK_1);
+ regularKeyCodesMap.put(0x32, KeyEvent.VK_2);
+ regularKeyCodesMap.put(0x33, KeyEvent.VK_3);
+ regularKeyCodesMap.put(0x34, KeyEvent.VK_4);
+ regularKeyCodesMap.put(0x35, KeyEvent.VK_5);
+ regularKeyCodesMap.put(0x36, KeyEvent.VK_6);
+ regularKeyCodesMap.put(0x37, KeyEvent.VK_7);
+ regularKeyCodesMap.put(0x38, KeyEvent.VK_8);
+ regularKeyCodesMap.put(0x39, KeyEvent.VK_9);
+ regularKeyCodesMap.put(0x3B, KeyEvent.VK_SEMICOLON);
+ regularKeyCodesMap.put(0x3D, KeyEvent.VK_EQUALS);
+ regularKeyCodesMap.put(0x41, KeyEvent.VK_A);
+ regularKeyCodesMap.put(0x61, KeyEvent.VK_A);
+ regularKeyCodesMap.put(0x42, KeyEvent.VK_B);
+ regularKeyCodesMap.put(0x62, KeyEvent.VK_B);
+ regularKeyCodesMap.put(0x43, KeyEvent.VK_C);
+ regularKeyCodesMap.put(0x63, KeyEvent.VK_C);
+ regularKeyCodesMap.put(0x44, KeyEvent.VK_D);
+ regularKeyCodesMap.put(0x64, KeyEvent.VK_D);
+ regularKeyCodesMap.put(0x45, KeyEvent.VK_E);
+ regularKeyCodesMap.put(0x65, KeyEvent.VK_E);
+ regularKeyCodesMap.put(0x46, KeyEvent.VK_F);
+ regularKeyCodesMap.put(0x66, KeyEvent.VK_F);
+ regularKeyCodesMap.put(0x47, KeyEvent.VK_G);
+ regularKeyCodesMap.put(0x67, KeyEvent.VK_G);
+ regularKeyCodesMap.put(0x48, KeyEvent.VK_H);
+ regularKeyCodesMap.put(0x68, KeyEvent.VK_H);
+ regularKeyCodesMap.put(0x49, KeyEvent.VK_I);
+ regularKeyCodesMap.put(0x69, KeyEvent.VK_I);
+ regularKeyCodesMap.put(0x4A, KeyEvent.VK_J);
+ regularKeyCodesMap.put(0x6A, KeyEvent.VK_J);
+ regularKeyCodesMap.put(0x4B, KeyEvent.VK_K);
+ regularKeyCodesMap.put(0x6B, KeyEvent.VK_K);
+ regularKeyCodesMap.put(0x4C, KeyEvent.VK_L);
+ regularKeyCodesMap.put(0x6C, KeyEvent.VK_L);
+ regularKeyCodesMap.put(0x4D, KeyEvent.VK_M);
+ regularKeyCodesMap.put(0x6D, KeyEvent.VK_M);
+ regularKeyCodesMap.put(0x4E, KeyEvent.VK_N);
+ regularKeyCodesMap.put(0x6E, KeyEvent.VK_N);
+ regularKeyCodesMap.put(0x4F, KeyEvent.VK_O);
+ regularKeyCodesMap.put(0x6F, KeyEvent.VK_O);
+ regularKeyCodesMap.put(0x50, KeyEvent.VK_P);
+ regularKeyCodesMap.put(0x70, KeyEvent.VK_P);
+ regularKeyCodesMap.put(0x51, KeyEvent.VK_Q);
+ regularKeyCodesMap.put(0x71, KeyEvent.VK_Q);
+ regularKeyCodesMap.put(0x52, KeyEvent.VK_R);
+ regularKeyCodesMap.put(0x72, KeyEvent.VK_R);
+ regularKeyCodesMap.put(0x53, KeyEvent.VK_S);
+ regularKeyCodesMap.put(0x73, KeyEvent.VK_S);
+ regularKeyCodesMap.put(0x54, KeyEvent.VK_T);
+ regularKeyCodesMap.put(0x74, KeyEvent.VK_T);
+ regularKeyCodesMap.put(0x55, KeyEvent.VK_U);
+ regularKeyCodesMap.put(0x75, KeyEvent.VK_U);
+ regularKeyCodesMap.put(0x56, KeyEvent.VK_V);
+ regularKeyCodesMap.put(0x76, KeyEvent.VK_V);
+ regularKeyCodesMap.put(0x57, KeyEvent.VK_W);
+ regularKeyCodesMap.put(0x77, KeyEvent.VK_W);
+ regularKeyCodesMap.put(0x58, KeyEvent.VK_X);
+ regularKeyCodesMap.put(0x78, KeyEvent.VK_X);
+ regularKeyCodesMap.put(0x59, KeyEvent.VK_Y);
+ regularKeyCodesMap.put(0x79, KeyEvent.VK_Y);
+ regularKeyCodesMap.put(0x5A, KeyEvent.VK_Z);
+ regularKeyCodesMap.put(0x7A, KeyEvent.VK_Z);
+ regularKeyCodesMap.put(0x5B, KeyEvent.VK_OPEN_BRACKET);
+ regularKeyCodesMap.put(0x5C, KeyEvent.VK_BACK_SLASH);
+ regularKeyCodesMap.put(0x5D, KeyEvent.VK_CLOSE_BRACKET);
+// regularKeyCodesMap.put(0x60, KeyEvent.VK_NUMPAD0);
+// regularKeyCodesMap.put(0x61, KeyEvent.VK_NUMPAD1);
+// regularKeyCodesMap.put(0x62, KeyEvent.VK_NUMPAD2);
+// regularKeyCodesMap.put(0x63, KeyEvent.VK_NUMPAD3);
+// regularKeyCodesMap.put(0x64, KeyEvent.VK_NUMPAD4);
+// regularKeyCodesMap.put(0x65, KeyEvent.VK_NUMPAD5);
+// regularKeyCodesMap.put(0x66, KeyEvent.VK_NUMPAD6);
+// regularKeyCodesMap.put(0x67, KeyEvent.VK_NUMPAD7);
+// regularKeyCodesMap.put(0x68, KeyEvent.VK_NUMPAD8);
+// regularKeyCodesMap.put(0x69, KeyEvent.VK_NUMPAD9);
+ regularKeyCodesMap.put(0x6A, KeyEvent.VK_MULTIPLY);
+ regularKeyCodesMap.put(0x6B, KeyEvent.VK_ADD);
+ regularKeyCodesMap.put(0x6C, KeyEvent.VK_SEPARATER);
+ regularKeyCodesMap.put(0x6D, KeyEvent.VK_SUBTRACT);
+ regularKeyCodesMap.put(0x6E, KeyEvent.VK_DECIMAL);
+ regularKeyCodesMap.put(0x6F, KeyEvent.VK_DIVIDE);
+ regularKeyCodesMap.put(0x7F, KeyEvent.VK_DELETE);
+ regularKeyCodesMap.put(0xC0, KeyEvent.VK_BACK_QUOTE);
+ regularKeyCodesMap.put(0xDE, KeyEvent.VK_QUOTE);
+ regularKeyCodesMap.put(0x26, KeyEvent.VK_AMPERSAND);
+ regularKeyCodesMap.put(0x2A, KeyEvent.VK_ASTERISK);
+ regularKeyCodesMap.put(0x22, KeyEvent.VK_QUOTEDBL);
+ regularKeyCodesMap.put(0x3C, KeyEvent.VK_LESS);
+ regularKeyCodesMap.put(0x3E, KeyEvent.VK_GREATER);
+ regularKeyCodesMap.put(0x7B, KeyEvent.VK_BRACELEFT);
+ regularKeyCodesMap.put(0x7D, KeyEvent.VK_BRACERIGHT);
+ regularKeyCodesMap.put(0x40, KeyEvent.VK_AT);
+ regularKeyCodesMap.put(0x3A, KeyEvent.VK_COLON);
+ regularKeyCodesMap.put(0x5E, KeyEvent.VK_CIRCUMFLEX);
+ regularKeyCodesMap.put(0x24, KeyEvent.VK_DOLLAR);
+ regularKeyCodesMap.put(0x20AC, KeyEvent.VK_EURO_SIGN);
+ regularKeyCodesMap.put(0x21, KeyEvent.VK_EXCLAMATION_MARK);
+ regularKeyCodesMap.put(0xA1, KeyEvent.VK_INVERTED_EXCLAMATION_MARK);
+ regularKeyCodesMap.put(0x28, KeyEvent.VK_LEFT_PARENTHESIS);
+ regularKeyCodesMap.put(0x23, KeyEvent.VK_NUMBER_SIGN);
+ regularKeyCodesMap.put(0x2B, KeyEvent.VK_PLUS);
+ regularKeyCodesMap.put(0x29, KeyEvent.VK_RIGHT_PARENTHESIS);
+ regularKeyCodesMap.put(0x5F, KeyEvent.VK_UNDERSCORE);
+
+
+ extendedKeyCodesSet.add(0x01000000+0x0060);
+ extendedKeyCodesSet.add(0x01000000+0x007C);
+ extendedKeyCodesSet.add(0x01000000+0x007E);
+ extendedKeyCodesSet.add(0x01000000+0x00A2);
+ extendedKeyCodesSet.add(0x01000000+0x00A3);
+ extendedKeyCodesSet.add(0x01000000+0x00A5);
+ extendedKeyCodesSet.add(0x01000000+0x00A7);
+ extendedKeyCodesSet.add(0x01000000+0x00A8);
+ extendedKeyCodesSet.add(0x01000000+0x00AB);
+ extendedKeyCodesSet.add(0x01000000+0x00B0);
+ extendedKeyCodesSet.add(0x01000000+0x00B1);
+ extendedKeyCodesSet.add(0x01000000+0x00B2);
+ extendedKeyCodesSet.add(0x01000000+0x00B3);
+ extendedKeyCodesSet.add(0x01000000+0x00B4);
+ extendedKeyCodesSet.add(0x01000000+0x00B5);
+ extendedKeyCodesSet.add(0x01000000+0x00B6);
+ extendedKeyCodesSet.add(0x01000000+0x00B7);
+ extendedKeyCodesSet.add(0x01000000+0x00B9);
+ extendedKeyCodesSet.add(0x01000000+0x00BA);
+ extendedKeyCodesSet.add(0x01000000+0x00BB);
+ extendedKeyCodesSet.add(0x01000000+0x00BC);
+ extendedKeyCodesSet.add(0x01000000+0x00BD);
+ extendedKeyCodesSet.add(0x01000000+0x00BE);
+ extendedKeyCodesSet.add(0x01000000+0x00BF);
+ extendedKeyCodesSet.add(0x01000000+0x00C4);
+ extendedKeyCodesSet.add(0x01000000+0x00C5);
+ extendedKeyCodesSet.add(0x01000000+0x00C6);
+ extendedKeyCodesSet.add(0x01000000+0x00C7);
+ extendedKeyCodesSet.add(0x01000000+0x00D1);
+ extendedKeyCodesSet.add(0x01000000+0x00D6);
+ extendedKeyCodesSet.add(0x01000000+0x00D7);
+ extendedKeyCodesSet.add(0x01000000+0x00D8);
+ extendedKeyCodesSet.add(0x01000000+0x00DF);
+ extendedKeyCodesSet.add(0x01000000+0x00E0);
+ extendedKeyCodesSet.add(0x01000000+0x00E1);
+ extendedKeyCodesSet.add(0x01000000+0x00E2);
+ extendedKeyCodesSet.add(0x01000000+0x00E4);
+ extendedKeyCodesSet.add(0x01000000+0x00E5);
+ extendedKeyCodesSet.add(0x01000000+0x00E6);
+ extendedKeyCodesSet.add(0x01000000+0x00E7);
+ extendedKeyCodesSet.add(0x01000000+0x00E8);
+ extendedKeyCodesSet.add(0x01000000+0x00E9);
+ extendedKeyCodesSet.add(0x01000000+0x00EA);
+ extendedKeyCodesSet.add(0x01000000+0x00EB);
+ extendedKeyCodesSet.add(0x01000000+0x00EC);
+ extendedKeyCodesSet.add(0x01000000+0x00ED);
+ extendedKeyCodesSet.add(0x01000000+0x00EE);
+ extendedKeyCodesSet.add(0x01000000+0x00F0);
+ extendedKeyCodesSet.add(0x01000000+0x00F1);
+ extendedKeyCodesSet.add(0x01000000+0x00F2);
+ extendedKeyCodesSet.add(0x01000000+0x00F3);
+ extendedKeyCodesSet.add(0x01000000+0x00F4);
+ extendedKeyCodesSet.add(0x01000000+0x00F5);
+ extendedKeyCodesSet.add(0x01000000+0x00F6);
+ extendedKeyCodesSet.add(0x01000000+0x00F7);
+ extendedKeyCodesSet.add(0x01000000+0x00F8);
+ extendedKeyCodesSet.add(0x01000000+0x00F9);
+ extendedKeyCodesSet.add(0x01000000+0x00FA);
+ extendedKeyCodesSet.add(0x01000000+0x00FB);
+ extendedKeyCodesSet.add(0x01000000+0x00FC);
+ extendedKeyCodesSet.add(0x01000000+0x00FD);
+ extendedKeyCodesSet.add(0x01000000+0x00FE);
+ extendedKeyCodesSet.add(0x01000000+0x0105);
+ extendedKeyCodesSet.add(0x01000000+0x02DB);
+ extendedKeyCodesSet.add(0x01000000+0x0142);
+ extendedKeyCodesSet.add(0x01000000+0x013E);
+ extendedKeyCodesSet.add(0x01000000+0x015B);
+ extendedKeyCodesSet.add(0x01000000+0x0161);
+ extendedKeyCodesSet.add(0x01000000+0x015F);
+ extendedKeyCodesSet.add(0x01000000+0x0165);
+ extendedKeyCodesSet.add(0x01000000+0x017E);
+ extendedKeyCodesSet.add(0x01000000+0x017C);
+ extendedKeyCodesSet.add(0x01000000+0x0103);
+ extendedKeyCodesSet.add(0x01000000+0x0107);
+ extendedKeyCodesSet.add(0x01000000+0x010D);
+ extendedKeyCodesSet.add(0x01000000+0x0119);
+ extendedKeyCodesSet.add(0x01000000+0x011B);
+ extendedKeyCodesSet.add(0x01000000+0x0111);
+ extendedKeyCodesSet.add(0x01000000+0x0148);
+ extendedKeyCodesSet.add(0x01000000+0x0151);
+ extendedKeyCodesSet.add(0x01000000+0x0171);
+ extendedKeyCodesSet.add(0x01000000+0x0159);
+ extendedKeyCodesSet.add(0x01000000+0x016F);
+ extendedKeyCodesSet.add(0x01000000+0x0163);
+ extendedKeyCodesSet.add(0x01000000+0x02D9);
+ extendedKeyCodesSet.add(0x01000000+0x0130);
+ extendedKeyCodesSet.add(0x01000000+0x0127);
+ extendedKeyCodesSet.add(0x01000000+0x0125);
+ extendedKeyCodesSet.add(0x01000000+0x0131);
+ extendedKeyCodesSet.add(0x01000000+0x011F);
+ extendedKeyCodesSet.add(0x01000000+0x0135);
+ extendedKeyCodesSet.add(0x01000000+0x010B);
+ extendedKeyCodesSet.add(0x01000000+0x0109);
+ extendedKeyCodesSet.add(0x01000000+0x0121);
+ extendedKeyCodesSet.add(0x01000000+0x011D);
+ extendedKeyCodesSet.add(0x01000000+0x016D);
+ extendedKeyCodesSet.add(0x01000000+0x015D);
+ extendedKeyCodesSet.add(0x01000000+0x0138);
+ extendedKeyCodesSet.add(0x01000000+0x0157);
+ extendedKeyCodesSet.add(0x01000000+0x013C);
+ extendedKeyCodesSet.add(0x01000000+0x0113);
+ extendedKeyCodesSet.add(0x01000000+0x0123);
+ extendedKeyCodesSet.add(0x01000000+0x0167);
+ extendedKeyCodesSet.add(0x01000000+0x014B);
+ extendedKeyCodesSet.add(0x01000000+0x0101);
+ extendedKeyCodesSet.add(0x01000000+0x012F);
+ extendedKeyCodesSet.add(0x01000000+0x0117);
+ extendedKeyCodesSet.add(0x01000000+0x012B);
+ extendedKeyCodesSet.add(0x01000000+0x0146);
+ extendedKeyCodesSet.add(0x01000000+0x014D);
+ extendedKeyCodesSet.add(0x01000000+0x0137);
+ extendedKeyCodesSet.add(0x01000000+0x0173);
+ extendedKeyCodesSet.add(0x01000000+0x016B);
+ extendedKeyCodesSet.add(0x01000000+0x0153);
+ extendedKeyCodesSet.add(0x01000000+0x30FC);
+ extendedKeyCodesSet.add(0x01000000+0x30A2);
+ extendedKeyCodesSet.add(0x01000000+0x30A4);
+ extendedKeyCodesSet.add(0x01000000+0x30A6);
+ extendedKeyCodesSet.add(0x01000000+0x30A8);
+ extendedKeyCodesSet.add(0x01000000+0x30AA);
+ extendedKeyCodesSet.add(0x01000000+0x30AB);
+ extendedKeyCodesSet.add(0x01000000+0x30AD);
+ extendedKeyCodesSet.add(0x01000000+0x30AF);
+ extendedKeyCodesSet.add(0x01000000+0x30B1);
+ extendedKeyCodesSet.add(0x01000000+0x30B3);
+ extendedKeyCodesSet.add(0x01000000+0x30B5);
+ extendedKeyCodesSet.add(0x01000000+0x30B7);
+ extendedKeyCodesSet.add(0x01000000+0x30B9);
+ extendedKeyCodesSet.add(0x01000000+0x30BB);
+ extendedKeyCodesSet.add(0x01000000+0x30BD);
+ extendedKeyCodesSet.add(0x01000000+0x30BF);
+ extendedKeyCodesSet.add(0x01000000+0x30C1);
+ extendedKeyCodesSet.add(0x01000000+0x30C4);
+ extendedKeyCodesSet.add(0x01000000+0x30C6);
+ extendedKeyCodesSet.add(0x01000000+0x30C8);
+ extendedKeyCodesSet.add(0x01000000+0x30CA);
+ extendedKeyCodesSet.add(0x01000000+0x30CB);
+ extendedKeyCodesSet.add(0x01000000+0x30CC);
+ extendedKeyCodesSet.add(0x01000000+0x30CD);
+ extendedKeyCodesSet.add(0x01000000+0x30CE);
+ extendedKeyCodesSet.add(0x01000000+0x30CF);
+ extendedKeyCodesSet.add(0x01000000+0x30D2);
+ extendedKeyCodesSet.add(0x01000000+0x30D5);
+ extendedKeyCodesSet.add(0x01000000+0x30D8);
+ extendedKeyCodesSet.add(0x01000000+0x30DB);
+ extendedKeyCodesSet.add(0x01000000+0x30DE);
+ extendedKeyCodesSet.add(0x01000000+0x30DF);
+ extendedKeyCodesSet.add(0x01000000+0x30E0);
+ extendedKeyCodesSet.add(0x01000000+0x30E1);
+ extendedKeyCodesSet.add(0x01000000+0x30E2);
+ extendedKeyCodesSet.add(0x01000000+0x30E4);
+ extendedKeyCodesSet.add(0x01000000+0x30E6);
+ extendedKeyCodesSet.add(0x01000000+0x30E8);
+ extendedKeyCodesSet.add(0x01000000+0x30E9);
+ extendedKeyCodesSet.add(0x01000000+0x30EA);
+ extendedKeyCodesSet.add(0x01000000+0x30EB);
+ extendedKeyCodesSet.add(0x01000000+0x30EC);
+ extendedKeyCodesSet.add(0x01000000+0x30ED);
+ extendedKeyCodesSet.add(0x01000000+0x30EF);
+ extendedKeyCodesSet.add(0x01000000+0x30F3);
+ extendedKeyCodesSet.add(0x01000000+0x309B);
+ extendedKeyCodesSet.add(0x01000000+0x309C);
+ extendedKeyCodesSet.add(0x01000000+0x06F0);
+ extendedKeyCodesSet.add(0x01000000+0x06F1);
+ extendedKeyCodesSet.add(0x01000000+0x06F2);
+ extendedKeyCodesSet.add(0x01000000+0x06F3);
+ extendedKeyCodesSet.add(0x01000000+0x06F4);
+ extendedKeyCodesSet.add(0x01000000+0x06F5);
+ extendedKeyCodesSet.add(0x01000000+0x06F6);
+ extendedKeyCodesSet.add(0x01000000+0x06F7);
+ extendedKeyCodesSet.add(0x01000000+0x06F8);
+ extendedKeyCodesSet.add(0x01000000+0x06F9);
+ extendedKeyCodesSet.add(0x01000000+0x0670);
+ extendedKeyCodesSet.add(0x01000000+0x067E);
+ extendedKeyCodesSet.add(0x01000000+0x0686);
+ extendedKeyCodesSet.add(0x01000000+0x060C);
+ extendedKeyCodesSet.add(0x01000000+0x06D4);
+ extendedKeyCodesSet.add(0x01000000+0x0660);
+ extendedKeyCodesSet.add(0x01000000+0x0661);
+ extendedKeyCodesSet.add(0x01000000+0x0662);
+ extendedKeyCodesSet.add(0x01000000+0x0663);
+ extendedKeyCodesSet.add(0x01000000+0x0664);
+ extendedKeyCodesSet.add(0x01000000+0x0665);
+ extendedKeyCodesSet.add(0x01000000+0x0666);
+ extendedKeyCodesSet.add(0x01000000+0x0667);
+ extendedKeyCodesSet.add(0x01000000+0x0668);
+ extendedKeyCodesSet.add(0x01000000+0x0669);
+ extendedKeyCodesSet.add(0x01000000+0x061B);
+ extendedKeyCodesSet.add(0x01000000+0x0621);
+ extendedKeyCodesSet.add(0x01000000+0x0624);
+ extendedKeyCodesSet.add(0x01000000+0x0626);
+ extendedKeyCodesSet.add(0x01000000+0x0627);
+ extendedKeyCodesSet.add(0x01000000+0x0628);
+ extendedKeyCodesSet.add(0x01000000+0x0629);
+ extendedKeyCodesSet.add(0x01000000+0x062A);
+ extendedKeyCodesSet.add(0x01000000+0x062B);
+ extendedKeyCodesSet.add(0x01000000+0x062C);
+ extendedKeyCodesSet.add(0x01000000+0x062D);
+ extendedKeyCodesSet.add(0x01000000+0x062E);
+ extendedKeyCodesSet.add(0x01000000+0x062F);
+ extendedKeyCodesSet.add(0x01000000+0x0630);
+ extendedKeyCodesSet.add(0x01000000+0x0631);
+ extendedKeyCodesSet.add(0x01000000+0x0632);
+ extendedKeyCodesSet.add(0x01000000+0x0633);
+ extendedKeyCodesSet.add(0x01000000+0x0634);
+ extendedKeyCodesSet.add(0x01000000+0x0635);
+ extendedKeyCodesSet.add(0x01000000+0x0636);
+ extendedKeyCodesSet.add(0x01000000+0x0637);
+ extendedKeyCodesSet.add(0x01000000+0x0638);
+ extendedKeyCodesSet.add(0x01000000+0x0639);
+ extendedKeyCodesSet.add(0x01000000+0x063A);
+ extendedKeyCodesSet.add(0x01000000+0x0641);
+ extendedKeyCodesSet.add(0x01000000+0x0642);
+ extendedKeyCodesSet.add(0x01000000+0x0643);
+ extendedKeyCodesSet.add(0x01000000+0x0644);
+ extendedKeyCodesSet.add(0x01000000+0x0645);
+ extendedKeyCodesSet.add(0x01000000+0x0646);
+ extendedKeyCodesSet.add(0x01000000+0x0647);
+ extendedKeyCodesSet.add(0x01000000+0x0648);
+ extendedKeyCodesSet.add(0x01000000+0x0649);
+ extendedKeyCodesSet.add(0x01000000+0x064A);
+ extendedKeyCodesSet.add(0x01000000+0x064E);
+ extendedKeyCodesSet.add(0x01000000+0x064F);
+ extendedKeyCodesSet.add(0x01000000+0x0650);
+ extendedKeyCodesSet.add(0x01000000+0x0652);
+ extendedKeyCodesSet.add(0x01000000+0x0698);
+ extendedKeyCodesSet.add(0x01000000+0x06A4);
+ extendedKeyCodesSet.add(0x01000000+0x06A9);
+ extendedKeyCodesSet.add(0x01000000+0x06AF);
+ extendedKeyCodesSet.add(0x01000000+0x06BE);
+ extendedKeyCodesSet.add(0x01000000+0x06CC);
+ extendedKeyCodesSet.add(0x01000000+0x06CC);
+ extendedKeyCodesSet.add(0x01000000+0x06D2);
+ extendedKeyCodesSet.add(0x01000000+0x0493);
+ extendedKeyCodesSet.add(0x01000000+0x0497);
+ extendedKeyCodesSet.add(0x01000000+0x049B);
+ extendedKeyCodesSet.add(0x01000000+0x049D);
+ extendedKeyCodesSet.add(0x01000000+0x04A3);
+ extendedKeyCodesSet.add(0x01000000+0x04AF);
+ extendedKeyCodesSet.add(0x01000000+0x04B1);
+ extendedKeyCodesSet.add(0x01000000+0x04B3);
+ extendedKeyCodesSet.add(0x01000000+0x04B9);
+ extendedKeyCodesSet.add(0x01000000+0x04BB);
+ extendedKeyCodesSet.add(0x01000000+0x04D9);
+ extendedKeyCodesSet.add(0x01000000+0x04E9);
+ extendedKeyCodesSet.add(0x01000000+0x0452);
+ extendedKeyCodesSet.add(0x01000000+0x0453);
+ extendedKeyCodesSet.add(0x01000000+0x0451);
+ extendedKeyCodesSet.add(0x01000000+0x0454);
+ extendedKeyCodesSet.add(0x01000000+0x0455);
+ extendedKeyCodesSet.add(0x01000000+0x0456);
+ extendedKeyCodesSet.add(0x01000000+0x0457);
+ extendedKeyCodesSet.add(0x01000000+0x0458);
+ extendedKeyCodesSet.add(0x01000000+0x0459);
+ extendedKeyCodesSet.add(0x01000000+0x045A);
+ extendedKeyCodesSet.add(0x01000000+0x045B);
+ extendedKeyCodesSet.add(0x01000000+0x045C);
+ extendedKeyCodesSet.add(0x01000000+0x0491);
+ extendedKeyCodesSet.add(0x01000000+0x045E);
+ extendedKeyCodesSet.add(0x01000000+0x045F);
+ extendedKeyCodesSet.add(0x01000000+0x2116);
+ extendedKeyCodesSet.add(0x01000000+0x044E);
+ extendedKeyCodesSet.add(0x01000000+0x0430);
+ extendedKeyCodesSet.add(0x01000000+0x0431);
+ extendedKeyCodesSet.add(0x01000000+0x0446);
+ extendedKeyCodesSet.add(0x01000000+0x0434);
+ extendedKeyCodesSet.add(0x01000000+0x0435);
+ extendedKeyCodesSet.add(0x01000000+0x0444);
+ extendedKeyCodesSet.add(0x01000000+0x0433);
+ extendedKeyCodesSet.add(0x01000000+0x0445);
+ extendedKeyCodesSet.add(0x01000000+0x0438);
+ extendedKeyCodesSet.add(0x01000000+0x0439);
+ extendedKeyCodesSet.add(0x01000000+0x043A);
+ extendedKeyCodesSet.add(0x01000000+0x043B);
+ extendedKeyCodesSet.add(0x01000000+0x043C);
+ extendedKeyCodesSet.add(0x01000000+0x043D);
+ extendedKeyCodesSet.add(0x01000000+0x043E);
+ extendedKeyCodesSet.add(0x01000000+0x043F);
+ extendedKeyCodesSet.add(0x01000000+0x044F);
+ extendedKeyCodesSet.add(0x01000000+0x0440);
+ extendedKeyCodesSet.add(0x01000000+0x0441);
+ extendedKeyCodesSet.add(0x01000000+0x0442);
+ extendedKeyCodesSet.add(0x01000000+0x0443);
+ extendedKeyCodesSet.add(0x01000000+0x0436);
+ extendedKeyCodesSet.add(0x01000000+0x0432);
+ extendedKeyCodesSet.add(0x01000000+0x044C);
+ extendedKeyCodesSet.add(0x01000000+0x044B);
+ extendedKeyCodesSet.add(0x01000000+0x0437);
+ extendedKeyCodesSet.add(0x01000000+0x0448);
+ extendedKeyCodesSet.add(0x01000000+0x044D);
+ extendedKeyCodesSet.add(0x01000000+0x0449);
+ extendedKeyCodesSet.add(0x01000000+0x0447);
+ extendedKeyCodesSet.add(0x01000000+0x044A);
+ extendedKeyCodesSet.add(0x01000000+0x2015);
+ extendedKeyCodesSet.add(0x01000000+0x03B1);
+ extendedKeyCodesSet.add(0x01000000+0x03B2);
+ extendedKeyCodesSet.add(0x01000000+0x03B3);
+ extendedKeyCodesSet.add(0x01000000+0x03B4);
+ extendedKeyCodesSet.add(0x01000000+0x03B5);
+ extendedKeyCodesSet.add(0x01000000+0x03B6);
+ extendedKeyCodesSet.add(0x01000000+0x03B7);
+ extendedKeyCodesSet.add(0x01000000+0x03B8);
+ extendedKeyCodesSet.add(0x01000000+0x03B9);
+ extendedKeyCodesSet.add(0x01000000+0x03BA);
+ extendedKeyCodesSet.add(0x01000000+0x03BB);
+ extendedKeyCodesSet.add(0x01000000+0x03BC);
+ extendedKeyCodesSet.add(0x01000000+0x03BD);
+ extendedKeyCodesSet.add(0x01000000+0x03BE);
+ extendedKeyCodesSet.add(0x01000000+0x03BF);
+ extendedKeyCodesSet.add(0x01000000+0x03C0);
+ extendedKeyCodesSet.add(0x01000000+0x03C1);
+ extendedKeyCodesSet.add(0x01000000+0x03C3);
+ extendedKeyCodesSet.add(0x01000000+0x03C2);
+ extendedKeyCodesSet.add(0x01000000+0x03C4);
+ extendedKeyCodesSet.add(0x01000000+0x03C5);
+ extendedKeyCodesSet.add(0x01000000+0x03C6);
+ extendedKeyCodesSet.add(0x01000000+0x03C7);
+ extendedKeyCodesSet.add(0x01000000+0x03C8);
+ extendedKeyCodesSet.add(0x01000000+0x03C9);
+ extendedKeyCodesSet.add(0x01000000+0x2190);
+ extendedKeyCodesSet.add(0x01000000+0x2192);
+ extendedKeyCodesSet.add(0x01000000+0x2193);
+ extendedKeyCodesSet.add(0x01000000+0x2013);
+ extendedKeyCodesSet.add(0x01000000+0x201C);
+ extendedKeyCodesSet.add(0x01000000+0x201D);
+ extendedKeyCodesSet.add(0x01000000+0x201E);
+ extendedKeyCodesSet.add(0x01000000+0x05D0);
+ extendedKeyCodesSet.add(0x01000000+0x05D1);
+ extendedKeyCodesSet.add(0x01000000+0x05D2);
+ extendedKeyCodesSet.add(0x01000000+0x05D3);
+ extendedKeyCodesSet.add(0x01000000+0x05D4);
+ extendedKeyCodesSet.add(0x01000000+0x05D5);
+ extendedKeyCodesSet.add(0x01000000+0x05D6);
+ extendedKeyCodesSet.add(0x01000000+0x05D7);
+ extendedKeyCodesSet.add(0x01000000+0x05D8);
+ extendedKeyCodesSet.add(0x01000000+0x05D9);
+ extendedKeyCodesSet.add(0x01000000+0x05DA);
+ extendedKeyCodesSet.add(0x01000000+0x05DB);
+ extendedKeyCodesSet.add(0x01000000+0x05DC);
+ extendedKeyCodesSet.add(0x01000000+0x05DD);
+ extendedKeyCodesSet.add(0x01000000+0x05DE);
+ extendedKeyCodesSet.add(0x01000000+0x05DF);
+ extendedKeyCodesSet.add(0x01000000+0x05E0);
+ extendedKeyCodesSet.add(0x01000000+0x05E1);
+ extendedKeyCodesSet.add(0x01000000+0x05E2);
+ extendedKeyCodesSet.add(0x01000000+0x05E3);
+ extendedKeyCodesSet.add(0x01000000+0x05E4);
+ extendedKeyCodesSet.add(0x01000000+0x05E5);
+ extendedKeyCodesSet.add(0x01000000+0x05E6);
+ extendedKeyCodesSet.add(0x01000000+0x05E7);
+ extendedKeyCodesSet.add(0x01000000+0x05E8);
+ extendedKeyCodesSet.add(0x01000000+0x05E9);
+ extendedKeyCodesSet.add(0x01000000+0x05EA);
+ extendedKeyCodesSet.add(0x01000000+0x0E01);
+ extendedKeyCodesSet.add(0x01000000+0x0E02);
+ extendedKeyCodesSet.add(0x01000000+0x0E03);
+ extendedKeyCodesSet.add(0x01000000+0x0E04);
+ extendedKeyCodesSet.add(0x01000000+0x0E05);
+ extendedKeyCodesSet.add(0x01000000+0x0E07);
+ extendedKeyCodesSet.add(0x01000000+0x0E08);
+ extendedKeyCodesSet.add(0x01000000+0x0E0A);
+ extendedKeyCodesSet.add(0x01000000+0x0E0C);
+ extendedKeyCodesSet.add(0x01000000+0x0E14);
+ extendedKeyCodesSet.add(0x01000000+0x0E15);
+ extendedKeyCodesSet.add(0x01000000+0x0E16);
+ extendedKeyCodesSet.add(0x01000000+0x0E17);
+ extendedKeyCodesSet.add(0x01000000+0x0E19);
+ extendedKeyCodesSet.add(0x01000000+0x0E1A);
+ extendedKeyCodesSet.add(0x01000000+0x0E1B);
+ extendedKeyCodesSet.add(0x01000000+0x0E1C);
+ extendedKeyCodesSet.add(0x01000000+0x0E1D);
+ extendedKeyCodesSet.add(0x01000000+0x0E1E);
+ extendedKeyCodesSet.add(0x01000000+0x0E1F);
+ extendedKeyCodesSet.add(0x01000000+0x0E20);
+ extendedKeyCodesSet.add(0x01000000+0x0E21);
+ extendedKeyCodesSet.add(0x01000000+0x0E22);
+ extendedKeyCodesSet.add(0x01000000+0x0E23);
+ extendedKeyCodesSet.add(0x01000000+0x0E25);
+ extendedKeyCodesSet.add(0x01000000+0x0E27);
+ extendedKeyCodesSet.add(0x01000000+0x0E2A);
+ extendedKeyCodesSet.add(0x01000000+0x0E2B);
+ extendedKeyCodesSet.add(0x01000000+0x0E2D);
+ extendedKeyCodesSet.add(0x01000000+0x0E30);
+ extendedKeyCodesSet.add(0x01000000+0x0E31);
+ extendedKeyCodesSet.add(0x01000000+0x0E32);
+ extendedKeyCodesSet.add(0x01000000+0x0E33);
+ extendedKeyCodesSet.add(0x01000000+0x0E34);
+ extendedKeyCodesSet.add(0x01000000+0x0E35);
+ extendedKeyCodesSet.add(0x01000000+0x0E36);
+ extendedKeyCodesSet.add(0x01000000+0x0E37);
+ extendedKeyCodesSet.add(0x01000000+0x0E38);
+ extendedKeyCodesSet.add(0x01000000+0x0E39);
+ extendedKeyCodesSet.add(0x01000000+0x0E3F);
+ extendedKeyCodesSet.add(0x01000000+0x0E40);
+ extendedKeyCodesSet.add(0x01000000+0x0E41);
+ extendedKeyCodesSet.add(0x01000000+0x0E43);
+ extendedKeyCodesSet.add(0x01000000+0x0E44);
+ extendedKeyCodesSet.add(0x01000000+0x0E45);
+ extendedKeyCodesSet.add(0x01000000+0x0E46);
+ extendedKeyCodesSet.add(0x01000000+0x0E47);
+ extendedKeyCodesSet.add(0x01000000+0x0E48);
+ extendedKeyCodesSet.add(0x01000000+0x0E49);
+ extendedKeyCodesSet.add(0x01000000+0x0E50);
+ extendedKeyCodesSet.add(0x01000000+0x0E51);
+ extendedKeyCodesSet.add(0x01000000+0x0E52);
+ extendedKeyCodesSet.add(0x01000000+0x0E53);
+ extendedKeyCodesSet.add(0x01000000+0x0E54);
+ extendedKeyCodesSet.add(0x01000000+0x0E55);
+ extendedKeyCodesSet.add(0x01000000+0x0E56);
+ extendedKeyCodesSet.add(0x01000000+0x0E57);
+ extendedKeyCodesSet.add(0x01000000+0x0E58);
+ extendedKeyCodesSet.add(0x01000000+0x0E59);
+ extendedKeyCodesSet.add(0x01000000+0x0587);
+ extendedKeyCodesSet.add(0x01000000+0x0589);
+ extendedKeyCodesSet.add(0x01000000+0x0589);
+ extendedKeyCodesSet.add(0x01000000+0x055D);
+ extendedKeyCodesSet.add(0x01000000+0x055D);
+ extendedKeyCodesSet.add(0x01000000+0x055B);
+ extendedKeyCodesSet.add(0x01000000+0x055B);
+ extendedKeyCodesSet.add(0x01000000+0x055E);
+ extendedKeyCodesSet.add(0x01000000+0x055E);
+ extendedKeyCodesSet.add(0x01000000+0x0561);
+ extendedKeyCodesSet.add(0x01000000+0x0562);
+ extendedKeyCodesSet.add(0x01000000+0x0563);
+ extendedKeyCodesSet.add(0x01000000+0x0564);
+ extendedKeyCodesSet.add(0x01000000+0x0565);
+ extendedKeyCodesSet.add(0x01000000+0x0566);
+ extendedKeyCodesSet.add(0x01000000+0x0567);
+ extendedKeyCodesSet.add(0x01000000+0x0568);
+ extendedKeyCodesSet.add(0x01000000+0x0569);
+ extendedKeyCodesSet.add(0x01000000+0x056A);
+ extendedKeyCodesSet.add(0x01000000+0x056B);
+ extendedKeyCodesSet.add(0x01000000+0x056C);
+ extendedKeyCodesSet.add(0x01000000+0x056D);
+ extendedKeyCodesSet.add(0x01000000+0x056E);
+ extendedKeyCodesSet.add(0x01000000+0x056F);
+ extendedKeyCodesSet.add(0x01000000+0x0570);
+ extendedKeyCodesSet.add(0x01000000+0x0571);
+ extendedKeyCodesSet.add(0x01000000+0x0572);
+ extendedKeyCodesSet.add(0x01000000+0x0573);
+ extendedKeyCodesSet.add(0x01000000+0x0574);
+ extendedKeyCodesSet.add(0x01000000+0x0575);
+ extendedKeyCodesSet.add(0x01000000+0x0576);
+ extendedKeyCodesSet.add(0x01000000+0x0577);
+ extendedKeyCodesSet.add(0x01000000+0x0578);
+ extendedKeyCodesSet.add(0x01000000+0x0579);
+ extendedKeyCodesSet.add(0x01000000+0x057A);
+ extendedKeyCodesSet.add(0x01000000+0x057B);
+ extendedKeyCodesSet.add(0x01000000+0x057C);
+ extendedKeyCodesSet.add(0x01000000+0x057D);
+ extendedKeyCodesSet.add(0x01000000+0x057E);
+ extendedKeyCodesSet.add(0x01000000+0x057F);
+ extendedKeyCodesSet.add(0x01000000+0x0580);
+ extendedKeyCodesSet.add(0x01000000+0x0581);
+ extendedKeyCodesSet.add(0x01000000+0x0582);
+ extendedKeyCodesSet.add(0x01000000+0x0583);
+ extendedKeyCodesSet.add(0x01000000+0x0584);
+ extendedKeyCodesSet.add(0x01000000+0x0585);
+ extendedKeyCodesSet.add(0x01000000+0x0586);
+ extendedKeyCodesSet.add(0x01000000+0x10D0);
+ extendedKeyCodesSet.add(0x01000000+0x10D1);
+ extendedKeyCodesSet.add(0x01000000+0x10D2);
+ extendedKeyCodesSet.add(0x01000000+0x10D3);
+ extendedKeyCodesSet.add(0x01000000+0x10D4);
+ extendedKeyCodesSet.add(0x01000000+0x10D5);
+ extendedKeyCodesSet.add(0x01000000+0x10D6);
+ extendedKeyCodesSet.add(0x01000000+0x10D7);
+ extendedKeyCodesSet.add(0x01000000+0x10D8);
+ extendedKeyCodesSet.add(0x01000000+0x10D9);
+ extendedKeyCodesSet.add(0x01000000+0x10DA);
+ extendedKeyCodesSet.add(0x01000000+0x10DB);
+ extendedKeyCodesSet.add(0x01000000+0x10DC);
+ extendedKeyCodesSet.add(0x01000000+0x10DD);
+ extendedKeyCodesSet.add(0x01000000+0x10DE);
+ extendedKeyCodesSet.add(0x01000000+0x10DF);
+ extendedKeyCodesSet.add(0x01000000+0x10E0);
+ extendedKeyCodesSet.add(0x01000000+0x10E1);
+ extendedKeyCodesSet.add(0x01000000+0x10E2);
+ extendedKeyCodesSet.add(0x01000000+0x10E3);
+ extendedKeyCodesSet.add(0x01000000+0x10E4);
+ extendedKeyCodesSet.add(0x01000000+0x10E5);
+ extendedKeyCodesSet.add(0x01000000+0x10E6);
+ extendedKeyCodesSet.add(0x01000000+0x10E7);
+ extendedKeyCodesSet.add(0x01000000+0x10E8);
+ extendedKeyCodesSet.add(0x01000000+0x10E9);
+ extendedKeyCodesSet.add(0x01000000+0x10EA);
+ extendedKeyCodesSet.add(0x01000000+0x10EB);
+ extendedKeyCodesSet.add(0x01000000+0x10EC);
+ extendedKeyCodesSet.add(0x01000000+0x10ED);
+ extendedKeyCodesSet.add(0x01000000+0x10EE);
+ extendedKeyCodesSet.add(0x01000000+0x10EF);
+ extendedKeyCodesSet.add(0x01000000+0x10F0);
+ extendedKeyCodesSet.add(0x01000000+0x01E7);
+ extendedKeyCodesSet.add(0x01000000+0x0259);
+ extendedKeyCodesSet.add(0x01000000+0x1EB9);
+ extendedKeyCodesSet.add(0x01000000+0x1ECB);
+ extendedKeyCodesSet.add(0x01000000+0x1ECD);
+ extendedKeyCodesSet.add(0x01000000+0x1EE5);
+ extendedKeyCodesSet.add(0x01000000+0x01A1);
+ extendedKeyCodesSet.add(0x01000000+0x01B0);
+ extendedKeyCodesSet.add(0x01000000+0x20AB);
+ }
+}
--- a/jdk/src/share/classes/sun/awt/HeadlessToolkit.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/awt/HeadlessToolkit.java Mon Apr 27 12:33:57 2009 -0700
@@ -179,9 +179,9 @@
throw new HeadlessException();
}
- public KeyboardFocusManagerPeer createKeyboardFocusManagerPeer(KeyboardFocusManager manager) throws HeadlessException {
- KeyboardFocusManagerPeerImpl peer = new KeyboardFocusManagerPeerImpl(manager);
- return peer;
+ public KeyboardFocusManagerPeer createKeyboardFocusManagerPeer(KeyboardFocusManager manager)
+ throws HeadlessException {
+ throw new HeadlessException();
}
public TrayIconPeer createTrayIcon(TrayIcon target)
--- a/jdk/src/share/classes/sun/awt/KeyboardFocusManagerPeerImpl.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/awt/KeyboardFocusManagerPeerImpl.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,47 +27,150 @@
import java.awt.Component;
import java.awt.KeyboardFocusManager;
import java.awt.Window;
+import java.awt.Canvas;
+import java.awt.Scrollbar;
+import java.awt.Panel;
+
+import java.awt.event.FocusEvent;
import java.awt.peer.KeyboardFocusManagerPeer;
+import java.awt.peer.ComponentPeer;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import java.util.logging.Level;
+import java.util.logging.Logger;
-public class KeyboardFocusManagerPeerImpl implements KeyboardFocusManagerPeer {
- static native Window getNativeFocusedWindow();
- static native Component getNativeFocusOwner();
- static native void clearNativeGlobalFocusOwner(Window activeWindow);
+public abstract class KeyboardFocusManagerPeerImpl implements KeyboardFocusManagerPeer {
+
+ private static final Logger focusLog = Logger.getLogger("sun.awt.focus.KeyboardFocusManagerPeerImpl");
+
+ private static AWTAccessor.KeyboardFocusManagerAccessor kfmAccessor =
+ AWTAccessor.getKeyboardFocusManagerAccessor();
- KeyboardFocusManagerPeerImpl(KeyboardFocusManager manager) {
+ // The constants are copied from java.awt.KeyboardFocusManager
+ public static final int SNFH_FAILURE = 0;
+ public static final int SNFH_SUCCESS_HANDLED = 1;
+ public static final int SNFH_SUCCESS_PROCEED = 2;
+
+ protected KeyboardFocusManager manager;
+
+ public KeyboardFocusManagerPeerImpl(KeyboardFocusManager manager) {
+ this.manager = manager;
}
- public Window getCurrentFocusedWindow() {
- return getNativeFocusedWindow();
+ @Override
+ public void clearGlobalFocusOwner(Window activeWindow) {
+ if (activeWindow != null) {
+ Component focusOwner = activeWindow.getFocusOwner();
+ if (focusLog.isLoggable(Level.FINE)) focusLog.fine("Clearing global focus owner " + focusOwner);
+ if (focusOwner != null) {
+ FocusEvent fl = new CausedFocusEvent(focusOwner, FocusEvent.FOCUS_LOST, false, null,
+ CausedFocusEvent.Cause.CLEAR_GLOBAL_FOCUS_OWNER);
+ SunToolkit.postPriorityEvent(fl);
+ }
+ }
}
- public void setCurrentFocusOwner(Component comp) {
+ /*
+ * WARNING: Don't call it on the Toolkit thread.
+ *
+ * Checks if the component:
+ * 1) accepts focus on click (in general)
+ * 2) may be a focus owner (in particular)
+ */
+ public static boolean shouldFocusOnClick(Component component) {
+ boolean acceptFocusOnClick = false;
+
+ // A component is generally allowed to accept focus on click
+ // if its peer is focusable. There're some exceptions though.
+
+
+ // CANVAS & SCROLLBAR accept focus on click
+ if (component instanceof Canvas ||
+ component instanceof Scrollbar)
+ {
+ acceptFocusOnClick = true;
+
+ // PANEL, empty only, accepts focus on click
+ } else if (component instanceof Panel) {
+ acceptFocusOnClick = (((Panel)component).getComponentCount() == 0);
+
+
+ // Other components
+ } else {
+ ComponentPeer peer = (component != null ? component.getPeer() : null);
+ acceptFocusOnClick = (peer != null ? peer.isFocusable() : false);
+ }
+ return acceptFocusOnClick &&
+ AWTAccessor.getComponentAccessor().canBeFocusOwner(component);
}
- public Component getCurrentFocusOwner() {
- return getNativeFocusOwner();
- }
- public void clearGlobalFocusOwner(Window activeWindow) {
- clearNativeGlobalFocusOwner(activeWindow);
+ /*
+ * Posts proper lost/gain focus events to the event queue.
+ */
+ public static boolean deliverFocus(Component lightweightChild,
+ Component target,
+ boolean temporary,
+ boolean focusedWindowChangeAllowed,
+ long time,
+ CausedFocusEvent.Cause cause,
+ Component currentFocusOwner) // provided by the descendant peers
+ {
+ if (lightweightChild == null) {
+ lightweightChild = (Component)target;
+ }
+
+ Component currentOwner = currentFocusOwner;
+ if (currentOwner != null && currentOwner.getPeer() == null) {
+ currentOwner = null;
+ }
+ if (currentOwner != null) {
+ FocusEvent fl = new CausedFocusEvent(currentOwner, FocusEvent.FOCUS_LOST,
+ false, lightweightChild, cause);
+
+ if (focusLog.isLoggable(Level.FINER)) focusLog.finer("Posting focus event: " + fl);
+ SunToolkit.postPriorityEvent(fl);
+ }
+
+ FocusEvent fg = new CausedFocusEvent(lightweightChild, FocusEvent.FOCUS_GAINED,
+ false, currentOwner, cause);
+
+ if (focusLog.isLoggable(Level.FINER)) focusLog.finer("Posting focus event: " + fg);
+ SunToolkit.postPriorityEvent(fg);
+ return true;
}
- static Method m_removeLastFocusRequest = null;
+ // WARNING: Don't call it on the Toolkit thread.
+ public static boolean requestFocusFor(Component target, CausedFocusEvent.Cause cause) {
+ return AWTAccessor.getComponentAccessor().requestFocus(target, cause);
+ }
+
+ // WARNING: Don't call it on the Toolkit thread.
+ public static int shouldNativelyFocusHeavyweight(Component heavyweight,
+ Component descendant,
+ boolean temporary,
+ boolean focusedWindowChangeAllowed,
+ long time,
+ CausedFocusEvent.Cause cause)
+ {
+ return kfmAccessor.shouldNativelyFocusHeavyweight(
+ heavyweight, descendant, temporary, focusedWindowChangeAllowed, time, cause);
+ }
+
public static void removeLastFocusRequest(Component heavyweight) {
- try {
- if (m_removeLastFocusRequest == null) {
- m_removeLastFocusRequest = SunToolkit.getMethod(KeyboardFocusManager.class, "removeLastFocusRequest",
- new Class[] {Component.class});
- }
- m_removeLastFocusRequest.invoke(null, new Object[]{heavyweight});
- } catch (InvocationTargetException ite) {
- ite.printStackTrace();
- } catch (IllegalAccessException ex) {
- ex.printStackTrace();
- }
+ kfmAccessor.removeLastFocusRequest(heavyweight);
+ }
+
+ // WARNING: Don't call it on the Toolkit thread.
+ public static boolean processSynchronousLightweightTransfer(Component heavyweight,
+ Component descendant,
+ boolean temporary,
+ boolean focusedWindowChangeAllowed,
+ long time)
+ {
+ return kfmAccessor.processSynchronousLightweightTransfer(
+ heavyweight, descendant, temporary, focusedWindowChangeAllowed, time);
}
}
--- a/jdk/src/share/classes/sun/awt/NullComponentPeer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/awt/NullComponentPeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -278,19 +278,6 @@
throw new UnsupportedOperationException();
}
- /**
- * @see java.awt.peer.ContainerPeer#restack
- */
- public void restack() {
- throw new UnsupportedOperationException();
- }
-
- /**
- * @see java.awt.peer.ContainerPeer#isRestackSupported
- */
- public boolean isRestackSupported() {
- return false;
- }
public void layout() {
}
@@ -305,4 +292,19 @@
*/
public void applyShape(Region shape) {
}
+
+ /**
+ * Lowers this component at the bottom of the above HW peer. If the above parameter
+ * is null then the method places this component at the top of the Z-order.
+ */
+ public void setZOrder(ComponentPeer above) {
+ }
+
+ public void updateGraphicsData(GraphicsConfiguration gc) {}
+
+ public GraphicsConfiguration getAppropriateGraphicsConfiguration(
+ GraphicsConfiguration gc)
+ {
+ return gc;
+ }
}
--- a/jdk/src/share/classes/sun/awt/SunToolkit.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/awt/SunToolkit.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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,14 +32,10 @@
import java.awt.peer.*;
import java.awt.event.WindowEvent;
import java.awt.event.KeyEvent;
-import java.awt.im.spi.InputMethodDescriptor;
import java.awt.image.*;
-import java.awt.geom.AffineTransform;
import java.awt.TrayIcon;
import java.awt.SystemTray;
-import java.io.*;
import java.net.URL;
-import java.net.JarURLConnection;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
@@ -49,7 +45,6 @@
import sun.misc.SoftCache;
import sun.font.FontDesignMetrics;
import sun.awt.im.InputContext;
-import sun.awt.im.SimpleInputMethodWindow;
import sun.awt.image.*;
import sun.security.action.GetPropertyAction;
import sun.security.action.GetBooleanAction;
@@ -225,10 +220,8 @@
public abstract RobotPeer createRobot(Robot target, GraphicsDevice screen)
throws AWTException;
- public KeyboardFocusManagerPeer createKeyboardFocusManagerPeer(KeyboardFocusManager manager) throws HeadlessException {
- KeyboardFocusManagerPeerImpl peer = new KeyboardFocusManagerPeerImpl(manager);
- return peer;
- }
+ public abstract KeyboardFocusManagerPeer createKeyboardFocusManagerPeer(KeyboardFocusManager manager)
+ throws HeadlessException;
/**
* The AWT lock is typically only used on Unix platforms to synchronize
@@ -824,16 +817,31 @@
}
/**
- * Disables erasing of background on the canvas before painting
- * if this is supported by the current toolkit.
- *
- * @throws IllegalStateException if the canvas is not displayable
- * @see java.awt.Component#isDisplayable
+ * Disables erasing of background on the canvas before painting if
+ * this is supported by the current toolkit. It is recommended to
+ * call this method early, before the Canvas becomes displayable,
+ * because some Toolkit implementations do not support changing
+ * this property once the Canvas becomes displayable.
*/
public void disableBackgroundErase(Canvas canvas) {
- if (!canvas.isDisplayable()) {
- throw new IllegalStateException("Canvas must have a valid peer");
- }
+ disableBackgroundEraseImpl(canvas);
+ }
+
+ /**
+ * Disables the native erasing of the background on the given
+ * component before painting if this is supported by the current
+ * toolkit. This only has an effect for certain components such as
+ * Canvas, Panel and Window. It is recommended to call this method
+ * early, before the Component becomes displayable, because some
+ * Toolkit implementations do not support changing this property
+ * once the Component becomes displayable.
+ */
+ public void disableBackgroundErase(Component component) {
+ disableBackgroundEraseImpl(component);
+ }
+
+ private void disableBackgroundEraseImpl(Component component) {
+ AWTAccessor.getComponentAccessor().setBackgroundEraseDisabled(component, true);
}
/**
@@ -1972,6 +1980,18 @@
AWTAutoShutdown.getInstance().dumpPeers(aLog);
}
+ /**
+ * Returns the <code>Window</code> ancestor of the component <code>comp</code>.
+ * @return Window ancestor of the component or component by itself if it is Window;
+ * null, if component is not a part of window hierarchy
+ */
+ public static Window getContainingWindow(Component comp) {
+ while (comp != null && !(comp instanceof Window)) {
+ comp = comp.getParent();
+ }
+ return (Window)comp;
+ }
+
private static Boolean sunAwtDisableMixing = null;
/**
@@ -1995,6 +2015,73 @@
public boolean isNativeGTKAvailable() {
return false;
}
+
+ // Cosntant alpha
+ public boolean isWindowOpacitySupported() {
+ return false;
+ }
+
+ // Shaping
+ public boolean isWindowShapingSupported() {
+ return false;
+ }
+
+ // Per-pixel alpha
+ public boolean isWindowTranslucencySupported() {
+ return false;
+ }
+
+ public boolean isTranslucencyCapable(GraphicsConfiguration gc) {
+ return false;
+ }
+
+ /**
+ * Returns whether or not a containing top level window for the passed
+ * component is
+ * {@link com.sun.awt.AWTUtilities.Translucency#PERPIXEL_TRANSLUCENT PERPIXEL_TRANSLUCENT}.
+ *
+ * @param c a Component which toplevel's to check
+ * @return {@code true} if the passed component is not null and has a
+ * containing toplevel window which is opaque (so per-pixel translucency
+ * is not enabled), {@code false} otherwise
+ * @see com.sun.awt.AWTUtilities.Translucency#PERPIXEL_TRANSLUCENT
+ * @see com.sun.awt.AWTUtilities#isWindowOpaque(Window)
+ */
+ public static boolean isContainingTopLevelOpaque(Component c) {
+ Window w = getContainingWindow(c);
+ // return w != null && (w).isOpaque();
+ return w != null && com.sun.awt.AWTUtilities.isWindowOpaque(w);
+ }
+
+ /**
+ * Returns whether or not a containing top level window for the passed
+ * component is
+ * {@link com.sun.awt.AWTUtilities.Translucency#TRANSLUCENT TRANSLUCENT}.
+ *
+ * @param c a Component which toplevel's to check
+ * @return {@code true} if the passed component is not null and has a
+ * containing toplevel window which has opacity less than
+ * 1.0f (which means that it is translucent), {@code false} otherwise
+ * @see com.sun.awt.AWTUtilities.Translucency#TRANSLUCENT
+ * @see com.sun.awt.AWTUtilities#getWindowOpacity(Window)
+ */
+ public static boolean isContainingTopLevelTranslucent(Component c) {
+ Window w = getContainingWindow(c);
+ // return w != null && (w).getOpacity() < 1.0f;
+ return w != null && com.sun.awt.AWTUtilities.getWindowOpacity((Window)w) < 1.0f;
+ }
+
+ /**
+ * Returns whether the native system requires using the peer.updateWindow()
+ * method to update the contents of a non-opaque window, or if usual
+ * painting procedures are sufficient. The default return value covers
+ * the X11 systems. On MS Windows this method is overriden in WToolkit
+ * to return true.
+ */
+ public boolean needUpdateWindow() {
+ return false;
+ }
+
} // class SunToolkit
--- a/jdk/src/share/classes/sun/awt/shell/ShellFolder.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/awt/shell/ShellFolder.java Mon Apr 27 12:33:57 2009 -0700
@@ -31,6 +31,7 @@
import java.io.*;
import java.io.FileNotFoundException;
import java.util.*;
+import java.util.concurrent.Callable;
/**
* @author Michael Martak
@@ -461,6 +462,35 @@
return null;
}
+ private static Invoker invoker;
+
+ /**
+ * Provides the single access point to the {@link Invoker}. It is guaranteed that the value
+ * returned by this method will be always the same.
+ *
+ * @return the singleton instance of {@link Invoker}
+ */
+ public static Invoker getInvoker() {
+ if (invoker == null) {
+ invoker = shellFolderManager.createInvoker();
+ }
+ return invoker;
+ }
+
+ /**
+ * Interface allowing to invoke tasks in different environments on different platforms.
+ */
+ public static interface Invoker {
+ /**
+ * Invokes a callable task. If the {@code task} throws a checked exception,
+ * it will be wrapped into a {@link RuntimeException}
+ *
+ * @param task a task to invoke
+ * @return the result of {@code task}'s invokation
+ */
+ <T> T invoke(Callable<T> task);
+ }
+
/**
* Provides a default comparator for the default column set
*/
--- a/jdk/src/share/classes/sun/awt/shell/ShellFolderManager.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/awt/shell/ShellFolderManager.java Mon Apr 27 12:33:57 2009 -0700
@@ -27,6 +27,7 @@
import java.io.File;
import java.io.FileNotFoundException;
+import java.util.concurrent.Callable;
/**
* @author Michael Martak
@@ -96,9 +97,23 @@
}
public boolean isFileSystemRoot(File dir) {
- if (dir instanceof ShellFolder && !((ShellFolder)dir).isFileSystem()) {
+ if (dir instanceof ShellFolder && !((ShellFolder) dir).isFileSystem()) {
return false;
}
return (dir.getParentFile() == null);
}
+
+ protected ShellFolder.Invoker createInvoker() {
+ return new DirectInvoker();
+ }
+
+ private static class DirectInvoker implements ShellFolder.Invoker {
+ public <T> T invoke(Callable<T> task) {
+ try {
+ return task.call();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
}
--- a/jdk/src/share/classes/sun/beans/editors/ColorEditor.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/beans/editors/ColorEditor.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -29,6 +29,8 @@
import java.beans.*;
public class ColorEditor extends Panel implements PropertyEditor {
+ private static final long serialVersionUID = 1781257185164716054L;
+
public ColorEditor() {
setLayout(null);
--- a/jdk/src/share/classes/sun/beans/editors/FontEditor.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/beans/editors/FontEditor.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -29,6 +29,7 @@
import java.beans.*;
public class FontEditor extends Panel implements java.beans.PropertyEditor {
+ private static final long serialVersionUID = 6732704486002715933L;
public FontEditor() {
setLayout(null);
--- a/jdk/src/share/classes/sun/misc/Launcher.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/misc/Launcher.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1998-2009 Sun Microsystems, Inc. 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
@@ -120,7 +120,10 @@
* The class loader used for loading installed extensions.
*/
static class ExtClassLoader extends URLClassLoader {
- private File[] dirs;
+
+ static {
+ ClassLoader.registerAsParallelCapable();
+ }
/**
* create an ExtClassLoader. The ExtClassLoader is created
@@ -146,12 +149,12 @@
}
});
} catch (java.security.PrivilegedActionException e) {
- throw (IOException) e.getException();
+ throw (IOException) e.getException();
}
}
void addExtURL(URL url) {
- super.addURL(url);
+ super.addURL(url);
}
/*
@@ -159,7 +162,6 @@
*/
public ExtClassLoader(File[] dirs) throws IOException {
super(getExtURLs(dirs), null, factory);
- this.dirs = dirs;
}
private static File[] getExtDirs() {
@@ -206,20 +208,27 @@
*/
public String findLibrary(String name) {
name = System.mapLibraryName(name);
- for (int i = 0; i < dirs.length; i++) {
- // Look in architecture-specific subdirectory first
- String arch = System.getProperty("os.arch");
- if (arch != null) {
- File file = new File(new File(dirs[i], arch), name);
+ URL[] urls = super.getURLs();
+ File prevDir = null;
+ for (int i = 0; i < urls.length; i++) {
+ // Get the ext directory from the URL
+ File dir = new File(urls[i].getPath()).getParentFile();
+ if (dir != null && !dir.equals(prevDir)) {
+ // Look in architecture-specific subdirectory first
+ String arch = System.getProperty("os.arch");
+ if (arch != null) {
+ File file = new File(new File(dir, arch), name);
+ if (file.exists()) {
+ return file.getAbsolutePath();
+ }
+ }
+ // Then check the extension directory
+ File file = new File(dir, name);
if (file.exists()) {
return file.getAbsolutePath();
}
}
- // Then check the extension directory
- File file = new File(dirs[i], name);
- if (file.exists()) {
- return file.getAbsolutePath();
- }
+ prevDir = dir;
}
return null;
}
@@ -248,6 +257,10 @@
*/
static class AppClassLoader extends URLClassLoader {
+ static {
+ ClassLoader.registerAsParallelCapable();
+ }
+
public static ClassLoader getAppClassLoader(final ClassLoader extcl)
throws IOException
{
@@ -281,7 +294,7 @@
/**
* Override loadClass so we can checkPackageAccess.
*/
- public synchronized Class loadClass(String name, boolean resolve)
+ public Class loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
int i = name.lastIndexOf('.');
--- a/jdk/src/share/classes/sun/net/spi/DefaultProxySelector.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/net/spi/DefaultProxySelector.java Mon Apr 27 12:33:57 2009 -0700
@@ -78,7 +78,6 @@
};
private static boolean hasSystemProxies = false;
- private static Properties defprops = new Properties();
static {
final String key = "java.net.useSystemProxies";
@@ -107,6 +106,9 @@
RegexpPool hostsPool;
String property;
+ static NonProxyInfo ftpNonProxyInfo = new NonProxyInfo("ftp.nonProxyHosts", null, null);
+ static NonProxyInfo httpNonProxyInfo = new NonProxyInfo("http.nonProxyHosts", null, null);
+
NonProxyInfo(String p, String s, RegexpPool pool) {
property = p;
hostsSource = s;
@@ -114,8 +116,6 @@
}
}
- private static NonProxyInfo ftpNonProxyInfo = new NonProxyInfo("ftp.nonProxyHosts", null, null);
- private static NonProxyInfo httpNonProxyInfo = new NonProxyInfo("http.nonProxyHosts", null, null);
/**
* select() method. Where all the hard work is done.
@@ -175,13 +175,13 @@
NonProxyInfo pinfo = null;
if ("http".equalsIgnoreCase(protocol)) {
- pinfo = httpNonProxyInfo;
+ pinfo = NonProxyInfo.httpNonProxyInfo;
} else if ("https".equalsIgnoreCase(protocol)) {
// HTTPS uses the same property as HTTP, for backward
// compatibility
- pinfo = httpNonProxyInfo;
+ pinfo = NonProxyInfo.httpNonProxyInfo;
} else if ("ftp".equalsIgnoreCase(protocol)) {
- pinfo = ftpNonProxyInfo;
+ pinfo = NonProxyInfo.ftpNonProxyInfo;
}
/**
@@ -334,7 +334,6 @@
}
}
- private static final Pattern p6 = Pattern.compile("::1|(0:){7}1|(0:){1,6}:1");
private boolean isLoopback(String host) {
if (host == null || host.length() == 0)
return false;
@@ -364,6 +363,7 @@
}
if (host.endsWith(":1")) {
+ final Pattern p6 = Pattern.compile("::1|(0:){7}1|(0:){1,6}:1");
return p6.matcher(host).matches();
}
return false;
--- a/jdk/src/share/classes/sun/nio/ch/AsynchronousServerSocketChannelImpl.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/nio/ch/AsynchronousServerSocketChannelImpl.java Mon Apr 27 12:33:57 2009 -0700
@@ -37,6 +37,7 @@
import java.util.Collections;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
+import sun.net.NetHooks;
/**
* Base implementation of AsynchronousServerSocketChannel.
@@ -131,6 +132,7 @@
synchronized (stateLock) {
if (localAddress != null)
throw new AlreadyBoundException();
+ NetHooks.beforeTcpBind(fd, isa.getAddress(), isa.getPort());
Net.bind(fd, isa.getAddress(), isa.getPort());
Net.listen(fd, backlog < 1 ? 50 : backlog);
localAddress = Net.localAddress(fd);
--- a/jdk/src/share/classes/sun/nio/ch/AsynchronousSocketChannelImpl.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/nio/ch/AsynchronousSocketChannelImpl.java Mon Apr 27 12:33:57 2009 -0700
@@ -38,6 +38,7 @@
import java.util.Collections;
import java.util.concurrent.*;
import java.util.concurrent.locks.*;
+import sun.net.NetHooks;
/**
* Base implementation of AsynchronousSocketChannel
@@ -387,6 +388,7 @@
throw new AlreadyBoundException();
InetSocketAddress isa = (local == null) ?
new InetSocketAddress(0) : Net.checkAddress(local);
+ NetHooks.beforeTcpBind(fd, isa.getAddress(), isa.getPort());
Net.bind(fd, isa.getAddress(), isa.getPort());
localAddress = Net.localAddress(fd);
}
--- a/jdk/src/share/classes/sun/nio/ch/DatagramChannelImpl.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/nio/ch/DatagramChannelImpl.java Mon Apr 27 12:33:57 2009 -0700
@@ -313,11 +313,9 @@
throw new NullPointerException();
synchronized (readLock) {
ensureOpen();
- // If socket is not bound then behave as if nothing received
- // Will be fixed by 6621699
- if (localAddress() == null) {
- return null;
- }
+ // Socket was not bound before attempting receive
+ if (localAddress() == null)
+ bind(null);
int n = 0;
ByteBuffer bb = null;
try {
--- a/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java Mon Apr 27 12:33:57 2009 -0700
@@ -128,9 +128,10 @@
throw new NonReadableChannelException();
synchronized (positionLock) {
int n = 0;
- int ti = threads.add();
+ int ti = -1;
try {
begin();
+ ti = threads.add();
if (!isOpen())
return 0;
do {
@@ -151,9 +152,10 @@
throw new NonReadableChannelException();
synchronized (positionLock) {
long n = 0;
- int ti = threads.add();
+ int ti = -1;
try {
begin();
+ ti = threads.add();
if (!isOpen())
return 0;
do {
@@ -183,9 +185,10 @@
throw new NonWritableChannelException();
synchronized (positionLock) {
int n = 0;
- int ti = threads.add();
+ int ti = -1;
try {
begin();
+ ti = threads.add();
if (!isOpen())
return 0;
do {
@@ -206,9 +209,10 @@
throw new NonWritableChannelException();
synchronized (positionLock) {
long n = 0;
- int ti = threads.add();
+ int ti = -1;
try {
begin();
+ ti = threads.add();
if (!isOpen())
return 0;
do {
@@ -239,9 +243,10 @@
ensureOpen();
synchronized (positionLock) {
long p = -1;
- int ti = threads.add();
+ int ti = -1;
try {
begin();
+ ti = threads.add();
if (!isOpen())
return 0;
do {
@@ -262,9 +267,10 @@
throw new IllegalArgumentException();
synchronized (positionLock) {
long p = -1;
- int ti = threads.add();
+ int ti = -1;
try {
begin();
+ ti = threads.add();
if (!isOpen())
return null;
do {
@@ -283,9 +289,10 @@
ensureOpen();
synchronized (positionLock) {
long s = -1;
- int ti = threads.add();
+ int ti = -1;
try {
begin();
+ ti = threads.add();
if (!isOpen())
return -1;
do {
@@ -311,9 +318,10 @@
synchronized (positionLock) {
int rv = -1;
long p = -1;
- int ti = threads.add();
+ int ti = -1;
try {
begin();
+ ti = threads.add();
if (!isOpen())
return null;
@@ -350,9 +358,10 @@
public void force(boolean metaData) throws IOException {
ensureOpen();
int rv = -1;
- int ti = threads.add();
+ int ti = -1;
try {
begin();
+ ti = threads.add();
if (!isOpen())
return;
do {
@@ -406,9 +415,10 @@
return IOStatus.UNSUPPORTED;
long n = -1;
- int ti = threads.add();
+ int ti = -1;
try {
begin();
+ ti = threads.add();
if (!isOpen())
return -1;
do {
@@ -612,9 +622,10 @@
throw new NonReadableChannelException();
ensureOpen();
int n = 0;
- int ti = threads.add();
+ int ti = -1;
try {
begin();
+ ti = threads.add();
if (!isOpen())
return -1;
do {
@@ -637,9 +648,10 @@
throw new NonWritableChannelException();
ensureOpen();
int n = 0;
- int ti = threads.add();
+ int ti = -1;
try {
begin();
+ ti = threads.add();
if (!isOpen())
return -1;
do {
@@ -731,9 +743,10 @@
throw new NonReadableChannelException();
long addr = -1;
- int ti = threads.add();
+ int ti = -1;
try {
begin();
+ ti = threads.add();
if (!isOpen())
return null;
if (size() < position + size) { // Extend file size
@@ -900,9 +913,10 @@
FileLockTable flt = fileLockTable();
flt.add(fli);
boolean i = true;
- int ti = threads.add();
+ int ti = -1;
try {
begin();
+ ti = threads.add();
if (!isOpen())
return null;
int result = nd.lock(fd, true, position, size, shared);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/sun/nio/ch/SctpMessageInfoImpl.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,170 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package sun.nio.ch;
+
+import java.net.SocketAddress;
+import com.sun.nio.sctp.MessageInfo;
+import com.sun.nio.sctp.Association;
+
+/**
+ * An implementation of a MessageInfo.
+ */
+public class SctpMessageInfoImpl extends MessageInfo {
+ private final SocketAddress address;
+ private final int bytes; /* 0 */
+
+ private Association association;
+ private int assocId;
+ private int streamNumber;
+ private boolean complete = true;
+ private boolean unordered; /* false */
+ private long timeToLive; /* 0L */
+ private int ppid; /* 0 */
+
+ public SctpMessageInfoImpl(Association association,
+ SocketAddress address,
+ int streamNumber) {
+ this.association = association;
+ this.address = address;
+ this.streamNumber = streamNumber;
+ bytes = 0;
+ }
+
+ /* Invoked from native */
+ private SctpMessageInfoImpl(int assocId,
+ SocketAddress address,
+ int bytes,
+ int streamNumber,
+ boolean complete,
+ boolean unordered,
+ int ppid) {
+ this.assocId = assocId;
+ this.address = address;
+ this.bytes = bytes;
+ this.streamNumber = streamNumber;
+ this.complete = complete;
+ this.unordered = unordered;
+ this.ppid = ppid;
+ }
+
+ @Override
+ public Association association() {
+ return association;
+ }
+
+ /**
+ * SctpMessageInfoImpl instances created from native will need to have their
+ * association set from the channel.
+ */
+ void setAssociation(Association association) {
+ this.association = association;
+ }
+
+ int associationID() {
+ return assocId;
+ }
+
+ @Override
+ public SocketAddress address() {
+ return address;
+ }
+
+ @Override
+ public int bytes() {
+ return bytes;
+ }
+
+ @Override
+ public int streamNumber() {
+ return streamNumber;
+ }
+
+ @Override
+ public MessageInfo streamNumber(int streamNumber) {
+ if (streamNumber < 0 || streamNumber > 65536)
+ throw new IllegalArgumentException("Invalid stream number");
+
+ this.streamNumber = streamNumber;
+ return this;
+ }
+
+ @Override
+ public int payloadProtocolID() {
+ return ppid;
+ }
+
+ @Override
+ public MessageInfo payloadProtocolID(int ppid) {
+ this.ppid = ppid;
+ return this;
+ }
+
+ @Override
+ public boolean isComplete() {
+ return complete;
+ }
+
+ @Override
+ public MessageInfo complete(boolean complete) {
+ this.complete = complete;
+ return this;
+ }
+
+ @Override
+ public boolean isUnordered() {
+ return unordered;
+ }
+
+ @Override
+ public MessageInfo unordered(boolean unordered) {
+ this.unordered = unordered;
+ return this;
+ }
+
+ @Override
+ public long timeToLive() {
+ return timeToLive;
+ }
+
+ @Override
+ public MessageInfo timeToLive(long millis) {
+ timeToLive = millis;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder(super.toString());
+ sb.append( "[Address: ").append(address)
+ .append(", Association: ").append(association)
+ .append(", Assoc ID: ").append(assocId)
+ .append(", Bytes: ").append(bytes)
+ .append(", Stream Number: ").append(streamNumber)
+ .append(", Complete: ").append(complete)
+ .append(", isUnordered: ").append(unordered)
+ .append("]");
+ return sb.toString();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/sun/nio/ch/SctpStdSocketOption.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package sun.nio.ch;
+
+import com.sun.nio.sctp.SctpSocketOption;
+
+public class SctpStdSocketOption<T>
+ implements SctpSocketOption<T>
+{
+ /* for native mapping of int options */
+ public static final int SCTP_DISABLE_FRAGMENTS = 1;
+ public static final int SCTP_EXPLICIT_COMPLETE = 2;
+ public static final int SCTP_FRAGMENT_INTERLEAVE = 3;
+ public static final int SCTP_NODELAY = 4;
+ public static final int SO_SNDBUF = 5;
+ public static final int SO_RCVBUF = 6;
+ public static final int SO_LINGER = 7;
+
+ private final String name;
+ private final Class<T> type;
+
+ /* for native mapping of int options */
+ private int constValue;
+
+ public SctpStdSocketOption(String name, Class<T> type) {
+ this.name = name;
+ this.type = type;
+ }
+
+ public SctpStdSocketOption(String name, Class<T> type, int constValue) {
+ this.name = name;
+ this.type = type;
+ this.constValue = constValue;
+ }
+
+ @Override
+ public String name() {
+ return name;
+ }
+
+ @Override
+ public Class<T> type() {
+ return type;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+
+ int constValue() {
+ return constValue;
+ }
+}
--- a/jdk/src/share/classes/sun/nio/ch/SelChImpl.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/nio/ch/SelChImpl.java Mon Apr 27 12:33:57 2009 -0700
@@ -25,6 +25,7 @@
package sun.nio.ch;
+import java.nio.channels.Channel;
import java.io.FileDescriptor;
import java.io.IOException;
@@ -35,7 +36,7 @@
* @since 1.4
*/
-interface SelChImpl {
+interface SelChImpl extends Channel {
FileDescriptor getFD();
--- a/jdk/src/share/classes/sun/nio/ch/ServerSocketChannelImpl.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/nio/ch/ServerSocketChannelImpl.java Mon Apr 27 12:33:57 2009 -0700
@@ -31,6 +31,7 @@
import java.nio.channels.*;
import java.nio.channels.spi.*;
import java.util.*;
+import sun.net.NetHooks;
/**
@@ -191,6 +192,7 @@
SecurityManager sm = System.getSecurityManager();
if (sm != null)
sm.checkListen(isa.getPort());
+ NetHooks.beforeTcpBind(fd, isa.getAddress(), isa.getPort());
Net.bind(fd, isa.getAddress(), isa.getPort());
Net.listen(fd, backlog < 1 ? 50 : backlog);
synchronized (stateLock) {
--- a/jdk/src/share/classes/sun/nio/ch/SocketChannelImpl.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/nio/ch/SocketChannelImpl.java Mon Apr 27 12:33:57 2009 -0700
@@ -32,6 +32,7 @@
import java.nio.channels.*;
import java.nio.channels.spi.*;
import java.util.*;
+import sun.net.NetHooks;
/**
@@ -526,6 +527,7 @@
throw new AlreadyBoundException();
InetSocketAddress isa = (local == null) ?
new InetSocketAddress(0) : Net.checkAddress(local);
+ NetHooks.beforeTcpBind(fd, isa.getAddress(), isa.getPort());
Net.bind(fd, isa.getAddress(), isa.getPort());
localAddress = Net.localAddress(fd);
}
@@ -577,6 +579,12 @@
if (!isOpen()) {
return false;
}
+ // notify hook only if unbound
+ if (localAddress == null) {
+ NetHooks.beforeTcpConnect(fd,
+ isa.getAddress(),
+ isa.getPort());
+ }
readerThread = NativeThread.current();
}
for (;;) {
--- a/jdk/src/share/classes/sun/security/jca/ProviderConfig.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/security/jca/ProviderConfig.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -60,37 +60,6 @@
// use by doLoadProvider()
private final static Class[] CL_STRING = { String.class };
- // lock to use while loading a provider. it ensures that each provider
- // is loaded only once and that we can detect recursion.
- // NOTE that because of 4944382 we use the system classloader as lock.
- // By using the same lock to load classes as to load providers we avoid
- // deadlock due to lock ordering. However, this class may be initialized
- // early in the startup when the system classloader has not yet been set
- // up. Use a temporary lock object if that is the case.
- // Any of this may break if the class loading implementation is changed.
- private static volatile Object LOCK = new Object();
-
- private static Object getLock() {
- Object o = LOCK;
- // check if lock is already set to the class loader
- if (o instanceof ClassLoader) {
- return o;
- }
- Object cl = AccessController.doPrivileged(
- new PrivilegedAction<Object>() {
- public Object run() {
- return ClassLoader.getSystemClassLoader();
- }
- });
- // check if class loader initialized now (non-null)
- if (cl != null) {
- LOCK = cl;
- o = cl;
- }
- return o;
- }
-
-
// name of the provider class
private final String className;
@@ -194,7 +163,7 @@
/**
* Get the provider object. Loads the provider if it is not already loaded.
*/
- Provider getProvider() {
+ synchronized Provider getProvider() {
// volatile variable load
Provider p = provider;
if (p != null) {
@@ -203,30 +172,23 @@
if (shouldLoad() == false) {
return null;
}
- synchronized (getLock()) {
- p = provider;
- if (p != null) {
- // loaded by another thread while we were blocked on lock
- return p;
+ if (isLoading) {
+ // because this method is synchronized, this can only
+ // happen if there is recursion.
+ if (debug != null) {
+ debug.println("Recursion loading provider: " + this);
+ new Exception("Call trace").printStackTrace();
}
- if (isLoading) {
- // because this method is synchronized, this can only
- // happen if there is recursion.
- if (debug != null) {
- debug.println("Recursion loading provider: " + this);
- new Exception("Call trace").printStackTrace();
- }
- return null;
- }
- try {
- isLoading = true;
- tries++;
- p = doLoadProvider();
- } finally {
- isLoading = false;
- }
- provider = p;
+ return null;
}
+ try {
+ isLoading = true;
+ tries++;
+ p = doLoadProvider();
+ } finally {
+ isLoading = false;
+ }
+ provider = p;
return p;
}
--- a/jdk/src/share/classes/sun/security/tools/JarSigner.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/security/tools/JarSigner.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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,28 +32,44 @@
import java.math.BigInteger;
import java.net.URI;
import java.net.URISyntaxException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.net.SocketTimeoutException;
import java.text.Collator;
import java.text.MessageFormat;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import java.security.cert.CertificateException;
-import java.security.cert.CertificateExpiredException;
-import java.security.cert.CertificateNotYetValidException;
import java.security.*;
import java.lang.reflect.Constructor;
import com.sun.jarsigner.ContentSigner;
import com.sun.jarsigner.ContentSignerParameters;
+import java.net.SocketTimeoutException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.security.cert.CertPath;
+import java.security.cert.CertPathValidator;
+import java.security.cert.CertificateExpiredException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.CertificateNotYetValidException;
+import java.security.cert.PKIXParameters;
+import java.security.cert.TrustAnchor;
+import java.util.Map.Entry;
import sun.security.x509.*;
import sun.security.util.*;
import sun.misc.BASE64Encoder;
+
/**
* <p>The jarsigner utility.
*
+ * The exit codes for the main method are:
+ *
+ * 0: success
+ * 1: any error that the jar cannot be signed or verified, including:
+ * keystore loading error
+ * TSP communciation error
+ * jarsigner command line error...
+ * otherwise: error codes from -strict
+ *
* @author Roland Schemers
* @author Jan Luehe
*/
@@ -84,8 +100,6 @@
// Attention:
// This is the entry that get launched by the security tool jarsigner.
- // It's marked as exported private per AppServer Team's request.
- // See http://ccc.sfbay/6428446
public static void main(String args[]) throws Exception {
JarSigner js = new JarSigner();
js.run(args);
@@ -93,31 +107,32 @@
static final String VERSION = "1.0";
- static final int IN_KEYSTORE = 0x01;
+ static final int IN_KEYSTORE = 0x01; // signer is in keystore
static final int IN_SCOPE = 0x02;
-
- // signer's certificate chain (when composing)
- X509Certificate[] certChain;
+ static final int NOT_ALIAS = 0x04; // alias list is NOT empty and
+ // signer is not in alias list
+ static final int SIGNED_BY_ALIAS = 0x08; // signer is in alias list
- /*
- * private key
- */
- PrivateKey privateKey;
- KeyStore store;
+ X509Certificate[] certChain; // signer's cert chain (when composing)
+ PrivateKey privateKey; // private key
+ KeyStore store; // the keystore specified by -keystore
+ // or the default keystore, never null
IdentityScope scope;
String keystore; // key store file
boolean nullStream = false; // null keystore input stream (NONE)
boolean token = false; // token-based keystore
- String jarfile; // jar file to sign
+ String jarfile; // jar file to sign or verify
String alias; // alias to sign jar with
+ List<String> ckaliases = new ArrayList<String>(); // aliases in -verify
char[] storepass; // keystore password
boolean protectedPath; // protected authentication path
String storetype; // keystore type
String providerName; // provider name
Vector<String> providers = null; // list of providers
- HashMap<String,String> providerArgs = new HashMap<String, String>(); // arguments for provider constructors
+ // arguments for provider constructors
+ HashMap<String,String> providerArgs = new HashMap<String, String>();
char[] keypass; // private key password
String sigfile; // name of .SF file
String sigalg; // name of signature algorithm
@@ -125,12 +140,14 @@
String signedjar; // output filename
String tsaUrl; // location of the Timestamping Authority
String tsaAlias; // alias for the Timestamping Authority's certificate
+ String altCertChain; // file to read alternative cert chain from
boolean verify = false; // verify the jar
- boolean verbose = false; // verbose output when signing/verifying
+ String verbose = null; // verbose output when signing/verifying
boolean showcerts = false; // show certs when verifying
boolean debug = false; // debug
boolean signManifest = true; // "sign" the whole manifest
boolean externalSF = true; // leave the .SF out of the PKCS7 block
+ boolean strict = false; // treat warnings as error
// read zip entry raw bytes
private ByteArrayOutputStream baos = new ByteArrayOutputStream(2048);
@@ -139,14 +156,22 @@
private String altSignerClass = null;
private String altSignerClasspath = null;
private ZipFile zipFile = null;
+
private boolean hasExpiredCert = false;
private boolean hasExpiringCert = false;
private boolean notYetValidCert = false;
-
+ private boolean chainNotValidated = false;
+ private boolean notSignedByAlias = false;
+ private boolean aliasNotInStore = false;
+ private boolean hasUnsignedEntry = false;
private boolean badKeyUsage = false;
private boolean badExtendedKeyUsage = false;
private boolean badNetscapeCertType = false;
+ CertificateFactory certificateFactory;
+ CertPathValidator validator;
+ PKIXParameters pkixParameters;
+
public void run(String args[]) {
try {
parseArgs(args);
@@ -184,14 +209,6 @@
}
}
- hasExpiredCert = false;
- hasExpiringCert = false;
- notYetValidCert = false;
-
- badKeyUsage = false;
- badExtendedKeyUsage = false;
- badNetscapeCertType = false;
-
if (verify) {
try {
loadKeyStore(keystore, false);
@@ -238,6 +255,29 @@
storepass = null;
}
}
+
+ if (strict) {
+ int exitCode = 0;
+ if (hasExpiringCert) {
+ exitCode |= 2;
+ }
+ if (chainNotValidated) {
+ // hasExpiredCert and notYetValidCert included in this case
+ exitCode |= 4;
+ }
+ if (badKeyUsage || badExtendedKeyUsage || badNetscapeCertType) {
+ exitCode |= 8;
+ }
+ if (hasUnsignedEntry) {
+ exitCode |= 16;
+ }
+ if (notSignedByAlias || aliasNotInStore) {
+ exitCode |= 32;
+ }
+ if (exitCode != 0) {
+ System.exit(exitCode);
+ }
+ }
}
/*
@@ -247,25 +287,26 @@
/* parse flags */
int n = 0;
- for (n=0; (n < args.length) && args[n].startsWith("-"); n++) {
+ if (args.length == 0) fullusage();
+ for (n=0; n < args.length; n++) {
String flags = args[n];
if (collator.compare(flags, "-keystore") == 0) {
- if (++n == args.length) usage();
+ if (++n == args.length) usageNoArg();
keystore = args[n];
} else if (collator.compare(flags, "-storepass") ==0) {
- if (++n == args.length) usage();
+ if (++n == args.length) usageNoArg();
storepass = args[n].toCharArray();
} else if (collator.compare(flags, "-storetype") ==0) {
- if (++n == args.length) usage();
+ if (++n == args.length) usageNoArg();
storetype = args[n];
} else if (collator.compare(flags, "-providerName") ==0) {
- if (++n == args.length) usage();
+ if (++n == args.length) usageNoArg();
providerName = args[n];
} else if ((collator.compare(flags, "-provider") == 0) ||
(collator.compare(flags, "-providerClass") == 0)) {
- if (++n == args.length) usage();
+ if (++n == args.length) usageNoArg();
if (providers == null) {
providers = new Vector<String>(3);
}
@@ -274,35 +315,38 @@
if (args.length > (n+1)) {
flags = args[n+1];
if (collator.compare(flags, "-providerArg") == 0) {
- if (args.length == (n+2)) usage();
+ if (args.length == (n+2)) usageNoArg();
providerArgs.put(args[n], args[n+2]);
n += 2;
}
}
} else if (collator.compare(flags, "-protected") ==0) {
protectedPath = true;
+ } else if (collator.compare(flags, "-certchain") ==0) {
+ if (++n == args.length) usageNoArg();
+ altCertChain = args[n];
} else if (collator.compare(flags, "-debug") ==0) {
debug = true;
} else if (collator.compare(flags, "-keypass") ==0) {
- if (++n == args.length) usage();
+ if (++n == args.length) usageNoArg();
keypass = args[n].toCharArray();
} else if (collator.compare(flags, "-sigfile") ==0) {
- if (++n == args.length) usage();
+ if (++n == args.length) usageNoArg();
sigfile = args[n];
} else if (collator.compare(flags, "-signedjar") ==0) {
- if (++n == args.length) usage();
+ if (++n == args.length) usageNoArg();
signedjar = args[n];
} else if (collator.compare(flags, "-tsa") ==0) {
- if (++n == args.length) usage();
+ if (++n == args.length) usageNoArg();
tsaUrl = args[n];
} else if (collator.compare(flags, "-tsacert") ==0) {
- if (++n == args.length) usage();
+ if (++n == args.length) usageNoArg();
tsaAlias = args[n];
} else if (collator.compare(flags, "-altsigner") ==0) {
- if (++n == args.length) usage();
+ if (++n == args.length) usageNoArg();
altSignerClass = args[n];
} else if (collator.compare(flags, "-altsignerpath") ==0) {
- if (++n == args.length) usage();
+ if (++n == args.length) usageNoArg();
altSignerClasspath = args[n];
} else if (collator.compare(flags, "-sectionsonly") ==0) {
signManifest = false;
@@ -311,30 +355,56 @@
} else if (collator.compare(flags, "-verify") ==0) {
verify = true;
} else if (collator.compare(flags, "-verbose") ==0) {
- verbose = true;
+ verbose = "all";
+ } else if (collator.compare(flags, "-verbose:all") ==0) {
+ verbose = "all";
+ } else if (collator.compare(flags, "-verbose:summary") ==0) {
+ verbose = "summary";
+ } else if (collator.compare(flags, "-verbose:grouped") ==0) {
+ verbose = "grouped";
} else if (collator.compare(flags, "-sigalg") ==0) {
- if (++n == args.length) usage();
+ if (++n == args.length) usageNoArg();
sigalg = args[n];
} else if (collator.compare(flags, "-digestalg") ==0) {
- if (++n == args.length) usage();
+ if (++n == args.length) usageNoArg();
digestalg = args[n];
} else if (collator.compare(flags, "-certs") ==0) {
showcerts = true;
+ } else if (collator.compare(flags, "-strict") ==0) {
+ strict = true;
} else if (collator.compare(flags, "-h") == 0 ||
collator.compare(flags, "-help") == 0) {
- usage();
+ fullusage();
} else {
- System.err.println(rb.getString("Illegal option: ") + flags);
- usage();
+ if (!flags.startsWith("-")) {
+ if (jarfile == null) {
+ jarfile = flags;
+ } else {
+ alias = flags;
+ ckaliases.add(alias);
+ }
+ } else {
+ System.err.println(
+ rb.getString("Illegal option: ") + flags);
+ usage();
+ }
}
}
- if (n == args.length) usage();
- jarfile = args[n++];
+ // -certs must always be specified with -verbose
+ if (verbose == null) showcerts = false;
- if (!verify) {
- if (n == args.length) usage();
- alias = args[n++];
+ if (jarfile == null) {
+ System.err.println(rb.getString("Please specify jarfile name"));
+ usage();
+ }
+ if (!verify && alias == null) {
+ System.err.println(rb.getString("Please specify alias name"));
+ usage();
+ }
+ if (!verify && ckaliases.size() > 1) {
+ System.err.println(rb.getString("Only one alias can be specified"));
+ usage();
}
if (storetype == null) {
@@ -357,7 +427,6 @@
if (token && !nullStream) {
System.err.println(MessageFormat.format(rb.getString
("-keystore must be NONE if -storetype is {0}"), storetype));
- System.err.println();
usage();
}
@@ -365,7 +434,6 @@
System.err.println(MessageFormat.format(rb.getString
("-keypass can not be specified " +
"if -storetype is {0}"), storetype));
- System.err.println();
usage();
}
@@ -374,7 +442,6 @@
System.err.println(rb.getString
("If -protected is specified, " +
"then -storepass and -keypass must not be specified"));
- System.err.println();
usage();
}
}
@@ -383,17 +450,27 @@
System.err.println(rb.getString
("If keystore is not password protected, " +
"then -storepass and -keypass must not be specified"));
- System.err.println();
usage();
}
}
}
+ void usageNoArg() {
+ System.out.println(rb.getString("Option lacks argument"));
+ usage();
+ }
+
void usage() {
+ System.out.println();
+ System.out.println(rb.getString("Please type jarsigner -help for usage"));
+ System.exit(1);
+ }
+
+ void fullusage() {
System.out.println(rb.getString
("Usage: jarsigner [options] jar-file alias"));
System.out.println(rb.getString
- (" jarsigner -verify [options] jar-file"));
+ (" jarsigner -verify [options] jar-file [alias...]"));
System.out.println();
System.out.println(rb.getString
("[-keystore <url>] keystore location"));
@@ -408,6 +485,9 @@
("[-keypass <password>] password for private key (if different)"));
System.out.println();
System.out.println(rb.getString
+ ("[-certchain <file>] name of alternative certchain file"));
+ System.out.println();
+ System.out.println(rb.getString
("[-sigfile <file>] name of .SF/.DSA file"));
System.out.println();
System.out.println(rb.getString
@@ -423,7 +503,9 @@
("[-verify] verify a signed JAR file"));
System.out.println();
System.out.println(rb.getString
- ("[-verbose] verbose output when signing/verifying"));
+ ("[-verbose[:suboptions]] verbose output when signing/verifying."));
+ System.out.println(rb.getString
+ (" suboptions can be all, grouped or summary"));
System.out.println();
System.out.println(rb.getString
("[-certs] display certificates when verbose and verifying"));
@@ -457,15 +539,17 @@
System.out.println(rb.getString
(" [-providerArg <arg>]] ... master class file and constructor argument"));
System.out.println();
+ System.out.println(rb.getString
+ ("[-strict] treat warnings as errors"));
+ System.out.println();
- System.exit(1);
+ System.exit(0);
}
void verifyJar(String jarName)
throws Exception
{
- boolean anySigned = false;
- boolean hasUnsignedEntry = false;
+ boolean anySigned = false; // if there exists entry inside jar signed
JarFile jf = null;
try {
@@ -494,11 +578,18 @@
Manifest man = jf.getManifest();
+ // The map to record display info, only used when -verbose provided
+ // key: signer info string
+ // value: the list of files with common key
+ Map<String,List<String>> output =
+ new LinkedHashMap<String,List<String>>();
+
if (man != null) {
- if (verbose) System.out.println();
+ if (verbose != null) System.out.println();
Enumeration<JarEntry> e = entriesVec.elements();
long now = System.currentTimeMillis();
+ String tab = rb.getString(" ");
while (e.hasMoreElements()) {
JarEntry je = e.nextElement();
@@ -509,77 +600,118 @@
hasUnsignedEntry |= !je.isDirectory() && !isSigned
&& !signatureRelated(name);
- if (verbose) {
- int inStoreOrScope = inKeyStore(signers);
- boolean inStore = (inStoreOrScope & IN_KEYSTORE) != 0;
- boolean inScope = (inStoreOrScope & IN_SCOPE) != 0;
+ int inStoreOrScope = inKeyStore(signers);
+
+ boolean inStore = (inStoreOrScope & IN_KEYSTORE) != 0;
+ boolean inScope = (inStoreOrScope & IN_SCOPE) != 0;
+
+ notSignedByAlias |= (inStoreOrScope & NOT_ALIAS) != 0;
+ aliasNotInStore |= isSigned && (!inStore && !inScope);
+
+ // Only used when -verbose provided
+ StringBuffer sb = null;
+ if (verbose != null) {
+ sb = new StringBuffer();
boolean inManifest =
((man.getAttributes(name) != null) ||
(man.getAttributes("./"+name) != null) ||
(man.getAttributes("/"+name) != null));
- System.out.print(
+ sb.append(
(isSigned ? rb.getString("s") : rb.getString(" ")) +
(inManifest ? rb.getString("m") : rb.getString(" ")) +
(inStore ? rb.getString("k") : rb.getString(" ")) +
(inScope ? rb.getString("i") : rb.getString(" ")) +
- rb.getString(" "));
- StringBuffer sb = new StringBuffer();
- String s = Long.toString(je.getSize());
- for (int i = 6 - s.length(); i > 0; --i) {
- sb.append(' ');
- }
- sb.append(s).append(' ').
- append(new Date(je.getTime()).toString());
- sb.append(' ').append(je.getName());
- System.out.println(sb.toString());
+ ((inStoreOrScope & NOT_ALIAS) != 0 ?"X":" ") +
+ rb.getString(" "));
+ sb.append("|");
+ }
- if (signers != null && showcerts) {
- String tab = rb.getString(" ");
- for (int i = 0; i < signers.length; i++) {
- System.out.println();
- List<? extends Certificate> certs =
- signers[i].getSignerCertPath()
- .getCertificates();
- // display the signature timestamp, if present
- Timestamp timestamp = signers[i].getTimestamp();
- if (timestamp != null) {
- System.out.println(
- printTimestamp(tab, timestamp));
- }
- // display the certificate(s)
- for (Certificate c : certs) {
- System.out.println(
- printCert(tab, c, true, now));
- }
+ // When -certs provided, display info has extra empty
+ // lines at the beginning and end.
+ if (isSigned) {
+ if (showcerts) sb.append('\n');
+ for (CodeSigner signer: signers) {
+ // signerInfo() must be called even if -verbose
+ // not provided. The method updates various
+ // warning flags.
+ String si = signerInfo(signer, tab, now);
+ if (showcerts) {
+ sb.append(si);
+ sb.append('\n');
}
- System.out.println();
}
-
- }
- if (isSigned) {
- for (int i = 0; i < signers.length; i++) {
- Certificate cert =
- signers[i].getSignerCertPath()
- .getCertificates().get(0);
- if (cert instanceof X509Certificate) {
- checkCertUsage((X509Certificate)cert, null);
- if (!showcerts) {
- long notAfter = ((X509Certificate)cert)
- .getNotAfter().getTime();
-
- if (notAfter < now) {
- hasExpiredCert = true;
- } else if (notAfter < now + SIX_MONTHS) {
- hasExpiringCert = true;
- }
- }
- }
+ } else if (showcerts && !verbose.equals("all")) {
+ // Print no info for unsigned entries when -verbose:all,
+ // to be consistent with old behavior.
+ if (signatureRelated(name)) {
+ sb.append("\n" + tab + rb.getString(
+ "(Signature related entries)") + "\n\n");
+ } else {
+ sb.append("\n" + tab + rb.getString(
+ "(Unsigned entries)") + "\n\n");
}
}
+ if (verbose != null) {
+ String label = sb.toString();
+ if (signatureRelated(name)) {
+ // Entries inside META-INF and other unsigned
+ // entries are grouped separately.
+ label = "-" + label.substring(1);
+ }
+
+ // The label finally contains 2 parts separated by '|':
+ // The legend displayed before the entry names, and
+ // the cert info (if -certs specfied).
+
+ if (!output.containsKey(label)) {
+ output.put(label, new ArrayList<String>());
+ }
+
+ StringBuffer fb = new StringBuffer();
+ String s = Long.toString(je.getSize());
+ for (int i = 6 - s.length(); i > 0; --i) {
+ fb.append(' ');
+ }
+ fb.append(s).append(' ').
+ append(new Date(je.getTime()).toString());
+ fb.append(' ').append(name);
+
+ output.get(label).add(fb.toString());
+ }
}
}
- if (verbose) {
+ if (verbose != null) {
+ for (Entry<String,List<String>> s: output.entrySet()) {
+ List<String> files = s.getValue();
+ String key = s.getKey();
+ if (key.charAt(0) == '-') { // the signature-related group
+ key = ' ' + key.substring(1);
+ }
+ int pipe = key.indexOf('|');
+ if (verbose.equals("all")) {
+ for (String f: files) {
+ System.out.println(key.substring(0, pipe) + f);
+ System.out.printf(key.substring(pipe+1));
+ }
+ } else {
+ if (verbose.equals("grouped")) {
+ for (String f: files) {
+ System.out.println(key.substring(0, pipe) + f);
+ }
+ } else if (verbose.equals("summary")) {
+ System.out.print(key.substring(0, pipe));
+ if (files.size() > 1) {
+ System.out.println(files.get(0) + " " +
+ String.format(rb.getString(
+ "(and %d more)"), files.size()-1));
+ } else {
+ System.out.println(files.get(0));
+ }
+ }
+ System.out.printf(key.substring(pipe+1));
+ }
+ }
System.out.println();
System.out.println(rb.getString(
" s = signature was verified "));
@@ -589,9 +721,12 @@
" k = at least one certificate was found in keystore"));
System.out.println(rb.getString(
" i = at least one certificate was found in identity scope"));
+ if (ckaliases.size() > 0) {
+ System.out.println((
+ " X = not signed by specified alias(es)"));
+ }
System.out.println();
}
-
if (man == null)
System.out.println(rb.getString("no manifest."));
@@ -602,7 +737,8 @@
System.out.println(rb.getString("jar verified."));
if (hasUnsignedEntry || hasExpiredCert || hasExpiringCert ||
badKeyUsage || badExtendedKeyUsage || badNetscapeCertType ||
- notYetValidCert) {
+ notYetValidCert || chainNotValidated ||
+ aliasNotInStore || notSignedByAlias) {
System.out.println();
System.out.println(rb.getString("Warning: "));
@@ -638,14 +774,27 @@
"This jar contains entries whose signer certificate is not yet valid. "));
}
- if (! (verbose && showcerts)) {
+ if (chainNotValidated) {
+ System.out.println(
+ rb.getString("This jar contains entries whose certificate chain is not validated."));
+ }
+
+ if (notSignedByAlias) {
+ System.out.println(
+ rb.getString("This jar contains signed entries which is not signed by the specified alias(es)."));
+ }
+
+ if (aliasNotInStore) {
+ System.out.println(rb.getString("This jar contains signed entries that's not signed by alias in this keystore."));
+ }
+ if (! (verbose != null && showcerts)) {
System.out.println();
System.out.println(rb.getString(
"Re-run with the -verbose and -certs options for more details."));
}
}
}
- System.exit(0);
+ return;
} catch (Exception e) {
System.out.println(rb.getString("jarsigner: ") + e);
if (debug) {
@@ -660,15 +809,6 @@
System.exit(1);
}
- /*
- * Display some details about a certificate:
- *
- * <cert-type> [", " <subject-DN>] [" (" <keystore-entry-alias> ")"]
- */
- String printCert(Certificate c) {
- return printCert("", c, false, 0);
- }
-
private static MessageFormat validityTimeForm = null;
private static MessageFormat notYetTimeForm = null;
private static MessageFormat expiredTimeForm = null;
@@ -679,6 +819,8 @@
*
* [<tab>] <cert-type> [", " <subject-DN>] [" (" <keystore-entry-alias> ")"]
* [<validity-period> | <expiry-warning>]
+ *
+ * Note: no newline character at the end
*/
String printCert(String tab, Certificate c, boolean checkValidityPeriod,
long now) {
@@ -788,54 +930,75 @@
.append(signTimeForm.format(source)).append("]").toString();
}
+ private Map<CodeSigner,Integer> cacheForInKS =
+ new IdentityHashMap<CodeSigner,Integer>();
+
+ private int inKeyStoreForOneSigner(CodeSigner signer) {
+ if (cacheForInKS.containsKey(signer)) {
+ return cacheForInKS.get(signer);
+ }
+
+ boolean found = false;
+ int result = 0;
+ List<? extends Certificate> certs = signer.getSignerCertPath().getCertificates();
+ for (Certificate c : certs) {
+ String alias = storeHash.get(c);
+ if (alias != null) {
+ if (alias.startsWith("(")) {
+ result |= IN_KEYSTORE;
+ } else if (alias.startsWith("[")) {
+ result |= IN_SCOPE;
+ }
+ if (ckaliases.contains(alias.substring(1, alias.length() - 1))) {
+ result |= SIGNED_BY_ALIAS;
+ }
+ } else {
+ if (store != null) {
+ try {
+ alias = store.getCertificateAlias(c);
+ } catch (KeyStoreException kse) {
+ // never happens, because keystore has been loaded
+ }
+ if (alias != null) {
+ storeHash.put(c, "(" + alias + ")");
+ found = true;
+ result |= IN_KEYSTORE;
+ }
+ }
+ if (!found && (scope != null)) {
+ Identity id = scope.getIdentity(c.getPublicKey());
+ if (id != null) {
+ result |= IN_SCOPE;
+ storeHash.put(c, "[" + id.getName() + "]");
+ }
+ }
+ if (ckaliases.contains(alias)) {
+ result |= SIGNED_BY_ALIAS;
+ }
+ }
+ }
+ cacheForInKS.put(signer, result);
+ return result;
+ }
+
Hashtable<Certificate, String> storeHash =
new Hashtable<Certificate, String>();
int inKeyStore(CodeSigner[] signers) {
- int result = 0;
if (signers == null)
return 0;
- boolean found = false;
-
- for (int i = 0; i < signers.length; i++) {
- found = false;
- List<? extends Certificate> certs =
- signers[i].getSignerCertPath().getCertificates();
-
- for (Certificate c : certs) {
- String alias = storeHash.get(c);
+ int output = 0;
- if (alias != null) {
- if (alias.startsWith("("))
- result |= IN_KEYSTORE;
- else if (alias.startsWith("["))
- result |= IN_SCOPE;
- } else {
- if (store != null) {
- try {
- alias = store.getCertificateAlias(c);
- } catch (KeyStoreException kse) {
- // never happens, because keystore has been loaded
- }
- if (alias != null) {
- storeHash.put(c, "("+alias+")");
- found = true;
- result |= IN_KEYSTORE;
- }
- }
- if (!found && (scope != null)) {
- Identity id = scope.getIdentity(c.getPublicKey());
- if (id != null) {
- result |= IN_SCOPE;
- storeHash.put(c, "["+id.getName()+"]");
- }
- }
- }
- }
+ for (CodeSigner signer: signers) {
+ int result = inKeyStoreForOneSigner(signer);
+ output |= result;
}
- return result;
+ if (ckaliases.size() > 0 && (output & SIGNED_BY_ALIAS) == 0) {
+ output |= NOT_ALIAS;
+ }
+ return output;
}
void signJar(String jarName, String alias, String[] args)
@@ -1025,7 +1188,7 @@
// manifest file has new length
mfFile = new ZipEntry(JarFile.MANIFEST_NAME);
}
- if (verbose) {
+ if (verbose != null) {
if (mfCreated) {
System.out.println(rb.getString(" adding: ") +
mfFile.getName());
@@ -1076,7 +1239,7 @@
// signature file
zos.putNextEntry(sfFile);
sf.write(zos);
- if (verbose) {
+ if (verbose != null) {
if (zipFile.getEntry(sfFilename) != null) {
System.out.println(rb.getString(" updating: ") +
sfFilename);
@@ -1086,7 +1249,7 @@
}
}
- if (verbose) {
+ if (verbose != null) {
if (tsaUrl != null || tsaCert != null) {
System.out.println(
rb.getString("requesting a signature timestamp"));
@@ -1101,8 +1264,8 @@
System.out.println(rb.getString("TSA location: ") +
certUrl);
}
- System.out.println(
- rb.getString("TSA certificate: ") + printCert(tsaCert));
+ System.out.println(rb.getString("TSA certificate: ") +
+ printCert("", tsaCert, false, 0));
}
if (signingMechanism != null) {
System.out.println(
@@ -1113,7 +1276,7 @@
// signature block file
zos.putNextEntry(bkFile);
block.write(zos);
- if (verbose) {
+ if (verbose != null) {
if (zipFile.getEntry(bkFilename) != null) {
System.out.println(rb.getString(" updating: ") +
bkFilename);
@@ -1140,7 +1303,7 @@
ZipEntry ze = enum_.nextElement();
if (!ze.getName().startsWith(META_INF)) {
- if (verbose) {
+ if (verbose != null) {
if (manifest.getAttributes(ze.getName()) != null)
System.out.println(rb.getString(" signing: ") +
ze.getName());
@@ -1194,7 +1357,8 @@
}
if (hasExpiredCert || hasExpiringCert || notYetValidCert
- || badKeyUsage || badExtendedKeyUsage || badNetscapeCertType) {
+ || badKeyUsage || badExtendedKeyUsage
+ || badNetscapeCertType || chainNotValidated) {
System.out.println();
System.out.println(rb.getString("Warning: "));
@@ -1223,6 +1387,11 @@
System.out.println(
rb.getString("The signer certificate is not yet valid."));
}
+
+ if (chainNotValidated) {
+ System.out.println(
+ rb.getString("The signer's certificate chain is not validated."));
+ }
}
// no IOException thrown in the above try clause, so disable
@@ -1274,6 +1443,40 @@
return false;
}
+ Map<CodeSigner,String> cacheForSignerInfo = new IdentityHashMap<CodeSigner,String>();
+
+ /**
+ * Returns a string of singer info, with a newline at the end
+ */
+ private String signerInfo(CodeSigner signer, String tab, long now) {
+ if (cacheForSignerInfo.containsKey(signer)) {
+ return cacheForSignerInfo.get(signer);
+ }
+ StringBuffer s = new StringBuffer();
+ List<? extends Certificate> certs = signer.getSignerCertPath().getCertificates();
+ // display the signature timestamp, if present
+ Timestamp timestamp = signer.getTimestamp();
+ if (timestamp != null) {
+ s.append(printTimestamp(tab, timestamp));
+ }
+ // display the certificate(s)
+ for (Certificate c : certs) {
+ s.append(printCert(tab, c, true, now));
+ s.append('\n');
+ }
+ try {
+ CertPath cp = certificateFactory.generateCertPath(certs);
+ validator.validate(cp, pkixParameters);
+ } catch (Exception e) {
+ chainNotValidated = true;
+ s.append(tab + rb.getString("[CertPath not validated: ") +
+ e.getLocalizedMessage() + "]\n"); // TODO
+ }
+ String result = s.toString();
+ cacheForSignerInfo.put(signer, result);
+ return result;
+ }
+
private void writeEntry(ZipFile zf, ZipOutputStream os, ZipEntry ze)
throws IOException
{
@@ -1360,6 +1563,48 @@
}
}
}
+ Set<TrustAnchor> tas = new HashSet<TrustAnchor>();
+ try {
+ KeyStore caks = KeyTool.getCacertsKeyStore();
+ if (caks != null) {
+ Enumeration<String> aliases = caks.aliases();
+ while (aliases.hasMoreElements()) {
+ String a = aliases.nextElement();
+ try {
+ tas.add(new TrustAnchor((X509Certificate)caks.getCertificate(a), null));
+ } catch (Exception e2) {
+ // ignore, when a SecretkeyEntry does not include a cert
+ }
+ }
+ }
+ } catch (Exception e) {
+ // Ignore, if cacerts cannot be loaded
+ }
+ if (store != null) {
+ Enumeration<String> aliases = store.aliases();
+ while (aliases.hasMoreElements()) {
+ String a = aliases.nextElement();
+ try {
+ X509Certificate c = (X509Certificate)store.getCertificate(a);
+ // Only add TrustedCertificateEntry and self-signed
+ // PrivateKeyEntry
+ if (store.isCertificateEntry(a) ||
+ c.getSubjectDN().equals(c.getIssuerDN())) {
+ tas.add(new TrustAnchor(c, null));
+ }
+ } catch (Exception e2) {
+ // ignore, when a SecretkeyEntry does not include a cert
+ }
+ }
+ }
+ certificateFactory = CertificateFactory.getInstance("X.509");
+ validator = CertPathValidator.getInstance("PKIX");
+ try {
+ pkixParameters = new PKIXParameters(tas);
+ pkixParameters.setRevocationEnabled(false);
+ } catch (InvalidAlgorithmParameterException ex) {
+ // Only if tas is empty
+ }
} catch (IOException ioe) {
throw new RuntimeException(rb.getString("keystore load: ") +
ioe.getMessage());
@@ -1408,7 +1653,8 @@
void checkCertUsage(X509Certificate userCert, boolean[] bad) {
// Can act as a signer?
- // 1. if KeyUsage, then [0] should be true
+ // 1. if KeyUsage, then [0:digitalSignature] or
+ // [1:nonRepudiation] should be true
// 2. if ExtendedKeyUsage, then should contains ANY or CODE_SIGNING
// 3. if NetscapeCertType, then should contains OBJECT_SIGNING
// 1,2,3 must be true
@@ -1419,10 +1665,10 @@
boolean[] keyUsage = userCert.getKeyUsage();
if (keyUsage != null) {
- if (keyUsage.length < 1 || !keyUsage[0]) {
+ keyUsage = Arrays.copyOf(keyUsage, 9);
+ if (!keyUsage[0] && !keyUsage[1]) {
if (bad != null) {
bad[0] = true;
- } else {
badKeyUsage = true;
}
}
@@ -1435,7 +1681,6 @@
&& !xKeyUsage.contains("1.3.6.1.5.5.7.3.3")) { // codeSigning
if (bad != null) {
bad[1] = true;
- } else {
badExtendedKeyUsage = true;
}
}
@@ -1462,7 +1707,6 @@
if (!val) {
if (bad != null) {
bad[2] = true;
- } else {
badNetscapeCertType = true;
}
}
@@ -1477,19 +1721,36 @@
Key key = null;
try {
-
java.security.cert.Certificate[] cs = null;
-
- try {
- cs = store.getCertificateChain(alias);
- } catch (KeyStoreException kse) {
- // this never happens, because keystore has been loaded
+ if (altCertChain != null) {
+ try {
+ cs = CertificateFactory.getInstance("X.509").
+ generateCertificates(new FileInputStream(altCertChain)).
+ toArray(new Certificate[0]);
+ } catch (CertificateException ex) {
+ error(rb.getString("Cannot restore certchain from file specified"));
+ } catch (FileNotFoundException ex) {
+ error(rb.getString("File specified by -certchain does not exist"));
+ }
+ } else {
+ try {
+ cs = store.getCertificateChain(alias);
+ } catch (KeyStoreException kse) {
+ // this never happens, because keystore has been loaded
+ }
}
- if (cs == null) {
- MessageFormat form = new MessageFormat(rb.getString
- ("Certificate chain not found for: alias. alias must reference a valid KeyStore key entry containing a private key and corresponding public key certificate chain."));
- Object[] source = {alias, alias};
- error(form.format(source));
+ if (cs == null || cs.length == 0) {
+ if (altCertChain != null) {
+ error(rb.getString
+ ("Certificate chain not found in the file specified."));
+ } else {
+ MessageFormat form = new MessageFormat(rb.getString
+ ("Certificate chain not found for: alias. alias must" +
+ " reference a valid KeyStore key entry containing a" +
+ " private key and corresponding public key certificate chain."));
+ Object[] source = {alias, alias};
+ error(form.format(source));
+ }
}
certChain = new X509Certificate[cs.length];
@@ -1501,56 +1762,15 @@
certChain[i] = (X509Certificate)cs[i];
}
- // order the cert chain if necessary (put user cert first,
- // root-cert last in the chain)
- X509Certificate userCert
- = (X509Certificate)store.getCertificate(alias);
-
- // check validity of signer certificate
- try {
- userCert.checkValidity();
-
- if (userCert.getNotAfter().getTime() <
- System.currentTimeMillis() + SIX_MONTHS) {
-
- hasExpiringCert = true;
- }
- } catch (CertificateExpiredException cee) {
- hasExpiredCert = true;
-
- } catch (CertificateNotYetValidException cnyve) {
- notYetValidCert = true;
- }
-
- checkCertUsage(userCert, null);
+ // We don't meant to print anything, the next call
+ // checks validity and keyUsage etc
+ printCert("", certChain[0], true, 0);
- if (!userCert.equals(certChain[0])) {
- // need to order ...
- X509Certificate[] certChainTmp
- = new X509Certificate[certChain.length];
- certChainTmp[0] = userCert;
- Principal issuer = userCert.getIssuerDN();
- for (int i=1; i<certChain.length; i++) {
- int j;
- // look for the cert whose subject corresponds to the
- // given issuer
- for (j=0; j<certChainTmp.length; j++) {
- if (certChainTmp[j] == null)
- continue;
- Principal subject = certChainTmp[j].getSubjectDN();
- if (issuer.equals(subject)) {
- certChain[i] = certChainTmp[j];
- issuer = certChainTmp[j].getIssuerDN();
- certChainTmp[j] = null;
- break;
- }
- }
- if (j == certChainTmp.length) {
- error(rb.getString("incomplete certificate chain"));
- }
-
- }
- certChain = certChainTmp; // ordered
+ try {
+ CertPath cp = certificateFactory.generateCertPath(Arrays.asList(certChain));
+ validator.validate(cp, pkixParameters);
+ } catch (Exception e) {
+ chainNotValidated = true;
}
try {
--- a/jdk/src/share/classes/sun/security/tools/JarSignerResources.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/security/tools/JarSignerResources.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2005 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2000-2009 Sun Microsystems, Inc. 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
@@ -54,8 +54,8 @@
"If keystore is not password protected, then -storepass and -keypass must not be specified"},
{"Usage: jarsigner [options] jar-file alias",
"Usage: jarsigner [options] jar-file alias"},
- {" jarsigner -verify [options] jar-file",
- " jarsigner -verify [options] jar-file"},
+ {" jarsigner -verify [options] jar-file [alias...]",
+ " jarsigner -verify [options] jar-file [alias...]"},
{"[-keystore <url>] keystore location",
"[-keystore <url>] keystore location"},
{"[-storepass <password>] password for keystore integrity",
@@ -64,6 +64,8 @@
"[-storetype <type>] keystore type"},
{"[-keypass <password>] password for private key (if different)",
"[-keypass <password>] password for private key (if different)"},
+ {"[-certchain <file>] name of alternative certchain file",
+ "[-certchain <file>] name of alternative certchain file"},
{"[-sigfile <file>] name of .SF/.DSA file",
"[-sigfile <file>] name of .SF/.DSA file"},
{"[-signedjar <file>] name of signed JAR file",
@@ -74,8 +76,10 @@
"[-sigalg <algorithm>] name of signature algorithm"},
{"[-verify] verify a signed JAR file",
"[-verify] verify a signed JAR file"},
- {"[-verbose] verbose output when signing/verifying",
- "[-verbose] verbose output when signing/verifying"},
+ {"[-verbose[:suboptions]] verbose output when signing/verifying.",
+ "[-verbose[:suboptions]] verbose output when signing/verifying."},
+ {" suboptions can be all, grouped or summary",
+ " suboptions can be all, grouped or summary"},
{"[-certs] display certificates when verbose and verifying",
"[-certs] display certificates when verbose and verifying"},
{"[-tsa <url>] location of the Timestamping Authority",
@@ -98,10 +102,22 @@
"[-providerClass <class> name of cryptographic service provider's"},
{" [-providerArg <arg>]] ... master class file and constructor argument",
" [-providerArg <arg>]] ... master class file and constructor argument"},
+ {"[-strict] treat warnings as errors",
+ "[-strict] treat warnings as errors"},
+ {"Option lacks argument", "Option lacks argument"},
+ {"Please type jarsigner -help for usage", "Please type jarsigner -help for usage"},
+ {"Please specify jarfile name", "Please specify jarfile name"},
+ {"Please specify alias name", "Please specify alias name"},
+ {"Only one alias can be specified", "Only one alias can be specified"},
+ {"This jar contains signed entries which is not signed by the specified alias(es).",
+ "This jar contains signed entries which is not signed by the specified alias(es)."},
+ {"This jar contains signed entries that's not signed by alias in this keystore.",
+ "This jar contains signed entries that's not signed by alias in this keystore."},
{"s", "s"},
{"m", "m"},
{"k", "k"},
{"i", "i"},
+ {"(and %d more)", "(and %d more)"},
{" s = signature was verified ",
" s = signature was verified "},
{" m = entry is listed in manifest",
@@ -110,7 +126,11 @@
" k = at least one certificate was found in keystore"},
{" i = at least one certificate was found in identity scope",
" i = at least one certificate was found in identity scope"},
+ {" X = not signed by specified alias(es)",
+ " X = not signed by specified alias(es)"},
{"no manifest.", "no manifest."},
+ {"(Signature related entries)","(Signature related entries)"},
+ {"(Unsigned entries)", "(Unsigned entries)"},
{"jar is unsigned. (signatures missing or not parsable)",
"jar is unsigned. (signatures missing or not parsable)"},
{"jar verified.", "jar verified."},
@@ -134,6 +154,12 @@
"unable to instantiate keystore class: "},
{"Certificate chain not found for: alias. alias must reference a valid KeyStore key entry containing a private key and corresponding public key certificate chain.",
"Certificate chain not found for: {0}. {1} must reference a valid KeyStore key entry containing a private key and corresponding public key certificate chain."},
+ {"File specified by -certchain does not exist",
+ "File specified by -certchain does not exist"},
+ {"Cannot restore certchain from file specified",
+ "Cannot restore certchain from file specified"},
+ {"Certificate chain not found in the file specified.",
+ "Certificate chain not found in the file specified."},
{"found non-X.509 certificate in signer's chain",
"found non-X.509 certificate in signer's chain"},
{"incomplete certificate chain", "incomplete certificate chain"},
@@ -149,6 +175,7 @@
{"certificate is not valid until",
"certificate is not valid until {0}"},
{"certificate will expire on", "certificate will expire on {0}"},
+ {"[CertPath not validated: ", "[CertPath not validated: "},
{"requesting a signature timestamp",
"requesting a signature timestamp"},
{"TSA location: ", "TSA location: "},
@@ -189,14 +216,18 @@
"The signer certificate's ExtendedKeyUsage extension doesn't allow code signing."},
{"The signer certificate's NetscapeCertType extension doesn't allow code signing.",
"The signer certificate's NetscapeCertType extension doesn't allow code signing."},
- {"This jar contains entries whose signer certificate's KeyUsage extension doesn't allow code signing.",
- "This jar contains entries whose signer certificate's KeyUsage extension doesn't allow code signing."},
- {"This jar contains entries whose signer certificate's ExtendedKeyUsage extension doesn't allow code signing.",
- "This jar contains entries whose signer certificate's ExtendedKeyUsage extension doesn't allow code signing."},
- {"This jar contains entries whose signer certificate's NetscapeCertType extension doesn't allow code signing.",
- "This jar contains entries whose signer certificate's NetscapeCertType extension doesn't allow code signing."},
+ {"This jar contains entries whose signer certificate's KeyUsage extension doesn't allow code signing.",
+ "This jar contains entries whose signer certificate's KeyUsage extension doesn't allow code signing."},
+ {"This jar contains entries whose signer certificate's ExtendedKeyUsage extension doesn't allow code signing.",
+ "This jar contains entries whose signer certificate's ExtendedKeyUsage extension doesn't allow code signing."},
+ {"This jar contains entries whose signer certificate's NetscapeCertType extension doesn't allow code signing.",
+ "This jar contains entries whose signer certificate's NetscapeCertType extension doesn't allow code signing."},
{"[{0} extension does not support code signing]",
"[{0} extension does not support code signing]"},
+ {"The signer's certificate chain is not validated.",
+ "The signer's certificate chain is not validated."},
+ {"This jar contains entries whose certificate chain is not validated.",
+ "This jar contains entries whose certificate chain is not validated."},
};
/**
--- a/jdk/src/share/classes/sun/security/tools/KeyTool.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/security/tools/KeyTool.java Mon Apr 27 12:33:57 2009 -0700
@@ -2545,7 +2545,19 @@
* Returns true if the certificate is self-signed, false otherwise.
*/
private boolean isSelfSigned(X509Certificate cert) {
- return cert.getSubjectDN().equals(cert.getIssuerDN());
+ return signedBy(cert, cert);
+ }
+
+ private boolean signedBy(X509Certificate end, X509Certificate ca) {
+ if (!ca.getSubjectDN().equals(end.getIssuerDN())) {
+ return false;
+ }
+ try {
+ end.verify(ca.getPublicKey());
+ return true;
+ } catch (Exception e) {
+ return false;
+ }
}
/**
@@ -2869,20 +2881,18 @@
Certificate tmpCert = replyCerts[0];
replyCerts[0] = replyCerts[i];
replyCerts[i] = tmpCert;
- Principal issuer = ((X509Certificate)replyCerts[0]).getIssuerDN();
+
+ X509Certificate thisCert = (X509Certificate)replyCerts[0];
for (i=1; i < replyCerts.length-1; i++) {
- // find a cert in the reply whose "subject" is the same as the
- // given "issuer"
+ // find a cert in the reply who signs thisCert
int j;
for (j=i; j<replyCerts.length; j++) {
- Principal subject;
- subject = ((X509Certificate)replyCerts[j]).getSubjectDN();
- if (subject.equals(issuer)) {
+ if (signedBy(thisCert, (X509Certificate)replyCerts[j])) {
tmpCert = replyCerts[i];
replyCerts[i] = replyCerts[j];
replyCerts[j] = tmpCert;
- issuer = ((X509Certificate)replyCerts[i]).getIssuerDN();
+ thisCert = (X509Certificate)replyCerts[i];
break;
}
}
@@ -2892,18 +2902,6 @@
}
}
- // now verify each cert in the ordered chain
- for (i=0; i<replyCerts.length-1; i++) {
- PublicKey pubKey = replyCerts[i+1].getPublicKey();
- try {
- replyCerts[i].verify(pubKey);
- } catch (Exception e) {
- throw new Exception(rb.getString
- ("Certificate chain in reply does not verify: ") +
- e.getMessage());
- }
- }
-
if (noprompt) {
return replyCerts;
}
@@ -3035,9 +3033,8 @@
private boolean buildChain(X509Certificate certToVerify,
Vector<Certificate> chain,
Hashtable<Principal, Vector<Certificate>> certs) {
- Principal subject = certToVerify.getSubjectDN();
Principal issuer = certToVerify.getIssuerDN();
- if (subject.equals(issuer)) {
+ if (isSelfSigned(certToVerify)) {
// reached self-signed root cert;
// no verification needed because it's trusted.
chain.addElement(certToVerify);
@@ -3108,7 +3105,7 @@
/**
* Returns the keystore with the configured CA certificates.
*/
- private KeyStore getCacertsKeyStore()
+ public static KeyStore getCacertsKeyStore()
throws Exception
{
String sep = File.separator;
--- a/jdk/src/share/classes/sun/security/util/ManifestEntryVerifier.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/security/util/ManifestEntryVerifier.java Mon Apr 27 12:33:57 2009 -0700
@@ -44,8 +44,6 @@
private static final Debug debug = Debug.getInstance("jar");
- private static final Provider digestProvider = Providers.getSunProvider();
-
/** the created digest objects */
HashMap<String, MessageDigest> createdDigests;
@@ -127,7 +125,7 @@
try {
digest = MessageDigest.getInstance
- (algorithm, digestProvider);
+ (algorithm, Providers.getSunProvider());
createdDigests.put(algorithm, digest);
} catch (NoSuchAlgorithmException nsae) {
// ignore
--- a/jdk/src/share/classes/sun/swing/FilePane.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/swing/FilePane.java Mon Apr 27 12:33:57 2009 -0700
@@ -34,6 +34,7 @@
import java.text.MessageFormat;
import java.util.*;
import java.util.List;
+import java.util.concurrent.Callable;
import javax.swing.*;
import javax.swing.border.*;
@@ -900,6 +901,16 @@
}
}
+ @Override
+ public void sort() {
+ ShellFolder.getInvoker().invoke(new Callable<Void>() {
+ public Void call() throws Exception {
+ DetailsTableRowSorter.super.sort();
+ return null;
+ }
+ });
+ }
+
public void modelStructureChanged() {
super.modelStructureChanged();
updateComparators(detailsTableModel.getColumns());
--- a/jdk/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java Mon Apr 27 12:33:57 2009 -0700
@@ -29,6 +29,8 @@
import java.beans.*;
import java.io.*;
import java.util.*;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import javax.swing.*;
import javax.swing.event.*;
@@ -749,7 +751,11 @@
File[] baseFolders;
if (useShellFolder) {
- baseFolders = (File[])ShellFolder.get("fileChooserComboBoxFolders");
+ baseFolders = AccessController.doPrivileged(new PrivilegedAction<File[]>() {
+ public File[] run() {
+ return (File[]) ShellFolder.get("fileChooserComboBoxFolders");
+ }
+ });
} else {
baseFolders = fsv.getRoots();
}
--- a/jdk/src/share/classes/sun/text/normalizer/CharTrie.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/text/normalizer/CharTrie.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Portions Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
+ * Portions Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,10 +22,9 @@
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
-
/*
*******************************************************************************
- * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved *
+ * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved *
* *
* The original version of this source code and documentation is copyrighted *
* and owned by IBM, These materials are provided under terms of a License *
@@ -78,6 +77,66 @@
}
/**
+ * Make a dummy CharTrie.
+ * A dummy trie is an empty runtime trie, used when a real data trie cannot
+ * be loaded.
+ *
+ * The trie always returns the initialValue,
+ * or the leadUnitValue for lead surrogate code points.
+ * The Latin-1 part is always set up to be linear.
+ *
+ * @param initialValue the initial value that is set for all code points
+ * @param leadUnitValue the value for lead surrogate code _units_ that do not
+ * have associated supplementary data
+ * @param dataManipulate object which provides methods to parse the char data
+ */
+ public CharTrie(int initialValue, int leadUnitValue, DataManipulate dataManipulate) {
+ super(new char[BMP_INDEX_LENGTH+SURROGATE_BLOCK_COUNT], HEADER_OPTIONS_LATIN1_IS_LINEAR_MASK_, dataManipulate);
+
+ int dataLength, latin1Length, i, limit;
+ char block;
+
+ /* calculate the actual size of the dummy trie data */
+
+ /* max(Latin-1, block 0) */
+ dataLength=latin1Length= INDEX_STAGE_1_SHIFT_<=8 ? 256 : DATA_BLOCK_LENGTH;
+ if(leadUnitValue!=initialValue) {
+ dataLength+=DATA_BLOCK_LENGTH;
+ }
+ m_data_=new char[dataLength];
+ m_dataLength_=dataLength;
+
+ m_initialValue_=(char)initialValue;
+
+ /* fill the index and data arrays */
+
+ /* indexes are preset to 0 (block 0) */
+
+ /* Latin-1 data */
+ for(i=0; i<latin1Length; ++i) {
+ m_data_[i]=(char)initialValue;
+ }
+
+ if(leadUnitValue!=initialValue) {
+ /* indexes for lead surrogate code units to the block after Latin-1 */
+ block=(char)(latin1Length>>INDEX_STAGE_2_SHIFT_);
+ i=0xd800>>INDEX_STAGE_1_SHIFT_;
+ limit=0xdc00>>INDEX_STAGE_1_SHIFT_;
+ for(; i<limit; ++i) {
+ m_index_[i]=block;
+ }
+
+ /* data for lead surrogate code units */
+ limit=latin1Length+DATA_BLOCK_LENGTH;
+ for(i=latin1Length; i<limit; ++i) {
+ m_data_[i]=(char)leadUnitValue;
+ }
+ }
+
+ m_friendAgent_ = new FriendAgent();
+ }
+
+ /**
* Java friend implementation
*/
public class FriendAgent
@@ -130,7 +189,18 @@
*/
public final char getCodePointValue(int ch)
{
- int offset = getCodePointOffset(ch);
+ int offset;
+
+ // fastpath for U+0000..U+D7FF
+ if(0 <= ch && ch < UTF16.LEAD_SURROGATE_MIN_VALUE) {
+ // copy of getRawOffset()
+ offset = (m_index_[ch >> INDEX_STAGE_1_SHIFT_] << INDEX_STAGE_2_SHIFT_)
+ + (ch & INDEX_STAGE_3_MASK_);
+ return m_data_[offset];
+ }
+
+ // handle U+D800..U+10FFFF
+ offset = getCodePointOffset(ch);
// return -1 if there is an error, in this case we return the default
// value: m_initialValue_
--- a/jdk/src/share/classes/sun/text/normalizer/NormalizerBase.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/text/normalizer/NormalizerBase.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Portions Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Portions Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,10 +22,9 @@
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
-
/*
*******************************************************************************
- * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved *
+ * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved *
* *
* The original version of this source code and documentation is copyrighted *
* and owned by IBM, These materials are provided under terms of a License *
@@ -127,7 +126,7 @@
* normalize(FCD) may be implemented with NFD.
*
* For more details on FCD see the collation design document:
- * http://oss.software.ibm.com/cvs/icu/~checkout~/icuhtml/design/collation/ICU_collation_design.htm
+ * http://source.icu-project.org/repos/icu/icuhtml/trunk/design/collation/ICU_collation_design.htm
*
* ICU collation performs either NFD or FCD normalization automatically if
* normalization is turned on for the collator object. Beyond collation and
--- a/jdk/src/share/classes/sun/text/normalizer/NormalizerDataReader.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/text/normalizer/NormalizerDataReader.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Portions Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Portions Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,10 +22,9 @@
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
-
/*
*******************************************************************************
- * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved *
+ * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved *
* *
* The original version of this source code and documentation is copyrighted *
* and owned by IBM, These materials are provided under terms of a License *
@@ -331,7 +330,7 @@
throws IOException{
//Read the bytes that make up the normTrie
- dataInputStream.read(normBytes);
+ dataInputStream.readFully(normBytes);
//normTrieStream= new ByteArrayInputStream(normBytes);
@@ -346,11 +345,11 @@
}
//Read the fcdTrie
- dataInputStream.read(fcdBytes);
+ dataInputStream.readFully(fcdBytes);
//Read the AuxTrie
- dataInputStream.read(auxBytes);
+ dataInputStream.readFully(auxBytes);
}
public byte[] getDataFormatVersion(){
--- a/jdk/src/share/classes/sun/text/normalizer/NormalizerImpl.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/text/normalizer/NormalizerImpl.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Portions Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Portions Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,10 +22,9 @@
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
-
/*
*******************************************************************************
- * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved *
+ * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved *
* *
* The original version of this source code and documentation is copyrighted *
* and owned by IBM, These materials are provided under terms of a License *
@@ -102,7 +101,7 @@
private static final long MIN_SPECIAL = (long)(0xfc000000 & UNSIGNED_INT_MASK);
private static final long SURROGATES_TOP = (long)(0xfff00000 & UNSIGNED_INT_MASK);
private static final long MIN_HANGUL = (long)(0xfff00000 & UNSIGNED_INT_MASK);
- private static final long MIN_JAMO_V = (long)(0xfff20000 & UNSIGNED_INT_MASK);
+// private static final long MIN_JAMO_V = (long)(0xfff20000 & UNSIGNED_INT_MASK);
private static final long JAMO_V_TOP = (long)(0xfff30000 & UNSIGNED_INT_MASK);
@@ -908,7 +907,7 @@
buffer = composePart(args,prevStarter,src,srcStart,srcLimit,options,nx);
// compare the normalized version with the original
- if(0!=strCompare(buffer,0,args.length,src,prevStarter,(srcStart-prevStarter), false)) {
+ if(0!=strCompare(buffer,0,args.length,src,prevStarter,srcStart, false)) {
result=NormalizerBase.NO; // normalization differs
break;
}
@@ -2291,7 +2290,7 @@
private static final int OPTIONS_NX_MASK=0x1f;
private static final int OPTIONS_UNICODE_MASK=0xe0;
public static final int OPTIONS_SETS_MASK=0xff;
- private static final int OPTIONS_UNICODE_SHIFT=5;
+// private static final int OPTIONS_UNICODE_SHIFT=5;
private static final UnicodeSet[] nxCache = new UnicodeSet[OPTIONS_SETS_MASK+1];
/* Constants for options flags for normalization.*/
--- a/jdk/src/share/classes/sun/text/normalizer/Trie.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/text/normalizer/Trie.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Portions Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
+ * Portions Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,10 +22,9 @@
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
-
/*
*******************************************************************************
- * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved *
+ * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved *
* *
* The original version of this source code and documentation is copyrighted *
* and owned by IBM, These materials are provided under terms of a License *
@@ -37,10 +36,9 @@
package sun.text.normalizer;
+import java.io.DataInputStream;
import java.io.InputStream;
-import java.io.DataInputStream;
import java.io.IOException;
-import java.util.Arrays;
/**
* <p>A trie is a kind of compressed, serializable table of values
@@ -81,7 +79,6 @@
* This interface specifies methods to be implemented in order for
* com.ibm.impl.Trie, to surrogate offset information encapsulated within
* the data.
- * @draft 2.1
*/
public static interface DataManipulate
{
@@ -92,11 +89,17 @@
* @param value data value for a surrogate from the trie, including the
* folding offset
* @return data offset or 0 if there is no data for the lead surrogate
- * @draft 2.1
*/
public int getFoldingOffset(int value);
}
+ // default implementation
+ private static class DefaultGetFoldingOffset implements DataManipulate {
+ public int getFoldingOffset(int value) {
+ return value;
+ }
+ }
+
// protected constructor -------------------------------------------
/**
@@ -107,7 +110,6 @@
* trie data
* @throws IOException thrown when input stream does not have the
* right header.
- * @draft 2.1
*/
protected Trie(InputStream inputStream,
DataManipulate dataManipulate) throws IOException
@@ -121,7 +123,11 @@
throw new IllegalArgumentException("ICU data file error: Trie header authentication failed, please check if you have the most updated ICU data file");
}
- m_dataManipulate_ = dataManipulate;
+ if(dataManipulate != null) {
+ m_dataManipulate_ = dataManipulate;
+ } else {
+ m_dataManipulate_ = new DefaultGetFoldingOffset();
+ }
m_isLatin1Linear_ = (m_options_ &
HEADER_OPTIONS_LATIN1_IS_LINEAR_MASK_) != 0;
m_dataOffset_ = input.readInt();
@@ -135,19 +141,21 @@
* @param options used by the trie
* @param dataManipulate object containing the information to parse the
* trie data
- * @draft 2.2
*/
protected Trie(char index[], int options, DataManipulate dataManipulate)
{
m_options_ = options;
- m_dataManipulate_ = dataManipulate;
+ if(dataManipulate != null) {
+ m_dataManipulate_ = dataManipulate;
+ } else {
+ m_dataManipulate_ = new DefaultGetFoldingOffset();
+ }
m_isLatin1Linear_ = (m_options_ &
HEADER_OPTIONS_LATIN1_IS_LINEAR_MASK_) != 0;
m_index_ = index;
m_dataOffset_ = m_index_.length;
}
-
// protected data members ------------------------------------------
/**
@@ -158,7 +166,6 @@
protected static final int LEAD_INDEX_OFFSET_ = 0x2800 >> 5;
/**
* Shift size for shifting right the input index. 1..9
- * @draft 2.1
*/
protected static final int INDEX_STAGE_1_SHIFT_ = 5;
/**
@@ -168,31 +175,39 @@
* This requires blocks of stage 2 data to be aligned by
* DATA_GRANULARITY.
* 0..INDEX_STAGE_1_SHIFT
- * @draft 2.1
*/
protected static final int INDEX_STAGE_2_SHIFT_ = 2;
/**
+ * Number of data values in a stage 2 (data array) block.
+ */
+ protected static final int DATA_BLOCK_LENGTH=1<<INDEX_STAGE_1_SHIFT_;
+ /**
* Mask for getting the lower bits from the input index.
- * DATA_BLOCK_LENGTH_ - 1.
- * @draft 2.1
+ * DATA_BLOCK_LENGTH - 1.
*/
- protected static final int INDEX_STAGE_3_MASK_ =
- (1 << INDEX_STAGE_1_SHIFT_) - 1;
+ protected static final int INDEX_STAGE_3_MASK_ = DATA_BLOCK_LENGTH - 1;
+ /** Number of bits of a trail surrogate that are used in index table lookups. */
+ protected static final int SURROGATE_BLOCK_BITS=10-INDEX_STAGE_1_SHIFT_;
+ /**
+ * Number of index (stage 1) entries per lead surrogate.
+ * Same as number of index entries for 1024 trail surrogates,
+ * ==0x400>>INDEX_STAGE_1_SHIFT_
+ */
+ protected static final int SURROGATE_BLOCK_COUNT=(1<<SURROGATE_BLOCK_BITS);
+ /** Length of the BMP portion of the index (stage 1) array. */
+ protected static final int BMP_INDEX_LENGTH=0x10000>>INDEX_STAGE_1_SHIFT_;
/**
* Surrogate mask to use when shifting offset to retrieve supplementary
* values
- * @draft 2.1
*/
protected static final int SURROGATE_MASK_ = 0x3FF;
/**
* Index or UTF16 characters
- * @draft 2.1
*/
protected char m_index_[];
/**
* Internal TrieValue which handles the parsing of the data value.
* This class is to be implemented by the user
- * @draft 2.1
*/
protected DataManipulate m_dataManipulate_;
/**
@@ -200,7 +215,6 @@
* index and data into a char array, so this is used to indicate the
* initial offset to the data portion.
* Note this index always points to the initial value.
- * @draft 2.1
*/
protected int m_dataOffset_;
/**
@@ -215,7 +229,6 @@
* @param lead lead surrogate
* @param trail trailing surrogate
* @return offset to data
- * @draft 2.1
*/
protected abstract int getSurrogateOffset(char lead, char trail);
@@ -223,14 +236,12 @@
* Gets the value at the argument index
* @param index value at index will be retrieved
* @return 32 bit value
- * @draft 2.1
*/
protected abstract int getValue(int index);
/**
* Gets the default initial value
* @return 32 bit value
- * @draft 2.1
*/
protected abstract int getInitialValue();
@@ -247,7 +258,6 @@
* @param offset index offset which ch is to start from
* @param ch index to be used after offset
* @return offset to the data
- * @draft 2.1
*/
protected final int getRawOffset(int offset, char ch)
{
@@ -261,7 +271,6 @@
* Treats a lead surrogate as a normal code point.
* @param ch BMP character
* @return offset to data
- * @draft 2.1
*/
protected final int getBMPOffset(char ch)
{
@@ -279,7 +288,6 @@
* the next trailing surrogate character.
* @param ch lead surrogate character
* @return offset to data
- * @draft 2.1
*/
protected final int getLeadOffset(char ch)
{
@@ -293,26 +301,27 @@
* Gets the offset to data which the codepoint points to
* @param ch codepoint
* @return offset to data
- * @draft 2.1
*/
protected final int getCodePointOffset(int ch)
{
// if ((ch >> 16) == 0) slower
- if (ch >= UTF16.CODEPOINT_MIN_VALUE
- && ch < UTF16.SUPPLEMENTARY_MIN_VALUE) {
+ if (ch < 0) {
+ return -1;
+ } else if (ch < UTF16.LEAD_SURROGATE_MIN_VALUE) {
+ // fastpath for the part of the BMP below surrogates (D800) where getRawOffset() works
+ return getRawOffset(0, (char)ch);
+ } else if (ch < UTF16.SUPPLEMENTARY_MIN_VALUE) {
// BMP codepoint
return getBMPOffset((char)ch);
- }
- // for optimization
- if (ch >= UTF16.CODEPOINT_MIN_VALUE
- && ch <= UCharacter.MAX_VALUE) {
+ } else if (ch <= UCharacter.MAX_VALUE) {
// look at the construction of supplementary characters
// trail forms the ends of it.
return getSurrogateOffset(UTF16.getLeadSurrogate(ch),
(char)(ch & SURROGATE_MASK_));
+ } else {
+ // return -1 // if there is an error, in this case we return
+ return -1;
}
- // return -1 if there is an error, in this case we return
- return -1;
}
/**
@@ -320,7 +329,6 @@
* <p>This is overwritten by the child classes.
* @param inputStream input stream containing the trie information
* @exception IOException thrown when data reading fails.
- * @draft 2.1
*/
protected void unserialize(InputStream inputStream) throws IOException
{
@@ -335,7 +343,6 @@
/**
* Determines if this is a 32 bit trie
* @return true if options specifies this is a 32 bit trie
- * @draft 2.1
*/
protected final boolean isIntTrie()
{
@@ -345,7 +352,6 @@
/**
* Determines if this is a 16 bit trie
* @return true if this is a 16 bit trie
- * @draft 2.1
*/
protected final boolean isCharTrie()
{
@@ -355,39 +361,19 @@
// private data members --------------------------------------------
/**
- * Signature index
- */
- private static final int HEADER_SIGNATURE_INDEX_ = 0;
- /**
- * Options index
- */
- private static final int HEADER_OPTIONS_INDEX_ = 1 << 1;
- /**
- * Index length index
- */
- private static final int HEADER_INDEX_LENGTH_INDEX_ = 2 << 1;
- /**
- * Data length index
- */
- private static final int HEADER_DATA_LENGTH_INDEX_ = 3 << 1;
- /**
- * Size of header
- */
- private static final int HEADER_LENGTH_ = 4 << 1;
- /**
* Latin 1 option mask
*/
- private static final int HEADER_OPTIONS_LATIN1_IS_LINEAR_MASK_ = 0x200;
+ protected static final int HEADER_OPTIONS_LATIN1_IS_LINEAR_MASK_ = 0x200;
/**
* Constant number to authenticate the byte block
*/
- private static final int HEADER_SIGNATURE_ = 0x54726965;
+ protected static final int HEADER_SIGNATURE_ = 0x54726965;
/**
* Header option formatting
*/
private static final int HEADER_OPTIONS_SHIFT_MASK_ = 0xF;
- private static final int HEADER_OPTIONS_INDEX_SHIFT_ = 4;
- private static final int HEADER_OPTIONS_DATA_IS_32_BIT_ = 0x100;
+ protected static final int HEADER_OPTIONS_INDEX_SHIFT_ = 4;
+ protected static final int HEADER_OPTIONS_DATA_IS_32_BIT_ = 0x100;
/**
* Flag indicator for Latin quick access data block
@@ -409,9 +395,8 @@
/**
* Authenticates raw data header.
* Checking the header information, signature and options.
- * @param rawdata array of char data to be checked
+ * @param signature This contains the options and type of a Trie
* @return true if the header is authenticated valid
- * @draft 2.1
*/
private final boolean checkHeader(int signature)
{
--- a/jdk/src/share/classes/sun/text/normalizer/TrieIterator.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/text/normalizer/TrieIterator.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Portions Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Portions Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,10 +22,9 @@
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
-
/*
*******************************************************************************
- * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved *
+ * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved *
* *
* The original version of this source code and documentation is copyrighted *
* and owned by IBM, These materials are provided under terms of a License *
@@ -108,15 +107,14 @@
* @since release 2.1, Jan 17 2002
*/
public class TrieIterator implements RangeValueIterator
+{
-{
// public constructor ---------------------------------------------
/**
* TrieEnumeration constructor
* @param trie to be used
* @exception IllegalArgumentException throw when argument is null.
- * @draft 2.1
*/
public TrieIterator(Trie trie)
{
@@ -141,7 +139,6 @@
* @return true if we are not at the end of the iteration, false otherwise.
* @exception NoSuchElementException - if no more elements exist.
* @see com.ibm.icu.util.RangeValueIterator.Element
- * @draft 2.1
*/
public final boolean next(Element element)
{
@@ -158,7 +155,6 @@
/**
* Resets the iterator to the beginning of the iteration
- * @draft 2.1
*/
public final void reset()
{
@@ -186,7 +182,6 @@
* The default function is to return the value as it is.
* @param value a value from the trie
* @return extracted value
- * @draft 2.1
*/
protected int extract(int value)
{
@@ -278,7 +273,6 @@
* Note, if there are no more iterations, it will never get to here.
* Blocked out by next().
* @param element return result object
- * @draft 2.1
*/
private final void calculateNextSupplementaryElement(Element element)
{
@@ -516,10 +510,6 @@
*/
private static final int TRAIL_SURROGATE_MIN_VALUE_ = 0xDC00;
/**
- * Trail surrogate maximum value
- */
- private static final int TRAIL_SURROGATE_MAX_VALUE_ = 0xDFFF;
- /**
* Number of trail surrogate
*/
private static final int TRAIL_SURROGATE_COUNT_ = 0x400;
@@ -538,11 +528,6 @@
private static final int DATA_BLOCK_LENGTH_ =
1 << Trie.INDEX_STAGE_1_SHIFT_;
/**
- * Number of codepoints in a stage 2 block
- */
- private static final int DATA_BLOCK_SUPPLEMENTARY_LENGTH_ =
- DATA_BLOCK_LENGTH_ << 10;
- /**
* Trie instance
*/
private Trie m_trie_;
@@ -560,10 +545,4 @@
private int m_nextBlock_;
private int m_nextBlockIndex_;
private int m_nextTrailIndexOffset_;
- /**
- * This is the return result element
- */
- private int m_start_;
- private int m_limit_;
- private int m_value_;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/sun/text/normalizer/UBiDiProps.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,179 @@
+/*
+ * Portions Copyright 2005-2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ *******************************************************************************
+ * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved *
+ * *
+ * The original version of this source code and documentation is copyrighted *
+ * and owned by IBM, These materials are provided under terms of a License *
+ * Agreement between IBM and Sun. This technology is protected by multiple *
+ * US and International patents. This notice and attribution to IBM may not *
+ * to removed. *
+ *******************************************************************************
+* file name: UBiDiProps.java
+* encoding: US-ASCII
+* tab size: 8 (not used)
+* indentation:4
+*
+* created on: 2005jan16
+* created by: Markus W. Scherer
+*
+* Low-level Unicode bidi/shaping properties access.
+* Java port of ubidi_props.h/.c.
+*/
+
+package sun.text.normalizer;
+
+import java.io.BufferedInputStream;
+import java.io.DataInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+
+public final class UBiDiProps {
+ // constructors etc. --------------------------------------------------- ***
+
+ // port of ubidi_openProps()
+ public UBiDiProps() throws IOException{
+ InputStream is=ICUData.getStream(DATA_FILE_NAME);
+ BufferedInputStream b=new BufferedInputStream(is, 4096 /* data buffer size */);
+ readData(b);
+ b.close();
+ is.close();
+
+ }
+
+ private void readData(InputStream is) throws IOException {
+ DataInputStream inputStream=new DataInputStream(is);
+
+ // read the header
+ ICUBinary.readHeader(inputStream, FMT, new IsAcceptable());
+
+ // read indexes[]
+ int i, count;
+ count=inputStream.readInt();
+ if(count<IX_INDEX_TOP) {
+ throw new IOException("indexes[0] too small in "+DATA_FILE_NAME);
+ }
+ indexes=new int[count];
+
+ indexes[0]=count;
+ for(i=1; i<count; ++i) {
+ indexes[i]=inputStream.readInt();
+ }
+
+ // read the trie
+ trie=new CharTrie(inputStream, null);
+
+ // read mirrors[]
+ count=indexes[IX_MIRROR_LENGTH];
+ if(count>0) {
+ mirrors=new int[count];
+ for(i=0; i<count; ++i) {
+ mirrors[i]=inputStream.readInt();
+ }
+ }
+
+ // read jgArray[]
+ count=indexes[IX_JG_LIMIT]-indexes[IX_JG_START];
+ jgArray=new byte[count];
+ for(i=0; i<count; ++i) {
+ jgArray[i]=inputStream.readByte();
+ }
+ }
+
+ // implement ICUBinary.Authenticate
+ private final class IsAcceptable implements ICUBinary.Authenticate {
+ public boolean isDataVersionAcceptable(byte version[]) {
+ return version[0]==1 &&
+ version[2]==Trie.INDEX_STAGE_1_SHIFT_ && version[3]==Trie.INDEX_STAGE_2_SHIFT_;
+ }
+ }
+
+ // UBiDiProps singleton
+ private static UBiDiProps gBdp=null;
+
+ // port of ubidi_getSingleton()
+ public static final synchronized UBiDiProps getSingleton() throws IOException {
+ if(gBdp==null) {
+ gBdp=new UBiDiProps();
+ }
+ return gBdp;
+ }
+
+ // UBiDiProps dummy singleton
+ private static UBiDiProps gBdpDummy=null;
+
+ private UBiDiProps(boolean makeDummy) { // ignore makeDummy, only creates a unique signature
+ indexes=new int[IX_TOP];
+ indexes[0]=IX_TOP;
+ trie=new CharTrie(0, 0, null); // dummy trie, always returns 0
+ }
+
+ /**
+ * Get a singleton dummy object, one that works with no real data.
+ * This can be used when the real data is not available.
+ * Using the dummy can reduce checks for available data after an initial failure.
+ * Port of ucase_getDummy().
+ */
+ public static final synchronized UBiDiProps getDummy() {
+ if(gBdpDummy==null) {
+ gBdpDummy=new UBiDiProps(true);
+ }
+ return gBdpDummy;
+ }
+
+ public final int getClass(int c) {
+ return getClassFromProps(trie.getCodePointValue(c));
+ }
+
+ // data members -------------------------------------------------------- ***
+ private int indexes[];
+ private int mirrors[];
+ private byte jgArray[];
+
+ private CharTrie trie;
+
+ // data format constants ----------------------------------------------- ***
+ private static final String DATA_FILE_NAME = "/sun/text/resources/ubidi.icu";
+
+ /* format "BiDi" */
+ private static final byte FMT[]={ 0x42, 0x69, 0x44, 0x69 };
+
+ /* indexes into indexes[] */
+ private static final int IX_INDEX_TOP=0;
+ private static final int IX_MIRROR_LENGTH=3;
+
+ private static final int IX_JG_START=4;
+ private static final int IX_JG_LIMIT=5;
+
+ private static final int IX_TOP=16;
+
+ private static final int CLASS_MASK= 0x0000001f;
+
+ private static final int getClassFromProps(int props) {
+ return props&CLASS_MASK;
+ }
+
+}
--- a/jdk/src/share/classes/sun/text/normalizer/UCharacter.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/text/normalizer/UCharacter.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Portions Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
+ * Portions Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,7 +24,7 @@
*/
/*
*******************************************************************************
- * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved *
+ * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved *
* *
* The original version of this source code and documentation is copyrighted *
* and owned by IBM, These materials are provided under terms of a License *
@@ -36,19 +36,18 @@
package sun.text.normalizer;
-import java.lang.ref.SoftReference;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
+import java.io.IOException;
+import java.util.MissingResourceException;
/**
* <p>
* The UCharacter class provides extensions to the
- * <a href=http://java.sun.com/j2se/1.3/docs/api/java/lang/Character.html>
+ * <a href="http://java.sun.com/j2se/1.5/docs/api/java/lang/Character.html">
* java.lang.Character</a> class. These extensions provide support for
- * Unicode 3.2 properties and together with the <a href=../text/UTF16.html>UTF16</a>
+ * more Unicode properties and together with the <a href=../text/UTF16.html>UTF16</a>
* class, provide support for supplementary characters (those with code
* points above U+FFFF).
+ * Each ICU release supports the latest version of Unicode available at that time.
* </p>
* <p>
* Code points are represented in these API using ints. While it would be
@@ -67,7 +66,7 @@
* <i>$ICU4J_CLASS/com.ibm.icu.impl.data</i>.
* </p>
* <p>
- * Aside from the additions for UTF-16 support, and the updated Unicode 3.1
+ * Aside from the additions for UTF-16 support, and the updated Unicode
* properties, the main differences between UCharacter and Character are:
* <ul>
* <li> UCharacter is not designed to be a char wrapper and does not have
@@ -77,7 +76,7 @@
* <li> char charValue(),
* <li> int compareTo(java.lang.Character, java.lang.Character), etc.
* </ul>
- * <li> UCharacter does not include Character APIs that are deprecated, not
+ * <li> UCharacter does not include Character APIs that are deprecated, nor
* does it include the Java-specific character information, such as
* boolean isJavaIdentifierPart(char ch).
* <li> Character maps characters 'A' - 'Z' and 'a' - 'z' to the numeric
@@ -89,10 +88,75 @@
* </ul>
* <p>
* Further detail differences can be determined from the program
- * <a href = http://oss.software.ibm.com/developerworks/opensource/cvs/icu4j/~checkout~/icu4j/src/com/ibm/icu/dev/test/lang/UCharacterCompare.java>
+ * <a href="http://source.icu-project.org/repos/icu/icu4j/trunk/src/com/ibm/icu/dev/test/lang/UCharacterCompare.java">
* com.ibm.icu.dev.test.lang.UCharacterCompare</a>
* </p>
* <p>
+ * In addition to Java compatibility functions, which calculate derived properties,
+ * this API provides low-level access to the Unicode Character Database.
+ * </p>
+ * <p>
+ * Unicode assigns each code point (not just assigned character) values for
+ * many properties.
+ * Most of them are simple boolean flags, or constants from a small enumerated list.
+ * For some properties, values are strings or other relatively more complex types.
+ * </p>
+ * <p>
+ * For more information see
+ * "About the Unicode Character Database" (http://www.unicode.org/ucd/)
+ * and the ICU User Guide chapter on Properties (http://www.icu-project.org/userguide/properties.html).
+ * </p>
+ * <p>
+ * There are also functions that provide easy migration from C/POSIX functions
+ * like isblank(). Their use is generally discouraged because the C/POSIX
+ * standards do not define their semantics beyond the ASCII range, which means
+ * that different implementations exhibit very different behavior.
+ * Instead, Unicode properties should be used directly.
+ * </p>
+ * <p>
+ * There are also only a few, broad C/POSIX character classes, and they tend
+ * to be used for conflicting purposes. For example, the "isalpha()" class
+ * is sometimes used to determine word boundaries, while a more sophisticated
+ * approach would at least distinguish initial letters from continuation
+ * characters (the latter including combining marks).
+ * (In ICU, BreakIterator is the most sophisticated API for word boundaries.)
+ * Another example: There is no "istitle()" class for titlecase characters.
+ * </p>
+ * <p>
+ * ICU 3.4 and later provides API access for all twelve C/POSIX character classes.
+ * ICU implements them according to the Standard Recommendations in
+ * Annex C: Compatibility Properties of UTS #18 Unicode Regular Expressions
+ * (http://www.unicode.org/reports/tr18/#Compatibility_Properties).
+ * </p>
+ * <p>
+ * API access for C/POSIX character classes is as follows:
+ * - alpha: isUAlphabetic(c) or hasBinaryProperty(c, UProperty.ALPHABETIC)
+ * - lower: isULowercase(c) or hasBinaryProperty(c, UProperty.LOWERCASE)
+ * - upper: isUUppercase(c) or hasBinaryProperty(c, UProperty.UPPERCASE)
+ * - punct: ((1<<getType(c)) & ((1<<DASH_PUNCTUATION)|(1<<START_PUNCTUATION)|(1<<END_PUNCTUATION)|(1<<CONNECTOR_PUNCTUATION)|(1<<OTHER_PUNCTUATION)|(1<<INITIAL_PUNCTUATION)|(1<<FINAL_PUNCTUATION)))!=0
+ * - digit: isDigit(c) or getType(c)==DECIMAL_DIGIT_NUMBER
+ * - xdigit: hasBinaryProperty(c, UProperty.POSIX_XDIGIT)
+ * - alnum: hasBinaryProperty(c, UProperty.POSIX_ALNUM)
+ * - space: isUWhiteSpace(c) or hasBinaryProperty(c, UProperty.WHITE_SPACE)
+ * - blank: hasBinaryProperty(c, UProperty.POSIX_BLANK)
+ * - cntrl: getType(c)==CONTROL
+ * - graph: hasBinaryProperty(c, UProperty.POSIX_GRAPH)
+ * - print: hasBinaryProperty(c, UProperty.POSIX_PRINT)
+ * </p>
+ * <p>
+ * The C/POSIX character classes are also available in UnicodeSet patterns,
+ * using patterns like [:graph:] or \p{graph}.
+ * </p>
+ * <p>
+ * Note: There are several ICU (and Java) whitespace functions.
+ * Comparison:
+ * - isUWhiteSpace=UCHAR_WHITE_SPACE: Unicode White_Space property;
+ * most of general categories "Z" (separators) + most whitespace ISO controls
+ * (including no-break spaces, but excluding IS1..IS4 and ZWSP)
+ * - isWhitespace: Java isWhitespace; Z + whitespace ISO controls but excluding no-break spaces
+ * - isSpaceChar: just Z (including no-break spaces)
+ * </p>
+ * <p>
* This class is not subclassable
* </p>
* @author Syn Wee Quek
@@ -113,92 +177,7 @@
/**
* @stable ICU 2.4
*/
- public static final int NONE = 0;
- /**
- * @stable ICU 2.4
- */
public static final int DECIMAL = 1;
- /**
- * @stable ICU 2.4
- */
- public static final int DIGIT = 2;
- /**
- * @stable ICU 2.4
- */
- public static final int NUMERIC = 3;
- /**
- * @stable ICU 2.4
- */
- public static final int COUNT = 4;
- }
-
- /**
- * Hangul Syllable Type constants.
- *
- * @see UProperty#HANGUL_SYLLABLE_TYPE
- * @stable ICU 2.6
- */
- public static interface HangulSyllableType
- {
- /**
- * @stable ICU 2.6
- */
- public static final int NOT_APPLICABLE = 0; /*[NA]*/ /*See note !!*/
- /**
- * @stable ICU 2.6
- */
- public static final int LEADING_JAMO = 1; /*[L]*/
- /**
- * @stable ICU 2.6
- */
- public static final int VOWEL_JAMO = 2; /*[V]*/
- /**
- * @stable ICU 2.6
- */
- public static final int TRAILING_JAMO = 3; /*[T]*/
- /**
- * @stable ICU 2.6
- */
- public static final int LV_SYLLABLE = 4; /*[LV]*/
- /**
- * @stable ICU 2.6
- */
- public static final int LVT_SYLLABLE = 5; /*[LVT]*/
- /**
- * @stable ICU 2.6
- */
- public static final int COUNT = 6;
- }
-
- /**
- * [Sun] This interface moved from UCharacterEnums.java.
- *
- * 'Enum' for the CharacterCategory constants. These constants are
- * compatible in name <b>but not in value</b> with those defined in
- * <code>java.lang.Character</code>.
- * @see UCharacterCategory
- * @draft ICU 3.0
- * @deprecated This is a draft API and might change in a future release of ICU.
- */
- public static interface ECharacterCategory
- {
- /**
- * Character type Lu
- * @stable ICU 2.1
- */
- public static final int UPPERCASE_LETTER = 1;
-
- /**
- * Character type Lt
- * @stable ICU 2.1
- */
- public static final int TITLECASE_LETTER = 3;
-
- /**
- * Character type Lo
- * @stable ICU 2.1
- */
- public static final int OTHER_LETTER = 5;
}
// public data members -----------------------------------------------
@@ -225,14 +204,6 @@
public static final int SUPPLEMENTARY_MIN_VALUE =
UTF16.SUPPLEMENTARY_MIN_VALUE;
- /**
- * Special value that is returned by getUnicodeNumericValue(int) when no
- * numeric value is defined for a code point.
- * @stable ICU 2.4
- * @see #getUnicodeNumericValue
- */
- public static final double NO_NUMERIC_VALUE = -123456789;
-
// public methods ----------------------------------------------------
/**
@@ -262,161 +233,16 @@
{
// when ch is out of bounds getProperty == 0
int props = getProperty(ch);
- if (getNumericType(props) != NumericType.DECIMAL) {
- return (radix <= 10) ? -1 : getEuropeanDigit(ch);
- }
- // if props == 0, it will just fall through and return -1
- if (isNotExceptionIndicator(props)) {
- // not contained in exception data
- // getSignedValue is just shifting so we can check for the sign
- // first
- // Optimization
- // int result = UCharacterProperty.getSignedValue(props);
- // if (result >= 0) {
- // return result;
- // }
- if (props >= 0) {
- return UCharacterProperty.getSignedValue(props);
- }
+ int value;
+ if (getNumericType(props) == NumericType.DECIMAL) {
+ value = UCharacterProperty.getUnsignedValue(props);
+ } else {
+ value = getEuropeanDigit(ch);
}
- else {
- int index = UCharacterProperty.getExceptionIndex(props);
- if (PROPERTY_.hasExceptionValue(index,
- UCharacterProperty.EXC_NUMERIC_VALUE_)) {
- int result = PROPERTY_.getException(index,
- UCharacterProperty.EXC_NUMERIC_VALUE_);
- if (result >= 0) {
- return result;
- }
- }
- }
-
- if (radix > 10) {
- int result = getEuropeanDigit(ch);
- if (result >= 0 && result < radix) {
- return result;
- }
- }
- return -1;
+ return (0 <= value && value < radix) ? value : -1;
}
/**
- * <p>Get the numeric value for a Unicode code point as defined in the
- * Unicode Character Database.</p>
- * <p>A "double" return type is necessary because some numeric values are
- * fractions, negative, or too large for int.</p>
- * <p>For characters without any numeric values in the Unicode Character
- * Database, this function will return NO_NUMERIC_VALUE.</p>
- * <p><em>API Change:</em> In release 2.2 and prior, this API has a
- * return type int and returns -1 when the argument ch does not have a
- * corresponding numeric value. This has been changed to synch with ICU4C
- * </p>
- * This corresponds to the ICU4C function u_getNumericValue.
- * @param ch Code point to get the numeric value for.
- * @return numeric value of ch, or NO_NUMERIC_VALUE if none is defined.
- * @stable ICU 2.4
- */
- public static double getUnicodeNumericValue(int ch)
- {
- // equivalent to c version double u_getNumericValue(UChar32 c)
- int props = PROPERTY_.getProperty(ch);
- int numericType = getNumericType(props);
- if (numericType > NumericType.NONE && numericType < NumericType.COUNT) {
- if (isNotExceptionIndicator(props)) {
- return UCharacterProperty.getSignedValue(props);
- }
- else {
- int index = UCharacterProperty.getExceptionIndex(props);
- boolean nex = false;
- boolean dex = false;
- double numerator = 0;
- if (PROPERTY_.hasExceptionValue(index,
- UCharacterProperty.EXC_NUMERIC_VALUE_)) {
- int num = PROPERTY_.getException(index,
- UCharacterProperty.EXC_NUMERIC_VALUE_);
- // There are special values for huge numbers that are
- // powers of ten. genprops/store.c documents:
- // if numericValue = 0x7fffff00 + x then
- // numericValue = 10 ^ x
- if (num >= NUMERATOR_POWER_LIMIT_) {
- num &= 0xff;
- // 10^x without math.h
- numerator = Math.pow(10, num);
- }
- else {
- numerator = num;
- }
- nex = true;
- }
- double denominator = 0;
- if (PROPERTY_.hasExceptionValue(index,
- UCharacterProperty.EXC_DENOMINATOR_VALUE_)) {
- denominator = PROPERTY_.getException(index,
- UCharacterProperty.EXC_DENOMINATOR_VALUE_);
- // faster path not in c
- if (numerator != 0) {
- return numerator / denominator;
- }
- dex = true;
- }
-
- if (nex) {
- if (dex) {
- return numerator / denominator;
- }
- return numerator;
- }
- if (dex) {
- return 1 / denominator;
- }
- }
- }
- return NO_NUMERIC_VALUE;
- }
-
- /**
- * Returns a value indicating a code point's Unicode category.
- * Up-to-date Unicode implementation of java.lang.Character.getType()
- * except for the above mentioned code points that had their category
- * changed.<br>
- * Return results are constants from the interface
- * <a href=UCharacterCategory.html>UCharacterCategory</a><br>
- * <em>NOTE:</em> the UCharacterCategory values are <em>not</em> compatible with
- * those returned by java.lang.Character.getType. UCharacterCategory values
- * match the ones used in ICU4C, while java.lang.Character type
- * values, though similar, skip the value 17.</p>
- * @param ch code point whose type is to be determined
- * @return category which is a value of UCharacterCategory
- * @stable ICU 2.1
- */
- public static int getType(int ch)
- {
- return getProperty(ch) & UCharacterProperty.TYPE_MASK;
- }
-
- //// for StringPrep
- /**
- * Returns a code point corresponding to the two UTF16 characters.
- * @param lead the lead char
- * @param trail the trail char
- * @return code point if surrogate characters are valid.
- * @exception IllegalArgumentException thrown when argument characters do
- * not form a valid codepoint
- * @stable ICU 2.1
- */
- public static int getCodePoint(char lead, char trail)
- {
- if (lead >= UTF16.LEAD_SURROGATE_MIN_VALUE &&
- lead <= UTF16.LEAD_SURROGATE_MAX_VALUE &&
- trail >= UTF16.TRAIL_SURROGATE_MIN_VALUE &&
- trail <= UTF16.TRAIL_SURROGATE_MAX_VALUE) {
- return UCharacterProperty.getRawSupplementary(lead, trail);
- }
- throw new IllegalArgumentException("Illegal surrogate characters");
- }
-
- //// for StringPrep
- /**
* Returns the Bidirection property of a code point.
* For example, 0x0041 (letter A) has the LEFT_TO_RIGHT directional
* property.<br>
@@ -428,111 +254,24 @@
*/
public static int getDirection(int ch)
{
- // when ch is out of bounds getProperty == 0
- return (getProperty(ch) >> BIDI_SHIFT_) & BIDI_MASK_AFTER_SHIFT_;
+ return gBdp.getClass(ch);
}
/**
- * The given string is mapped to its case folding equivalent according to
- * UnicodeData.txt and CaseFolding.txt; if any character has no case
- * folding equivalent, the character itself is returned.
- * "Full", multiple-code point case folding mappings are returned here.
- * For "simple" single-code point mappings use the API
- * foldCase(int ch, boolean defaultmapping).
- * @param str the String to be converted
- * @param defaultmapping Indicates if all mappings defined in
- * CaseFolding.txt is to be used, otherwise the
- * mappings for dotted I and dotless i marked with
- * 'I' in CaseFolding.txt will be skipped.
- * @return the case folding equivalent of the character, if
- * any; otherwise the character itself.
- * @see #foldCase(int, boolean)
+ * Returns a code point corresponding to the two UTF16 characters.
+ * @param lead the lead char
+ * @param trail the trail char
+ * @return code point if surrogate characters are valid.
+ * @exception IllegalArgumentException thrown when argument characters do
+ * not form a valid codepoint
* @stable ICU 2.1
*/
- public static String foldCase(String str, boolean defaultmapping)
+ public static int getCodePoint(char lead, char trail)
{
- int size = str.length();
- StringBuffer result = new StringBuffer(size);
- int offset = 0;
- int ch;
-
- // case mapping loop
- while (offset < size) {
- ch = UTF16.charAt(str, offset);
- offset += UTF16.getCharCount(ch);
- int props = PROPERTY_.getProperty(ch);
- if (isNotExceptionIndicator(props)) {
- int type = UCharacterProperty.TYPE_MASK & props;
- if (type == ECharacterCategory.UPPERCASE_LETTER ||
- type == ECharacterCategory.TITLECASE_LETTER) {
- ch += UCharacterProperty.getSignedValue(props);
- }
- }
- else {
- int index = UCharacterProperty.getExceptionIndex(props);
- if (PROPERTY_.hasExceptionValue(index,
- UCharacterProperty.EXC_CASE_FOLDING_)) {
- int exception = PROPERTY_.getException(index,
- UCharacterProperty.EXC_CASE_FOLDING_);
- if (exception != 0) {
- PROPERTY_.getFoldCase(exception & LAST_CHAR_MASK_,
- exception >> SHIFT_24_, result);
- }
- else {
- // special case folding mappings, hardcoded
- if (ch != 0x49 && ch != 0x130) {
- // return ch itself because there is no special
- // mapping for it
- UTF16.append(result, ch);
- continue;
- }
- if (defaultmapping) {
- // default mappings
- if (ch == 0x49) {
- // 0049; C; 0069; # LATIN CAPITAL LETTER I
- result.append(
- UCharacterProperty.LATIN_SMALL_LETTER_I_);
- }
- else if (ch == 0x130) {
- // 0130; F; 0069 0307;
- // # LATIN CAPITAL LETTER I WITH DOT ABOVE
- result.append(
- UCharacterProperty.LATIN_SMALL_LETTER_I_);
- result.append((char)0x307);
- }
- }
- else {
- // Turkic mappings
- if (ch == 0x49) {
- // 0049; T; 0131; # LATIN CAPITAL LETTER I
- result.append((char)0x131);
- }
- else if (ch == 0x130) {
- // 0130; T; 0069;
- // # LATIN CAPITAL LETTER I WITH DOT ABOVE
- result.append(
- UCharacterProperty.LATIN_SMALL_LETTER_I_);
- }
- }
- }
- // do not fall through to the output of c
- continue;
- }
- else {
- if (PROPERTY_.hasExceptionValue(index,
- UCharacterProperty.EXC_LOWERCASE_)) {
- ch = PROPERTY_.getException(index,
- UCharacterProperty.EXC_LOWERCASE_);
- }
- }
-
- }
-
- // handle 1:1 code point mappings from UnicodeData.txt
- UTF16.append(result, ch);
+ if (UTF16.isLeadSurrogate(lead) && UTF16.isTrailSurrogate(trail)) {
+ return UCharacterProperty.getRawSupplementary(lead, trail);
}
-
- return result.toString();
+ throw new IllegalArgumentException("Illegal surrogate characters");
}
/**
@@ -555,83 +294,6 @@
return PROPERTY_.getAge(ch);
}
- /**
- * <p>Gets the property value for an Unicode property type of a code point.
- * Also returns binary and mask property values.</p>
- * <p>Unicode, especially in version 3.2, defines many more properties than
- * the original set in UnicodeData.txt.</p>
- * <p>The properties APIs are intended to reflect Unicode properties as
- * defined in the Unicode Character Database (UCD) and Unicode Technical
- * Reports (UTR). For details about the properties see
- * http://www.unicode.org/.</p>
- * <p>For names of Unicode properties see the UCD file PropertyAliases.txt.
- * </p>
- * <pre>
- * Sample usage:
- * int ea = UCharacter.getIntPropertyValue(c, UProperty.EAST_ASIAN_WIDTH);
- * int ideo = UCharacter.getIntPropertyValue(c, UProperty.IDEOGRAPHIC);
- * boolean b = (ideo == 1) ? true : false;
- * </pre>
- * @param ch code point to test.
- * @param type UProperty selector constant, identifies which binary
- * property to check. Must be
- * UProperty.BINARY_START <= type < UProperty.BINARY_LIMIT or
- * UProperty.INT_START <= type < UProperty.INT_LIMIT or
- * UProperty.MASK_START <= type < UProperty.MASK_LIMIT.
- * @return numeric value that is directly the property value or,
- * for enumerated properties, corresponds to the numeric value of
- * the enumerated constant of the respective property value
- * enumeration type (cast to enum type if necessary).
- * Returns 0 or 1 (for false / true) for binary Unicode properties.
- * Returns a bit-mask for mask properties.
- * Returns 0 if 'type' is out of bounds or if the Unicode version
- * does not have data for the property at all, or not for this code
- * point.
- * @see UProperty
- * @see #hasBinaryProperty
- * @see #getIntPropertyMinValue
- * @see #getIntPropertyMaxValue
- * @see #getUnicodeVersion
- * @stable ICU 2.4
- */
- public static int getIntPropertyValue(int ch, int type)
- {
- /*
- * For Normalizer with Unicode 3.2, this method is called only for
- * HANGUL_SYLLABLE_TYPE in UnicodeSet.addPropertyStarts().
- */
- if (type == UProperty.HANGUL_SYLLABLE_TYPE) {
- /* purely algorithmic; hardcode known characters, check for assigned new ones */
- if(ch<NormalizerImpl.JAMO_L_BASE) {
- /* NA */
- } else if(ch<=0x11ff) {
- /* Jamo range */
- if(ch<=0x115f) {
- /* Jamo L range, HANGUL CHOSEONG ... */
- if(ch==0x115f || ch<=0x1159 || getType(ch)==ECharacterCategory.OTHER_LETTER) {
- return HangulSyllableType.LEADING_JAMO;
- }
- } else if(ch<=0x11a7) {
- /* Jamo V range, HANGUL JUNGSEONG ... */
- if(ch<=0x11a2 || getType(ch)==ECharacterCategory.OTHER_LETTER) {
- return HangulSyllableType.VOWEL_JAMO;
- }
- } else {
- /* Jamo T range */
- if(ch<=0x11f9 || getType(ch)==ECharacterCategory.OTHER_LETTER) {
- return HangulSyllableType.TRAILING_JAMO;
- }
- }
- } else if((ch-=NormalizerImpl.HANGUL_BASE)<0) {
- /* NA */
- } else if(ch<NormalizerImpl.HANGUL_COUNT) {
- /* Hangul syllable */
- return ch%NormalizerImpl.JAMO_T_COUNT==0 ? HangulSyllableType.LV_SYLLABLE : HangulSyllableType.LVT_SYLLABLE;
- }
- }
- return 0; /* NA */
- }
-
// private variables -------------------------------------------------
/**
@@ -643,143 +305,43 @@
*/
private static final char[] PROPERTY_TRIE_INDEX_;
private static final char[] PROPERTY_TRIE_DATA_;
- private static final int[] PROPERTY_DATA_;
private static final int PROPERTY_INITIAL_VALUE_;
+ private static final UBiDiProps gBdp;
+
// block to initialise character property database
static
{
try
{
- PROPERTY_ = UCharacterProperty.getInstance();
- PROPERTY_TRIE_INDEX_ = PROPERTY_.m_trieIndex_;
- PROPERTY_TRIE_DATA_ = PROPERTY_.m_trieData_;
- PROPERTY_DATA_ = PROPERTY_.m_property_;
- PROPERTY_INITIAL_VALUE_
- = PROPERTY_DATA_[PROPERTY_.m_trieInitialValue_];
+ PROPERTY_ = UCharacterProperty.getInstance();
+ PROPERTY_TRIE_INDEX_ = PROPERTY_.m_trieIndex_;
+ PROPERTY_TRIE_DATA_ = PROPERTY_.m_trieData_;
+ PROPERTY_INITIAL_VALUE_ = PROPERTY_.m_trieInitialValue_;
}
catch (Exception e)
{
- throw new RuntimeException(e.getMessage());
+ throw new MissingResourceException(e.getMessage(),"","");
}
- }
-
- /**
- * To get the last character out from a data type
- */
- private static final int LAST_CHAR_MASK_ = 0xFFFF;
- /**
- * To get the last byte out from a data type
- */
-// private static final int LAST_BYTE_MASK_ = 0xFF;
-
- /**
- * Shift 16 bits
- */
-// private static final int SHIFT_16_ = 16;
-
- /**
- * Shift 24 bits
- */
- private static final int SHIFT_24_ = 24;
+ UBiDiProps bdp;
+ try {
+ bdp=UBiDiProps.getSingleton();
+ } catch(IOException e) {
+ bdp=UBiDiProps.getDummy();
+ }
+ gBdp=bdp;
+ }
/**
* Shift to get numeric type
*/
- private static final int NUMERIC_TYPE_SHIFT_ = 12;
+ private static final int NUMERIC_TYPE_SHIFT_ = 5;
/**
* Mask to get numeric type
*/
private static final int NUMERIC_TYPE_MASK_ = 0x7 << NUMERIC_TYPE_SHIFT_;
- /**
- * Shift to get bidi bits
- */
- private static final int BIDI_SHIFT_ = 6;
- /**
- * Mask to be applied after shifting to get bidi bits
- */
- private static final int BIDI_MASK_AFTER_SHIFT_ = 0x1F;
-
- /**
- * <p>Numerator power limit.
- * There are special values for huge numbers that are powers of ten.</p>
- * <p>c version genprops/store.c documents:
- * if numericValue = 0x7fffff00 + x then numericValue = 10 ^ x</p>
- */
- private static final int NUMERATOR_POWER_LIMIT_ = 0x7fffff00;
- /**
- * Integer properties mask and shift values for joining type.
- * Equivalent to icu4c UPROPS_JT_MASK.
- */
- private static final int JOINING_TYPE_MASK_ = 0x00003800;
- /**
- * Integer properties mask and shift values for joining type.
- * Equivalent to icu4c UPROPS_JT_SHIFT.
- */
- private static final int JOINING_TYPE_SHIFT_ = 11;
- /**
- * Integer properties mask and shift values for joining group.
- * Equivalent to icu4c UPROPS_JG_MASK.
- */
- private static final int JOINING_GROUP_MASK_ = 0x000007e0;
- /**
- * Integer properties mask and shift values for joining group.
- * Equivalent to icu4c UPROPS_JG_SHIFT.
- */
- private static final int JOINING_GROUP_SHIFT_ = 5;
- /**
- * Integer properties mask for decomposition type.
- * Equivalent to icu4c UPROPS_DT_MASK.
- */
- private static final int DECOMPOSITION_TYPE_MASK_ = 0x0000001f;
- /**
- * Integer properties mask and shift values for East Asian cell width.
- * Equivalent to icu4c UPROPS_EA_MASK
- */
- private static final int EAST_ASIAN_MASK_ = 0x00038000;
- /**
- * Integer properties mask and shift values for East Asian cell width.
- * Equivalent to icu4c UPROPS_EA_SHIFT
- */
- private static final int EAST_ASIAN_SHIFT_ = 15;
-
- /**
- * Integer properties mask and shift values for line breaks.
- * Equivalent to icu4c UPROPS_LB_MASK
- */
- private static final int LINE_BREAK_MASK_ = 0x007C0000;
- /**
- * Integer properties mask and shift values for line breaks.
- * Equivalent to icu4c UPROPS_LB_SHIFT
- */
- private static final int LINE_BREAK_SHIFT_ = 18;
- /**
- * Integer properties mask and shift values for blocks.
- * Equivalent to icu4c UPROPS_BLOCK_MASK
- */
- private static final int BLOCK_MASK_ = 0x00007f80;
- /**
- * Integer properties mask and shift values for blocks.
- * Equivalent to icu4c UPROPS_BLOCK_SHIFT
- */
- private static final int BLOCK_SHIFT_ = 7;
- /**
- * Integer properties mask and shift values for scripts.
- * Equivalent to icu4c UPROPS_SHIFT_MASK
- */
- private static final int SCRIPT_MASK_ = 0x0000007f;
-
- // private constructor -----------------------------------------------
- ///CLOVER:OFF
- /**
- * Private constructor to prevent instantiation
- */
- private UCharacter()
- {
- }
- ///CLOVER:ON
// private methods ---------------------------------------------------
/**
@@ -819,17 +381,6 @@
}
/**
- * Checks if the property value has a exception indicator
- * @param props 32 bit property value
- * @return true if property does not have a exception indicator, false
- * otherwise
- */
- private static boolean isNotExceptionIndicator(int props)
- {
- return (props & UCharacterProperty.EXCEPTION_MASK) == 0;
- }
-
- /**
* Gets the property value at the index.
* This is optimized.
* Note this is alittle different from CharTrie the index m_trieData_
@@ -841,35 +392,34 @@
* @return property value of code point
* @stable ICU 2.6
*/
- private static int getProperty(int ch)
+ private static final int getProperty(int ch)
{
if (ch < UTF16.LEAD_SURROGATE_MIN_VALUE
|| (ch > UTF16.LEAD_SURROGATE_MAX_VALUE
&& ch < UTF16.SUPPLEMENTARY_MIN_VALUE)) {
- // BMP codepoint
- try { // using try for < 0 ch is faster than using an if statement
- return PROPERTY_DATA_[
- PROPERTY_TRIE_DATA_[
+ // BMP codepoint 0000..D7FF or DC00..FFFF
+ try { // using try for ch < 0 is faster than using an if statement
+ return PROPERTY_TRIE_DATA_[
(PROPERTY_TRIE_INDEX_[ch >> 5] << 2)
- + (ch & 0x1f)]];
+ + (ch & 0x1f)];
} catch (ArrayIndexOutOfBoundsException e) {
return PROPERTY_INITIAL_VALUE_;
}
}
if (ch <= UTF16.LEAD_SURROGATE_MAX_VALUE) {
- // surrogate
- return PROPERTY_DATA_[
- PROPERTY_TRIE_DATA_[
+ // lead surrogate D800..DBFF
+ return PROPERTY_TRIE_DATA_[
(PROPERTY_TRIE_INDEX_[(0x2800 >> 5) + (ch >> 5)] << 2)
- + (ch & 0x1f)]];
+ + (ch & 0x1f)];
}
// for optimization
if (ch <= UTF16.CODEPOINT_MAX_VALUE) {
+ // supplementary code point 10000..10FFFF
// look at the construction of supplementary characters
// trail forms the ends of it.
- return PROPERTY_DATA_[PROPERTY_.m_trie_.getSurrogateValue(
+ return PROPERTY_.m_trie_.getSurrogateValue(
UTF16.getLeadSurrogate(ch),
- (char)(ch & 0x3ff))];
+ (char)(ch & 0x3ff));
}
// return m_dataOffset_ if there is an error, in this case we return
// the default value: m_initialValue_
@@ -877,4 +427,5 @@
// this is for optimization.
return PROPERTY_INITIAL_VALUE_;
}
+
}
--- a/jdk/src/share/classes/sun/text/normalizer/UCharacterProperty.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/text/normalizer/UCharacterProperty.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Portions Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Portions Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,10 +22,9 @@
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
-
/*
*******************************************************************************
- * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved *
+ * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved *
* *
* The original version of this source code and documentation is copyrighted *
* and owned by IBM, These materials are provided under terms of a License *
@@ -40,8 +39,7 @@
import java.io.BufferedInputStream;
import java.io.InputStream;
import java.io.IOException;
-import java.text.BreakIterator;
-import java.util.Locale;
+import java.util.MissingResourceException;
/**
* <p>Internal class used for Unicode character property database.</p>
@@ -56,10 +54,9 @@
* <a href=UCharacter.html>UCharacter</a>.</p>
* @author Syn Wee Quek
* @since release 2.1, february 1st 2002
-* @draft 2.1
*/
-public final class UCharacterProperty implements Trie.DataManipulate
+public final class UCharacterProperty
{
// public data members -----------------------------------------------
@@ -83,68 +80,16 @@
*/
public int m_trieInitialValue_;
/**
- * Character property table
- */
- public int m_property_[];
- /**
* Unicode version
*/
public VersionInfo m_unicodeVersion_;
- /**
- * Exception indicator for uppercase type
- */
- public static final int EXC_UPPERCASE_ = 0;
- /**
- * Exception indicator for lowercase type
- */
- public static final int EXC_LOWERCASE_ = 1;
- /**
- * Exception indicator for titlecase type
- */
- public static final int EXC_TITLECASE_ = 2;
- /**
- * Exception indicator for digit type
- */
- public static final int EXC_UNUSED_ = 3;
- /**
- * Exception indicator for numeric type
- */
- public static final int EXC_NUMERIC_VALUE_ = 4;
- /**
- * Exception indicator for denominator type
- */
- public static final int EXC_DENOMINATOR_VALUE_ = 5;
- /**
- * Exception indicator for mirror type
- */
- public static final int EXC_MIRROR_MAPPING_ = 6;
- /**
- * Exception indicator for special casing type
- */
- public static final int EXC_SPECIAL_CASING_ = 7;
- /**
- * Exception indicator for case folding type
- */
- public static final int EXC_CASE_FOLDING_ = 8;
- /**
- * EXC_COMBINING_CLASS_ is not found in ICU.
- * Used to retrieve the combining class of the character in the exception
- * value
- */
- public static final int EXC_COMBINING_CLASS_ = 9;
+
+ // uprops.h enum UPropertySource --------------------------------------- ***
- /**
- * Latin lowercase i
- */
- public static final char LATIN_SMALL_LETTER_I_ = 0x69;
- /**
- * Character type mask
- */
- public static final int TYPE_MASK = 0x1F;
- /**
- * Exception test mask
- */
- public static final int EXCEPTION_MASK = 0x20;
+ /** From uchar.c/uprops.icu properties vectors trie */
+ public static final int SRC_PROPSVEC=2;
+ /** One more than the highest UPropertySource (SRC_) constant. */
+ public static final int SRC_COUNT=9;
// public methods ----------------------------------------------------
@@ -159,23 +104,6 @@
}
/**
- * Called by com.ibm.icu.util.Trie to extract from a lead surrogate's
- * data the index array offset of the indexes for that lead surrogate.
- * @param value data value for a surrogate from the trie, including the
- * folding offset
- * @return data offset or 0 if there is no data for the lead surrogate
- */
- public int getFoldingOffset(int value)
- {
- if ((value & SUPPLEMENTARY_FOLD_INDICATOR_MASK_) != 0) {
- return (value & SUPPLEMENTARY_FOLD_OFFSET_MASK_);
- }
- else {
- return 0;
- }
- }
-
- /**
* Gets the property value at the index.
* This is optimized.
* Note this is alittle different from CharTrie the index m_trieData_
@@ -183,115 +111,57 @@
* @param ch code point whose property value is to be retrieved
* @return property value of code point
*/
- public int getProperty(int ch)
+ public final int getProperty(int ch)
{
if (ch < UTF16.LEAD_SURROGATE_MIN_VALUE
|| (ch > UTF16.LEAD_SURROGATE_MAX_VALUE
&& ch < UTF16.SUPPLEMENTARY_MIN_VALUE)) {
- // BMP codepoint
+ // BMP codepoint 0000..D7FF or DC00..FFFF
// optimized
- try {
- return m_property_[
- m_trieData_[
+ try { // using try for ch < 0 is faster than using an if statement
+ return m_trieData_[
(m_trieIndex_[ch >> Trie.INDEX_STAGE_1_SHIFT_]
<< Trie.INDEX_STAGE_2_SHIFT_)
- + (ch & Trie.INDEX_STAGE_3_MASK_)]];
+ + (ch & Trie.INDEX_STAGE_3_MASK_)];
} catch (ArrayIndexOutOfBoundsException e) {
- return m_property_[m_trieInitialValue_];
+ return m_trieInitialValue_;
}
}
if (ch <= UTF16.LEAD_SURROGATE_MAX_VALUE) {
- return m_property_[
- m_trieData_[
+ // lead surrogate D800..DBFF
+ return m_trieData_[
(m_trieIndex_[Trie.LEAD_INDEX_OFFSET_
+ (ch >> Trie.INDEX_STAGE_1_SHIFT_)]
<< Trie.INDEX_STAGE_2_SHIFT_)
- + (ch & Trie.INDEX_STAGE_3_MASK_)]];
+ + (ch & Trie.INDEX_STAGE_3_MASK_)];
}
- // for optimization
if (ch <= UTF16.CODEPOINT_MAX_VALUE) {
+ // supplementary code point 10000..10FFFF
// look at the construction of supplementary characters
// trail forms the ends of it.
- return m_property_[m_trie_.getSurrogateValue(
+ return m_trie_.getSurrogateValue(
UTF16.getLeadSurrogate(ch),
- (char)(ch & Trie.SURROGATE_MASK_))];
+ (char)(ch & Trie.SURROGATE_MASK_));
}
+ // ch is out of bounds
// return m_dataOffset_ if there is an error, in this case we return
// the default value: m_initialValue_
// we cannot assume that m_initialValue_ is at offset 0
// this is for optimization.
- return m_property_[m_trieInitialValue_];
- // return m_property_[m_trie_.getCodePointValue(ch)];
- }
+ return m_trieInitialValue_;
- /**
- * Getting the signed numeric value of a character embedded in the property
- * argument
- * @param prop the character
- * @return signed numberic value
- */
- public static int getSignedValue(int prop)
- {
- return (prop >> VALUE_SHIFT_);
- }
-
- /**
- * Getting the exception index for argument property
- * @param prop character property
- * @return exception index
- */
- public static int getExceptionIndex(int prop)
- {
- return (prop >> VALUE_SHIFT_) & UNSIGNED_VALUE_MASK_AFTER_SHIFT_;
+ // this all is an inlined form of return m_trie_.getCodePointValue(ch);
}
/**
- * Determines if the exception value passed in has the kind of information
- * which the indicator wants, e.g if the exception value contains the digit
- * value of the character
- * @param index exception index
- * @param indicator type indicator
- * @return true if type value exist
+ * Getting the unsigned numeric value of a character embedded in the property
+ * argument
+ * @param prop the character
+ * @return unsigned numberic value
*/
- public boolean hasExceptionValue(int index, int indicator)
- {
- return (m_exception_[index] & (1 << indicator)) != 0;
- }
-
- /**
- * Gets the exception value at the index, assuming that data type is
- * available. Result is undefined if data is not available. Use
- * hasExceptionValue() to determine data's availability.
- * @param index
- * @param etype exception data type
- * @return exception data type value at index
- */
- public int getException(int index, int etype)
+ public static int getUnsignedValue(int prop)
{
- // contained in exception data
- if (etype == EXC_COMBINING_CLASS_) {
- return m_exception_[index];
- }
- // contained in the exception digit address
- index = addExceptionOffset(m_exception_[index], etype, ++ index);
- return m_exception_[index];
- }
-
- /**
- * Gets the folded case value at the index
- * @param index of the case value to be retrieved
- * @param count number of characters to retrieve
- * @param str string buffer to which to append the result
- */
- public void getFoldCase(int index, int count, StringBuffer str)
- {
- // first 2 chars are for the simple mappings
- index += 2;
- while (count > 0) {
- str.append(m_case_[index]);
- index ++;
- count --;
- }
+ return (prop >> VALUE_SHIFT_) & UNSIGNED_VALUE_MASK_AFTER_SHIFT_;
}
/**
@@ -299,13 +169,21 @@
* C version getUnicodeProperties.
* @param codepoint codepoint whose additional properties is to be
* retrieved
+ * @param column
* @return unicode properties
*/
- public int getAdditional(int codepoint) {
- return m_additionalVectors_[m_additionalTrie_.getCodePointValue(codepoint)];
+ public int getAdditional(int codepoint, int column) {
+ if (column == -1) {
+ return getProperty(codepoint);
+ }
+ if (column < 0 || column >= m_additionalColumnsCount_) {
+ return 0;
+ }
+ return m_additionalVectors_[
+ m_additionalTrie_.getCodePointValue(codepoint) + column];
}
- /**
+ /**
* <p>Get the "age" of the code point.</p>
* <p>The "age" is the Unicode version when the code point was first
* designated (as a non-character or for Private Use) or assigned a
@@ -316,11 +194,10 @@
* <p>This API does not check the validity of the codepoint.</p>
* @param codepoint The code point.
* @return the Unicode version number
- * @draft ICU 2.1
*/
public VersionInfo getAge(int codepoint)
{
- int version = getAdditional(codepoint) >> AGE_SHIFT_;
+ int version = getAdditional(codepoint, 0) >> AGE_SHIFT_;
return VersionInfo.getInstance(
(version >> FIRST_NIBBLE_SHIFT_) & LAST_NIBBLE_MASK_,
version & LAST_NIBBLE_MASK_, 0, 0);
@@ -341,16 +218,16 @@
/**
* Loads the property data and initialize the UCharacterProperty instance.
- * @throws RuntimeException when data is missing or data has been corrupted
+ * @throws MissingResourceException when data is missing or data has been corrupted
*/
- public static UCharacterProperty getInstance() throws RuntimeException
+ public static UCharacterProperty getInstance()
{
- if (INSTANCE_ == null) {
+ if(INSTANCE_ == null) {
try {
INSTANCE_ = new UCharacterProperty();
}
catch (Exception e) {
- throw new RuntimeException(e.getMessage());
+ throw new MissingResourceException(e.getMessage(),"","");
}
}
return INSTANCE_;
@@ -359,6 +236,9 @@
/**
* Checks if the argument c is to be treated as a white space in ICU
* rules. Usually ICU rule white spaces are ignored unless quoted.
+ * Equivalent to test for Pattern_White_Space Unicode property.
+ * Stable set of characters, won't change.
+ * See UAX #31 Identifier and Pattern Syntax: http://www.unicode.org/reports/tr31/
* @param c codepoint to check
* @return true if c is a ICU white space
*/
@@ -366,8 +246,9 @@
{
/* "white space" in the sense of ICU rule parsers
This is a FIXED LIST that is NOT DEPENDENT ON UNICODE PROPERTIES.
- See UTR #31: http://www.unicode.org/reports/tr31/.
+ See UAX #31 Identifier and Pattern Syntax: http://www.unicode.org/reports/tr31/
U+0009..U+000D, U+0020, U+0085, U+200E..U+200F, and U+2028..U+2029
+ Equivalent to test for Pattern_White_Space Unicode property.
*/
return (c >= 0x0009 && c <= 0x2029 &&
(c <= 0x000D || c == 0x0020 || c == 0x0085 ||
@@ -377,15 +258,6 @@
// protected variables -----------------------------------------------
/**
- * Case table
- */
- char m_case_[];
-
- /**
- * Exception property table
- */
- int m_exception_[];
- /**
* Extra property trie
*/
CharTrie m_additionalTrie_;
@@ -427,77 +299,19 @@
private static final int DATA_BUFFER_SIZE_ = 25000;
/**
- * This, from what i infer is the max size of the indicators used for the
- * exception values.
- * Number of bits in an 8-bit integer value
- */
- private static final int EXC_GROUP_ = 8;
-
- /**
- * Mask to get the group
- */
- private static final int EXC_GROUP_MASK_ = 255;
-
- /**
- * Mask to get the digit value in the exception result
- */
- private static final int EXC_DIGIT_MASK_ = 0xFFFF;
-
- /**
- * Offset table for data in exception block.<br>
- * Table formed by the number of bits used for the index, e.g. 0 = 0 bits,
- * 1 = 1 bits.
- */
- private static final byte FLAGS_OFFSET_[] =
- {
- 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
- 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
- };
-
- /**
* Numeric value shift
*/
- private static final int VALUE_SHIFT_ = 20;
+ private static final int VALUE_SHIFT_ = 8;
/**
* Mask to be applied after shifting to obtain an unsigned numeric value
*/
- private static final int UNSIGNED_VALUE_MASK_AFTER_SHIFT_ = 0x7FF;
-
- /**
- *
- */
- private static final int NUMERIC_TYPE_SHIFT = 12;
-
- /**
- * Folding indicator mask
- */
- private static final int SUPPLEMENTARY_FOLD_INDICATOR_MASK_ = 0x8000;
-
- /**
- * Folding offset mask
- */
- private static final int SUPPLEMENTARY_FOLD_OFFSET_MASK_ = 0x7FFF;
+ private static final int UNSIGNED_VALUE_MASK_AFTER_SHIFT_ = 0xFF;
/**
* Shift value for lead surrogate to form a supplementary character.
*/
private static final int LEAD_SURROGATE_SHIFT_ = 10;
-
/**
* Offset to add to combined surrogate pair to avoid msking.
*/
@@ -507,16 +321,12 @@
LEAD_SURROGATE_SHIFT_) -
UTF16.TRAIL_SURROGATE_MIN_VALUE;
- /**
- * To get the last character out from a data type
- */
- private static final int LAST_CHAR_MASK_ = 0xFFFF;
+ // additional properties ----------------------------------------------
/**
* First nibble shift
*/
private static final int FIRST_NIBBLE_SHIFT_ = 0x4;
-
/**
* Second nibble mask
*/
@@ -530,7 +340,7 @@
/**
* Constructor
- * @exception thrown when data reading fails or data corrupted
+ * @exception IOException thrown when data reading fails or data corrupted
*/
private UCharacterProperty() throws IOException
{
@@ -544,275 +354,16 @@
m_trie_.putIndexData(this);
}
- /* Is followed by {case-ignorable}* cased ? */
- /**
- * Getting the correct address for data in the exception value
- * @param evalue exception value
- * @param indicator type of data to retrieve
- * @param address current address to move from
- * @return the correct address
- */
- private int addExceptionOffset(int evalue, int indicator, int address)
- {
- int result = address;
- if (indicator >= EXC_GROUP_) {
- result += FLAGS_OFFSET_[evalue & EXC_GROUP_MASK_];
- evalue >>= EXC_GROUP_;
- indicator -= EXC_GROUP_;
- }
- int mask = (1 << indicator) - 1;
- result += FLAGS_OFFSET_[evalue & mask];
- return result;
- }
-
- private static final int TAB = 0x0009;
- private static final int LF = 0x000a;
- private static final int FF = 0x000c;
- private static final int CR = 0x000d;
- private static final int U_A = 0x0041;
- private static final int U_Z = 0x005a;
- private static final int U_a = 0x0061;
- private static final int U_z = 0x007a;
- private static final int DEL = 0x007f;
- private static final int NL = 0x0085;
- private static final int NBSP = 0x00a0;
- private static final int CGJ = 0x034f;
- private static final int FIGURESP= 0x2007;
- private static final int HAIRSP = 0x200a;
- private static final int ZWNJ = 0x200c;
- private static final int ZWJ = 0x200d;
- private static final int RLM = 0x200f;
- private static final int NNBSP = 0x202f;
- private static final int WJ = 0x2060;
- private static final int INHSWAP = 0x206a;
- private static final int NOMDIG = 0x206f;
- private static final int ZWNBSP = 0xfeff;
-
- public UnicodeSet addPropertyStarts(UnicodeSet set) {
- int c;
-
- /* add the start code point of each same-value range of each trie */
- //utrie_enum(&normTrie, NULL, _enumPropertyStartsRange, set);
- TrieIterator propsIter = new TrieIterator(m_trie_);
- RangeValueIterator.Element propsResult = new RangeValueIterator.Element();
- while(propsIter.next(propsResult)){
- set.add(propsResult.start);
- }
- //utrie_enum(&propsVectorsTrie, NULL, _enumPropertyStartsRange, set);
- TrieIterator propsVectorsIter = new TrieIterator(m_additionalTrie_);
- RangeValueIterator.Element propsVectorsResult = new RangeValueIterator.Element();
- while(propsVectorsIter.next(propsVectorsResult)){
- set.add(propsVectorsResult.start);
- }
-
-
- /* add code points with hardcoded properties, plus the ones following them */
-
- /* add for IS_THAT_CONTROL_SPACE() */
- set.add(TAB); /* range TAB..CR */
- set.add(CR+1);
- set.add(0x1c);
- set.add(0x1f+1);
- set.add(NL);
- set.add(NL+1);
-
- /* add for u_isIDIgnorable() what was not added above */
- set.add(DEL); /* range DEL..NBSP-1, NBSP added below */
- set.add(HAIRSP);
- set.add(RLM+1);
- set.add(INHSWAP);
- set.add(NOMDIG+1);
- set.add(ZWNBSP);
- set.add(ZWNBSP+1);
-
- /* add no-break spaces for u_isWhitespace() what was not added above */
- set.add(NBSP);
- set.add(NBSP+1);
- set.add(FIGURESP);
- set.add(FIGURESP+1);
- set.add(NNBSP);
- set.add(NNBSP+1);
-
- /* add for u_charDigitValue() */
- set.add(0x3007);
- set.add(0x3008);
- set.add(0x4e00);
- set.add(0x4e01);
- set.add(0x4e8c);
- set.add(0x4e8d);
- set.add(0x4e09);
- set.add(0x4e0a);
- set.add(0x56db);
- set.add(0x56dc);
- set.add(0x4e94);
- set.add(0x4e95);
- set.add(0x516d);
- set.add(0x516e);
- set.add(0x4e03);
- set.add(0x4e04);
- set.add(0x516b);
- set.add(0x516c);
- set.add(0x4e5d);
- set.add(0x4e5e);
-
- /* add for u_digit() */
- set.add(U_a);
- set.add(U_z+1);
- set.add(U_A);
- set.add(U_Z+1);
-
- /* add for UCHAR_DEFAULT_IGNORABLE_CODE_POINT what was not added above */
- set.add(WJ); /* range WJ..NOMDIG */
- set.add(0xfff0);
- set.add(0xfffb+1);
- set.add(0xe0000);
- set.add(0xe0fff+1);
-
- /* add for UCHAR_GRAPHEME_BASE and others */
- set.add(CGJ);
- set.add(CGJ+1);
-
- /* add for UCHAR_JOINING_TYPE */
- set.add(ZWNJ); /* range ZWNJ..ZWJ */
- set.add(ZWJ+1);
-
- /* add Jamo type boundaries for UCHAR_HANGUL_SYLLABLE_TYPE */
- set.add(0x1100);
- int value= UCharacter.HangulSyllableType.LEADING_JAMO;
- int value2;
- for(c=0x115a; c<=0x115f; ++c) {
- value2= UCharacter.getIntPropertyValue(c, UProperty.HANGUL_SYLLABLE_TYPE);
- if(value!=value2) {
- value=value2;
- set.add(c);
+ public void upropsvec_addPropertyStarts(UnicodeSet set) {
+ /* add the start code point of each same-value range of the properties vectors trie */
+ if(m_additionalColumnsCount_>0) {
+ /* if m_additionalColumnsCount_==0 then the properties vectors trie may not be there at all */
+ TrieIterator propsVectorsIter = new TrieIterator(m_additionalTrie_);
+ RangeValueIterator.Element propsVectorsResult = new RangeValueIterator.Element();
+ while(propsVectorsIter.next(propsVectorsResult)){
+ set.add(propsVectorsResult.start);
}
}
-
- set.add(0x1160);
- value=UCharacter.HangulSyllableType.VOWEL_JAMO;
- for(c=0x11a3; c<=0x11a7; ++c) {
- value2=UCharacter.getIntPropertyValue(c, UProperty.HANGUL_SYLLABLE_TYPE);
- if(value!=value2) {
- value=value2;
- set.add(c);
- }
- }
-
- set.add(0x11a8);
- value=UCharacter.HangulSyllableType.TRAILING_JAMO;
- for(c=0x11fa; c<=0x11ff; ++c) {
- value2=UCharacter.getIntPropertyValue(c, UProperty.HANGUL_SYLLABLE_TYPE);
- if(value!=value2) {
- value=value2;
- set.add(c);
- }
- }
-
-
- /*
- * Omit code points for u_charCellWidth() because
- * - it is deprecated and not a real Unicode property
- * - they are probably already set from the trie enumeration
- */
-
- /*
- * Omit code points with hardcoded specialcasing properties
- * because we do not build property UnicodeSets for them right now.
- */
- return set; // for chaining
- }
-/*----------------------------------------------------------------
- * Inclusions list
- *----------------------------------------------------------------*/
-
- /*
- * Return a set of characters for property enumeration.
- * The set implicitly contains 0x110000 as well, which is one more than the highest
- * Unicode code point.
- *
- * This set is used as an ordered list - its code points are ordered, and
- * consecutive code points (in Unicode code point order) in the set define a range.
- * For each two consecutive characters (start, limit) in the set,
- * all of the UCD/normalization and related properties for
- * all code points start..limit-1 are all the same,
- * except for character names and ISO comments.
- *
- * All Unicode code points U+0000..U+10ffff are covered by these ranges.
- * The ranges define a partition of the Unicode code space.
- * ICU uses the inclusions set to enumerate properties for generating
- * UnicodeSets containing all code points that have a certain property value.
- *
- * The Inclusion List is generated from the UCD. It is generated
- * by enumerating the data tries, and code points for hardcoded properties
- * are added as well.
- *
- * --------------------------------------------------------------------------
- *
- * The following are ideas for getting properties-unique code point ranges,
- * with possible optimizations beyond the current implementation.
- * These optimizations would require more code and be more fragile.
- * The current implementation generates one single list (set) for all properties.
- *
- * To enumerate properties efficiently, one needs to know ranges of
- * repetitive values, so that the value of only each start code point
- * can be applied to the whole range.
- * This information is in principle available in the uprops.icu/unorm.icu data.
- *
- * There are two obstacles:
- *
- * 1. Some properties are computed from multiple data structures,
- * making it necessary to get repetitive ranges by intersecting
- * ranges from multiple tries.
- *
- * 2. It is not economical to write code for getting repetitive ranges
- * that are precise for each of some 50 properties.
- *
- * Compromise ideas:
- *
- * - Get ranges per trie, not per individual property.
- * Each range contains the same values for a whole group of properties.
- * This would generate currently five range sets, two for uprops.icu tries
- * and three for unorm.icu tries.
- *
- * - Combine sets of ranges for multiple tries to get sufficient sets
- * for properties, e.g., the uprops.icu main and auxiliary tries
- * for all non-normalization properties.
- *
- * Ideas for representing ranges and combining them:
- *
- * - A UnicodeSet could hold just the start code points of ranges.
- * Multiple sets are easily combined by or-ing them together.
- *
- * - Alternatively, a UnicodeSet could hold each even-numbered range.
- * All ranges could be enumerated by using each start code point
- * (for the even-numbered ranges) as well as each limit (end+1) code point
- * (for the odd-numbered ranges).
- * It should be possible to combine two such sets by xor-ing them,
- * but no more than two.
- *
- * The second way to represent ranges may(?!) yield smaller UnicodeSet arrays,
- * but the first one is certainly simpler and applicable for combining more than
- * two range sets.
- *
- * It is possible to combine all range sets for all uprops/unorm tries into one
- * set that can be used for all properties.
- * As an optimization, there could be less-combined range sets for certain
- * groups of properties.
- * The relationship of which less-combined range set to use for which property
- * depends on the implementation of the properties and must be hardcoded
- * - somewhat error-prone and higher maintenance but can be tested easily
- * by building property sets "the simple way" in test code.
- *
- * ---
- *
- * Do not use a UnicodeSet pattern because that causes infinite recursion;
- * UnicodeSet depends on the inclusions set.
- */
- public UnicodeSet getInclusions() {
- UnicodeSet set = new UnicodeSet();
- NormalizerImpl.addPropertyStarts(set);
- addPropertyStarts(set);
- return set;
}
}
--- a/jdk/src/share/classes/sun/text/normalizer/UCharacterPropertyReader.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/text/normalizer/UCharacterPropertyReader.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Portions Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
+ * Portions Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,10 +22,9 @@
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
-
/*
*******************************************************************************
- * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved *
+ * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved *
* *
* The original version of this source code and documentation is copyrighted *
* and owned by IBM, These materials are provided under terms of a License *
@@ -37,8 +36,8 @@
package sun.text.normalizer;
+import java.io.DataInputStream;
import java.io.InputStream;
-import java.io.DataInputStream;
import java.io.IOException;
/**
@@ -50,254 +49,13 @@
* </p>
* <p>uprops.icu which is in big-endian format is jared together with this
* package.</p>
+*
+* Unicode character properties file format see
+* (ICU4C)/source/tools/genprops/store.c
+*
* @author Syn Wee Quek
* @since release 2.1, February 1st 2002
-* @draft 2.1
*/
-/* Unicode character properties file format ------------------------------------
-
-The file format prepared and written here contains several data
-structures that store indexes or data.
-
-
-
-The following is a description of format version 3 .
-
-Data contents:
-
-The contents is a parsed, binary form of several Unicode character
-database files, most prominently UnicodeData.txt.
-
-Any Unicode code point from 0 to 0x10ffff can be looked up to get
-the properties, if any, for that code point. This means that the input
-to the lookup are 21-bit unsigned integers, with not all of the
-21-bit range used.
-
-It is assumed that client code keeps a uint32_t pointer
-to the beginning of the data:
-
- const uint32_t *p32;
-
-Formally, the file contains the following structures:
-
- const int32_t indexes[16] with values i0..i15:
-
- i0 propsIndex; -- 32-bit unit index to the table of 32-bit properties words
- i1 exceptionsIndex; -- 32-bit unit index to the table of 32-bit exception words
- i2 exceptionsTopIndex; -- 32-bit unit index to the array of UChars for special mappings
-
- i3 additionalTrieIndex; -- 32-bit unit index to the additional trie for more properties
- i4 additionalVectorsIndex; -- 32-bit unit index to the table of properties vectors
- i5 additionalVectorsColumns; -- number of 32-bit words per properties vector
-
- i6 reservedItemIndex; -- 32-bit unit index to the top of the properties vectors table
- i7..i9 reservedIndexes; -- reserved values; 0 for now
-
- i10 maxValues; -- maximum code values for vector word 0, see uprops.h (format version 3.1+)
- i11 maxValues2; -- maximum code values for vector word 2, see uprops.h (format version 3.2)
- i12..i15 reservedIndexes; -- reserved values; 0 for now
-
- PT serialized properties trie, see utrie.h (byte size: 4*(i0-16))
-
- P const uint32_t props32[i1-i0];
- E const uint32_t exceptions[i2-i1];
- U const UChar uchars[2*(i3-i2)];
-
- AT serialized trie for additional properties (byte size: 4*(i4-i3))
- PV const uint32_t propsVectors[(i6-i4)/i5][i5]==uint32_t propsVectors[i6-i4];
-
-Trie lookup and properties:
-
-In order to condense the data for the 21-bit code space, several properties of
-the Unicode code assignment are exploited:
-- The code space is sparse.
-- There are several 10k of consecutive codes with the same properties.
-- Characters and scripts are allocated in groups of 16 code points.
-- Inside blocks for scripts the properties are often repetitive.
-- The 21-bit space is not fully used for Unicode.
-
-The lookup of properties for a given code point is done with a trie lookup,
-using the UTrie implementation.
-The trie lookup result is a 16-bit index in the props32[] table where the
-actual 32-bit properties word is stored. This is done to save space.
-
-(There are thousands of 16-bit entries in the trie data table, but
-only a few hundred unique 32-bit properties words.
-If the trie data table contained 32-bit words directly, then that would be
-larger because the length of the table would be the same as now but the
-width would be 32 bits instead of 16. This saves more than 10kB.)
-
-With a given Unicode code point
-
- UChar32 c;
-
-and 0<=c<0x110000, the lookup is done like this:
-
- uint16_t i;
- UTRIE_GET16(c, i);
- uint32_t props=p32[i];
-
-For some characters, not all of the properties can be efficiently encoded
-using 32 bits. For them, the 32-bit word contains an index into the exceptions[]
-array:
-
- if(props&EXCEPTION_BIT)) {
- uint16_t e=(uint16_t)(props>>VALUE_SHIFT);
- ...
- }
-
-The exception values are a variable number of uint32_t starting at
-
- const uint32_t *pe=p32+exceptionsIndex+e;
-
-The first uint32_t there contains flags about what values actually follow it.
-Some of the exception values are UChar32 code points for the case mappings,
-others are numeric values etc.
-
-32-bit properties sets:
-
-Each 32-bit properties word contains:
-
- 0.. 4 general category
- 5 has exception values
- 6..10 BiDi category
-11 is mirrored
-12..14 numericType:
- 0 no numeric value
- 1 decimal digit value
- 2 digit value
- 3 numeric value
- ### TODO: type 4 for Han digits & numbers?!
-15..19 reserved
-20..31 value according to bits 0..5:
- if(has exception) {
- exception index;
- } else switch(general category) {
- case Ll: delta to uppercase; -- same as titlecase
- case Lu: -delta to lowercase; -- titlecase is same as c
- case Lt: -delta to lowercase; -- uppercase is same as c
- default:
- if(is mirrored) {
- delta to mirror;
- } else if(numericType!=0) {
- numericValue;
- } else {
- 0;
- };
- }
-
-Exception values:
-
-In the first uint32_t exception word for a code point,
-bits
-31..16 reserved
-15..0 flags that indicate which values follow:
-
-bit
- 0 has uppercase mapping
- 1 has lowercase mapping
- 2 has titlecase mapping
- 3 unused
- 4 has numeric value (numerator)
- if numericValue=0x7fffff00+x then numericValue=10^x
- 5 has denominator value
- 6 has a mirror-image Unicode code point
- 7 has SpecialCasing.txt entries
- 8 has CaseFolding.txt entries
-
-According to the flags in this word, one or more uint32_t words follow it
-in the sequence of the bit flags in the flags word; if a flag is not set,
-then the value is missing or 0:
-
-For the case mappings and the mirror-image Unicode code point,
-one uint32_t or UChar32 each is the code point.
-If the titlecase mapping is missing, then it is the same as the uppercase mapping.
-
-For the digit values, bits 31..16 contain the decimal digit value, and
-bits 15..0 contain the digit value. A value of -1 indicates that
-this value is missing.
-
-For the numeric/numerator value, an int32_t word contains the value directly,
-except for when there is no numerator but a denominator, then the numerator
-is implicitly 1. This means:
- numerator denominator result
- none none none
- x none x
- none y 1/y
- x y x/y
-
-If the numerator value is 0x7fffff00+x then it is replaced with 10^x.
-
-For the denominator value, a uint32_t word contains the value directly.
-
-For special casing mappings, the 32-bit exception word contains:
-31 if set, this character has complex, conditional mappings
- that are not stored;
- otherwise, the mappings are stored according to the following bits
-30..24 number of UChars used for mappings
-23..16 reserved
-15.. 0 UChar offset from the beginning of the UChars array where the
- UChars for the special case mappings are stored in the following format:
-
-Format of special casing UChars:
-One UChar value with lengths as follows:
-14..10 number of UChars for titlecase mapping
- 9.. 5 number of UChars for uppercase mapping
- 4.. 0 number of UChars for lowercase mapping
-
-Followed by the UChars for lowercase, uppercase, titlecase mappings in this order.
-
-For case folding mappings, the 32-bit exception word contains:
-31..24 number of UChars used for the full mapping
-23..16 reserved
-15.. 0 UChar offset from the beginning of the UChars array where the
- UChars for the special case mappings are stored in the following format:
-
-Format of case folding UChars:
-Two UChars contain the simple mapping as follows:
- 0, 0 no simple mapping
- BMP,0 a simple mapping to a BMP code point
- s1, s2 a simple mapping to a supplementary code point stored as two surrogates
-This is followed by the UChars for the full case folding mappings.
-
-Example:
-U+2160, ROMAN NUMERAL ONE, needs an exception because it has a lowercase
-mapping and a numeric value.
-Its exception values would be stored as 3 uint32_t words:
-
-- flags=0x0a (see above) with combining class 0
-- lowercase mapping 0x2170
-- numeric value=1
-
---- Additional properties (new in format version 2.1) ---
-
-The second trie for additional properties (AT) is also a UTrie with 16-bit data.
-The data words consist of 32-bit unit indexes (not row indexes!) into the
-table of unique properties vectors (PV).
-Each vector contains a set of properties.
-The width of a vector (number of uint32_t per row) may change
-with the formatVersion, it is stored in i5.
-
-Current properties: see icu/source/common/uprops.h
-
---- Changes in format version 3.1 ---
-
-See i10 maxValues above, contains only UBLOCK_COUNT and USCRIPT_CODE_LIMIT.
-
---- Changes in format version 3.2 ---
-
-- The tries use linear Latin-1 ranges.
-- The additional properties bits store full properties XYZ instead
- of partial Other_XYZ, so that changes in the derivation formulas
- need not be tracked in runtime library code.
-- Joining Type and Line Break are also stored completely, so that uprops.c
- needs no runtime formulas for enumerated properties either.
-- Store the case-sensitive flag in the main properties word.
-- i10 also contains U_LB_COUNT and U_EA_COUNT.
-- i11 contains maxValues2 for vector word 2.
-
------------------------------------------------------------------------------ */
-
final class UCharacterPropertyReader implements ICUBinary.Authenticate
{
// public methods ----------------------------------------------------
@@ -315,7 +73,6 @@
* <p>Protected constructor.</p>
* @param inputStream ICU uprop.dat file input stream
* @exception IOException throw if data file fails authentication
- * @draft 2.1
*/
protected UCharacterPropertyReader(InputStream inputStream)
throws IOException
@@ -331,8 +88,7 @@
* <p>Reads uprops.icu, parse it into blocks of data to be stored in
* UCharacterProperty.</P
* @param ucharppty UCharacterProperty instance
- * @exception thrown when data reading fails
- * @draft 2.1
+ * @exception IOException thrown when data reading fails
*/
protected void read(UCharacterProperty ucharppty) throws IOException
{
@@ -362,38 +118,30 @@
// read the trie index block
// m_props_index_ in terms of ints
- ucharppty.m_trie_ = new CharTrie(m_dataInputStream_, ucharppty);
+ ucharppty.m_trie_ = new CharTrie(m_dataInputStream_, null);
- // reads the 32 bit properties block
+ // skip the 32 bit properties block
int size = m_exceptionOffset_ - m_propertyOffset_;
- ucharppty.m_property_ = new int[size];
- for (int i = 0; i < size; i ++) {
- ucharppty.m_property_[i] = m_dataInputStream_.readInt();
- }
+ m_dataInputStream_.skipBytes(size * 4);
// reads the 32 bit exceptions block
size = m_caseOffset_ - m_exceptionOffset_;
- ucharppty.m_exception_ = new int[size];
- for (int i = 0; i < size; i ++) {
- ucharppty.m_exception_[i] = m_dataInputStream_.readInt();
- }
+ m_dataInputStream_.skipBytes(size * 4);
// reads the 32 bit case block
size = (m_additionalOffset_ - m_caseOffset_) << 1;
- ucharppty.m_case_ = new char[size];
- for (int i = 0; i < size; i ++) {
- ucharppty.m_case_[i] = m_dataInputStream_.readChar();
- }
+ m_dataInputStream_.skipBytes(size * 2);
+
+ if(m_additionalColumnsCount_ > 0) {
+ // reads the additional property block
+ ucharppty.m_additionalTrie_ = new CharTrie(m_dataInputStream_, null);
- // reads the additional property block
- ucharppty.m_additionalTrie_ = new CharTrie(m_dataInputStream_,
- ucharppty);
-
- // additional properties
- size = m_reservedOffset_ - m_additionalVectorsOffset_;
- ucharppty.m_additionalVectors_ = new int[size];
- for (int i = 0; i < size; i ++) {
- ucharppty.m_additionalVectors_[i] = m_dataInputStream_.readInt();
+ // additional properties
+ size = m_reservedOffset_ - m_additionalVectorsOffset_;
+ ucharppty.m_additionalVectors_ = new int[size];
+ for (int i = 0; i < size; i ++) {
+ ucharppty.m_additionalVectors_[i] = m_dataInputStream_.readInt();
+ }
}
m_dataInputStream_.close();
@@ -428,12 +176,15 @@
private byte m_unicodeVersion_[];
/**
- * File format version that this class understands.
- * No guarantees are made if a older version is used
+ * Data format "UPro".
*/
private static final byte DATA_FORMAT_ID_[] = {(byte)0x55, (byte)0x50,
(byte)0x72, (byte)0x6F};
- private static final byte DATA_FORMAT_VERSION_[] = {(byte)0x3, (byte)0x1,
+ /**
+ * Format version; this code works with all versions with the same major
+ * version number and the same Trie bit distribution.
+ */
+ private static final byte DATA_FORMAT_VERSION_[] = {(byte)0x5, (byte)0,
(byte)Trie.INDEX_STAGE_1_SHIFT_,
(byte)Trie.INDEX_STAGE_2_SHIFT_};
}
--- a/jdk/src/share/classes/sun/text/normalizer/UProperty.java Thu Apr 23 16:58:16 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-/*
- * Portions Copyright 2005 Sun Microsystems, Inc. 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. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-/*
- *******************************************************************************
- * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved *
- * *
- * The original version of this source code and documentation is copyrighted *
- * and owned by IBM, These materials are provided under terms of a License *
- * Agreement between IBM and Sun. This technology is protected by multiple *
- * US and International patents. This notice and attribution to IBM may not *
- * to removed. *
- *******************************************************************************
- */
-
-package sun.text.normalizer;
-
-/**
- * <p>Selection constants for Unicode properties. </p>
- * <p>These constants are used in functions like
- * UCharacter.hasBinaryProperty(int) to select one of the Unicode properties.
- * </p>
- * <p>The properties APIs are intended to reflect Unicode properties as
- * defined in the Unicode Character Database (UCD) and Unicode Technical
- * Reports (UTR).</p>
- * <p>For details about the properties see <a href=http://www.unicode.org>
- * http://www.unicode.org</a>.</p>
- * <p>For names of Unicode properties see the UCD file PropertyAliases.txt.
- * </p>
- * <p>Important: If ICU is built with UCD files from Unicode versions below
- * 3.2, then properties marked with "new" are not or not fully
- * available. Check UCharacter.getUnicodeVersion() to be sure.</p>
- * @author Syn Wee Quek
- * @stable ICU 2.6
- * @see com.ibm.icu.lang.UCharacter
- */
-public interface UProperty
-{
- // public data member --------------------------------------------------
-
- /**
- * Enumerated property Hangul_Syllable_Type, new in Unicode 4.
- * Returns HangulSyllableType values.
- * @stable ICU 2.6
- */
- public static final int HANGUL_SYLLABLE_TYPE = 0x100B;
-
- /**
- * Bitmask property General_Category_Mask.
- * This is the General_Category property returned as a bit mask.
- * When used in UCharacter.getIntPropertyValue(c),
- * returns bit masks for UCharacterCategory values where exactly one bit is set.
- * When used with UCharacter.getPropertyValueName() and UCharacter.getPropertyValueEnum(),
- * a multi-bit mask is used for sets of categories like "Letters".
- * @stable ICU 2.4
- */
- public static final int GENERAL_CATEGORY_MASK = 0x2000;
-}
--- a/jdk/src/share/classes/sun/text/normalizer/UTF16.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/text/normalizer/UTF16.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Portions Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Portions Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,10 +22,9 @@
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
-
/*
*******************************************************************************
- * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved *
+ * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved *
* *
* The original version of this source code and documentation is copyrighted *
* and owned by IBM, These materials are provided under terms of a License *
@@ -184,15 +183,16 @@
* bounds.
* @stable ICU 2.1
*/
- public static int charAt(String source, int offset16)
- {
- if (offset16 < 0 || offset16 >= source.length()) {
- throw new StringIndexOutOfBoundsException(offset16);
+ public static int charAt(String source, int offset16) {
+ char single = source.charAt(offset16);
+ if (single < LEAD_SURROGATE_MIN_VALUE) {
+ return single;
}
+ return _charAt(source, offset16, single);
+ }
- char single = source.charAt(offset16);
- if (single < LEAD_SURROGATE_MIN_VALUE ||
- single > TRAIL_SURROGATE_MAX_VALUE) {
+ private static int _charAt(String source, int offset16, char single) {
+ if (single > TRAIL_SURROGATE_MAX_VALUE) {
return single;
}
@@ -201,29 +201,23 @@
// low, look both directions.
if (single <= LEAD_SURROGATE_MAX_VALUE) {
- ++ offset16;
+ ++offset16;
if (source.length() != offset16) {
char trail = source.charAt(offset16);
- if (trail >= TRAIL_SURROGATE_MIN_VALUE &&
- trail <= TRAIL_SURROGATE_MAX_VALUE) {
- return UCharacterProperty.getRawSupplementary(single,
- trail);
+ if (trail >= TRAIL_SURROGATE_MIN_VALUE && trail <= TRAIL_SURROGATE_MAX_VALUE) {
+ return UCharacterProperty.getRawSupplementary(single, trail);
+ }
+ }
+ } else {
+ --offset16;
+ if (offset16 >= 0) {
+ // single is a trail surrogate so
+ char lead = source.charAt(offset16);
+ if (lead >= LEAD_SURROGATE_MIN_VALUE && lead <= LEAD_SURROGATE_MAX_VALUE) {
+ return UCharacterProperty.getRawSupplementary(lead, single);
}
}
}
- else
- {
- -- offset16;
- if (offset16 >= 0) {
- // single is a trail surrogate so
- char lead = source.charAt(offset16);
- if (lead >= LEAD_SURROGATE_MIN_VALUE &&
- lead <= LEAD_SURROGATE_MAX_VALUE) {
- return UCharacterProperty.getRawSupplementary(lead,
- single);
- }
- }
- }
return single; // return unmatched surrogate
}
--- a/jdk/src/share/classes/sun/text/normalizer/UnicodeSet.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/text/normalizer/UnicodeSet.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Portions Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Portions Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,10 +22,9 @@
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
-
/*
*******************************************************************************
- * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved *
+ * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved *
* *
* The original version of this source code and documentation is copyrighted *
* and owned by IBM, These materials are provided under terms of a License *
@@ -38,11 +37,8 @@
package sun.text.normalizer;
import java.text.ParsePosition;
-import java.util.Map;
-import java.util.HashMap;
+import java.util.Iterator;
import java.util.TreeSet;
-import java.util.Iterator;
-import java.util.Collection;
/**
* A mutable set of Unicode characters and multicharacter strings. Objects of this class
@@ -130,8 +126,8 @@
* "[:Lu:]" and the Perl-like syntax "\p{Lu}" are recognized. For a
* complete list of supported property patterns, see the User's Guide
* for UnicodeSet at
- * <a href="http://oss.software.ibm.com/icu/userguide/unicodeSet.html">
- * http://oss.software.ibm.com/icu/userguide/unicodeSet.html</a>.
+ * <a href="http://www.icu-project.org/userguide/unicodeSet.html">
+ * http://www.icu-project.org/userguide/unicodeSet.html</a>.
* Actual determination of property data is defined by the underlying
* Unicode database as implemented by UCharacter.
*
@@ -271,9 +267,11 @@
* </tr>
* </table>
* </blockquote>
+ * <p>To iterate over contents of UnicodeSet, use UnicodeSetIterator class.
*
* @author Alan Liu
* @stable ICU 2.0
+ * @see UnicodeSetIterator
*/
public class UnicodeSet implements UnicodeMatcher {
@@ -322,7 +320,7 @@
* properties are all exactly alike, e.g. CJK Ideographs from
* U+4E00 to U+9FA5.
*/
- private static UnicodeSet INCLUSIONS = null;
+ private static UnicodeSet INCLUSIONS[] = null;
//----------------------------------------------------------------
// Public API
@@ -471,17 +469,18 @@
return result;
}
- return _generatePattern(result, escapeUnprintable);
+ return _generatePattern(result, escapeUnprintable, true);
}
/**
* Generate and append a string representation of this set to result.
* This does not use this.pat, the cleaned up copy of the string
* passed to applyPattern().
- * @stable ICU 2.0
+ * @param includeStrings if false, doesn't include the strings.
+ * @stable ICU 3.8
*/
public StringBuffer _generatePattern(StringBuffer result,
- boolean escapeUnprintable) {
+ boolean escapeUnprintable, boolean includeStrings) {
result.append('[');
int count = getRangeCount();
@@ -524,7 +523,7 @@
}
}
- if (strings.size() > 0) {
+ if (includeStrings && strings.size() > 0) {
Iterator it = strings.iterator();
while (it.hasNext()) {
result.append('{');
@@ -535,19 +534,8 @@
return result.append(']');
}
- /**
- * Adds the specified range to this set if it is not already
- * present. If this set already contains the specified range,
- * the call leaves this set unchanged. If <code>end > start</code>
- * then an empty range is added, leaving the set unchanged.
- *
- * @param start first character, inclusive, of range to be added
- * to this set.
- * @param end last character, inclusive, of range to be added
- * to this set.
- * @stable ICU 2.0
- */
- public UnicodeSet add(int start, int end) {
+ // for internal use, after checkFrozen has been called
+ private UnicodeSet add_unchecked(int start, int end) {
if (start < MIN_VALUE || start > MAX_VALUE) {
throw new IllegalArgumentException("Invalid code point U+" + Utility.hex(start, 6));
}
@@ -569,6 +557,11 @@
* @stable ICU 2.0
*/
public final UnicodeSet add(int c) {
+ return add_unchecked(c);
+ }
+
+ // for internal use only, after checkFrozen has been called
+ private final UnicodeSet add_unchecked(int c) {
if (c < MIN_VALUE || c > MAX_VALUE) {
throw new IllegalArgumentException("Invalid code point U+" + Utility.hex(c, 6));
}
@@ -663,13 +656,12 @@
* @stable ICU 2.0
*/
public final UnicodeSet add(String s) {
-
int cp = getSingleCP(s);
if (cp < 0) {
strings.add(s);
pat = null;
} else {
- add(cp, cp);
+ add_unchecked(cp, cp);
}
return this;
}
@@ -981,7 +973,6 @@
*/
void applyPattern(RuleCharacterIterator chars, SymbolTable symbols,
StringBuffer rebuiltPat, int options) {
-
// Syntax characters: [ ] ^ - & { }
// Recognized special forms for chars, sets: c-c s-s s&s
@@ -992,7 +983,7 @@
opts |= RuleCharacterIterator.SKIP_WHITESPACE;
}
- StringBuffer pat = new StringBuffer(), buf = null;
+ StringBuffer patBuf = new StringBuffer(), buf = null;
boolean usePat = false;
UnicodeSet scratch = null;
Object backup = null;
@@ -1049,13 +1040,13 @@
} else {
// Handle opening '[' delimiter
mode = 1;
- pat.append('[');
+ patBuf.append('[');
backup = chars.getPos(backup); // prepare to backup
c = chars.next(opts);
literal = chars.isEscaped();
if (c == '^' && !literal) {
invert = true;
- pat.append('^');
+ patBuf.append('^');
backup = chars.getPos(backup); // prepare to backup
c = chars.next(opts);
literal = chars.isEscaped();
@@ -1093,13 +1084,13 @@
if (op != 0) {
syntaxError(chars, "Char expected after operator");
}
- add(lastChar, lastChar);
- _appendToPat(pat, lastChar, false);
+ add_unchecked(lastChar, lastChar);
+ _appendToPat(patBuf, lastChar, false);
lastItem = op = 0;
}
if (op == '-' || op == '&') {
- pat.append(op);
+ patBuf.append(op);
}
if (nested == null) {
@@ -1108,14 +1099,14 @@
}
switch (setMode) {
case 1:
- nested.applyPattern(chars, symbols, pat, options);
+ nested.applyPattern(chars, symbols, patBuf, options);
break;
case 2:
chars.skipIgnored(opts);
- nested.applyPropertyPattern(chars, pat, symbols);
+ nested.applyPropertyPattern(chars, patBuf, symbols);
break;
case 3: // `nested' already parsed
- nested._toPattern(pat, false);
+ nested._toPattern(patBuf, false);
break;
}
@@ -1158,17 +1149,17 @@
switch (c) {
case ']':
if (lastItem == 1) {
- add(lastChar, lastChar);
- _appendToPat(pat, lastChar, false);
+ add_unchecked(lastChar, lastChar);
+ _appendToPat(patBuf, lastChar, false);
}
// Treat final trailing '-' as a literal
if (op == '-') {
- add(op, op);
- pat.append(op);
+ add_unchecked(op, op);
+ patBuf.append(op);
} else if (op == '&') {
syntaxError(chars, "Trailing '&'");
}
- pat.append(']');
+ patBuf.append(']');
mode = 2;
continue;
case '-':
@@ -1178,11 +1169,11 @@
continue;
} else {
// Treat final trailing '-' as a literal
- add(c, c);
+ add_unchecked(c, c);
c = chars.next(opts);
literal = chars.isEscaped();
if (c == ']' && !literal) {
- pat.append("-]");
+ patBuf.append("-]");
mode = 2;
continue;
}
@@ -1202,8 +1193,8 @@
syntaxError(chars, "Missing operand after operator");
}
if (lastItem == 1) {
- add(lastChar, lastChar);
- _appendToPat(pat, lastChar, false);
+ add_unchecked(lastChar, lastChar);
+ _appendToPat(patBuf, lastChar, false);
}
lastItem = 0;
if (buf == null) {
@@ -1228,9 +1219,9 @@
// we don't need to drop through to the further
// processing
add(buf.toString());
- pat.append('{');
- _appendToPat(pat, buf.toString(), false);
- pat.append('}');
+ patBuf.append('{');
+ _appendToPat(patBuf, buf.toString(), false);
+ patBuf.append('}');
continue;
case SymbolTable.SYMBOL_REF:
// symbols nosymbols
@@ -1250,12 +1241,12 @@
}
if (anchor && op == 0) {
if (lastItem == 1) {
- add(lastChar, lastChar);
- _appendToPat(pat, lastChar, false);
+ add_unchecked(lastChar, lastChar);
+ _appendToPat(patBuf, lastChar, false);
}
- add(UnicodeMatcher.ETHER);
+ add_unchecked(UnicodeMatcher.ETHER);
usePat = true;
- pat.append(SymbolTable.SYMBOL_REF).append(']');
+ patBuf.append(SymbolTable.SYMBOL_REF).append(']');
mode = 2;
continue;
}
@@ -1281,14 +1272,14 @@
// these are most likely typos.
syntaxError(chars, "Invalid range");
}
- add(lastChar, c);
- _appendToPat(pat, lastChar, false);
- pat.append(op);
- _appendToPat(pat, c, false);
+ add_unchecked(lastChar, c);
+ _appendToPat(patBuf, lastChar, false);
+ patBuf.append(op);
+ _appendToPat(patBuf, c, false);
lastItem = op = 0;
} else {
- add(lastChar, lastChar);
- _appendToPat(pat, lastChar, false);
+ add_unchecked(lastChar, lastChar);
+ _appendToPat(patBuf, lastChar, false);
lastChar = c;
}
break;
@@ -1315,9 +1306,9 @@
// Use the rebuilt pattern (pat) only if necessary. Prefer the
// generated pattern.
if (usePat) {
- rebuiltPat.append(pat.toString());
+ rebuiltPat.append(patBuf.toString());
} else {
- _generatePattern(rebuiltPat, false);
+ _generatePattern(rebuiltPat, false, true);
}
}
@@ -1590,7 +1581,9 @@
private static class VersionFilter implements Filter {
VersionInfo version;
+
VersionFilter(VersionInfo version) { this.version = version; }
+
public boolean contains(int ch) {
VersionInfo v = UCharacter.getAge(ch);
// Reference comparison ok; VersionInfo caches and reuses
@@ -1600,18 +1593,28 @@
}
}
- private static synchronized UnicodeSet getInclusions() {
+ private static synchronized UnicodeSet getInclusions(int src) {
if (INCLUSIONS == null) {
- UCharacterProperty property = UCharacterProperty.getInstance();
- INCLUSIONS = property.getInclusions();
+ INCLUSIONS = new UnicodeSet[UCharacterProperty.SRC_COUNT];
}
- return INCLUSIONS;
+ if(INCLUSIONS[src] == null) {
+ UnicodeSet incl = new UnicodeSet();
+ switch(src) {
+ case UCharacterProperty.SRC_PROPSVEC:
+ UCharacterProperty.getInstance().upropsvec_addPropertyStarts(incl);
+ break;
+ default:
+ throw new IllegalStateException("UnicodeSet.getInclusions(unknown src "+src+")");
+ }
+ INCLUSIONS[src] = incl;
+ }
+ return INCLUSIONS[src];
}
/**
* Generic filter-based scanning code for UCD property UnicodeSets.
*/
- private UnicodeSet applyFilter(Filter filter) {
+ private UnicodeSet applyFilter(Filter filter, int src) {
// Walk through all Unicode characters, noting the start
// and end of each range for which filter.contain(c) is
// true. Add each range to a set.
@@ -1629,7 +1632,7 @@
clear();
int startHasProperty = -1;
- UnicodeSet inclusions = getInclusions();
+ UnicodeSet inclusions = getInclusions(src);
int limitRange = inclusions.getRangeCount();
for (int j=0; j<limitRange; ++j) {
@@ -1646,19 +1649,18 @@
startHasProperty = ch;
}
} else if (startHasProperty >= 0) {
- add(startHasProperty, ch-1);
+ add_unchecked(startHasProperty, ch-1);
startHasProperty = -1;
}
}
}
if (startHasProperty >= 0) {
- add(startHasProperty, 0x10FFFF);
+ add_unchecked(startHasProperty, 0x10FFFF);
}
return this;
}
-
/**
* Remove leading and trailing rule white space and compress
* internal rule white space to a single space character.
@@ -1686,10 +1688,6 @@
return buf.toString();
}
- //----------------------------------------------------------------
- // Property set API
- //----------------------------------------------------------------
-
/**
* Modifies this set to contain those code points which have the
* given value for the given property. Prior contents of this
@@ -1699,22 +1697,21 @@
* @param symbols if not null, then symbols are first called to see if a property
* is available. If true, then everything else is skipped.
* @return this set
- * @draft ICU 3.2
- * @deprecated This is a draft API and might change in a future release of ICU.
+ * @stable ICU 3.2
*/
public UnicodeSet applyPropertyAlias(String propertyAlias,
String valueAlias, SymbolTable symbols) {
- if (propertyAlias.equals("Age"))
- {
- // Must munge name, since
- // VersionInfo.getInstance() does not do
- // 'loose' matching.
- VersionInfo version = VersionInfo.getInstance(mungeCharName(valueAlias));
- applyFilter(new VersionFilter(version));
- return this;
- }
- else
- throw new IllegalArgumentException("Unsupported property");
+ if (valueAlias.length() > 0) {
+ if (propertyAlias.equals("Age")) {
+ // Must munge name, since
+ // VersionInfo.getInstance() does not do
+ // 'loose' matching.
+ VersionInfo version = VersionInfo.getInstance(mungeCharName(valueAlias));
+ applyFilter(new VersionFilter(version), UCharacterProperty.SRC_PROPSVEC);
+ return this;
+ }
+ }
+ throw new IllegalArgumentException("Unsupported property: " + propertyAlias);
}
/**
@@ -1840,14 +1837,14 @@
*/
private void applyPropertyPattern(RuleCharacterIterator chars,
StringBuffer rebuiltPat, SymbolTable symbols) {
- String pat = chars.lookahead();
+ String patStr = chars.lookahead();
ParsePosition pos = new ParsePosition(0);
- applyPropertyPattern(pat, pos, symbols);
+ applyPropertyPattern(patStr, pos, symbols);
if (pos.getIndex() == 0) {
syntaxError(chars, "Invalid property pattern");
}
chars.jumpahead(pos.getIndex());
- rebuiltPat.append(pat.substring(0, pos.getIndex()));
+ rebuiltPat.append(patStr.substring(0, pos.getIndex()));
}
//----------------------------------------------------------------
@@ -1860,8 +1857,9 @@
* which UCharacterProperty.isRuleWhiteSpace() returns true,
* unless they are quoted or escaped. This may be ORed together
* with other selectors.
- * @internal
+ * @stable ICU 3.8
*/
public static final int IGNORE_SPACE = 1;
}
+
--- a/jdk/src/share/classes/sun/text/normalizer/UnicodeSetIterator.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/text/normalizer/UnicodeSetIterator.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Portions Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
+ * Portions Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,10 +22,9 @@
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
-
/*
*******************************************************************************
- * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved *
+ * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved *
* *
* The original version of this source code and documentation is copyrighted *
* and owned by IBM, These materials are provided under terms of a License *
@@ -167,8 +166,8 @@
* @param set the set to iterate over.
* @stable ICU 2.0
*/
- public void reset(UnicodeSet set) {
- this.set = set;
+ public void reset(UnicodeSet uset) {
+ set = uset;
reset();
}
@@ -213,8 +212,8 @@
/**
* @internal
*/
- protected void loadRange(int range) {
- nextElement = set.getRangeStart(range);
- endElement = set.getRangeEnd(range);
+ protected void loadRange(int aRange) {
+ nextElement = set.getRangeStart(aRange);
+ endElement = set.getRangeEnd(aRange);
}
}
--- a/jdk/src/share/classes/sun/text/normalizer/Utility.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/text/normalizer/Utility.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Portions Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
+ * Portions Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,7 +24,7 @@
*/
/*
*******************************************************************************
- * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved *
+ * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved *
* *
* The original version of this source code and documentation is copyrighted *
* and owned by IBM, These materials are provided under terms of a License *
@@ -36,11 +36,28 @@
package sun.text.normalizer;
-// This class contains utility functions so testing not needed
-///CLOVER:OFF
public final class Utility {
/**
+ * Convenience utility to compare two Object[]s
+ * Ought to be in System.
+ * @param len the length to compare.
+ * The start indices and start+len must be valid.
+ */
+ public final static boolean arrayRegionMatches(char[] source, int sourceStart,
+ char[] target, int targetStart,
+ int len)
+ {
+ int sourceEnd = sourceStart + len;
+ int delta = targetStart - sourceStart;
+ for (int i = sourceStart; i < sourceEnd; i++) {
+ if (source[i]!=target[i + delta])
+ return false;
+ }
+ return true;
+ }
+
+ /**
* Convert characters outside the range U+0020 to U+007F to
* Unicode escapes, and convert backslash to a double backslash.
*/
@@ -344,7 +361,6 @@
return false;
}
- //// for StringPrep
/**
* Similar to StringBuffer.getChars, version 1.3.
* Since JDK 1.2 implements StringBuffer.getChars differently, this method
@@ -356,7 +372,6 @@
* @param dst char array to store the retrieved chars
* @param dstBegin offset to the start of the destination char array to
* store the retrieved chars
- * @draft since ICU4J 2.0
*/
public static void getChars(StringBuffer src, int srcBegin, int srcEnd,
char dst[], int dstBegin)
@@ -367,23 +382,4 @@
src.getChars(srcBegin, srcEnd, dst, dstBegin);
}
- /**
- * Convenience utility to compare two char[]s.
- * @param len the length to compare.
- * The start indices and start+len must be valid.
- */
- public final static boolean arrayRegionMatches(char[] source, int sourceStart,
- char[] target, int targetStart,
- int len)
- {
- int sourceEnd = sourceStart + len;
- int delta = targetStart - sourceStart;
- for (int i = sourceStart; i < sourceEnd; i++) {
- if (source[i] != target[i + delta])
- return false;
- }
- return true;
- }
-
}
-///CLOVER:ON
--- a/jdk/src/share/classes/sun/text/normalizer/VersionInfo.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/classes/sun/text/normalizer/VersionInfo.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Portions Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Portions Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,7 +24,7 @@
*/
/*
*******************************************************************************
- * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved *
+ * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved *
* *
* The original version of this source code and documentation is copyrighted *
* and owned by IBM, These materials are provided under terms of a License *
Binary file jdk/src/share/classes/sun/text/resources/ubidi.icu has changed
Binary file jdk/src/share/classes/sun/text/resources/unorm.icu has changed
Binary file jdk/src/share/classes/sun/text/resources/uprops.icu has changed
--- a/jdk/src/share/native/java/lang/ClassLoader.c Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/native/java/lang/ClassLoader.c Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2005 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -437,3 +437,21 @@
(*env)->ReleaseStringUTFChars(env, name, cname);
return res;
}
+
+JNIEXPORT jobject JNICALL
+Java_java_lang_ClassLoader_getCaller(JNIEnv *env, jclass cls, jint index)
+{
+ jobjectArray jcallerStack;
+ int len;
+
+ jcallerStack = JVM_GetClassContext(env);
+ if ((*env)->ExceptionCheck(env)) {
+ return NULL;
+ }
+ len = (*env)->GetArrayLength(env, jcallerStack);
+ if (index < len) {
+ return (*env)->GetObjectArrayElement(env, jcallerStack, index);
+ }
+ return NULL;
+}
+
--- a/jdk/src/share/native/java/util/zip/zip_util.c Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/native/java/util/zip/zip_util.c Mon Apr 27 12:33:57 2009 -0700
@@ -313,6 +313,38 @@
}
/*
+ * Searches for the ZIP64 end of central directory (END) header. The
+ * contents of the ZIP64 END header will be read and placed in end64buf.
+ * Returns the file position of the ZIP64 END header, otherwise returns
+ * -1 if the END header was not found or an error occurred.
+ *
+ * The ZIP format specifies the "position" of each related record as
+ * ...
+ * [central directory]
+ * [zip64 end of central directory record]
+ * [zip64 end of central directory locator]
+ * [end of central directory record]
+ *
+ * The offset of zip64 end locator can be calculated from endpos as
+ * "endpos - ZIP64_LOCHDR".
+ * The "offset" of zip64 end record is stored in zip64 end locator.
+ */
+static jlong
+findEND64(jzfile *zip, void *end64buf, jlong endpos)
+{
+ char loc64[ZIP64_LOCHDR];
+ jlong end64pos;
+ if (readFullyAt(zip->zfd, loc64, ZIP64_LOCHDR, endpos - ZIP64_LOCHDR) == -1) {
+ return -1; // end64 locator not found
+ }
+ end64pos = ZIP64_LOCOFF(loc64);
+ if (readFullyAt(zip->zfd, end64buf, ZIP64_ENDHDR, end64pos) == -1) {
+ return -1; // end64 record not found
+ }
+ return end64pos;
+}
+
+/*
* Returns a hash code value for a C-style NUL-terminated string.
*/
static unsigned int
@@ -463,7 +495,7 @@
readCEN(jzfile *zip, jint knownTotal)
{
/* Following are unsigned 32-bit */
- jlong endpos, cenpos, cenlen;
+ jlong endpos, end64pos, cenpos, cenlen, cenoff;
/* Following are unsigned 16-bit */
jint total, tablelen, i, j;
unsigned char *cenbuf = NULL;
@@ -474,6 +506,7 @@
jlong offset;
#endif
unsigned char endbuf[ENDHDR];
+ jint endhdrlen = ENDHDR;
jzcell *entries;
jint *table;
@@ -490,13 +523,27 @@
/* Get position and length of central directory */
cenlen = ENDSIZ(endbuf);
+ cenoff = ENDOFF(endbuf);
+ total = ENDTOT(endbuf);
+ if (cenlen == ZIP64_MAGICVAL || cenoff == ZIP64_MAGICVAL ||
+ total == ZIP64_MAGICCOUNT) {
+ unsigned char end64buf[ZIP64_ENDHDR];
+ if ((end64pos = findEND64(zip, end64buf, endpos)) != -1) {
+ cenlen = ZIP64_ENDSIZ(end64buf);
+ cenoff = ZIP64_ENDOFF(end64buf);
+ total = (jint)ZIP64_ENDTOT(end64buf);
+ endpos = end64pos;
+ endhdrlen = ZIP64_ENDHDR;
+ }
+ }
+
if (cenlen > endpos)
ZIP_FORMAT_ERROR("invalid END header (bad central directory size)");
cenpos = endpos - cenlen;
/* Get position of first local file (LOC) header, taking into
* account that there may be a stub prefixed to the zip file. */
- zip->locpos = cenpos - ENDOFF(endbuf);
+ zip->locpos = cenpos - cenoff;
if (zip->locpos < 0)
ZIP_FORMAT_ERROR("invalid END header (bad central directory offset)");
@@ -527,7 +574,7 @@
out the page size in order to make offset to be multiples of
page size.
*/
- zip->mlen = cenpos - offset + cenlen + ENDHDR;
+ zip->mlen = cenpos - offset + cenlen + endhdrlen;
zip->offset = offset;
mappedAddr = mmap64(0, zip->mlen, PROT_READ, MAP_SHARED, zip->zfd, (off64_t) offset);
zip->maddr = (mappedAddr == (void*) MAP_FAILED) ? NULL :
@@ -551,8 +598,13 @@
* is a 2-byte field, but we (and other zip implementations)
* support approx. 2**31 entries, we do not trust ENDTOT, but
* treat it only as a strong hint. When we call ourselves
- * recursively, knownTotal will have the "true" value. */
- total = (knownTotal != -1) ? knownTotal : ENDTOT(endbuf);
+ * recursively, knownTotal will have the "true" value.
+ *
+ * Keep this path alive even with the Zip64 END support added, just
+ * for zip files that have more than 0xffff entries but don't have
+ * the Zip64 enabled.
+ */
+ total = (knownTotal != -1) ? knownTotal : total;
entries = zip->entries = calloc(total, sizeof(entries[0]));
tablelen = zip->tablelen = ((total/2) | 1); // Odd -> fewer collisions
table = zip->table = malloc(tablelen * sizeof(table[0]));
@@ -854,6 +906,7 @@
static jzentry *
newEntry(jzfile *zip, jzcell *zc, AccessHint accessHint)
{
+ jlong locoff;
jint nlen, elen, clen;
jzentry *ze;
char *cen;
@@ -880,18 +933,55 @@
ze->size = CENLEN(cen);
ze->csize = (CENHOW(cen) == STORED) ? 0 : CENSIZ(cen);
ze->crc = CENCRC(cen);
- ze->pos = -(zip->locpos + CENOFF(cen));
+ locoff = CENOFF(cen);
+ ze->pos = -(zip->locpos + locoff);
if ((ze->name = malloc(nlen + 1)) == NULL) goto Catch;
memcpy(ze->name, cen + CENHDR, nlen);
ze->name[nlen] = '\0';
if (elen > 0) {
+ char *extra = cen + CENHDR + nlen;
+
/* This entry has "extra" data */
if ((ze->extra = malloc(elen + 2)) == NULL) goto Catch;
ze->extra[0] = (unsigned char) elen;
ze->extra[1] = (unsigned char) (elen >> 8);
- memcpy(ze->extra+2, cen + CENHDR + nlen, elen);
+ memcpy(ze->extra+2, extra, elen);
+ if (ze->csize == ZIP64_MAGICVAL || ze->size == ZIP64_MAGICVAL ||
+ locoff == ZIP64_MAGICVAL) {
+ jint off = 0;
+ while ((off + 4) < elen) { // spec: HeaderID+DataSize+Data
+ jint sz = SH(extra, off + 2);
+ if (SH(extra, off) == ZIP64_EXTID) {
+ off += 4;
+ if (ze->size == ZIP64_MAGICVAL) {
+ // if invalid zip64 extra fields, just skip
+ if (sz < 8 || (off + 8) > elen)
+ break;
+ ze->size = LL(extra, off);
+ sz -= 8;
+ off += 8;
+ }
+ if (ze->csize == ZIP64_MAGICVAL) {
+ if (sz < 8 || (off + 8) > elen)
+ break;
+ ze->csize = LL(extra, off);
+ sz -= 8;
+ off += 8;
+ }
+ if (locoff == ZIP64_MAGICVAL) {
+ if (sz < 8 || (off + 8) > elen)
+ break;
+ ze->pos = -(zip->locpos + LL(extra, off));
+ sz -= 8;
+ off += 8;
+ }
+ break;
+ }
+ off += (sz + 4);
+ }
+ }
}
if (clen > 0) {
--- a/jdk/src/share/native/java/util/zip/zip_util.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/native/java/util/zip/zip_util.h Mon Apr 27 12:33:57 2009 -0700
@@ -38,9 +38,13 @@
#define CENSIG 0x02014b50L /* "PK\001\002" */
#define ENDSIG 0x06054b50L /* "PK\005\006" */
+#define ZIP64_ENDSIG 0x06064b50L /* "PK\006\006" */
+#define ZIP64_LOCSIG 0x07064b50L /* "PK\006\007" */
+
/*
* Header sizes including signatures
*/
+
#ifdef USE_MMAP
#define SIGSIZ 4
#endif
@@ -49,12 +53,22 @@
#define CENHDR 46
#define ENDHDR 22
+#define ZIP64_ENDHDR 56 // ZIP64 end header size
+#define ZIP64_LOCHDR 20 // ZIP64 end loc header size
+#define ZIP64_EXTHDR 24 // EXT header size
+#define ZIP64_EXTID 1 // Extra field Zip64 header ID
+
+#define ZIP64_MAGICVAL 0xffffffffLL
+#define ZIP64_MAGICCOUNT 0xffff
+
+
/*
* Header field access macros
*/
#define CH(b, n) (((unsigned char *)(b))[n])
#define SH(b, n) (CH(b, n) | (CH(b, n+1) << 8))
-#define LG(b, n) (SH(b, n) | (SH(b, n+2) << 16))
+#define LG(b, n) ((SH(b, n) | (SH(b, n+2) << 16)) &0xffffffffUL)
+#define LL(b, n) (((jlong)LG(b, n)) | (((jlong)LG(b, n+4)) << 32))
#define GETSIG(b) LG(b, 0)
/*
@@ -106,6 +120,26 @@
#define ENDCOM(b) SH(b, 20) /* size of zip file comment */
/*
+ * Macros for getting Zip64 end of central directory header fields
+ */
+#define ZIP64_ENDLEN(b) LL(b, 4) /* size of zip64 end of central dir */
+#define ZIP64_ENDVEM(b) SH(b, 12) /* version made by */
+#define ZIP64_ENDVER(b) SH(b, 14) /* version needed to extract */
+#define ZIP64_ENDNMD(b) LG(b, 16) /* number of this disk */
+#define ZIP64_ENDDSK(b) LG(b, 20) /* disk number of start */
+#define ZIP64_ENDTOD(b) LL(b, 24) /* total number of entries on this disk */
+#define ZIP64_ENDTOT(b) LL(b, 32) /* total number of entries */
+#define ZIP64_ENDSIZ(b) LL(b, 40) /* central directory size in bytes */
+#define ZIP64_ENDOFF(b) LL(b, 48) /* offset of first CEN header */
+
+/*
+ * Macros for getting Zip64 end of central directory locator fields
+ */
+#define ZIP64_LOCDSK(b) LG(b, 4) /* disk number start */
+#define ZIP64_LOCOFF(b) LL(b, 8) /* offset of zip64 end */
+#define ZIP64_LOCTOT(b) LG(b, 16) /* total number of disks */
+
+/*
* Supported compression methods
*/
#define STORED 0
@@ -145,7 +179,7 @@
*/
typedef struct jzcell {
unsigned int hash; /* 32 bit hashcode on name */
- unsigned int cenpos; /* Offset of central directory file header */
+ jlong cenpos; /* Offset of central directory file header */
unsigned int next; /* hash chain: index into jzfile->entries */
} jzcell;
--- a/jdk/src/share/native/java/util/zip/zlib-1.1.3/zlib.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/share/native/java/util/zip/zlib-1.1.3/zlib.h Mon Apr 27 12:33:57 2009 -0700
@@ -106,11 +106,11 @@
typedef struct z_stream_s {
Bytef *next_in; /* next input byte */
uInt avail_in; /* number of bytes available at next_in */
- uLong total_in; /* total nb of input bytes read so far */
+ long long total_in; /* total nb of input bytes read so far */
Bytef *next_out; /* next output byte should be put there */
uInt avail_out; /* remaining free space at next_out */
- uLong total_out; /* total nb of bytes output so far */
+ long long total_out; /* total nb of bytes output so far */
char *msg; /* last error message, NULL if no error */
struct internal_state FAR *state; /* not visible by applications */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/native/sun/awt/utility/rect.c Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2008-2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+#include "utility/rect.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+/**
+ * bitsPerPixel must be 32 for now.
+ * outBuf must be large enough to conatin all the rectangles.
+ */
+int BitmapToYXBandedRectangles(int bitsPerPixel, int width, int height, unsigned char * buf, RECT_T * outBuf)
+{
+ //XXX: we might want to reuse the code in the splashscreen library,
+ // though we'd have to deal with the ALPHA_THRESHOLD and different
+ // image formats in this case.
+ int widthBytes = width * bitsPerPixel / 8;
+ int alignedWidth = (((widthBytes - 1) / 4) + 1) * 4;
+
+ RECT_T * out = outBuf;
+
+ RECT_T *pPrevLine = NULL, *pFirst = out, *pThis = pFirst;
+ int i, j, i0;
+ int length;
+
+ for (j = 0; j < height; j++) {
+ /* generate data for a scanline */
+
+ unsigned char *pSrc = (unsigned char *) buf + j * alignedWidth;
+ RECT_T *pLine = pThis;
+
+ i = 0;
+
+ do {
+ // pSrc[0,1,2] == B,G,R; pSrc[3] == Alpha
+ while (i < width && !pSrc[3]) {
+ pSrc += 4;
+ ++i;
+ }
+ if (i >= width)
+ break;
+ i0 = i;
+ while (i < width && pSrc[3]) {
+ pSrc += 4;
+ ++i;
+ }
+ RECT_SET(*pThis, i0, j, i - i0, 1);
+ ++pThis;
+ } while (i < width);
+
+ /* check if the previous scanline is exactly the same, merge if so
+ (this is the only optimization we can use for YXBanded rectangles,
+ and win32 supports YXBanded only */
+
+ length = pThis - pLine;
+ if (pPrevLine && pLine - pPrevLine == length) {
+ for (i = 0; i < length && RECT_EQ_X(pPrevLine[i], pLine[i]); ++i) {
+ }
+ if (i == pLine - pPrevLine) {
+ // do merge
+ for (i = 0; i < length; i++) {
+ RECT_INC_HEIGHT(pPrevLine[i]);
+ }
+ pThis = pLine;
+ continue;
+ }
+ }
+ /* or else use the generated scanline */
+
+ pPrevLine = pLine;
+ }
+
+ return pThis - pFirst;
+}
+
+#if defined(__cplusplus)
+}
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/classes/sun/awt/X11/InfoWindow.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,495 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.awt.X11;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.awt.peer.TrayIconPeer;
+import sun.awt.*;
+import java.awt.image.*;
+import java.text.BreakIterator;
+import java.util.logging.Logger;
+import java.util.logging.Level;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * An utility window class. This is a base class for Tooltip and Balloon.
+ */
+public abstract class InfoWindow extends Window {
+ private Container container;
+ private Closer closer;
+
+ protected InfoWindow(Frame parent, Color borderColor) {
+ super(parent);
+ container = new Container() {
+ @Override
+ public Insets getInsets() {
+ return new Insets(1, 1, 1, 1);
+ }
+ };
+ setLayout(new BorderLayout());
+ setBackground(borderColor);
+ add(container, BorderLayout.CENTER);
+ container.setLayout(new BorderLayout());
+
+ closer = new Closer();
+ }
+
+ public Component add(Component c) {
+ container.add(c, BorderLayout.CENTER);
+ return c;
+ }
+
+ protected void setCloser(Runnable action, int time) {
+ closer.set(action, time);
+ }
+
+ // Must be executed on EDT.
+ protected void show(Point corner, int indent) {
+ assert SunToolkit.isDispatchThreadForAppContext(this);
+
+ pack();
+
+ Dimension size = getSize();
+ // TODO: When 6356322 is fixed we should get screen bounds in
+ // this way: eframe.getGraphicsConfiguration().getBounds().
+ Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();
+
+ if (corner.x < scrSize.width/2 && corner.y < scrSize.height/2) { // 1st square
+ setLocation(corner.x + indent, corner.y + indent);
+
+ } else if (corner.x >= scrSize.width/2 && corner.y < scrSize.height/2) { // 2nd square
+ setLocation(corner.x - indent - size.width, corner.y + indent);
+
+ } else if (corner.x < scrSize.width/2 && corner.y >= scrSize.height/2) { // 3rd square
+ setLocation(corner.x + indent, corner.y - indent - size.height);
+
+ } else if (corner.x >= scrSize.width/2 && corner.y >= scrSize.height/2) { // 4th square
+ setLocation(corner.x - indent - size.width, corner.y - indent - size.height);
+ }
+
+ super.show();
+ closer.schedule();
+ }
+
+ public void hide() {
+ closer.close();
+ }
+
+ private class Closer implements Runnable {
+ Runnable action;
+ int time;
+
+ public void run() {
+ doClose();
+ }
+
+ void set(Runnable action, int time) {
+ this.action = action;
+ this.time = time;
+ }
+
+ void schedule() {
+ XToolkit.schedule(this, time);
+ }
+
+ void close() {
+ XToolkit.remove(this);
+ doClose();
+ }
+
+ // WARNING: this method may be executed on Toolkit thread.
+ private void doClose() {
+ SunToolkit.executeOnEventHandlerThread(InfoWindow.this, new Runnable() {
+ public void run() {
+ InfoWindow.super.hide();
+ invalidate();
+ if (action != null) {
+ action.run();
+ }
+ }
+ });
+ }
+ }
+
+
+ private interface LiveArguments {
+ /** Whether the target of the InfoWindow is disposed. */
+ boolean isDisposed();
+
+ /** The bounds of the target of the InfoWindow. */
+ Rectangle getBounds();
+ }
+
+ public static class Tooltip extends InfoWindow {
+
+ public interface LiveArguments extends InfoWindow.LiveArguments {
+ /** The tooltip to be displayed. */
+ String getTooltipString();
+ }
+
+ private final Object target;
+ private final LiveArguments liveArguments;
+
+ private final Label textLabel = new Label("");
+ private final Runnable starter = new Runnable() {
+ public void run() {
+ display();
+ }};
+
+ private final static int TOOLTIP_SHOW_TIME = 10000;
+ private final static int TOOLTIP_START_DELAY_TIME = 1000;
+ private final static int TOOLTIP_MAX_LENGTH = 64;
+ private final static int TOOLTIP_MOUSE_CURSOR_INDENT = 5;
+ private final static Color TOOLTIP_BACKGROUND_COLOR = new Color(255, 255, 220);
+ private final static Font TOOLTIP_TEXT_FONT = XWindow.getDefaultFont();
+
+ public Tooltip(Frame parent, Object target,
+ LiveArguments liveArguments)
+ {
+ super(parent, Color.black);
+
+ this.target = target;
+ this.liveArguments = liveArguments;
+
+ XTrayIconPeer.suppressWarningString(this);
+
+ setCloser(null, TOOLTIP_SHOW_TIME);
+ textLabel.setBackground(TOOLTIP_BACKGROUND_COLOR);
+ textLabel.setFont(TOOLTIP_TEXT_FONT);
+ add(textLabel);
+ }
+
+ /*
+ * WARNING: this method is executed on Toolkit thread!
+ */
+ private void display() {
+ String tooltipString = liveArguments.getTooltipString();
+ if (tooltipString == null) {
+ return;
+ } else if (tooltipString.length() > TOOLTIP_MAX_LENGTH) {
+ textLabel.setText(tooltipString.substring(0, TOOLTIP_MAX_LENGTH));
+ } else {
+ textLabel.setText(tooltipString);
+ }
+
+ // Execute on EDT to avoid deadlock (see 6280857).
+ SunToolkit.executeOnEventHandlerThread(target, new Runnable() {
+ public void run() {
+ if (liveArguments.isDisposed()) {
+ return;
+ }
+ Point pointer = (Point)AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ if (!isPointerOverTrayIcon(liveArguments.getBounds())) {
+ return null;
+ }
+ return MouseInfo.getPointerInfo().getLocation();
+ }
+ });
+ if (pointer == null) {
+ return;
+ }
+ show(new Point(pointer.x, pointer.y), TOOLTIP_MOUSE_CURSOR_INDENT);
+ }
+ });
+ }
+
+ public void enter() {
+ XToolkit.schedule(starter, TOOLTIP_START_DELAY_TIME);
+ }
+
+ public void exit() {
+ XToolkit.remove(starter);
+ if (isVisible()) {
+ hide();
+ }
+ }
+
+ private boolean isPointerOverTrayIcon(Rectangle trayRect) {
+ Point p = MouseInfo.getPointerInfo().getLocation();
+ return !(p.x < trayRect.x || p.x > (trayRect.x + trayRect.width) ||
+ p.y < trayRect.y || p.y > (trayRect.y + trayRect.height));
+ }
+ }
+
+ public static class Balloon extends InfoWindow {
+
+ public interface LiveArguments extends InfoWindow.LiveArguments {
+ /** The action to be performed upon clicking the baloon. */
+ String getActionCommand();
+ }
+
+ private final LiveArguments liveArguments;
+ private final Object target;
+
+ private final static int BALLOON_SHOW_TIME = 10000;
+ private final static int BALLOON_TEXT_MAX_LENGTH = 256;
+ private final static int BALLOON_WORD_LINE_MAX_LENGTH = 16;
+ private final static int BALLOON_WORD_LINE_MAX_COUNT = 4;
+ private final static int BALLOON_ICON_WIDTH = 32;
+ private final static int BALLOON_ICON_HEIGHT = 32;
+ private final static int BALLOON_TRAY_ICON_INDENT = 0;
+ private final static Color BALLOON_CAPTION_BACKGROUND_COLOR = new Color(200, 200 ,255);
+ private final static Font BALLOON_CAPTION_FONT = new Font(Font.DIALOG, Font.BOLD, 12);
+
+ private Panel mainPanel = new Panel();
+ private Panel captionPanel = new Panel();
+ private Label captionLabel = new Label("");
+ private Button closeButton = new Button("X");
+ private Panel textPanel = new Panel();
+ private XTrayIconPeer.IconCanvas iconCanvas = new XTrayIconPeer.IconCanvas(BALLOON_ICON_WIDTH, BALLOON_ICON_HEIGHT);
+ private Label[] lineLabels = new Label[BALLOON_WORD_LINE_MAX_COUNT];
+ private ActionPerformer ap = new ActionPerformer();
+
+ private Image iconImage;
+ private Image errorImage;
+ private Image warnImage;
+ private Image infoImage;
+ private boolean gtkImagesLoaded;
+
+ private Displayer displayer = new Displayer();
+
+ public Balloon(Frame parent, Object target, LiveArguments liveArguments) {
+ super(parent, new Color(90, 80 ,190));
+ this.liveArguments = liveArguments;
+ this.target = target;
+
+ XTrayIconPeer.suppressWarningString(this);
+
+ setCloser(new Runnable() {
+ public void run() {
+ if (textPanel != null) {
+ textPanel.removeAll();
+ textPanel.setSize(0, 0);
+ iconCanvas.setSize(0, 0);
+ XToolkit.awtLock();
+ try {
+ displayer.isDisplayed = false;
+ XToolkit.awtLockNotifyAll();
+ } finally {
+ XToolkit.awtUnlock();
+ }
+ }
+ }
+ }, BALLOON_SHOW_TIME);
+
+ add(mainPanel);
+
+ captionLabel.setFont(BALLOON_CAPTION_FONT);
+ captionLabel.addMouseListener(ap);
+
+ captionPanel.setLayout(new BorderLayout());
+ captionPanel.add(captionLabel, BorderLayout.WEST);
+ captionPanel.add(closeButton, BorderLayout.EAST);
+ captionPanel.setBackground(BALLOON_CAPTION_BACKGROUND_COLOR);
+ captionPanel.addMouseListener(ap);
+
+ closeButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ hide();
+ }
+ });
+
+ mainPanel.setLayout(new BorderLayout());
+ mainPanel.setBackground(Color.white);
+ mainPanel.add(captionPanel, BorderLayout.NORTH);
+ mainPanel.add(iconCanvas, BorderLayout.WEST);
+ mainPanel.add(textPanel, BorderLayout.CENTER);
+
+ iconCanvas.addMouseListener(ap);
+
+ for (int i = 0; i < BALLOON_WORD_LINE_MAX_COUNT; i++) {
+ lineLabels[i] = new Label();
+ lineLabels[i].addMouseListener(ap);
+ lineLabels[i].setBackground(Color.white);
+ }
+
+ displayer.start();
+ }
+
+ public void display(String caption, String text, String messageType) {
+ if (!gtkImagesLoaded) {
+ loadGtkImages();
+ }
+ displayer.display(caption, text, messageType);
+ }
+
+ private void _display(String caption, String text, String messageType) {
+ captionLabel.setText(caption);
+
+ BreakIterator iter = BreakIterator.getWordInstance();
+ if (text != null) {
+ iter.setText(text);
+ int start = iter.first(), end;
+ int nLines = 0;
+
+ do {
+ end = iter.next();
+
+ if (end == BreakIterator.DONE ||
+ text.substring(start, end).length() >= 50)
+ {
+ lineLabels[nLines].setText(text.substring(start, end == BreakIterator.DONE ?
+ iter.last() : end));
+ textPanel.add(lineLabels[nLines++]);
+ start = end;
+ }
+ if (nLines == BALLOON_WORD_LINE_MAX_COUNT) {
+ if (end != BreakIterator.DONE) {
+ lineLabels[nLines - 1].setText(
+ new String(lineLabels[nLines - 1].getText() + " ..."));
+ }
+ break;
+ }
+ } while (end != BreakIterator.DONE);
+
+
+ textPanel.setLayout(new GridLayout(nLines, 1));
+ }
+
+ if ("ERROR".equals(messageType)) {
+ iconImage = errorImage;
+ } else if ("WARNING".equals(messageType)) {
+ iconImage = warnImage;
+ } else if ("INFO".equals(messageType)) {
+ iconImage = infoImage;
+ } else {
+ iconImage = null;
+ }
+
+ if (iconImage != null) {
+ Dimension tpSize = textPanel.getSize();
+ iconCanvas.setSize(BALLOON_ICON_WIDTH, (BALLOON_ICON_HEIGHT > tpSize.height ?
+ BALLOON_ICON_HEIGHT : tpSize.height));
+ iconCanvas.validate();
+ }
+
+ SunToolkit.executeOnEventHandlerThread(target, new Runnable() {
+ public void run() {
+ if (liveArguments.isDisposed()) {
+ return;
+ }
+ Point parLoc = getParent().getLocationOnScreen();
+ Dimension parSize = getParent().getSize();
+ show(new Point(parLoc.x + parSize.width/2, parLoc.y + parSize.height/2),
+ BALLOON_TRAY_ICON_INDENT);
+ if (iconImage != null) {
+ iconCanvas.updateImage(iconImage); // call it after the show(..) above
+ }
+ }
+ });
+ }
+
+ public void dispose() {
+ displayer.interrupt();
+ super.dispose();
+ }
+
+ private void loadGtkImages() {
+ if (!gtkImagesLoaded) {
+ errorImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty(
+ "gtk.icon.gtk-dialog-error.6.rtl");
+ warnImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty(
+ "gtk.icon.gtk-dialog-warning.6.rtl");
+ infoImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty(
+ "gtk.icon.gtk-dialog-info.6.rtl");
+ gtkImagesLoaded = true;
+ }
+ }
+
+ private class ActionPerformer extends MouseAdapter {
+ public void mouseClicked(MouseEvent e) {
+ // hide the balloon by any click
+ hide();
+ if (e.getButton() == MouseEvent.BUTTON1) {
+ ActionEvent aev = new ActionEvent(target, ActionEvent.ACTION_PERFORMED,
+ liveArguments.getActionCommand(),
+ e.getWhen(), e.getModifiers());
+ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(aev);
+ }
+ }
+ }
+
+ private class Displayer extends Thread {
+ final int MAX_CONCURRENT_MSGS = 10;
+
+ ArrayBlockingQueue<Message> messageQueue = new ArrayBlockingQueue<Message>(MAX_CONCURRENT_MSGS);
+ boolean isDisplayed;
+
+ Displayer() {
+ setDaemon(true);
+ }
+
+ public void run() {
+ while (true) {
+ Message msg = null;
+ try {
+ msg = (Message)messageQueue.take();
+ } catch (InterruptedException e) {
+ return;
+ }
+
+ /*
+ * Wait till the previous message is displayed if any
+ */
+ XToolkit.awtLock();
+ try {
+ while (isDisplayed) {
+ try {
+ XToolkit.awtLockWait();
+ } catch (InterruptedException e) {
+ return;
+ }
+ }
+ isDisplayed = true;
+ } finally {
+ XToolkit.awtUnlock();
+ }
+ _display(msg.caption, msg.text, msg.messageType);
+ }
+ }
+
+ void display(String caption, String text, String messageType) {
+ messageQueue.offer(new Message(caption, text, messageType));
+ }
+ }
+
+ private static class Message {
+ String caption, text, messageType;
+
+ Message(String caption, String text, String messageType) {
+ this.caption = caption;
+ this.text = text;
+ this.messageType = messageType;
+ }
+ }
+ }
+}
+
--- a/jdk/src/solaris/classes/sun/awt/X11/XBaseWindow.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XBaseWindow.java Mon Apr 27 12:33:57 2009 -0700
@@ -842,27 +842,35 @@
| XConstants.ButtonMotionMask);
final int ownerEvents = 1;
- int ptrGrab = XlibWrapper.XGrabPointer(XToolkit.getDisplay(),
- getContentWindow(), ownerEvents, eventMask, XConstants.GrabModeAsync,
- XConstants.GrabModeAsync, XConstants.None, (XWM.isMotif() ? XToolkit.arrowCursor : XConstants.None),
- XConstants.CurrentTime);
- // Check grab results to be consistent with X server grab
- if (ptrGrab != XConstants.GrabSuccess) {
- XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), XConstants.CurrentTime);
- XAwtState.setGrabWindow(null);
- grabLog.fine(" Grab Failure - mouse");
- return false;
- }
- int keyGrab = XlibWrapper.XGrabKeyboard(XToolkit.getDisplay(),
- getContentWindow(), ownerEvents, XConstants.GrabModeAsync, XConstants.GrabModeAsync,
- XConstants.CurrentTime);
- if (keyGrab != XConstants.GrabSuccess) {
- XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), XConstants.CurrentTime);
- XlibWrapper.XUngrabKeyboard(XToolkit.getDisplay(), XConstants.CurrentTime);
- XAwtState.setGrabWindow(null);
- grabLog.fine(" Grab Failure - keyboard");
- return false;
+ //6714678: IDE (Netbeans, Eclipse, JDeveloper) Debugger hangs
+ //process on Linux
+ //The user must pass the sun.awt.disablegrab property to disable
+ //taking grabs. This prevents hanging of the GUI when a breakpoint
+ //is hit while a popup window taking the grab is open.
+ if (!XToolkit.getSunAwtDisableGrab()) {
+ int ptrGrab = XlibWrapper.XGrabPointer(XToolkit.getDisplay(),
+ getContentWindow(), ownerEvents, eventMask, XConstants.GrabModeAsync,
+ XConstants.GrabModeAsync, XConstants.None, (XWM.isMotif() ? XToolkit.arrowCursor : XConstants.None),
+ XConstants.CurrentTime);
+ // Check grab results to be consistent with X server grab
+ if (ptrGrab != XConstants.GrabSuccess) {
+ XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), XConstants.CurrentTime);
+ XAwtState.setGrabWindow(null);
+ grabLog.fine(" Grab Failure - mouse");
+ return false;
+ }
+
+ int keyGrab = XlibWrapper.XGrabKeyboard(XToolkit.getDisplay(),
+ getContentWindow(), ownerEvents, XConstants.GrabModeAsync, XConstants.GrabModeAsync,
+ XConstants.CurrentTime);
+ if (keyGrab != XConstants.GrabSuccess) {
+ XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), XConstants.CurrentTime);
+ XlibWrapper.XUngrabKeyboard(XToolkit.getDisplay(), XConstants.CurrentTime);
+ XAwtState.setGrabWindow(null);
+ grabLog.fine(" Grab Failure - keyboard");
+ return false;
+ }
}
if (prevGrabWindow != null) {
prevGrabWindow.ungrabInputImpl();
@@ -882,8 +890,10 @@
grabLog.log(Level.FINE, "UnGrab input on {0}", new Object[] {grabWindow});
if (grabWindow != null) {
grabWindow.ungrabInputImpl();
- XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), XConstants.CurrentTime);
- XlibWrapper.XUngrabKeyboard(XToolkit.getDisplay(), XConstants.CurrentTime);
+ if (!XToolkit.getSunAwtDisableGrab()) {
+ XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), XConstants.CurrentTime);
+ XlibWrapper.XUngrabKeyboard(XToolkit.getDisplay(), XConstants.CurrentTime);
+ }
XAwtState.setGrabWindow(null);
// we need to call XFlush() here to force ungrab
// see 6384219 for details
--- a/jdk/src/solaris/classes/sun/awt/X11/XCanvasPeer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XCanvasPeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -27,7 +27,6 @@
import java.awt.*;
import java.awt.peer.*;
-import sun.awt.ComponentAccessor;
import sun.awt.SunToolkit;
import sun.awt.X11GraphicsConfig;
@@ -54,60 +53,45 @@
}
}
- void resetTargetGC(Component target) {
- ComponentAccessor.resetGC(target);
- }
+ /* Get a GraphicsConfig with the same visual on the new
+ * screen, which should be easy in Xinerama mode.
+ */
+ public GraphicsConfiguration getAppropriateGraphicsConfiguration(
+ GraphicsConfiguration gc)
+ {
+ if (graphicsConfig == null || gc == null) {
+ return gc;
+ }
+ // Opt: Only need to do if we're not using the default GC
+
+ int screenNum = ((X11GraphicsDevice)gc.getDevice()).getScreen();
+
+ X11GraphicsConfig parentgc;
+ // save vis id of current gc
+ int visual = graphicsConfig.getVisual();
- /*
- * Called when the Window this
- * Canvas is on is moved onto another Xinerama screen.
- *
- * Canvases can be created with a non-defulat GraphicsConfiguration. The
- * GraphicsConfiguration needs to be changed to one on the new screen,
- * preferably with the same visual ID.
- *
- * Up-called for other windows peer instances (XPanelPeer, XWindowPeer).
- *
- * Should only be called from the event thread.
- */
- public void displayChanged(int screenNum) {
- resetLocalGC(screenNum);
- resetTargetGC(target);
+ X11GraphicsDevice newDev = (X11GraphicsDevice) GraphicsEnvironment.
+ getLocalGraphicsEnvironment().
+ getScreenDevices()[screenNum];
+
+ for (int i = 0; i < newDev.getNumConfigs(screenNum); i++) {
+ if (visual == newDev.getConfigVisualId(i, screenNum)) {
+ // use that
+ graphicsConfig = (X11GraphicsConfig)newDev.getConfigurations()[i];
+ break;
+ }
+ }
+ // just in case...
+ if (graphicsConfig == null) {
+ graphicsConfig = (X11GraphicsConfig) GraphicsEnvironment.
+ getLocalGraphicsEnvironment().
+ getScreenDevices()[screenNum].
+ getDefaultConfiguration();
+ }
+
+ return graphicsConfig;
}
- /* Set graphicsConfig to a GraphicsConfig with the same visual on the new
- * screen, which should be easy in Xinerama mode.
- *
- * Should only be called from displayChanged(), and therefore only from
- * the event thread.
- */
- void resetLocalGC(int screenNum) {
- // Opt: Only need to do if we're not using the default GC
- if (graphicsConfig != null) {
- X11GraphicsConfig parentgc;
- // save vis id of current gc
- int visual = graphicsConfig.getVisual();
-
- X11GraphicsDevice newDev = (X11GraphicsDevice) GraphicsEnvironment.
- getLocalGraphicsEnvironment().
- getScreenDevices()[screenNum];
-
- for (int i = 0; i < newDev.getNumConfigs(screenNum); i++) {
- if (visual == newDev.getConfigVisualId(i, screenNum)) {
- // use that
- graphicsConfig = (X11GraphicsConfig)newDev.getConfigurations()[i];
- break;
- }
- }
- // just in case...
- if (graphicsConfig == null) {
- graphicsConfig = (X11GraphicsConfig) GraphicsEnvironment.
- getLocalGraphicsEnvironment().
- getScreenDevices()[screenNum].
- getDefaultConfiguration();
- }
- }
- }
protected boolean shouldFocusOnClick() {
// Canvas should always be able to be focused by mouse clicks.
return true;
--- a/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -35,6 +35,7 @@
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
+import java.awt.GraphicsConfiguration;
import java.awt.Image;
import java.awt.Insets;
import java.awt.KeyboardFocusManager;
@@ -76,11 +77,6 @@
public class XComponentPeer extends XWindow implements ComponentPeer, DropTargetPeer,
BackBufferCapsProvider
{
- /* FIX ME: these constants copied from java.awt.KeyboardFocusManager */
- static final int SNFH_FAILURE = 0;
- static final int SNFH_SUCCESS_HANDLED = 1;
- static final int SNFH_SUCCESS_PROCEED = 2;
-
private static final Logger log = Logger.getLogger("sun.awt.X11.XComponentPeer");
private static final Logger buffersLog = Logger.getLogger("sun.awt.X11.XComponentPeer.multibuffer");
private static final Logger focusLog = Logger.getLogger("sun.awt.X11.focus.XComponentPeer");
@@ -166,7 +162,7 @@
enableLog.log(Level.FINE, "Initial enable state: {0}", new Object[] {Boolean.valueOf(enabled)});
if (target.isVisible()) {
- show();
+ setVisible(true);
}
}
@@ -314,113 +310,27 @@
return null;
}
- /**
- * Returns whether or not this component should be given focus on mouse click.
- * Default implementation return whether or not this peer is "focusable"
- * Descendants might want to override it to extend/restrict conditions at which this
- * component should be focused by click (see MCanvasPeer and MPanelPeer)
- */
- protected boolean shouldFocusOnClick() {
- return isFocusable();
- }
-
- /**
- * Checks whether or not this component would be focused by native system if it would be allowed to do so.
- * Currently it checks that it displayable, visible, enabled and focusable.
- */
- static boolean canBeFocusedByClick(Component component) {
- if (component == null) {
- return false;
- } else {
- return component.isDisplayable() && component.isVisible() && component.isEnabled() && component.isFocusable();
- }
- }
-
- static Window getContainingWindow(Component comp) {
- while (comp != null && !(comp instanceof Window)) {
- comp = comp.getParent();
- }
-
- return (Window)comp;
- }
-
- static Method processSynchronousLightweightTransferMethod;
- static boolean processSynchronousLightweightTransfer(Component heavyweight, Component descendant,
- boolean temporary, boolean focusedWindowChangeAllowed,
- long time)
+ // TODO: consider moving it to KeyboardFocusManagerPeerImpl
+ final public boolean requestFocus(Component lightweightChild, boolean temporary,
+ boolean focusedWindowChangeAllowed, long time,
+ CausedFocusEvent.Cause cause)
{
- try {
- if (processSynchronousLightweightTransferMethod == null) {
- processSynchronousLightweightTransferMethod =
- (Method)AccessController.doPrivileged(
- new PrivilegedExceptionAction() {
- public Object run() throws IllegalAccessException, NoSuchMethodException
- {
- Method m = KeyboardFocusManager.class.
- getDeclaredMethod("processSynchronousLightweightTransfer",
- new Class[] {Component.class, Component.class,
- Boolean.TYPE, Boolean.TYPE,
- Long.TYPE});
- m.setAccessible(true);
- return m;
- }
- });
- }
- Object[] params = new Object[] {
- heavyweight,
- descendant,
- Boolean.valueOf(temporary),
- Boolean.valueOf(focusedWindowChangeAllowed),
- Long.valueOf(time)
- };
- return ((Boolean)processSynchronousLightweightTransferMethod.invoke(null, params)).booleanValue();
- } catch (PrivilegedActionException pae) {
- pae.printStackTrace();
- return false;
- } catch (IllegalAccessException iae) {
- iae.printStackTrace();
- return false;
- } catch (IllegalArgumentException iaee) {
- iaee.printStackTrace();
- return false;
- } catch (InvocationTargetException ite) {
- ite.printStackTrace();
- return false;
- }
- }
-
- static Method requestFocusWithCause;
-
- static void callRequestFocus(Component target, CausedFocusEvent.Cause cause) {
- if (requestFocusWithCause == null) {
- requestFocusWithCause = SunToolkit.getMethod(Component.class, "requestFocus", new Class[] {CausedFocusEvent.Cause.class});
- }
- if (requestFocusWithCause != null) {
- try {
- requestFocusWithCause.invoke(target, new Object[] {cause});
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
-
- final public boolean requestFocus(Component lightweightChild, boolean temporary,
- boolean focusedWindowChangeAllowed, long time, CausedFocusEvent.Cause cause)
- {
- if (processSynchronousLightweightTransfer(target, lightweightChild, temporary,
+ if (XKeyboardFocusManagerPeer.
+ processSynchronousLightweightTransfer(target, lightweightChild, temporary,
focusedWindowChangeAllowed, time))
{
return true;
}
- int result = XKeyboardFocusManagerPeer
- .shouldNativelyFocusHeavyweight(target, lightweightChild,
- temporary, focusedWindowChangeAllowed, time, cause);
+ int result = XKeyboardFocusManagerPeer.
+ shouldNativelyFocusHeavyweight(target, lightweightChild,
+ temporary, focusedWindowChangeAllowed,
+ time, cause);
switch (result) {
- case SNFH_FAILURE:
+ case XKeyboardFocusManagerPeer.SNFH_FAILURE:
return false;
- case SNFH_SUCCESS_PROCEED:
+ case XKeyboardFocusManagerPeer.SNFH_SUCCESS_PROCEED:
// Currently we just generate focus events like we deal with lightweight instead of calling
// XSetInputFocus on native window
if (focusLog.isLoggable(Level.FINER)) focusLog.finer("Proceeding with request to " +
@@ -433,7 +343,7 @@
* focus owner which had focus before WLF. So, we should not add request record for such requests
* but store this component in mostRecent - and return true as before for compatibility.
*/
- Window parentWindow = getContainingWindow(target);
+ Window parentWindow = SunToolkit.getContainingWindow(target);
if (parentWindow == null) {
return rejectFocusRequestHelper("WARNING: Parent window is null");
}
@@ -454,14 +364,13 @@
if (!(res && parentWindow.isFocused())) {
return rejectFocusRequestHelper("Waiting for asynchronous processing of the request");
}
-
- // NOTE: We simulate heavyweight behavior of Motif - component receives focus right
- // after request, not after event. Normally, we should better listen for event
- // by listeners.
- return XKeyboardFocusManagerPeer.simulateMotifRequestFocus(lightweightChild, target, temporary,
- focusedWindowChangeAllowed, time, cause);
+ return XKeyboardFocusManagerPeer.deliverFocus(lightweightChild,
+ (Component)target,
+ temporary,
+ focusedWindowChangeAllowed,
+ time, cause);
// Motif compatibility code
- case SNFH_SUCCESS_HANDLED:
+ case XKeyboardFocusManagerPeer.SNFH_SUCCESS_HANDLED:
// Either lightweight or excessive request - all events are generated.
return true;
}
@@ -470,7 +379,7 @@
private boolean rejectFocusRequestHelper(String logMsg) {
if (focusLog.isLoggable(Level.FINER)) focusLog.finer(logMsg);
- KeyboardFocusManagerPeerImpl.removeLastFocusRequest(target);
+ XKeyboardFocusManagerPeer.removeLastFocusRequest(target);
return false;
}
@@ -496,10 +405,6 @@
xSetVisible(b);
}
- public void show() {
- setVisible(true);
- }
-
public void hide() {
setVisible(false);
}
@@ -618,8 +523,9 @@
void handleJavaMouseEvent(MouseEvent e) {
switch (e.getID()) {
case MouseEvent.MOUSE_PRESSED:
- if (target == e.getSource() && shouldFocusOnClick()
- && !target.isFocusOwner() && canBeFocusedByClick(target))
+ if (target == e.getSource() &&
+ !target.isFocusOwner() &&
+ XKeyboardFocusManagerPeer.shouldFocusOnClick(target))
{
XWindowPeer parentXWindow = getParentTopLevel();
Window parentWindow = ((Window)parentXWindow.getTarget());
@@ -633,7 +539,7 @@
// WindowEvent wfg = new WindowEvent(parentWindow, WindowEvent.WINDOW_GAINED_FOCUS);
// parentWindow.dispatchEvent(wfg);
// }
- callRequestFocus(target, CausedFocusEvent.Cause.MOUSE_EVENT);
+ XKeyboardFocusManagerPeer.requestFocusFor(target, CausedFocusEvent.Cause.MOUSE_EVENT);
}
break;
}
@@ -1418,59 +1324,21 @@
}
}
- public void restack() {
- synchronized(target.getTreeLock()) {
- // Build the list of X windows in the window corresponding to this container
- // This list is already in correct Java stacking order
- Container cont = (Container)target;
- Vector order = new Vector(cont.getComponentCount());
- HashSet set = new HashSet();
-
- addTree(order, set, cont);
+ /**
+ * Lowers this component at the bottom of the above HW peer. If the above parameter
+ * is null then the method places this component at the top of the Z-order.
+ */
+ public void setZOrder(ComponentPeer above) {
+ long aboveWindow = (above != null) ? ((XComponentPeer)above).getWindow() : 0;
- XToolkit.awtLock();
- try {
- // Get the current list of X window in X window. Some of the windows
- // might be only native
- XQueryTree qt = new XQueryTree(getContentWindow());
- try {
- if (qt.execute() != 0) {
- if (qt.get_nchildren() != 0) {
- long pchildren = qt.get_children();
- int j = 0; // index to insert
- for (int i = 0; i < qt.get_nchildren(); i++) {
- Long w = Long.valueOf(Native.getLong(pchildren, i));
- if (!set.contains(w)) {
- set.add(w);
- order.add(j++, w);
- }
- }
- }
- }
-
- if (order.size() != 0) {
- // Create native array of the windows
- long windows = Native.allocateLongArray(order.size());
- Native.putLong(windows, order);
-
- // Restack native window according to the new order
- XlibWrapper.XRestackWindows(XToolkit.getDisplay(), windows, order.size());
-
- XlibWrapper.unsafe.freeMemory(windows);
- }
- } finally {
- qt.dispose();
- }
- } finally {
- XToolkit.awtUnlock();
- }
+ XToolkit.awtLock();
+ try{
+ XlibWrapper.SetZOrder(XToolkit.getDisplay(), getWindow(), aboveWindow);
+ }finally{
+ XToolkit.awtUnlock();
}
}
- public boolean isRestackSupported() {
- return true;
- }
-
private void addTree(Collection order, Set set, Container cont) {
for (int i = 0; i < cont.getComponentCount(); i++) {
Component comp = cont.getComponent(i);
@@ -1560,4 +1428,8 @@
}
}
}
+
+ public void updateGraphicsData(GraphicsConfiguration gc) {
+ initGraphicsConfiguration();
+ }
}
--- a/jdk/src/solaris/classes/sun/awt/X11/XConstants.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XConstants.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2003-2009 Sun Microsystems, Inc. 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
@@ -684,4 +684,19 @@
public static final int LSBFirst = 0 ;
public static final int MSBFirst = 1 ;
+
+ /* XKB support */
+ public static final int XkbUseCoreKbd = 0x0100 ;
+ public static final int XkbNewKeyboardNotify = 0;
+ public static final int XkbMapNotify = 1;
+ public static final int XkbStateNotify = 2;
+ public static final long XkbNewKeyboardNotifyMask = (1L << 0);
+ public static final long XkbMapNotifyMask = (1L << 1);
+ public static final long XkbStateNotifyMask = (1L << 2);
+ public static final long XkbGroupStateMask = (1L << 4);
+ public static final long XkbKeyTypesMask = (1L<<0);
+ public static final long XkbKeySymsMask = (1L<<1);
+ public static final long XkbModifierMapMask = (1L<<2);
+ public static final long XkbVirtualModsMask = (1L<<6); //server map
+
}
--- a/jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -383,7 +383,7 @@
dimensions.setInsets(getRealInsets());
insets_corrected = true;
- if (isMaximized() || isNull(correction)) {
+ if (isMaximized()) {
return;
}
@@ -451,7 +451,7 @@
public Insets getInsets() {
Insets in = copy(getRealInsets());
- in.top += getMenuBarHeight() + getWarningWindowHeight();
+ in.top += getMenuBarHeight();
if (insLog.isLoggable(Level.FINEST)) {
insLog.log(Level.FINEST, "Get insets returns {0}", new Object[] {in});
}
@@ -802,6 +802,8 @@
}
reconfigureContentWindow(newDimensions);
updateChildrenSizes();
+
+ repositionSecurityWarning();
}
private void checkShellRectSize(Rectangle shellRect) {
--- a/jdk/src/solaris/classes/sun/awt/X11/XEmbedChildProxyPeer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XEmbedChildProxyPeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -184,6 +184,7 @@
fl = new FocusEvent(currentOwner, FocusEvent.FOCUS_LOST, false, lightweightChild);
}
+ // TODO: do we need to wrap in sequenced?
if (fl != null) {
postEvent(XComponentPeer.wrapInSequenced(fl));
}
@@ -203,9 +204,9 @@
temporary, false, time, cause);
switch (result) {
- case XComponentPeer.SNFH_FAILURE:
+ case XKeyboardFocusManagerPeer.SNFH_FAILURE:
return false;
- case XComponentPeer.SNFH_SUCCESS_PROCEED:
+ case XKeyboardFocusManagerPeer.SNFH_SUCCESS_PROCEED:
// Currently we just generate focus events like we deal with lightweight instead of calling
// XSetInputFocus on native window
@@ -235,9 +236,11 @@
// NOTE: We simulate heavyweight behavior of Motif - component receives focus right
// after request, not after event. Normally, we should better listen for event
// by listeners.
+
+ // TODO: consider replacing with XKeyboardFocusManagerPeer.deliverFocus
return simulateMotifRequestFocus(lightweightChild, temporary, focusedWindowChangeAllowed, time);
// Motif compatibility code
- case XComponentPeer.SNFH_SUCCESS_HANDLED:
+ case XKeyboardFocusManagerPeer.SNFH_SUCCESS_HANDLED:
// Either lightweight or excessive requiest - all events are generated.
return true;
}
@@ -379,4 +382,9 @@
public void applyShape(Region shape) {
}
+
+ public void setZOrder(ComponentPeer above) {
+ }
+
+ public void updateGraphicsData(GraphicsConfiguration gc) {}
}
--- a/jdk/src/solaris/classes/sun/awt/X11/XFileDialogPeer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XFileDialogPeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -739,7 +739,17 @@
this.filter = filter;
}
- public void show() {
+
+ public void dispose() {
+ FileDialog fd = (FileDialog)fileDialog;
+ if (fd != null) {
+ fd.removeAll();
+ }
+ super.dispose();
+ }
+
+ // 03/02/2005 b5097243 Pressing 'ESC' on a file dlg does not dispose the dlg on Xtoolkit
+ public void setVisible(boolean b){
if (fileDialog == null) {
init((FileDialog)target);
}
@@ -754,34 +764,20 @@
setFile(savedFile);
}
- super.show();
- selectionField.requestFocusInWindow();
- }
-
- public void dispose() {
- FileDialog fd = (FileDialog)fileDialog;
- if (fd != null) {
- fd.removeAll();
- }
- super.dispose();
- }
-
- // 03/02/2005 b5097243 Pressing 'ESC' on a file dlg does not dispose the dlg on Xtoolkit
- public void setVisible(boolean b){
super.setVisible(b);
if (b == true){
// See 6240074 for more information
XChoicePeer choicePeer = (XChoicePeer)pathChoice.getPeer();
choicePeer.addXChoicePeerListener(this);
-
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this);
}else{
// See 6240074 for more information
XChoicePeer choicePeer = (XChoicePeer)pathChoice.getPeer();
choicePeer.removeXChoicePeerListener();
-
KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(this);
}
+
+ selectionField.requestFocusInWindow();
}
/*
--- a/jdk/src/solaris/classes/sun/awt/X11/XFramePeer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XFramePeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -36,6 +36,7 @@
import java.awt.peer.FramePeer;
import java.util.logging.Level;
import java.util.logging.Logger;
+import sun.awt.AWTAccessor;
class XFramePeer extends XDecoratedPeer implements FramePeer {
private static Logger log = Logger.getLogger("sun.awt.X11.XFramePeer");
@@ -231,13 +232,19 @@
}
}
- public int getState() { return state; }
+ public int getState() {
+ synchronized(getStateLock()) {
+ return state;
+ }
+ }
public void setState(int newState) {
- if (!isShowing()) {
- stateLog.finer("Frame is not showing");
- state = newState;
- return;
+ synchronized(getStateLock()) {
+ if (!isShowing()) {
+ stateLog.finer("Frame is not showing");
+ state = newState;
+ return;
+ }
}
changeState(newState);
}
@@ -296,6 +303,9 @@
int old_state = state;
state = newState;
+ // sync target with peer
+ AWTAccessor.getFrameAccessor().setExtendedState((Frame)target, state);
+
if ((changed & Frame.ICONIFIED) != 0) {
if ((state & Frame.ICONIFIED) != 0) {
stateLog.finer("Iconified");
--- a/jdk/src/solaris/classes/sun/awt/X11/XKeyboardFocusManagerPeer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XKeyboardFocusManagerPeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -31,6 +31,7 @@
import java.awt.event.FocusEvent;
import java.awt.peer.KeyboardFocusManagerPeer;
+import java.awt.peer.ComponentPeer;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@@ -40,136 +41,90 @@
import sun.awt.CausedFocusEvent;
import sun.awt.SunToolkit;
+import sun.awt.KeyboardFocusManagerPeerImpl;
-public class XKeyboardFocusManagerPeer implements KeyboardFocusManagerPeer {
+public class XKeyboardFocusManagerPeer extends KeyboardFocusManagerPeerImpl {
private static final Logger focusLog = Logger.getLogger("sun.awt.X11.focus.XKeyboardFocusManagerPeer");
- KeyboardFocusManager manager;
-
- XKeyboardFocusManagerPeer(KeyboardFocusManager manager) {
- this.manager = manager;
- }
private static Object lock = new Object() {};
private static Component currentFocusOwner;
private static Window currentFocusedWindow;
- static void setCurrentNativeFocusOwner(Component comp) {
- if (focusLog.isLoggable(Level.FINER)) focusLog.finer("Setting current native focus owner " + comp);
- synchronized(lock) {
+ XKeyboardFocusManagerPeer(KeyboardFocusManager manager) {
+ super(manager);
+ }
+
+ @Override
+ public void setCurrentFocusOwner(Component comp) {
+ setCurrentNativeFocusOwner(comp);
+ }
+
+ @Override
+ public Component getCurrentFocusOwner() {
+ return getCurrentNativeFocusOwner();
+ }
+
+ @Override
+ public Window getCurrentFocusedWindow() {
+ return getCurrentNativeFocusedWindow();
+ }
+
+ public static void setCurrentNativeFocusOwner(Component comp) {
+ synchronized (lock) {
currentFocusOwner = comp;
}
}
- static void setCurrentNativeFocusedWindow(Window win) {
- if (focusLog.isLoggable(Level.FINER)) focusLog.finer("Setting current native focused window " + win);
- synchronized(lock) {
- currentFocusedWindow = win;
- }
- }
-
- static Component getCurrentNativeFocusOwner() {
+ public static Component getCurrentNativeFocusOwner() {
synchronized(lock) {
return currentFocusOwner;
}
}
- static Window getCurrentNativeFocusedWindow() {
+ public static void setCurrentNativeFocusedWindow(Window win) {
+ if (focusLog.isLoggable(Level.FINER)) focusLog.finer("Setting current native focused window " + win);
+ XWindowPeer from = null, to = null;
+
+ synchronized(lock) {
+ if (currentFocusedWindow != null) {
+ from = (XWindowPeer)currentFocusedWindow.getPeer();
+ }
+
+ currentFocusedWindow = win;
+
+ if (currentFocusedWindow != null) {
+ to = (XWindowPeer)currentFocusedWindow.getPeer();
+ }
+ }
+
+ if (from != null) {
+ from.updateSecurityWarningVisibility();
+ }
+ if (to != null) {
+ to.updateSecurityWarningVisibility();
+ }
+ }
+
+ public static Window getCurrentNativeFocusedWindow() {
synchronized(lock) {
return currentFocusedWindow;
}
}
- public Window getCurrentFocusedWindow() {
- return getCurrentNativeFocusedWindow();
- }
-
- public void setCurrentFocusOwner(Component comp) {
- setCurrentNativeFocusOwner(comp);
- }
-
- public Component getCurrentFocusOwner() {
- return getCurrentNativeFocusOwner();
- }
-
- public void clearGlobalFocusOwner(Window activeWindow) {
- if (activeWindow != null) {
- Component focusOwner = activeWindow.getFocusOwner();
- if (focusLog.isLoggable(Level.FINE)) focusLog.fine("Clearing global focus owner " + focusOwner);
- if (focusOwner != null) {
-// XComponentPeer nativePeer = XComponentPeer.getNativeContainer(focusOwner);
-// if (nativePeer != null) {
- FocusEvent fl = new CausedFocusEvent(focusOwner, FocusEvent.FOCUS_LOST, false, null,
- CausedFocusEvent.Cause.CLEAR_GLOBAL_FOCUS_OWNER);
- XWindow.sendEvent(fl);
-// }
- }
- }
- }
-
- static boolean simulateMotifRequestFocus(Component lightweightChild, Component target, boolean temporary,
- boolean focusedWindowChangeAllowed, long time, CausedFocusEvent.Cause cause)
+ // TODO: do something to eliminate this forwarding
+ public static boolean deliverFocus(Component lightweightChild,
+ Component target,
+ boolean temporary,
+ boolean focusedWindowChangeAllowed,
+ long time,
+ CausedFocusEvent.Cause cause)
{
- if (lightweightChild == null) {
- lightweightChild = (Component)target;
- }
- Component currentOwner = XKeyboardFocusManagerPeer.getCurrentNativeFocusOwner();
- if (currentOwner != null && currentOwner.getPeer() == null) {
- currentOwner = null;
- }
- if (focusLog.isLoggable(Level.FINER)) focusLog.finer("Simulating transfer from " + currentOwner + " to " + lightweightChild);
- FocusEvent fg = new CausedFocusEvent(lightweightChild, FocusEvent.FOCUS_GAINED, false, currentOwner, cause);
- FocusEvent fl = null;
- if (currentOwner != null) {
- fl = new CausedFocusEvent(currentOwner, FocusEvent.FOCUS_LOST, false, lightweightChild, cause);
- }
-
- if (fl != null) {
- XWindow.sendEvent(fl);
- }
- XWindow.sendEvent(fg);
- return true;
- }
-
- static Method shouldNativelyFocusHeavyweightMethod;
-
- static int shouldNativelyFocusHeavyweight(Component heavyweight,
- Component descendant, boolean temporary,
- boolean focusedWindowChangeAllowed, long time, CausedFocusEvent.Cause cause)
- {
- if (shouldNativelyFocusHeavyweightMethod == null) {
- Class[] arg_types =
- new Class[] { Component.class,
- Component.class,
- Boolean.TYPE,
- Boolean.TYPE,
- Long.TYPE,
- CausedFocusEvent.Cause.class
- };
-
- shouldNativelyFocusHeavyweightMethod =
- SunToolkit.getMethod(KeyboardFocusManager.class,
- "shouldNativelyFocusHeavyweight",
- arg_types);
- }
- Object[] args = new Object[] { heavyweight,
- descendant,
- Boolean.valueOf(temporary),
- Boolean.valueOf(focusedWindowChangeAllowed),
- Long.valueOf(time), cause};
-
- int result = XComponentPeer.SNFH_FAILURE;
- if (shouldNativelyFocusHeavyweightMethod != null) {
- try {
- result = ((Integer) shouldNativelyFocusHeavyweightMethod.invoke(null, args)).intValue();
- }
- catch (IllegalAccessException e) {
- assert false;
- }
- catch (InvocationTargetException e) {
- assert false;
- }
- }
-
- return result;
+ return KeyboardFocusManagerPeerImpl.deliverFocus(lightweightChild,
+ target,
+ temporary,
+ focusedWindowChangeAllowed,
+ time,
+ cause,
+ getCurrentNativeFocusOwner());
}
}
--- a/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,7 +1,7 @@
// This is a generated file: do not edit! Edit keysym2ucs.h if necessary.
/*
- * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2005-2009 Sun Microsystems, Inc. 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
@@ -89,14 +89,47 @@
Character ch = keysym2UCSHash.get(ks);
return ch == null ? (char)0 : ch.charValue();
}
+ static long xkeycode2keysym_noxkb(XKeyEvent ev, int ndx) {
+ XToolkit.awtLock();
+ try {
+ return XlibWrapper.XKeycodeToKeysym(ev.get_display(), ev.get_keycode(), ndx);
+ } finally {
+ XToolkit.awtUnlock();
+ }
+ }
+ static long xkeycode2keysym_xkb(XKeyEvent ev, int ndx) {
+ XToolkit.awtLock();
+ try {
+ int mods = ev.get_state();
+ if ((ndx == 0) && ((mods & XConstants.ShiftMask) != 0)) {
+ // I don't know all possible meanings of 'ndx' in case of XKB
+ // and don't want to speculate. But this particular case
+ // clearly means that caller needs a so called primary keysym.
+ mods ^= XConstants.ShiftMask;
+ }
+ XlibWrapper.XkbTranslateKeyCode(XToolkit.getXKBKbdDesc(), ev.get_keycode(),
+ mods, XlibWrapper.iarg1, XlibWrapper.larg3);
+ //XXX unconsumed modifiers?
+ return Native.getLong(XlibWrapper.larg3);
+ } finally {
+ XToolkit.awtUnlock();
+ }
+ }
static long xkeycode2keysym(XKeyEvent ev, int ndx) {
XToolkit.awtLock();
try {
- return XlibWrapper.XKeycodeToKeysym(ev.get_display(), ev.get_keycode(), ndx );
+ if (XToolkit.canUseXKBCalls()) {
+ return xkeycode2keysym_xkb(ev, ndx);
+ }else{
+ return xkeycode2keysym_noxkb(ev, ndx);
+ }
} finally {
XToolkit.awtUnlock();
}
}
+ static long xkeycode2primary_keysym(XKeyEvent ev) {
+ return xkeycode2keysym(ev, 0);
+ }
public static boolean isKPEvent( XKeyEvent ev )
{
// Xsun without XKB uses keysymarray[2] keysym to determine if it is KP event.
@@ -198,6 +231,27 @@
Keysym2JavaKeycode jkc = getJavaKeycode( ev );
return jkc == null ? java.awt.event.KeyEvent.VK_UNDEFINED : jkc.getJavaKeycode();
}
+ /**
+ * Return an integer java keycode apprx as it was before extending keycodes range.
+ * This call would ignore for instance XKB and process whatever is on the bottom
+ * of keysym stack. Result will not depend on actual locale, will differ between
+ * dual/multiple keyboard setup systems (e.g. English+Russian vs French+Russian)
+ * but will be someway compatible with old releases.
+ */
+ static int getLegacyJavaKeycodeOnly( XKeyEvent ev ) {
+ long keysym = XConstants.NoSymbol;
+ int ndx = 0;
+ if( (ev.get_state() & XToolkit.numLockMask) != 0 &&
+ isKPEvent(ev)) {
+ keysym = getKeypadKeysym( ev );
+ } else {
+ // we only need primary-layer keysym to derive a java keycode.
+ ndx = 0;
+ keysym = xkeycode2keysym_noxkb(ev, ndx);
+ }
+ Keysym2JavaKeycode jkc = keysym2JavaKeycodeHash.get( keysym );
+ return jkc == null ? java.awt.event.KeyEvent.VK_UNDEFINED : jkc.getJavaKeycode();
+ }
static long javaKeycode2Keysym( int jkey ) {
Long ks = javaKeycode2KeysymHash.get( jkey );
return (ks == null ? 0 : ks.longValue());
--- a/jdk/src/solaris/classes/sun/awt/X11/XNETProtocol.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XNETProtocol.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2003-2009 Sun Microsystems, Inc. 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
@@ -169,6 +169,34 @@
return ((layer == LAYER_ALWAYS_ON_TOP) || (layer == LAYER_NORMAL)) && doLayerProtocol();
}
+ public void requestState(XWindow window, XAtom state, boolean isAdd) {
+ XClientMessageEvent req = new XClientMessageEvent();
+ try {
+ req.set_type((int)XConstants.ClientMessage);
+ req.set_window(window.getWindow());
+ req.set_message_type(XA_NET_WM_STATE.getAtom());
+ req.set_format(32);
+ req.set_data(0, isAdd ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE);
+ req.set_data(1, state.getAtom());
+ // Fix for 6735584: req.data[2] must be set to 0 when only one property is changed
+ req.set_data(2, 0);
+ log.log(Level.FINE, "Setting _NET_STATE atom {0} on {1} for {2}", new Object[] {state, window, Boolean.valueOf(isAdd)});
+ XToolkit.awtLock();
+ try {
+ XlibWrapper.XSendEvent(XToolkit.getDisplay(),
+ XlibWrapper.RootWindow(XToolkit.getDisplay(), window.getScreenNumber()),
+ false,
+ XConstants.SubstructureRedirectMask | XConstants.SubstructureNotifyMask,
+ req.pData);
+ }
+ finally {
+ XToolkit.awtUnlock();
+ }
+ } finally {
+ req.dispose();
+ }
+ }
+
/**
* Helper function to set/reset one state in NET_WM_STATE
* If window is showing then it uses ClientMessage, otherwise adjusts NET_WM_STATE list
@@ -181,31 +209,7 @@
new Object[] {Boolean.valueOf(window.isWithdrawn()), Boolean.valueOf(window.isVisible()),
Boolean.valueOf(window.isMapped()), Boolean.valueOf(window.isShowing())});
if (window.isShowing()) {
- XClientMessageEvent req = new XClientMessageEvent();
- try {
- req.set_type((int)XConstants.ClientMessage);
- req.set_window(window.getWindow());
- req.set_message_type(XA_NET_WM_STATE.getAtom());
- req.set_format(32);
- req.set_data(0, (!set) ? _NET_WM_STATE_REMOVE : _NET_WM_STATE_ADD);
- req.set_data(1, state.getAtom());
- // Fix for 6735584: req.data[2] must be set to 0 when only one property is changed
- req.set_data(2, 0);
- log.log(Level.FINE, "Setting _NET_STATE atom {0} on {1} for {2}", new Object[] {state, window, Boolean.valueOf(set)});
- XToolkit.awtLock();
- try {
- XlibWrapper.XSendEvent(XToolkit.getDisplay(),
- XlibWrapper.RootWindow(XToolkit.getDisplay(), window.getScreenNumber()),
- false,
- XConstants.SubstructureRedirectMask | XConstants.SubstructureNotifyMask,
- req.pData);
- }
- finally {
- XToolkit.awtUnlock();
- }
- } finally {
- req.dispose();
- }
+ requestState(window, state, set);
} else {
XAtomList net_wm_state = window.getNETWMState();
log.log(Level.FINE, "Current state on {0} is {1}", new Object[] {window, net_wm_state});
@@ -252,6 +256,8 @@
XAtom XA_NET_WM_WINDOW_TYPE = XAtom.get("_NET_WM_WINDOW_TYPE");
XAtom XA_NET_WM_WINDOW_TYPE_DIALOG = XAtom.get("_NET_WM_WINDOW_TYPE_DIALOG");
+ XAtom XA_NET_WM_WINDOW_OPACITY = XAtom.get("_NET_WM_WINDOW_OPACITY");
+
/* For _NET_WM_STATE ClientMessage requests */
final static int _NET_WM_STATE_REMOVE =0; /* remove/unset property */
final static int _NET_WM_STATE_ADD =1; /* add/set property */
@@ -289,6 +295,12 @@
boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_STATE_MODAL);
return res;
}
+
+ boolean doOpacityProtocol() {
+ boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_WINDOW_OPACITY);
+ return res;
+ }
+
boolean isWMName(String name) {
if (!active()) {
return false;
--- a/jdk/src/solaris/classes/sun/awt/X11/XPanelPeer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XPanelPeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -130,39 +130,6 @@
return getInsets();
}
- /*
- * This method is called from XWindowPeer.displayChanged, when
- * the window this Panel is on is moved to the new screen, or
- * display mode is changed.
- *
- * The notification is propagated to the child Canvas components.
- * Top-level windows and other Panels are notified too as their
- * peers are subclasses of XCanvasPeer.
- */
- public void displayChanged(int screenNum) {
- super.displayChanged(screenNum);
- displayChanged((Container)target, screenNum);
- }
-
- /*
- * Recursively iterates through all the HW and LW children
- * of the container and calls displayChanged() for HW peers.
- * Iteration through children peers only is not enough as the
- * displayChanged notification may not be propagated to HW
- * components inside LW containers, see 4452373 for details.
- */
- private static void displayChanged(Container target, int screenNum) {
- Component children[] = ((Container)target).getComponents();
- for (Component child : children) {
- ComponentPeer cpeer = child.getPeer();
- if (cpeer instanceof XCanvasPeer) {
- ((XCanvasPeer)cpeer).displayChanged(screenNum);
- } else if (child instanceof Container) {
- displayChanged((Container)child, screenNum);
- }
- }
- }
-
public void dispose() {
if (embedder != null) {
embedder.deinstall();
--- a/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2002-2009 Sun Microsystems, Inc. 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
@@ -54,6 +54,7 @@
import sun.font.FontManager;
import sun.misc.PerformanceLogger;
import sun.print.PrintJob2D;
+import sun.security.action.GetBooleanAction;
public final class XToolkit extends UNIXToolkit implements Runnable {
private static Logger log = Logger.getLogger("sun.awt.X11.XToolkit");
@@ -291,6 +292,7 @@
if (XlibWrapper.XSetLocaleModifiers("") == null) {
log.finer("X locale modifiers are not supported, using default");
}
+ tryXKB();
AwtScreenData defaultScreen = new AwtScreenData(XToolkit.getDefaultScreenData());
awt_defaultFg = defaultScreen.get_blackpixel();
@@ -313,6 +315,7 @@
if (xs != null) {
((XAWTXSettings)xs).dispose();
}
+ freeXKB();
if (log.isLoggable(Level.FINE)) {
dumpPeers();
}
@@ -591,6 +594,9 @@
if (ev.get_type() != XConstants.NoExpose) {
eventNumber++;
}
+ if (awt_UseXKB_Calls && ev.get_type() == awt_XKBBaseEventCode) {
+ processXkbChanges(ev);
+ }
if (XDropTargetEventProcessor.processEvent(ev) ||
XDragSourceContextPeer.processEvent(ev)) {
@@ -2093,8 +2099,12 @@
static boolean awt_ServerInquired = false;
static boolean awt_IsXsunServer = false;
- static boolean awt_XKBInquired = false;
static boolean awt_UseXKB = false;
+ static boolean awt_UseXKB_Calls = false;
+ static int awt_XKBBaseEventCode = 0;
+ static int awt_XKBEffectiveGroup = 0; // so far, I don't use it leaving all calculations
+ // to XkbTranslateKeyCode
+ static long awt_XKBDescPtr = 0;
/**
Try to understand if it is Xsun server.
By now (2005) Sun is vendor of Xsun and Xorg servers; we only return true if Xsun is running.
@@ -2124,23 +2134,143 @@
awtUnlock();
}
}
- /**
- Query XKEYBOARD extension.
- */
static boolean isXKBenabled() {
awtLock();
try {
- if( awt_XKBInquired ) {
- return awt_UseXKB;
+ return awt_UseXKB;
+ } finally {
+ awtUnlock();
+ }
+ }
+
+ /**
+ Query XKEYBOARD extension.
+ If possible, initialize xkb library.
+ */
+ static boolean tryXKB() {
+ awtLock();
+ try {
+ String name = "XKEYBOARD";
+ // First, if there is extension at all.
+ awt_UseXKB = XlibWrapper.XQueryExtension( getDisplay(), name, XlibWrapper.larg1, XlibWrapper.larg2, XlibWrapper.larg3);
+ if( awt_UseXKB ) {
+ // There is a keyboard extension. Check if a client library is compatible.
+ // If not, don't use xkb calls.
+ // In this case we still may be Xkb-capable application.
+ awt_UseXKB_Calls = XlibWrapper.XkbLibraryVersion( XlibWrapper.larg1, XlibWrapper.larg2);
+ if( awt_UseXKB_Calls ) {
+ awt_UseXKB_Calls = XlibWrapper.XkbQueryExtension( getDisplay(), XlibWrapper.larg1, XlibWrapper.larg2,
+ XlibWrapper.larg3, XlibWrapper.larg4, XlibWrapper.larg5);
+ if( awt_UseXKB_Calls ) {
+ awt_XKBBaseEventCode = Native.getInt(XlibWrapper.larg2);
+ XlibWrapper.XkbSelectEvents (getDisplay(),
+ XConstants.XkbUseCoreKbd,
+ XConstants.XkbNewKeyboardNotifyMask |
+ XConstants.XkbMapNotifyMask ,//|
+ //XConstants.XkbStateNotifyMask,
+ XConstants.XkbNewKeyboardNotifyMask |
+ XConstants.XkbMapNotifyMask );//|
+ //XConstants.XkbStateNotifyMask);
+
+ XlibWrapper.XkbSelectEventDetails(getDisplay(), XConstants.XkbUseCoreKbd,
+ XConstants.XkbStateNotify,
+ XConstants.XkbGroupStateMask,
+ XConstants.XkbGroupStateMask);
+ //XXX ? XkbGroupLockMask last, XkbAllStateComponentsMask before last?
+ awt_XKBDescPtr = XlibWrapper.XkbGetMap(getDisplay(),
+ XConstants.XkbKeyTypesMask |
+ XConstants.XkbKeySymsMask |
+ XConstants.XkbModifierMapMask |
+ XConstants.XkbVirtualModsMask,
+ XConstants.XkbUseCoreKbd);
+ }
+ }
}
- awt_XKBInquired = true;
- String name = "XKEYBOARD";
- awt_UseXKB = XlibWrapper.XQueryExtension( getDisplay(), name, XlibWrapper.larg1, XlibWrapper.larg2, XlibWrapper.larg3);
return awt_UseXKB;
} finally {
awtUnlock();
}
}
+ static boolean canUseXKBCalls() {
+ awtLock();
+ try {
+ return awt_UseXKB_Calls;
+ } finally {
+ awtUnlock();
+ }
+ }
+ static int getXKBEffectiveGroup() {
+ awtLock();
+ try {
+ return awt_XKBEffectiveGroup;
+ } finally {
+ awtUnlock();
+ }
+ }
+ static int getXKBBaseEventCode() {
+ awtLock();
+ try {
+ return awt_XKBBaseEventCode;
+ } finally {
+ awtUnlock();
+ }
+ }
+ static long getXKBKbdDesc() {
+ awtLock();
+ try {
+ return awt_XKBDescPtr;
+ } finally {
+ awtUnlock();
+ }
+ }
+ void freeXKB() {
+ awtLock();
+ try {
+ if (awt_UseXKB_Calls && awt_XKBDescPtr != 0) {
+ XlibWrapper.XkbFreeKeyboard(awt_XKBDescPtr, 0xFF, true);
+ }
+ } finally {
+ awtUnlock();
+ }
+ }
+ private void processXkbChanges(XEvent ev) {
+ // mapping change --> refresh kbd map
+ // state change --> get a new effective group; do I really need it
+ // or that should be left for XkbTranslateKeyCode?
+ XkbEvent xke = new XkbEvent( ev.getPData() );
+ int xkb_type = xke.get_any().get_xkb_type();
+ switch( xkb_type ) {
+ case XConstants.XkbNewKeyboardNotify :
+ if( awt_XKBDescPtr != 0 ) {
+ freeXKB();
+ }
+ awt_XKBDescPtr = XlibWrapper.XkbGetMap(getDisplay(),
+ XConstants.XkbKeyTypesMask |
+ XConstants.XkbKeySymsMask |
+ XConstants.XkbModifierMapMask |
+ XConstants.XkbVirtualModsMask,
+ XConstants.XkbUseCoreKbd);
+ //System.out.println("XkbNewKeyboard:"+(xke.get_new_kbd()));
+ break;
+ case XConstants.XkbMapNotify :
+ //TODO: provide a simple unit test.
+ XlibWrapper.XkbGetUpdatedMap(getDisplay(),
+ XConstants.XkbKeyTypesMask |
+ XConstants.XkbKeySymsMask |
+ XConstants.XkbModifierMapMask |
+ XConstants.XkbVirtualModsMask,
+ awt_XKBDescPtr);
+ //System.out.println("XkbMap:"+(xke.get_map()));
+ break;
+ case XConstants.XkbStateNotify :
+ // May use it later e.g. to obtain an effective group etc.
+ //System.out.println("XkbState:"+(xke.get_state()));
+ break;
+ default:
+ //System.out.println("XkbEvent of xkb_type "+xkb_type);
+ break;
+ }
+ }
private static long eventNumber;
public static long getEventNumber() {
@@ -2273,4 +2403,44 @@
public boolean areExtraMouseButtonsEnabled() throws HeadlessException {
return areExtraMouseButtonsEnabled;
}
+
+ @Override
+ public boolean isWindowOpacitySupported() {
+ XNETProtocol net_protocol = XWM.getWM().getNETProtocol();
+
+ if (net_protocol == null) {
+ return false;
+ }
+
+ return net_protocol.doOpacityProtocol();
+ }
+
+ @Override
+ public boolean isWindowShapingSupported() {
+ return XlibUtil.isShapingSupported();
+ }
+
+ @Override
+ public boolean isWindowTranslucencySupported() {
+ //NOTE: it may not be supported. The actual check is being performed
+ // at com.sun.awt.AWTUtilities(). In X11 we need to check
+ // whether there's any translucency-capable GC available.
+ return true;
+ }
+
+ @Override
+ public boolean isTranslucencyCapable(GraphicsConfiguration gc) {
+ if (!(gc instanceof X11GraphicsConfig)) {
+ return false;
+ }
+ return ((X11GraphicsConfig)gc).isTranslucencyCapable();
+ }
+
+ /**
+ * Returns the value of "sun.awt.disablegrab" property. Default
+ * value is {@code false}.
+ */
+ public static boolean getSunAwtDisableGrab() {
+ return AccessController.doPrivileged(new GetBooleanAction("sun.awt.disablegrab"));
+ }
}
--- a/jdk/src/solaris/classes/sun/awt/X11/XTrayIconPeer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XTrayIconPeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -38,15 +38,18 @@
import java.security.PrivilegedAction;
import java.lang.reflect.InvocationTargetException;
-public class XTrayIconPeer implements TrayIconPeer {
+public class XTrayIconPeer implements TrayIconPeer,
+ InfoWindow.Balloon.LiveArguments,
+ InfoWindow.Tooltip.LiveArguments
+{
private static final Logger ctrLog = Logger.getLogger("sun.awt.X11.XTrayIconPeer.centering");
TrayIcon target;
TrayIconEventProxy eventProxy;
XTrayIconEmbeddedFrame eframe;
TrayIconCanvas canvas;
- Balloon balloon;
- Tooltip tooltip;
+ InfoWindow.Balloon balloon;
+ InfoWindow.Tooltip tooltip;
PopupMenu popup;
String tooltipString;
boolean isTrayIconDisplayed;
@@ -255,8 +258,8 @@
eframe.setVisible(true);
updateImage();
- balloon = new Balloon(this, eframe);
- tooltip = new Tooltip(this, eframe);
+ balloon = new InfoWindow.Balloon(eframe, target, this);
+ tooltip = new InfoWindow.Tooltip(eframe, target, this);
addListeners();
}
@@ -300,6 +303,10 @@
tooltipString = tooltip;
}
+ public String getTooltipString() {
+ return tooltipString;
+ }
+
public void updateImage() {
Runnable r = new Runnable() {
public void run() {
@@ -385,7 +392,7 @@
return eframe.getLocationOnScreen();
}
- private Rectangle getBounds() {
+ public Rectangle getBounds() {
Point loc = getLocationOnScreen();
return new Rectangle(loc.x, loc.y, loc.x + TRAY_ICON_WIDTH, loc.y + TRAY_ICON_HEIGHT);
}
@@ -399,10 +406,14 @@
return ((XEmbeddedFramePeer)eframe.getPeer()).getWindow();
}
- boolean isDisposed() {
+ public boolean isDisposed() {
return isDisposed;
}
+ public String getActionCommand() {
+ return target.getActionCommand();
+ }
+
static class TrayIconEventProxy implements MouseListener, MouseMotionListener {
XTrayIconPeer xtiPeer;
@@ -474,8 +485,8 @@
}
static boolean isTrayIconStuffWindow(Window w) {
- return (w instanceof Tooltip) ||
- (w instanceof Balloon) ||
+ return (w instanceof InfoWindow.Tooltip) ||
+ (w instanceof InfoWindow.Balloon) ||
(w instanceof XTrayIconEmbeddedFrame);
}
@@ -530,7 +541,7 @@
}
}
- static class IconCanvas extends Canvas {
+ public static class IconCanvas extends Canvas {
volatile Image image;
IconObserver observer;
int width, height;
@@ -608,429 +619,4 @@
}
}
}
-
- // ***************************************
- // Classes for toolitp and balloon windows
- // ***************************************
-
- static class Tooltip extends InfoWindow {
- XTrayIconPeer xtiPeer;
- Label textLabel = new Label("");
- Runnable starter = new Runnable() {
- public void run() {
- display();
- }};
-
- final static int TOOLTIP_SHOW_TIME = 10000;
- final static int TOOLTIP_START_DELAY_TIME = 1000;
- final static int TOOLTIP_MAX_LENGTH = 64;
- final static int TOOLTIP_MOUSE_CURSOR_INDENT = 5;
- final static Color TOOLTIP_BACKGROUND_COLOR = new Color(255, 255, 220);
- final static Font TOOLTIP_TEXT_FONT = XWindow.getDefaultFont();
-
- Tooltip(XTrayIconPeer xtiPeer, Frame parent) {
- super(parent, Color.black);
- this.xtiPeer = xtiPeer;
-
- suppressWarningString(this);
-
- setCloser(null, TOOLTIP_SHOW_TIME);
- textLabel.setBackground(TOOLTIP_BACKGROUND_COLOR);
- textLabel.setFont(TOOLTIP_TEXT_FONT);
- add(textLabel);
- }
-
- /*
- * WARNING: this method is executed on Toolkit thread!
- */
- void display() {
- String tip = xtiPeer.tooltipString;
- if (tip == null) {
- return;
- } else if (tip.length() > TOOLTIP_MAX_LENGTH) {
- textLabel.setText(tip.substring(0, TOOLTIP_MAX_LENGTH));
- } else {
- textLabel.setText(tip);
- }
-
- // Execute on EDT to avoid deadlock (see 6280857).
- SunToolkit.executeOnEventHandlerThread(xtiPeer.target, new Runnable() {
- public void run() {
- if (xtiPeer.isDisposed()) {
- return;
- }
- Point pointer = (Point)AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- if (!isPointerOverTrayIcon(xtiPeer.getBounds())) {
- return null;
- }
- return MouseInfo.getPointerInfo().getLocation();
- }
- });
- if (pointer == null) {
- return;
- }
- show(new Point(pointer.x, pointer.y), TOOLTIP_MOUSE_CURSOR_INDENT);
- }
- });
- }
-
- void enter() {
- XToolkit.schedule(starter, TOOLTIP_START_DELAY_TIME);
- }
-
- void exit() {
- XToolkit.remove(starter);
- if (isVisible()) {
- hide();
- }
- }
-
- boolean isPointerOverTrayIcon(Rectangle trayRect) {
- Point p = MouseInfo.getPointerInfo().getLocation();
- return !(p.x < trayRect.x || p.x > (trayRect.x + trayRect.width) ||
- p.y < trayRect.y || p.y > (trayRect.y + trayRect.height));
- }
- }
-
- static class Balloon extends InfoWindow {
- final static int BALLOON_SHOW_TIME = 10000;
- final static int BALLOON_TEXT_MAX_LENGTH = 256;
- final static int BALLOON_WORD_LINE_MAX_LENGTH = 16;
- final static int BALLOON_WORD_LINE_MAX_COUNT = 4;
- final static int BALLOON_ICON_WIDTH = 32;
- final static int BALLOON_ICON_HEIGHT = 32;
- final static int BALLOON_TRAY_ICON_INDENT = 0;
- final static Color BALLOON_CAPTION_BACKGROUND_COLOR = new Color(200, 200 ,255);
- final static Font BALLOON_CAPTION_FONT = new Font(Font.DIALOG, Font.BOLD, 12);
-
- XTrayIconPeer xtiPeer;
- Panel mainPanel = new Panel();
- Panel captionPanel = new Panel();
- Label captionLabel = new Label("");
- Button closeButton = new Button("X");
- Panel textPanel = new Panel();
- IconCanvas iconCanvas = new IconCanvas(BALLOON_ICON_WIDTH, BALLOON_ICON_HEIGHT);
- Label[] lineLabels = new Label[BALLOON_WORD_LINE_MAX_COUNT];
- ActionPerformer ap = new ActionPerformer();
-
- Image iconImage;
- Image errorImage;
- Image warnImage;
- Image infoImage;
- boolean gtkImagesLoaded;
-
- Displayer displayer = new Displayer();
-
- Balloon(final XTrayIconPeer xtiPeer, Frame parent) {
- super(parent, new Color(90, 80 ,190));
- this.xtiPeer = xtiPeer;
-
- suppressWarningString(this);
-
- setCloser(new Runnable() {
- public void run() {
- if (textPanel != null) {
- textPanel.removeAll();
- textPanel.setSize(0, 0);
- iconCanvas.setSize(0, 0);
- XToolkit.awtLock();
- try {
- displayer.isDisplayed = false;
- XToolkit.awtLockNotifyAll();
- } finally {
- XToolkit.awtUnlock();
- }
- }
- }
- }, BALLOON_SHOW_TIME);
-
- add(mainPanel);
-
- captionLabel.setFont(BALLOON_CAPTION_FONT);
- captionLabel.addMouseListener(ap);
-
- captionPanel.setLayout(new BorderLayout());
- captionPanel.add(captionLabel, BorderLayout.WEST);
- captionPanel.add(closeButton, BorderLayout.EAST);
- captionPanel.setBackground(BALLOON_CAPTION_BACKGROUND_COLOR);
- captionPanel.addMouseListener(ap);
-
- closeButton.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- hide();
- }
- });
-
- mainPanel.setLayout(new BorderLayout());
- mainPanel.setBackground(Color.white);
- mainPanel.add(captionPanel, BorderLayout.NORTH);
- mainPanel.add(iconCanvas, BorderLayout.WEST);
- mainPanel.add(textPanel, BorderLayout.CENTER);
-
- iconCanvas.addMouseListener(ap);
-
- for (int i = 0; i < BALLOON_WORD_LINE_MAX_COUNT; i++) {
- lineLabels[i] = new Label();
- lineLabels[i].addMouseListener(ap);
- lineLabels[i].setBackground(Color.white);
- }
-
- displayer.start();
- }
-
- void display(String caption, String text, String messageType) {
- if (!gtkImagesLoaded) {
- loadGtkImages();
- }
- displayer.display(caption, text, messageType);
- }
-
- private void _display(String caption, String text, String messageType) {
- captionLabel.setText(caption);
-
- BreakIterator iter = BreakIterator.getWordInstance();
- if (text != null) {
- iter.setText(text);
- int start = iter.first(), end;
- int nLines = 0;
-
- do {
- end = iter.next();
-
- if (end == BreakIterator.DONE ||
- text.substring(start, end).length() >= 50)
- {
- lineLabels[nLines].setText(text.substring(start, end == BreakIterator.DONE ?
- iter.last() : end));
- textPanel.add(lineLabels[nLines++]);
- start = end;
- }
- if (nLines == BALLOON_WORD_LINE_MAX_COUNT) {
- if (end != BreakIterator.DONE) {
- lineLabels[nLines - 1].setText(
- new String(lineLabels[nLines - 1].getText() + " ..."));
- }
- break;
- }
- } while (end != BreakIterator.DONE);
-
-
- textPanel.setLayout(new GridLayout(nLines, 1));
- }
-
- if ("ERROR".equals(messageType)) {
- iconImage = errorImage;
- } else if ("WARNING".equals(messageType)) {
- iconImage = warnImage;
- } else if ("INFO".equals(messageType)) {
- iconImage = infoImage;
- } else {
- iconImage = null;
- }
-
- if (iconImage != null) {
- Dimension tpSize = textPanel.getSize();
- iconCanvas.setSize(BALLOON_ICON_WIDTH, (BALLOON_ICON_HEIGHT > tpSize.height ?
- BALLOON_ICON_HEIGHT : tpSize.height));
- iconCanvas.validate();
- }
-
- SunToolkit.executeOnEventHandlerThread(xtiPeer.target, new Runnable() {
- public void run() {
- if (xtiPeer.isDisposed()) {
- return;
- }
- Point parLoc = getParent().getLocationOnScreen();
- Dimension parSize = getParent().getSize();
- show(new Point(parLoc.x + parSize.width/2, parLoc.y + parSize.height/2),
- BALLOON_TRAY_ICON_INDENT);
- if (iconImage != null) {
- iconCanvas.updateImage(iconImage); // call it after the show(..) above
- }
- }
- });
- }
-
- public void dispose() {
- displayer.interrupt();
- super.dispose();
- }
-
- void loadGtkImages() {
- if (!gtkImagesLoaded) {
- errorImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty(
- "gtk.icon.gtk-dialog-error.6.rtl");
- warnImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty(
- "gtk.icon.gtk-dialog-warning.6.rtl");
- infoImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty(
- "gtk.icon.gtk-dialog-info.6.rtl");
- gtkImagesLoaded = true;
- }
- }
-
- class ActionPerformer extends MouseAdapter {
- public void mouseClicked(MouseEvent e) {
- // hide the balloon by any click
- hide();
- if (e.getButton() == MouseEvent.BUTTON1) {
- ActionEvent aev = new ActionEvent(xtiPeer.target, ActionEvent.ACTION_PERFORMED,
- xtiPeer.target.getActionCommand(),
- e.getWhen(), e.getModifiers());
- Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(aev);
- }
- }
- }
-
- class Displayer extends Thread {
- final int MAX_CONCURRENT_MSGS = 10;
-
- ArrayBlockingQueue<Message> messageQueue = new ArrayBlockingQueue<Message>(MAX_CONCURRENT_MSGS);
- boolean isDisplayed;
-
- Displayer() {
- setDaemon(true);
- }
-
- public void run() {
- while (true) {
- Message msg = null;
- try {
- msg = (Message)messageQueue.take();
- } catch (InterruptedException e) {
- return;
- }
-
- /*
- * Wait till the previous message is displayed if any
- */
- XToolkit.awtLock();
- try {
- while (isDisplayed) {
- try {
- XToolkit.awtLockWait();
- } catch (InterruptedException e) {
- return;
- }
- }
- isDisplayed = true;
- } finally {
- XToolkit.awtUnlock();
- }
- _display(msg.caption, msg.text, msg.messageType);
- }
- }
-
- void display(String caption, String text, String messageType) {
- messageQueue.offer(new Message(caption, text, messageType));
- }
- }
-
- class Message {
- String caption, text, messageType;
-
- Message(String caption, String text, String messageType) {
- this.caption = caption;
- this.text = text;
- this.messageType = messageType;
- }
- }
- }
-
- static class InfoWindow extends Window {
- Container container;
- Closer closer;
-
- InfoWindow(Frame parent, Color borderColor) {
- super(parent);
- container = new Container() {
- public Insets getInsets() {
- return new Insets(1, 1, 1, 1);
- }
- };
- setLayout(new BorderLayout());
- setBackground(borderColor);
- add(container, BorderLayout.CENTER);
- container.setLayout(new BorderLayout());
-
- closer = new Closer();
- }
-
- public Component add(Component c) {
- container.add(c, BorderLayout.CENTER);
- return c;
- }
-
- void setCloser(Runnable action, int time) {
- closer.set(action, time);
- }
-
- // Must be executed on EDT.
- protected void show(Point corner, int indent) {
- assert SunToolkit.isDispatchThreadForAppContext(InfoWindow.this);
-
- pack();
-
- Dimension size = getSize();
- // TODO: When 6356322 is fixed we should get screen bounds in
- // this way: eframe.getGraphicsConfiguration().getBounds().
- Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();
-
- if (corner.x < scrSize.width/2 && corner.y < scrSize.height/2) { // 1st square
- setLocation(corner.x + indent, corner.y + indent);
-
- } else if (corner.x >= scrSize.width/2 && corner.y < scrSize.height/2) { // 2nd square
- setLocation(corner.x - indent - size.width, corner.y + indent);
-
- } else if (corner.x < scrSize.width/2 && corner.y >= scrSize.height/2) { // 3rd square
- setLocation(corner.x + indent, corner.y - indent - size.height);
-
- } else if (corner.x >= scrSize.width/2 && corner.y >= scrSize.height/2) { // 4th square
- setLocation(corner.x - indent - size.width, corner.y - indent - size.height);
- }
-
- InfoWindow.super.show();
- InfoWindow.this.closer.schedule();
- }
-
- public void hide() {
- closer.close();
- }
-
- class Closer implements Runnable {
- Runnable action;
- int time;
-
- public void run() {
- doClose();
- }
-
- void set(Runnable action, int time) {
- this.action = action;
- this.time = time;
- }
-
- void schedule() {
- XToolkit.schedule(this, time);
- }
-
- void close() {
- XToolkit.remove(this);
- doClose();
- }
-
- // WARNING: this method may be executed on Toolkit thread.
- private void doClose() {
- SunToolkit.executeOnEventHandlerThread(InfoWindow.this, new Runnable() {
- public void run() {
- InfoWindow.super.hide();
- invalidate();
- if (action != null) {
- action.run();
- }
- }
- });
- }
- }
- }
}
--- a/jdk/src/solaris/classes/sun/awt/X11/XWM.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XWM.java Mon Apr 27 12:33:57 2009 -0700
@@ -896,7 +896,7 @@
/*
* Set MWM decorations. Set MWM functions depending on resizability.
*/
- static void setMotifDecor(XWindowPeer window, boolean resizable, int decorations, int functions) {
+ static void setMotifDecor(XWindow window, boolean resizable, int decorations, int functions) {
/* Apparently some WMs don't implement MWM_*_ALL semantic correctly */
if ((decorations & MWMConstants.MWM_DECOR_ALL) != 0
&& (decorations != MWMConstants.MWM_DECOR_ALL))
--- a/jdk/src/solaris/classes/sun/awt/X11/XWarningWindow.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XWarningWindow.java Mon Apr 27 12:33:57 2009 -0700
@@ -25,16 +25,194 @@
package sun.awt.X11;
import java.awt.*;
+import java.awt.event.*;
+import java.awt.geom.Point2D;
+import java.lang.ref.WeakReference;
+import sun.java2d.SunGraphics2D;
+import sun.java2d.pipe.Region;
+import sun.awt.AWTAccessor;
+import sun.awt.SunToolkit;
class XWarningWindow extends XWindow {
- final static int defaultHeight = 27;
+ private final static int showingDelay = 330;
+ private final static int hidingDelay = 2000;
+
+ private final Window ownerWindow;
+ private WeakReference<XWindowPeer> ownerPeer;
+
+ public final Window getOwnerWindow() {
+ return ownerWindow;
+ }
+ private long parentWindow;
+
+ private final static String OWNER = "OWNER";
+
+ private static XIconInfo[][] icons;
+
+ private InfoWindow.Tooltip tooltip;
+
+ private static synchronized XIconInfo getSecurityIconInfo(int size, int num) {
+ if (icons == null) {
+ icons = new XIconInfo[4][3];
+ if (XlibWrapper.dataModel == 32) {
+ icons[0][0] = new XIconInfo(XAWTIcon32_security_icon_bw16_png.security_icon_bw16_png);
+ icons[0][1] = new XIconInfo(XAWTIcon32_security_icon_interim16_png.security_icon_interim16_png);
+ icons[0][2] = new XIconInfo(XAWTIcon32_security_icon_yellow16_png.security_icon_yellow16_png);
+ icons[1][0] = new XIconInfo(XAWTIcon32_security_icon_bw24_png.security_icon_bw24_png);
+ icons[1][1] = new XIconInfo(XAWTIcon32_security_icon_interim24_png.security_icon_interim24_png);
+ icons[1][2] = new XIconInfo(XAWTIcon32_security_icon_yellow24_png.security_icon_yellow24_png);
+ icons[2][0] = new XIconInfo(XAWTIcon32_security_icon_bw32_png.security_icon_bw32_png);
+ icons[2][1] = new XIconInfo(XAWTIcon32_security_icon_interim32_png.security_icon_interim32_png);
+ icons[2][2] = new XIconInfo(XAWTIcon32_security_icon_yellow32_png.security_icon_yellow32_png);
+ icons[3][0] = new XIconInfo(XAWTIcon32_security_icon_bw48_png.security_icon_bw48_png);
+ icons[3][1] = new XIconInfo(XAWTIcon32_security_icon_interim48_png.security_icon_interim48_png);
+ icons[3][2] = new XIconInfo(XAWTIcon32_security_icon_yellow48_png.security_icon_yellow48_png);
+ } else {
+ icons[0][0] = new XIconInfo(XAWTIcon64_security_icon_bw16_png.security_icon_bw16_png);
+ icons[0][1] = new XIconInfo(XAWTIcon64_security_icon_interim16_png.security_icon_interim16_png);
+ icons[0][2] = new XIconInfo(XAWTIcon64_security_icon_yellow16_png.security_icon_yellow16_png);
+ icons[1][0] = new XIconInfo(XAWTIcon64_security_icon_bw24_png.security_icon_bw24_png);
+ icons[1][1] = new XIconInfo(XAWTIcon64_security_icon_interim24_png.security_icon_interim24_png);
+ icons[1][2] = new XIconInfo(XAWTIcon64_security_icon_yellow24_png.security_icon_yellow24_png);
+ icons[2][0] = new XIconInfo(XAWTIcon64_security_icon_bw32_png.security_icon_bw32_png);
+ icons[2][1] = new XIconInfo(XAWTIcon64_security_icon_interim32_png.security_icon_interim32_png);
+ icons[2][2] = new XIconInfo(XAWTIcon64_security_icon_yellow32_png.security_icon_yellow32_png);
+ icons[3][0] = new XIconInfo(XAWTIcon64_security_icon_bw48_png.security_icon_bw48_png);
+ icons[3][1] = new XIconInfo(XAWTIcon64_security_icon_interim48_png.security_icon_interim48_png);
+ icons[3][2] = new XIconInfo(XAWTIcon64_security_icon_yellow48_png.security_icon_yellow48_png);
+ }
+ }
+ final int sizeIndex = size % icons.length;
+ return icons[sizeIndex][num % icons[sizeIndex].length];
+ }
+
+ private volatile int currentIcon = 0;
+
+ /* -1 - uninitialized yet
+ * 0 - 16x16
+ * 1 - 24x24
+ * 2 - 32x32
+ * 3 - 48x48
+ */
+ private volatile int currentSize = -1;
+
+ /** Indicates whether the shape of the window must be updated
+ */
+ private volatile boolean sizeUpdated = true;
+
+ private synchronized boolean updateIconSize() {
+ int newSize = currentSize;
+
+ if (ownerWindow != null) {
+ Insets insets = ownerWindow.getInsets();
+ int max = Math.max(insets.top, Math.max(insets.bottom,
+ Math.max(insets.left, insets.right)));
+ if (max < 24) {
+ newSize = 0;
+ } else if (max < 32) {
+ newSize = 1;
+ } else if (max < 48) {
+ newSize = 2;
+ } else {
+ newSize = 3;
+ }
+ }
+ if (newSize != currentSize) {
+ currentSize = newSize;
+ sizeUpdated = true;
+ }
+ return sizeUpdated;
+ }
- Window ownerWindow;
- XWarningWindow(Window ownerWindow, long parentWindow) {
- super(ownerWindow, parentWindow);
+ private synchronized XIconInfo getSecurityIconInfo() {
+ updateIconSize();
+ return getSecurityIconInfo(currentSize, currentIcon);
+ }
+
+ XWarningWindow(final Window ownerWindow, long parentWindow, XWindowPeer ownerPeer) {
+ super(new XCreateWindowParams(new Object[] {
+ TARGET, ownerWindow,
+ OWNER, Long.valueOf(parentWindow)
+ }));
this.ownerWindow = ownerWindow;
- xSetVisible(true);
- toFront();
+ this.parentWindow = parentWindow;
+ this.tooltip = new InfoWindow.Tooltip(null, getTarget(),
+ new InfoWindow.Tooltip.LiveArguments() {
+ public boolean isDisposed() {
+ return XWarningWindow.this.isDisposed();
+ }
+ public Rectangle getBounds() {
+ return XWarningWindow.this.getBounds();
+ }
+ public String getTooltipString() {
+ return XWarningWindow.this.ownerWindow.getWarningString();
+ }
+ });
+ this.ownerPeer = new WeakReference<XWindowPeer>(ownerPeer);
+ }
+
+ private void requestNoTaskbar() {
+ XNETProtocol netProtocol = XWM.getWM().getNETProtocol();
+ if (netProtocol != null) {
+ netProtocol.requestState(this, netProtocol.XA_NET_WM_STATE_SKIP_TASKBAR, true);
+ }
+ }
+
+ @Override
+ void postInit(XCreateWindowParams params) {
+ super.postInit(params);
+ XToolkit.awtLock();
+ try {
+ XWM.setMotifDecor(this, false, 0, 0);
+ XWM.setOLDecor(this, false, 0);
+
+ long parentWindow = ((Long)params.get(OWNER)).longValue();
+ XlibWrapper.XSetTransientFor(XToolkit.getDisplay(),
+ getWindow(), parentWindow);
+
+ XWMHints hints = getWMHints();
+ hints.set_flags(hints.get_flags() | (int)XUtilConstants.InputHint | (int)XUtilConstants.StateHint);
+ hints.set_input(false);
+ hints.set_initial_state(XUtilConstants.NormalState);
+ XlibWrapper.XSetWMHints(XToolkit.getDisplay(), getWindow(), hints.pData);
+
+ initWMProtocols();
+ requestNoTaskbar();
+ } finally {
+ XToolkit.awtUnlock();
+ }
+ }
+
+ private void updateWarningWindowBounds() {
+ XWindowPeer peer = ownerPeer.get();
+ if (peer != null) {
+ synchronized (this) {
+ if (updateIconSize()) {
+ XIconInfo ico = getSecurityIconInfo();
+ XToolkit.awtLock();
+ try {
+ XlibWrapper.SetBitmapShape(XToolkit.getDisplay(), getWindow(),
+ ico.getWidth(), ico.getHeight(), ico.getIntData());
+ } finally {
+ XToolkit.awtUnlock();
+ }
+ sizeUpdated = false;
+ AWTAccessor.getWindowAccessor().setSecurityWarningSize(
+ ownerWindow, ico.getWidth(), ico.getHeight());
+ }
+ }
+ peer.repositionSecurityWarning();
+ }
+ }
+
+ /**
+ * @param x,y,w,h coordinates of the untrusted window
+ */
+ public void reposition(int x, int y, int w, int h) {
+ Point2D point = AWTAccessor.getWindowAccessor().
+ calculateSecurityWarningPosition(ownerWindow,
+ x, y, w, h);
+ reshape((int)point.getX(), (int)point.getY(), getWidth(), getHeight());
}
protected String getWMName() {
@@ -49,33 +227,19 @@
getFont());
}
void paint(Graphics g, int x, int y, int width, int height) {
- String warningString = getWarningString();
- Rectangle bounds = getBounds();
- bounds.x = 0;
- bounds.y = 0;
- Rectangle updateRect = new Rectangle(x, y, width, height);
- if (updateRect.intersects(bounds)) {
- Rectangle updateArea = updateRect.intersection(bounds);
- g.setClip(updateArea);
- g.setColor(getBackground());
- g.fillRect(updateArea.x, updateArea.y, updateArea.width, updateArea.height);
- g.setColor(getColor());
- g.setFont(getFont());
- FontMetrics fm = g.getFontMetrics();
- int warningWidth = fm.stringWidth(warningString);
- int w_x = (bounds.width - warningWidth)/2;
- int w_y = (bounds.height + fm.getMaxAscent() - fm.getMaxDescent())/2;
- g.drawString(warningString, w_x, w_y);
- g.drawLine(bounds.x, bounds.y+bounds.height-1, bounds.x+bounds.width-1, bounds.y+bounds.height-1);
- }
+ g.drawImage(getSecurityIconInfo().getImage(), 0, 0, null);
}
String getWarningString() {
return ownerWindow.getWarningString();
}
+ int getWidth() {
+ return getSecurityIconInfo().getWidth();
+ }
+
int getHeight() {
- return defaultHeight; // should implement depending on Font
+ return getSecurityIconInfo().getHeight();
}
Color getBackground() {
@@ -97,6 +261,7 @@
}
}
+ @Override
public void handleExposeEvent(XEvent xev) {
super.handleExposeEvent(xev);
@@ -105,18 +270,156 @@
final int y = xe.get_y();
final int width = xe.get_width();
final int height = xe.get_height();
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- Graphics g = getGraphics();
- try {
- paint(g, x, y, width, height);
- } finally {
- g.dispose();
- }
- }
- });
+ SunToolkit.executeOnEventHandlerThread(target,
+ new Runnable() {
+ public void run() {
+ Graphics g = getGraphics();
+ try {
+ paint(g, x, y, width, height);
+ } finally {
+ g.dispose();
+ }
+ }
+ });
}
+
+ @Override
protected boolean isEventDisabled(XEvent e) {
return true;
}
+
+ /** Send a synthetic UnmapNotify in order to withdraw the window.
+ */
+ private void withdraw() {
+ XEvent req = new XEvent();
+ try {
+ long root;
+ XToolkit.awtLock();
+ try {
+ root = XlibWrapper.RootWindow(XToolkit.getDisplay(), getScreenNumber());
+ }
+ finally {
+ XToolkit.awtUnlock();
+ }
+
+ req.set_type(XConstants.UnmapNotify);
+
+ XUnmapEvent umev = req.get_xunmap();
+
+ umev.set_event(root);
+ umev.set_window(getWindow());
+ umev.set_from_configure(false);
+
+ XToolkit.awtLock();
+ try {
+ XlibWrapper.XSendEvent(XToolkit.getDisplay(),
+ root,
+ false,
+ XConstants.SubstructureRedirectMask | XConstants.SubstructureNotifyMask,
+ req.pData);
+ }
+ finally {
+ XToolkit.awtUnlock();
+ }
+ } finally {
+ req.dispose();
+ }
+ }
+
+ @Override
+ protected void stateChanged(long time, int oldState, int newState) {
+ if (newState == XUtilConstants.IconicState) {
+ super.xSetVisible(false);
+ withdraw();
+ }
+ }
+
+ @Override
+ protected void setMouseAbove(boolean above) {
+ super.setMouseAbove(above);
+ XWindowPeer p = ownerPeer.get();
+ if (p != null) {
+ p.updateSecurityWarningVisibility();
+ }
+ }
+
+ @Override
+ protected void enterNotify(long window) {
+ super.enterNotify(window);
+ if (window == getWindow()) {
+ tooltip.enter();
+ }
+ }
+
+ @Override
+ protected void leaveNotify(long window) {
+ super.leaveNotify(window);
+ if (window == getWindow()) {
+ tooltip.exit();
+ }
+ }
+
+ @Override
+ public void xSetVisible(boolean visible) {
+ super.xSetVisible(visible);
+
+ // The _NET_WM_STATE_SKIP_TASKBAR got reset upon hiding/showing,
+ // so we request it every time whenever we change the visibility.
+ requestNoTaskbar();
+ }
+
+ private final Runnable hidingTask = new Runnable() {
+ public void run() {
+ xSetVisible(false);
+ }
+ };
+
+ private final Runnable showingTask = new Runnable() {
+ public void run() {
+ new Thread() {
+ public void run() {
+ if (!isVisible()) {
+ xSetVisible(true);
+ updateWarningWindowBounds();
+ }
+ repaint();
+ if (currentIcon > 0) {
+ currentIcon--;
+ XToolkit.schedule(showingTask, showingDelay);
+ }
+ }}.start();
+ }
+ };
+
+ public void setSecurityWarningVisible(boolean visible) {
+ setSecurityWarningVisible(visible, true);
+ }
+
+ public void setSecurityWarningVisible(boolean visible, boolean doSchedule) {
+ if (visible) {
+ XToolkit.remove(hidingTask);
+ XToolkit.remove(showingTask);
+ if (isVisible()) {
+ currentIcon = 0;
+ } else {
+ currentIcon = 3;
+ }
+ if (doSchedule) {
+ XToolkit.schedule(showingTask, 1);
+ } else {
+ showingTask.run();
+ }
+ } else {
+ XToolkit.remove(showingTask);
+ XToolkit.remove(hidingTask);
+ if (!isVisible()) {
+ return;
+ }
+ if (doSchedule) {
+ XToolkit.schedule(hidingTask, hidingDelay);
+ } else {
+ hidingTask.run();
+ }
+ }
+ }
}
--- a/jdk/src/solaris/classes/sun/awt/X11/XWindow.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XWindow.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2002-2009 Sun Microsystems, Inc. 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,6 +68,15 @@
int oldWidth = -1;
int oldHeight = -1;
+ protected PropMwmHints mwm_hints;
+ protected static XAtom wm_protocols;
+ protected static XAtom wm_delete_window;
+ protected static XAtom wm_take_focus;
+
+ private boolean stateChanged; // Indicates whether the value on savedState is valid
+ private int savedState; // Holds last known state of the top-level window
+
+ XWindowAttributesData winAttr;
protected X11GraphicsConfig graphicsConfig;
protected AwtGraphicsConfigData graphicsConfigData;
@@ -119,6 +128,9 @@
private native static void initIDs();
private static Field isPostedField;
+ private static Field rawCodeField;
+ private static Field primaryLevelUnicodeField;
+ private static Field extendedKeyCodeField;
static {
initIDs();
}
@@ -218,6 +230,20 @@
}
params.putIfNull(BACKING_STORE, XToolkit.getBackingStoreType());
+
+ XToolkit.awtLock();
+ try {
+ if (wm_protocols == null) {
+ wm_protocols = XAtom.get("WM_PROTOCOLS");
+ wm_delete_window = XAtom.get("WM_DELETE_WINDOW");
+ wm_take_focus = XAtom.get("WM_TAKE_FOCUS");
+ }
+ }
+ finally {
+ XToolkit.awtUnlock();
+ }
+ winAttr = new XWindowAttributesData();
+ savedState = XUtilConstants.WithdrawnState;
}
void postInit(XCreateWindowParams params) {
@@ -832,12 +858,42 @@
public native boolean x11inputMethodLookupString(long event, long [] keysymArray);
native boolean haveCurrentX11InputMethodInstance();
+ private boolean mouseAboveMe;
+
+ public boolean isMouseAbove() {
+ synchronized (getStateLock()) {
+ return mouseAboveMe;
+ }
+ }
+ protected void setMouseAbove(boolean above) {
+ synchronized (getStateLock()) {
+ mouseAboveMe = above;
+ }
+ }
+
+ protected void enterNotify(long window) {
+ if (window == getWindow()) {
+ setMouseAbove(true);
+ }
+ }
+ protected void leaveNotify(long window) {
+ if (window == getWindow()) {
+ setMouseAbove(false);
+ }
+ }
+
public void handleXCrossingEvent(XEvent xev) {
super.handleXCrossingEvent(xev);
XCrossingEvent xce = xev.get_xcrossing();
if (eventLog.isLoggable(Level.FINEST)) eventLog.finest(xce.toString());
+ if (xce.get_type() == XConstants.EnterNotify) {
+ enterNotify(xce.get_window());
+ } else { // LeaveNotify:
+ leaveNotify(xce.get_window());
+ }
+
// Skip event If it was caused by a grab
// This is needed because on displays with focus-follows-mouse on MousePress X system generates
// two XCrossing events with mode != NormalNotify. First of them notifies that the mouse has left
@@ -984,7 +1040,7 @@
Parameter is a keysym basically from keysymdef.h
XXX: how about vendor keys? Is there some with Unicode value and not in the list?
*/
- char keysymToUnicode( long keysym, int state ) {
+ int keysymToUnicode( long keysym, int state ) {
return XKeysym.convertKeysym( keysym, state );
}
int keyEventType2Id( int xEventType ) {
@@ -994,6 +1050,13 @@
static private long xkeycodeToKeysym(XKeyEvent ev) {
return XKeysym.getKeysym( ev );
}
+ private long xkeycodeToPrimaryKeysym(XKeyEvent ev) {
+ return XKeysym.xkeycode2primary_keysym( ev );
+ }
+ static private int primaryUnicode2JavaKeycode(int uni) {
+ return (uni > 0? sun.awt.ExtendedKeyCodes.getExtendedKeyCodeForChar(uni) : 0);
+ //return (uni > 0? uni + 0x01000000 : 0);
+ }
void logIncomingKeyEvent(XKeyEvent ev) {
keyEventLog.fine("--XWindow.java:handleKeyEvent:"+ev);
dumpKeysymArray(ev);
@@ -1012,7 +1075,7 @@
// un-final it if you need to override it in a subclass.
final void handleKeyPress(XKeyEvent ev) {
long keysym[] = new long[2];
- char unicodeKey = 0;
+ int unicodeKey = 0;
keysym[0] = XConstants.NoSymbol;
if (keyEventLog.isLoggable(Level.FINE)) {
@@ -1057,19 +1120,36 @@
if( jkc == null ) {
jkc = new XKeysym.Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_UNDEFINED, java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN);
}
+
+ // Take the first keysym from a keysym array associated with the XKeyevent
+ // and convert it to Unicode. Then, even if a Java keycode for the keystroke
+ // is undefined, we still have a guess of what has been engraved on a keytop.
+ int unicodeFromPrimaryKeysym = keysymToUnicode( xkeycodeToPrimaryKeysym(ev) ,0);
+
if (keyEventLog.isLoggable(Level.FINE)) {
keyEventLog.fine(">>>Fire Event:"+
(ev.get_type() == XConstants.KeyPress ? "KEY_PRESSED; " : "KEY_RELEASED; ")+
"jkeycode:decimal="+jkc.getJavaKeycode()+
- ", hex=0x"+Integer.toHexString(jkc.getJavaKeycode())+"; "
+ ", hex=0x"+Integer.toHexString(jkc.getJavaKeycode())+"; "+
+ " legacy jkeycode: decimal="+XKeysym.getLegacyJavaKeycodeOnly(ev)+
+ ", hex=0x"+Integer.toHexString(XKeysym.getLegacyJavaKeycodeOnly(ev))+"; "
);
}
+
+ int jkeyToReturn = XKeysym.getLegacyJavaKeycodeOnly(ev); // someway backward compatible
+ int jkeyExtended = jkc.getJavaKeycode() == java.awt.event.KeyEvent.VK_UNDEFINED ?
+ primaryUnicode2JavaKeycode( unicodeFromPrimaryKeysym ) :
+ jkc.getJavaKeycode();
postKeyEvent( java.awt.event.KeyEvent.KEY_PRESSED,
ev.get_time(),
- jkc.getJavaKeycode(),
+ jkeyToReturn,
(unicodeKey == 0 ? java.awt.event.KeyEvent.CHAR_UNDEFINED : unicodeKey),
jkc.getKeyLocation(),
- ev.get_state(),ev.getPData(), XKeyEvent.getSize());
+ ev.get_state(),ev.getPData(), XKeyEvent.getSize(), (long)(ev.get_keycode()),
+ unicodeFromPrimaryKeysym,
+ jkeyExtended);
+
+
if( unicodeKey > 0 ) {
keyEventLog.fine("fire _TYPED on "+unicodeKey);
postKeyEvent( java.awt.event.KeyEvent.KEY_TYPED,
@@ -1077,7 +1157,10 @@
java.awt.event.KeyEvent.VK_UNDEFINED,
unicodeKey,
java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN,
- ev.get_state(),ev.getPData(), XKeyEvent.getSize());
+ ev.get_state(),ev.getPData(), XKeyEvent.getSize(), (long)0,
+ unicodeFromPrimaryKeysym,
+ java.awt.event.KeyEvent.VK_UNDEFINED);
+
}
@@ -1095,7 +1178,7 @@
// un-private it if you need to call it from elsewhere
private void handleKeyRelease(XKeyEvent ev) {
long keysym[] = new long[2];
- char unicodeKey = 0;
+ int unicodeKey = 0;
keysym[0] = XConstants.NoSymbol;
if (keyEventLog.isLoggable(Level.FINE)) {
@@ -1113,7 +1196,9 @@
keyEventLog.fine(">>>Fire Event:"+
(ev.get_type() == XConstants.KeyPress ? "KEY_PRESSED; " : "KEY_RELEASED; ")+
"jkeycode:decimal="+jkc.getJavaKeycode()+
- ", hex=0x"+Integer.toHexString(jkc.getJavaKeycode())+"; "
+ ", hex=0x"+Integer.toHexString(jkc.getJavaKeycode())+"; "+
+ " legacy jkeycode: decimal="+XKeysym.getLegacyJavaKeycodeOnly(ev)+
+ ", hex=0x"+Integer.toHexString(XKeysym.getLegacyJavaKeycodeOnly(ev))+"; "
);
}
// We obtain keysym from IM and derive unicodeKey from it for KeyPress only.
@@ -1124,13 +1209,74 @@
// That's why we use the same procedure as if there was no IM instance: do-it-yourself unicode.
unicodeKey = keysymToUnicode( xkeycodeToKeysym(ev), ev.get_state() );
+ // Take a first keysym from a keysym array associated with the XKeyevent
+ // and convert it to Unicode. Then, even if Java keycode for the keystroke
+ // is undefined, we still will have a guess of what was engraved on a keytop.
+ int unicodeFromPrimaryKeysym = keysymToUnicode( xkeycodeToPrimaryKeysym(ev) ,0);
+
+ int jkeyToReturn = XKeysym.getLegacyJavaKeycodeOnly(ev); // someway backward compatible
+ int jkeyExtended = jkc.getJavaKeycode() == java.awt.event.KeyEvent.VK_UNDEFINED ?
+ primaryUnicode2JavaKeycode( unicodeFromPrimaryKeysym ) :
+ jkc.getJavaKeycode();
postKeyEvent( java.awt.event.KeyEvent.KEY_RELEASED,
ev.get_time(),
- jkc.getJavaKeycode(),
+ jkeyToReturn,
(unicodeKey == 0 ? java.awt.event.KeyEvent.CHAR_UNDEFINED : unicodeKey),
jkc.getKeyLocation(),
- ev.get_state(),ev.getPData(), XKeyEvent.getSize());
+ ev.get_state(),ev.getPData(), XKeyEvent.getSize(), (long)(ev.get_keycode()),
+ unicodeFromPrimaryKeysym,
+ jkeyExtended);
+
+
+ }
+
+ /*
+ * XmNiconic and Map/UnmapNotify (that XmNiconic relies on) are
+ * unreliable, since mapping changes can happen for a virtual desktop
+ * switch or MacOS style shading that became quite popular under X as
+ * well. Yes, it probably should not be this way, as it violates
+ * ICCCM, but reality is that quite a lot of window managers abuse
+ * mapping state.
+ */
+ int getWMState() {
+ if (stateChanged) {
+ stateChanged = false;
+ WindowPropertyGetter getter =
+ new WindowPropertyGetter(window, XWM.XA_WM_STATE, 0, 1, false,
+ XWM.XA_WM_STATE);
+ try {
+ int status = getter.execute();
+ if (status != XConstants.Success || getter.getData() == 0) {
+ return savedState = XUtilConstants.WithdrawnState;
+ }
+ if (getter.getActualType() != XWM.XA_WM_STATE.getAtom() && getter.getActualFormat() != 32) {
+ return savedState = XUtilConstants.WithdrawnState;
+ }
+ savedState = (int)Native.getCard32(getter.getData());
+ } finally {
+ getter.dispose();
+ }
+ }
+ return savedState;
+ }
+
+ /**
+ * Override this methods to get notifications when top-level window state changes. The state is
+ * meant in terms of ICCCM: WithdrawnState, IconicState, NormalState
+ */
+ protected void stateChanged(long time, int oldState, int newState) {
+ }
+
+ @Override
+ public void handlePropertyNotify(XEvent xev) {
+ super.handlePropertyNotify(xev);
+ XPropertyEvent ev = xev.get_xproperty();
+ if (ev.get_atom() == XWM.XA_WM_STATE.getAtom()) {
+ // State has changed, invalidate saved value
+ stateChanged = true;
+ stateChanged(ev.get_time(), savedState, getWMState());
+ }
}
public void reshape(Rectangle bounds) {
@@ -1277,20 +1423,77 @@
}
}
- public void postKeyEvent(int id, long when, int keyCode, char keyChar,
- int keyLocation, int state, long event, int eventSize)
+ public void postKeyEvent(int id, long when, int keyCode, int keyChar,
+ int keyLocation, int state, long event, int eventSize, long rawCode,
+ int unicodeFromPrimaryKeysym, int extendedKeyCode)
+
{
long jWhen = XToolkit.nowMillisUTC_offset(when);
int modifiers = getModifiers(state, 0, keyCode);
+ if (rawCodeField == null) {
+ rawCodeField = XToolkit.getField(KeyEvent.class, "rawCode");
+ }
+ if (primaryLevelUnicodeField == null) {
+ primaryLevelUnicodeField = XToolkit.getField(KeyEvent.class, "primaryLevelUnicode");
+ }
+ if (extendedKeyCodeField == null) {
+ extendedKeyCodeField = XToolkit.getField(KeyEvent.class, "extendedKeyCode");
+ }
+
KeyEvent ke = new KeyEvent((Component)getEventSource(), id, jWhen,
- modifiers, keyCode, keyChar, keyLocation);
+ modifiers, keyCode, (char)keyChar, keyLocation);
if (event != 0) {
byte[] data = Native.toBytes(event, eventSize);
setBData(ke, data);
}
+ try {
+ rawCodeField.set(ke, rawCode);
+ primaryLevelUnicodeField.set(ke, (long)unicodeFromPrimaryKeysym);
+ extendedKeyCodeField.set(ke, (long)extendedKeyCode);
+ } catch (IllegalArgumentException e) {
+ assert(false);
+ } catch (IllegalAccessException e) {
+ assert(false);
+ }
postEventToEventQueue(ke);
}
static native int getAWTKeyCodeForKeySym(int keysym);
static native int getKeySymForAWTKeyCode(int keycode);
+
+ /* These two methods are actually applicable to toplevel windows only.
+ * However, the functionality is required by both the XWindowPeer and
+ * XWarningWindow, both of which have the XWindow as a common ancestor.
+ * See XWM.setMotifDecor() for details.
+ */
+ public PropMwmHints getMWMHints() {
+ if (mwm_hints == null) {
+ mwm_hints = new PropMwmHints();
+ if (!XWM.XA_MWM_HINTS.getAtomData(getWindow(), mwm_hints.pData, MWMConstants.PROP_MWM_HINTS_ELEMENTS)) {
+ mwm_hints.zero();
+ }
+ }
+ return mwm_hints;
+ }
+
+ public void setMWMHints(PropMwmHints hints) {
+ mwm_hints = hints;
+ if (hints != null) {
+ XWM.XA_MWM_HINTS.setAtomData(getWindow(), mwm_hints.pData, MWMConstants.PROP_MWM_HINTS_ELEMENTS);
+ }
+ }
+
+ protected final void initWMProtocols() {
+ wm_protocols.setAtomListProperty(this, getWMProtocols());
+ }
+
+ /**
+ * Returns list of protocols which should be installed on this window.
+ * Descendants can override this method to add class-specific protocols
+ */
+ protected XAtomList getWMProtocols() {
+ // No protocols on simple window
+ return new XAtomList();
+ }
+
}
--- a/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2002-2009 Sun Microsystems, Inc. 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
@@ -30,6 +30,8 @@
import java.awt.event.FocusEvent;
import java.awt.event.WindowEvent;
+import java.awt.image.BufferedImage;
+
import java.awt.peer.ComponentPeer;
import java.awt.peer.WindowPeer;
@@ -42,13 +44,17 @@
import java.util.logging.Level;
import java.util.logging.Logger;
+import sun.awt.AWTAccessor;
import sun.awt.ComponentAccessor;
import sun.awt.WindowAccessor;
+import sun.awt.AWTAccessor;
import sun.awt.DisplayChangedListener;
import sun.awt.SunToolkit;
import sun.awt.X11GraphicsDevice;
import sun.awt.X11GraphicsEnvironment;
+import sun.java2d.pipe.Region;
+
class XWindowPeer extends XPanelPeer implements WindowPeer,
DisplayChangedListener {
@@ -61,16 +67,11 @@
// should be synchronized on awtLock
private static Set<XWindowPeer> windows = new HashSet<XWindowPeer>();
- static XAtom wm_protocols;
- static XAtom wm_delete_window;
- static XAtom wm_take_focus;
- XWindowAttributesData winAttr;
private boolean cachedFocusableWindow;
XWarningWindow warningWindow;
private boolean alwaysOnTop;
- PropMwmHints mwm_hints;
private boolean locationByPlatform;
Dialog modalBlocker;
@@ -87,8 +88,6 @@
private boolean grab = false; // Whether to do a grab during showing
private boolean isMapped = false; // Is this window mapped or not
- private boolean stateChanged; // Indicates whether the value on savedState is valid
- private int savedState; // Holds last known state of the top-level window
private boolean mustControlStackPosition = false; // Am override-redirect not on top
private XEventDispatcher rootPropertyEventDispatcher = null;
@@ -135,25 +134,18 @@
super.preInit(params);
params.putIfNull(BIT_GRAVITY, Integer.valueOf(XConstants.NorthWestGravity));
- savedState = XUtilConstants.WithdrawnState;
+ long eventMask = 0;
+ if (params.containsKey(EVENT_MASK)) {
+ eventMask = ((Long)params.get(EVENT_MASK));
+ }
+ eventMask |= XConstants.VisibilityChangeMask;
+ params.put(EVENT_MASK, eventMask);
+
XA_NET_WM_STATE = XAtom.get("_NET_WM_STATE");
- winAttr = new XWindowAttributesData();
params.put(OVERRIDE_REDIRECT, Boolean.valueOf(isOverrideRedirect()));
- SunToolkit.awtLock();
- try {
- windows.add(this);
- if (wm_protocols == null) {
- wm_protocols = XAtom.get("WM_PROTOCOLS");
- wm_delete_window = XAtom.get("WM_DELETE_WINDOW");
- wm_take_focus = XAtom.get("WM_TAKE_FOCUS");
- }
- }
- finally {
- SunToolkit.awtUnlock();
- }
cachedFocusableWindow = isFocusableWindow();
Font f = target.getFont();
@@ -186,20 +178,6 @@
params.put(BOUNDS, constrainBounds(bounds.x, bounds.y, bounds.width, bounds.height));
}
- private void initWMProtocols() {
- wm_protocols.setAtomListProperty(this, getWMProtocols());
- }
-
- /**
- * Returns list of protocols which should be installed on this window.
- * Descendants can override this method to add class-specific protocols
- */
- protected XAtomList getWMProtocols() {
- // No protocols on simple window
- return new XAtomList();
- }
-
-
protected String getWMName() {
String name = target.getName();
if (name == null || name.trim().equals("")) {
@@ -253,13 +231,17 @@
// accessSystemTray permission allows to display TrayIcon, TrayIcon tooltip
// and TrayIcon balloon windows without a warning window.
if (!WindowAccessor.isTrayIconWindow((Window)target)) {
- warningWindow = new XWarningWindow((Window)target, getWindow());
+ warningWindow = new XWarningWindow((Window)target, getWindow(), this);
}
}
setSaveUnder(true);
updateIconImages();
+
+ updateShape();
+ updateOpacity();
+ // no need in updateOpaque() as it is no-op
}
public void updateIconImages() {
@@ -417,6 +399,22 @@
return defaultIconInfo;
}
+ private void updateShape() {
+ // Shape shape = ((Window)target).getShape();
+ Shape shape = AWTAccessor.getWindowAccessor().getShape((Window)target);
+ if (shape != null) {
+ applyShape(Region.getInstance(shape, null));
+ }
+ }
+
+ private void updateOpacity() {
+ // float opacity = ((Window)target).getOpacity();
+ float opacity = AWTAccessor.getWindowAccessor().getOpacity((Window)target);
+ if (opacity < 1.0f) {
+ setOpacity(opacity);
+ }
+ }
+
public void updateMinimumSize() {
//This function only saves minimumSize value in XWindowPeer
//Setting WMSizeHints is implemented in XDecoratedPeer
@@ -513,10 +511,15 @@
}
- if (!bounds.getSize().equals(oldBounds.getSize())) {
+ boolean isResized = !bounds.getSize().equals(oldBounds.getSize());
+ boolean isMoved = !bounds.getLocation().equals(oldBounds.getLocation());
+ if (isMoved || isResized) {
+ repositionSecurityWarning();
+ }
+ if (isResized) {
postEventToEventQueue(new ComponentEvent(getEventSource(), ComponentEvent.COMPONENT_RESIZED));
}
- if (!bounds.getLocation().equals(oldBounds.getLocation())) {
+ if (isMoved) {
postEventToEventQueue(new ComponentEvent(getEventSource(), ComponentEvent.COMPONENT_MOVED));
}
} finally {
@@ -539,7 +542,7 @@
}
public Insets getInsets() {
- return new Insets(getWarningWindowHeight(), 0, 0, 0);
+ return new Insets(0, 0, 0, 0);
}
// NOTE: This method may be called by privileged threads.
@@ -686,6 +689,7 @@
int curScreenNum = ((X11GraphicsDevice)getGraphicsConfiguration().getDevice()).getScreen();
int newScreenNum = 0;
GraphicsDevice gds[] = XToolkit.localEnv.getScreenDevices();
+ GraphicsConfiguration newGC = null;
Rectangle screenBounds;
for (int i = 0; i < gds.length; i++) {
@@ -701,11 +705,13 @@
if (intAmt == area) {
// Completely on this screen - done!
newScreenNum = i;
+ newGC = gds[i].getDefaultConfiguration();
break;
}
if (intAmt > largestAmt) {
largestAmt = intAmt;
newScreenNum = i;
+ newGC = gds[i].getDefaultConfiguration();
}
}
}
@@ -713,28 +719,20 @@
if (log.isLoggable(Level.FINEST)) {
log.finest("XWindowPeer: Moved to a new screen");
}
- draggedToNewScreen(newScreenNum);
+ executeDisplayChangedOnEDT(newGC);
}
}
- /* Xinerama
- * called to update our GC when dragged onto another screen
- */
- public void draggedToNewScreen(int screenNum) {
- executeDisplayChangedOnEDT(screenNum);
- }
-
/**
* Helper method that executes the displayChanged(screen) method on
* the event dispatch thread. This method is used in the Xinerama case
* and after display mode change events.
*/
- private void executeDisplayChangedOnEDT(final int screenNum) {
+ private void executeDisplayChangedOnEDT(final GraphicsConfiguration gc) {
Runnable dc = new Runnable() {
public void run() {
- // Updates this window's GC and notifies all the children.
- // See XPanelPeer/XCanvasPeer.displayChanged(int) for details.
- displayChanged(screenNum);
+ AWTAccessor.getComponentAccessor().
+ setGraphicsConfiguration((Component)target, gc);
}
};
SunToolkit.executeOnEventHandlerThread((Component)target, dc);
@@ -745,9 +743,7 @@
* X11GraphicsDevice when the display mode has been changed.
*/
public void displayChanged() {
- GraphicsConfiguration gc = getGraphicsConfiguration();
- int curScreenNum = ((X11GraphicsDevice)gc.getDevice()).getScreen();
- executeDisplayChangedOnEDT(curScreenNum);
+ executeDisplayChangedOnEDT(getGraphicsConfiguration());
}
/**
@@ -761,6 +757,7 @@
* Overridden to check if we need to update our GraphicsDevice/Config
* Added for 4934052.
*/
+ @Override
public void handleConfigureNotifyEvent(XEvent xev) {
// TODO: We create an XConfigureEvent every time we override
// handleConfigureNotify() - too many!
@@ -774,8 +771,7 @@
// there could be a race condition in which a ComponentListener could
// see the old screen.
super.handleConfigureNotifyEvent(xev);
- // for 5085647: no applet warning window visible
- updateChildrenSizes();
+ repositionSecurityWarning();
}
final void requestXFocus(long time) {
@@ -1053,6 +1049,9 @@
}
updateFocusability();
promoteDefaultPosition();
+ if (!vis && warningWindow != null) {
+ warningWindow.setSecurityWarningVisible(false, false);
+ }
super.setVisible(vis);
if (!vis && !isWithdrawn()) {
// ICCCM, 4.1.4. Changing Window State:
@@ -1082,6 +1081,7 @@
if (isOverrideRedirect() && vis) {
updateChildrenSizes();
}
+ repositionSecurityWarning();
}
protected void suppressWmTakeFocus(boolean doSuppress) {
@@ -1099,21 +1099,64 @@
return 0;
}
- // The height of area used to display Applet's warning about securit
- int getWarningWindowHeight() {
+ // Called when shell changes its size and requires children windows
+ // to update their sizes appropriately
+ void updateChildrenSizes() {
+ }
+
+ public void repositionSecurityWarning() {
+ // NOTE: On KWin if the window/border snapping option is enabled,
+ // the Java window may be swinging while it's being moved.
+ // This doesn't make the application unusable though looks quite ugly.
+ // Probobly we need to find some hint to assign to our Security
+ // Warning window in order to exclude it from the snapping option.
+ // We are not currently aware of existance of such a property.
if (warningWindow != null) {
- return warningWindow.getHeight();
- } else {
- return 0;
+ // We can't use the coordinates stored in the XBaseWindow since
+ // they are zeros for decorated frames.
+ int x = ComponentAccessor.getX(target);
+ int y = ComponentAccessor.getY(target);
+ int width = ComponentAccessor.getWidth(target);
+ int height = ComponentAccessor.getHeight(target);
+ warningWindow.reposition(x, y, width, height);
}
}
- // Called when shell changes its size and requires children windows
- // to update their sizes appropriately
- void updateChildrenSizes() {
- if (warningWindow != null) {
- warningWindow.reshape(0, getMenuBarHeight(), getSize().width, warningWindow.getHeight());
+ @Override
+ protected void setMouseAbove(boolean above) {
+ super.setMouseAbove(above);
+ updateSecurityWarningVisibility();
+ }
+
+ public void updateSecurityWarningVisibility() {
+ if (warningWindow == null) {
+ return;
+ }
+
+ boolean show = false;
+
+ int state = getWMState();
+
+ if (!isVisible()) {
+ return; // The warning window should already be hidden.
}
+
+ // getWMState() always returns 0 (Withdrawn) for simple windows. Hence
+ // we ignore the state for such windows.
+ if (isVisible() && (state == XUtilConstants.NormalState || isSimpleWindow())) {
+ if (XKeyboardFocusManagerPeer.getCurrentNativeFocusedWindow() ==
+ getTarget())
+ {
+ show = true;
+ }
+
+ if (isMouseAbove() || warningWindow.isMouseAbove())
+ {
+ show = true;
+ }
+ }
+
+ warningWindow.setSecurityWarningVisible(show);
}
boolean isOverrideRedirect() {
@@ -1165,16 +1208,7 @@
// if (ve.get_state() == XlibWrapper.VisibilityUnobscured) {
// // raiseInputMethodWindow
// }
- }
-
- public void handlePropertyNotify(XEvent xev) {
- super.handlePropertyNotify(xev);
- XPropertyEvent ev = xev.get_xproperty();
- if (ev.get_atom() == XWM.XA_WM_STATE.getAtom()) {
- // State has changed, invalidate saved value
- stateChanged = true;
- stateChanged(ev.get_time(), savedState, getWMState());
- }
+ repositionSecurityWarning();
}
void handleRootPropertyNotify(XEvent xev) {
@@ -1275,6 +1309,7 @@
* Override this methods to get notifications when top-level window state changes. The state is
* meant in terms of ICCCM: WithdrawnState, IconicState, NormalState
*/
+ @Override
protected void stateChanged(long time, int oldState, int newState) {
// Fix for 6401700, 6412803
// If this window is modal blocked, it is put into the transient_for
@@ -1288,38 +1323,8 @@
for (ToplevelStateListener topLevelListenerTmp : toplevelStateListeners) {
topLevelListenerTmp.stateChangedICCCM(oldState, newState);
}
- }
-
- /*
- * XmNiconic and Map/UnmapNotify (that XmNiconic relies on) are
- * unreliable, since mapping changes can happen for a virtual desktop
- * switch or MacOS style shading that became quite popular under X as
- * well. Yes, it probably should not be this way, as it violates
- * ICCCM, but reality is that quite a lot of window managers abuse
- * mapping state.
- */
- int getWMState() {
- if (stateChanged) {
- stateChanged = false;
- WindowPropertyGetter getter =
- new WindowPropertyGetter(window, XWM.XA_WM_STATE, 0, 1, false,
- XWM.XA_WM_STATE);
- try {
- int status = getter.execute();
- if (status != XConstants.Success || getter.getData() == 0) {
- return savedState = XUtilConstants.WithdrawnState;
- }
-
- if (getter.getActualType() != XWM.XA_WM_STATE.getAtom() && getter.getActualFormat() != 32) {
- return savedState = XUtilConstants.WithdrawnState;
- }
- savedState = (int)Native.getCard32(getter.getData());
- } finally {
- getter.dispose();
- }
- }
- return savedState;
+ updateSecurityWarningVisibility();
}
boolean isWithdrawn() {
@@ -2064,4 +2069,44 @@
}
super.handleButtonPressRelease(xev);
}
+
+ public void print(Graphics g) {
+ // We assume we print the whole frame,
+ // so we expect no clip was set previously
+ Shape shape = AWTAccessor.getWindowAccessor().getShape((Window)target);
+ if (shape != null) {
+ g.setClip(shape);
+ }
+ super.print(g);
+ }
+
+ @Override
+ public void setOpacity(float opacity) {
+ final long maxOpacity = 0xffffffffl;
+ long iOpacity = (long)(opacity * maxOpacity);
+ if (iOpacity < 0) {
+ iOpacity = 0;
+ }
+ if (iOpacity > maxOpacity) {
+ iOpacity = maxOpacity;
+ }
+
+ XAtom netWmWindowOpacityAtom = XAtom.get("_NET_WM_WINDOW_OPACITY");
+
+ if (iOpacity == maxOpacity) {
+ netWmWindowOpacityAtom.DeleteProperty(getWindow());
+ } else {
+ netWmWindowOpacityAtom.setCard32Property(getWindow(), iOpacity);
+ }
+ }
+
+ @Override
+ public void setOpaque(boolean isOpaque) {
+ // no-op
+ }
+
+ @Override
+ public void updateWindow(BufferedImage backBuffer) {
+ // no-op
+ }
}
--- a/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2002-2009 Sun Microsystems, Inc. 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
@@ -156,6 +156,8 @@
static native void XLowerWindow(long display, long window);
static native void XRestackWindows(long display, long windows, int length);
+ static native void XConfigureWindow(long display, long window,
+ long value_mask, long values);
static native void XSetInputFocus(long display, long window);
static native void XSetInputFocus2(long display, long window, long time);
static native long XGetInputFocus(long display);
@@ -490,6 +492,21 @@
static native int XKeysymToKeycode(long display, long keysym);
+ // xkb-related
+ static native int XkbGetEffectiveGroup(long display);
+ static native long XkbKeycodeToKeysym(long display, int keycode, int group, int level);
+ static native void XkbSelectEvents(long display, long device, long bits_to_change, long values_for_bits);
+ static native void XkbSelectEventDetails(long display, long device, long event_type,
+ long bits_to_change, long values_for_bits);
+ static native boolean XkbQueryExtension(long display, long opcode_rtrn, long event_rtrn,
+ long error_rtrn, long major_in_out, long minor_in_out);
+ static native boolean XkbLibraryVersion(long lib_major_in_out, long lib_minor_in_out);
+ static native long XkbGetMap(long display, long which, long device_spec);
+ static native long XkbGetUpdatedMap(long display, long which, long xkb);
+ static native void XkbFreeKeyboard(long xkb, long which, boolean free_all);
+ static native boolean XkbTranslateKeyCode(long xkb, int keycode, long mods, long mods_rtrn, long keysym_rtrn);
+
+
static native void XConvertCase(long keysym,
long keysym_lowercase,
long keysym_uppercase);
@@ -533,6 +550,13 @@
static native void SetRectangularShape(long display, long window,
int lox, int loy, int hix, int hiy,
sun.java2d.pipe.Region region);
+ /** Each int in the bitmap array is one pixel with a 32-bit color:
+ * R, G, B, and Alpha.
+ */
+ static native void SetBitmapShape(long display, long window,
+ int width, int height, int[] bitmap);
+
+ static native void SetZOrder(long display, long window, long above);
/* Global memory area used for X lib parameter passing */
@@ -608,6 +632,15 @@
}
return buf.toString();
}
+ static String getEventToString( int type ) {
+ if( (type >= 0) && (type < eventToString.length)) {
+ return eventToString[type];
+ }else if( type == XToolkit.getXKBBaseEventCode() ) {
+ //XXX TODO various xkb types
+ return "XkbEvent";
+ }
+ return eventToString[0];
+ }
private static boolean getBuildInternal() {
String javaVersion = XToolkit.getSystemProperty("java.version");
--- a/jdk/src/solaris/classes/sun/awt/X11/generator/WrapperGenerator.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/generator/WrapperGenerator.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2003-2009 Sun Microsystems, Inc. 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
@@ -859,14 +859,14 @@
pw.println("\n\tlong pData;");
pw.println("\n\tpublic long getPData() { return pData; }");
- pw.println("\n\n\t" + stp.getJavaClassName() + "(long addr) {");
+ pw.println("\n\n\tpublic " + stp.getJavaClassName() + "(long addr) {");
if (generateLog) {
pw.println("\t\tlog.finest(\"Creating\");");
}
pw.println("\t\tpData=addr;");
pw.println("\t\tshould_free_memory = false;");
pw.println("\t}");
- pw.println("\n\n\t" + stp.getJavaClassName() + "() {");
+ pw.println("\n\n\tpublic " + stp.getJavaClassName() + "() {");
if (generateLog) {
pw.println("\t\tlog.finest(\"Creating\");");
}
@@ -1138,6 +1138,7 @@
pw.println("/* This file is an automatically generated file, please do not edit this file, modify the XlibParser.java file instead !*/\n" );
pw.println("#include <X11/Xlib.h>\n#include <X11/Xutil.h>\n#include <X11/Xos.h>\n#include <X11/Xatom.h>\n#include <stdio.h>\n");
pw.println("#include <X11/extensions/Xdbe.h>");
+ pw.println("#include <X11/XKBlib.h>");
pw.println("#include \"awt_p.h\"");
pw.println("#include \"color.h\"");
pw.println("#include \"colordata.h\"");
--- a/jdk/src/solaris/classes/sun/awt/X11/generator/sizes.64-solaris-i386 Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/generator/sizes.64-solaris-i386 Mon Apr 27 12:33:57 2009 -0700
@@ -16,10 +16,38 @@
XIMStringConversionCallbackStruct.factor 10
XIMStringConversionCallbackStruct.text 16
XIMStringConversionCallbackStruct 24
+XkbNewKeyboardNotifyEvent.type 0
+XkbNewKeyboardNotifyEvent.serial 8
+XkbNewKeyboardNotifyEvent.send_event 16
+XkbNewKeyboardNotifyEvent.display 24
+XkbNewKeyboardNotifyEvent.time 32
+XkbNewKeyboardNotifyEvent.xkb_type 40
+XkbNewKeyboardNotifyEvent.device 44
+XkbNewKeyboardNotifyEvent.old_device 48
+XkbNewKeyboardNotifyEvent.min_key_code 52
+XkbNewKeyboardNotifyEvent.max_key_code 56
+XkbNewKeyboardNotifyEvent.old_min_key_code 60
+XkbNewKeyboardNotifyEvent.old_max_key_code 64
+XkbNewKeyboardNotifyEvent.changed 68
+XkbNewKeyboardNotifyEvent.req_major 72
+XkbNewKeyboardNotifyEvent.req_minor 73
+XkbNewKeyboardNotifyEvent 80
XTimeCoord.time 0
XTimeCoord.x 8
XTimeCoord.y 10
XTimeCoord 16
+XkbCompatMapNotifyEvent.type 0
+XkbCompatMapNotifyEvent.serial 8
+XkbCompatMapNotifyEvent.send_event 16
+XkbCompatMapNotifyEvent.display 24
+XkbCompatMapNotifyEvent.time 32
+XkbCompatMapNotifyEvent.xkb_type 40
+XkbCompatMapNotifyEvent.device 44
+XkbCompatMapNotifyEvent.changed_groups 48
+XkbCompatMapNotifyEvent.first_si 52
+XkbCompatMapNotifyEvent.num_si 56
+XkbCompatMapNotifyEvent.num_total_si 60
+XkbCompatMapNotifyEvent 64
XIMStatusDrawCallbackStruct.type 0
XIMStatusDrawCallbackStruct.data 8
XIMStatusDrawCallbackStruct 16
@@ -289,6 +317,22 @@
XVisualInfo.colormap_size 56
XVisualInfo.bits_per_rgb 60
XVisualInfo 64
+XkbControlsNotifyEvent.type 0
+XkbControlsNotifyEvent.serial 8
+XkbControlsNotifyEvent.send_event 16
+XkbControlsNotifyEvent.display 24
+XkbControlsNotifyEvent.time 32
+XkbControlsNotifyEvent.xkb_type 40
+XkbControlsNotifyEvent.device 44
+XkbControlsNotifyEvent.changed_ctrls 48
+XkbControlsNotifyEvent.enabled_ctrls 52
+XkbControlsNotifyEvent.enabled_ctrl_changes 56
+XkbControlsNotifyEvent.num_groups 60
+XkbControlsNotifyEvent.keycode 64
+XkbControlsNotifyEvent.event_type 65
+XkbControlsNotifyEvent.req_major 66
+XkbControlsNotifyEvent.req_minor 67
+XkbControlsNotifyEvent 72
PropMwmHints.flags 0
PropMwmHints.functions 8
PropMwmHints.decorations 16
@@ -310,8 +354,26 @@
XAnyEvent.display 24
XAnyEvent.window 32
XAnyEvent 40
+XkbIndicatorNotifyEvent.type 0
+XkbIndicatorNotifyEvent.serial 8
+XkbIndicatorNotifyEvent.send_event 16
+XkbIndicatorNotifyEvent.display 24
+XkbIndicatorNotifyEvent.time 32
+XkbIndicatorNotifyEvent.xkb_type 40
+XkbIndicatorNotifyEvent.device 44
+XkbIndicatorNotifyEvent.changed 48
+XkbIndicatorNotifyEvent.state 52
+XkbIndicatorNotifyEvent 56
XIMPreeditStateNotifyCallbackStruct.state 0
XIMPreeditStateNotifyCallbackStruct 8
+XkbAnyEvent.type 0
+XkbAnyEvent.serial 8
+XkbAnyEvent.send_event 16
+XkbAnyEvent.display 24
+XkbAnyEvent.time 32
+XkbAnyEvent.xkb_type 40
+XkbAnyEvent.device 44
+XkbAnyEvent 48
XMotionEvent.type 0
XMotionEvent.serial 8
XMotionEvent.send_event 16
@@ -334,6 +396,23 @@
XIMStyles.count_styles 0
XIMStyles.supported_styles 8
XIMStyles 16
+XkbExtensionDeviceNotifyEvent.type 0
+XkbExtensionDeviceNotifyEvent.serial 8
+XkbExtensionDeviceNotifyEvent.send_event 16
+XkbExtensionDeviceNotifyEvent.display 24
+XkbExtensionDeviceNotifyEvent.time 32
+XkbExtensionDeviceNotifyEvent.xkb_type 40
+XkbExtensionDeviceNotifyEvent.device 44
+XkbExtensionDeviceNotifyEvent.reason 48
+XkbExtensionDeviceNotifyEvent.supported 52
+XkbExtensionDeviceNotifyEvent.unsupported 56
+XkbExtensionDeviceNotifyEvent.first_btn 60
+XkbExtensionDeviceNotifyEvent.num_btns 64
+XkbExtensionDeviceNotifyEvent.leds_defined 68
+XkbExtensionDeviceNotifyEvent.led_state 72
+XkbExtensionDeviceNotifyEvent.led_class 76
+XkbExtensionDeviceNotifyEvent.led_id 80
+XkbExtensionDeviceNotifyEvent 88
XwcTextItem.chars 0
XwcTextItem.nchars 8
XwcTextItem.delta 12
@@ -419,6 +498,20 @@
XKeyEvent.keycode 84
XKeyEvent.same_screen 88
XKeyEvent 96
+XkbActionMessageEvent.type 0
+XkbActionMessageEvent.serial 8
+XkbActionMessageEvent.send_event 16
+XkbActionMessageEvent.display 24
+XkbActionMessageEvent.time 32
+XkbActionMessageEvent.xkb_type 40
+XkbActionMessageEvent.device 44
+XkbActionMessageEvent.keycode 48
+XkbActionMessageEvent.press 52
+XkbActionMessageEvent.key_event_follows 56
+XkbActionMessageEvent.group 60
+XkbActionMessageEvent.mods 64
+XkbActionMessageEvent.message 68
+XkbActionMessageEvent 80
XdbeSwapInfo.swap_window 0
XdbeSwapInfo.swap_action 8
XdbeSwapInfo 16
@@ -458,6 +551,18 @@
XOMOrientation.num_orientation 0
XOMOrientation.orientation 8
XOMOrientation 16
+XkbAccessXNotifyEvent.type 0
+XkbAccessXNotifyEvent.serial 8
+XkbAccessXNotifyEvent.send_event 16
+XkbAccessXNotifyEvent.display 24
+XkbAccessXNotifyEvent.time 32
+XkbAccessXNotifyEvent.xkb_type 40
+XkbAccessXNotifyEvent.device 44
+XkbAccessXNotifyEvent.detail 48
+XkbAccessXNotifyEvent.keycode 52
+XkbAccessXNotifyEvent.sk_delay 56
+XkbAccessXNotifyEvent.debounce_delay 60
+XkbAccessXNotifyEvent 64
XWindowAttributes.x 0
XWindowAttributes.y 4
XWindowAttributes.width 8
@@ -528,6 +633,33 @@
awtImageData.clrdata 16
awtImageData.convert 48
awtImageData 560
+XkbStateNotifyEvent.type 0
+XkbStateNotifyEvent.serial 8
+XkbStateNotifyEvent.send_event 16
+XkbStateNotifyEvent.display 24
+XkbStateNotifyEvent.time 32
+XkbStateNotifyEvent.xkb_type 40
+XkbStateNotifyEvent.device 44
+XkbStateNotifyEvent.changed 48
+XkbStateNotifyEvent.group 52
+XkbStateNotifyEvent.base_group 56
+XkbStateNotifyEvent.latched_group 60
+XkbStateNotifyEvent.locked_group 64
+XkbStateNotifyEvent.mods 68
+XkbStateNotifyEvent.base_mods 72
+XkbStateNotifyEvent.latched_mods 76
+XkbStateNotifyEvent.locked_mods 80
+XkbStateNotifyEvent.compat_state 84
+XkbStateNotifyEvent.grab_mods 88
+XkbStateNotifyEvent.compat_grab_mods 89
+XkbStateNotifyEvent.lookup_mods 90
+XkbStateNotifyEvent.compat_lookup_mods 91
+XkbStateNotifyEvent.ptr_buttons 92
+XkbStateNotifyEvent.keycode 96
+XkbStateNotifyEvent.event_type 97
+XkbStateNotifyEvent.req_major 98
+XkbStateNotifyEvent.req_minor 99
+XkbStateNotifyEvent 104
XExposeEvent.type 0
XExposeEvent.serial 8
XExposeEvent.send_event 16
@@ -539,6 +671,33 @@
XExposeEvent.height 52
XExposeEvent.count 56
XExposeEvent 64
+XkbMapNotifyEvent.type 0
+XkbMapNotifyEvent.serial 8
+XkbMapNotifyEvent.send_event 16
+XkbMapNotifyEvent.display 24
+XkbMapNotifyEvent.time 32
+XkbMapNotifyEvent.xkb_type 40
+XkbMapNotifyEvent.device 44
+XkbMapNotifyEvent.changed 48
+XkbMapNotifyEvent.flags 52
+XkbMapNotifyEvent.first_type 56
+XkbMapNotifyEvent.num_types 60
+XkbMapNotifyEvent.min_key_code 64
+XkbMapNotifyEvent.max_key_code 65
+XkbMapNotifyEvent.first_key_sym 66
+XkbMapNotifyEvent.first_key_act 67
+XkbMapNotifyEvent.first_key_behavior 68
+XkbMapNotifyEvent.first_key_explicit 69
+XkbMapNotifyEvent.first_modmap_key 70
+XkbMapNotifyEvent.first_vmodmap_key 71
+XkbMapNotifyEvent.num_key_syms 72
+XkbMapNotifyEvent.num_key_acts 76
+XkbMapNotifyEvent.num_key_behaviors 80
+XkbMapNotifyEvent.num_key_explicit 84
+XkbMapNotifyEvent.num_modmap_keys 88
+XkbMapNotifyEvent.num_vmodmap_keys 92
+XkbMapNotifyEvent.vmods 96
+XkbMapNotifyEvent 104
XGCValues.function 0
XGCValues.plane_mask 8
XGCValues.foreground 16
@@ -583,6 +742,22 @@
XMapEvent.window 40
XMapEvent.override_redirect 48
XMapEvent 56
+XkbBellNotifyEvent.type 0
+XkbBellNotifyEvent.serial 8
+XkbBellNotifyEvent.send_event 16
+XkbBellNotifyEvent.display 24
+XkbBellNotifyEvent.time 32
+XkbBellNotifyEvent.xkb_type 40
+XkbBellNotifyEvent.device 44
+XkbBellNotifyEvent.percent 48
+XkbBellNotifyEvent.pitch 52
+XkbBellNotifyEvent.duration 56
+XkbBellNotifyEvent.bell_class 60
+XkbBellNotifyEvent.bell_id 64
+XkbBellNotifyEvent.name 72
+XkbBellNotifyEvent.window 80
+XkbBellNotifyEvent.event_only 88
+XkbBellNotifyEvent 96
XIMStringConversionText.length 0
XIMStringConversionText.feedback 8
XIMStringConversionText.encoding_is_wchar 16
@@ -596,6 +771,21 @@
XKeyboardState.global_auto_repeat 24
XKeyboardState.auto_repeats 28
XKeyboardState 64
+XkbEvent.type 0
+XkbEvent.any 0
+XkbEvent.new_kbd 0
+XkbEvent.map 0
+XkbEvent.state 0
+XkbEvent.ctrls 0
+XkbEvent.indicators 0
+XkbEvent.names 0
+XkbEvent.compat 0
+XkbEvent.bell 0
+XkbEvent.message 0
+XkbEvent.accessx 0
+XkbEvent.device 0
+XkbEvent.core 0
+XkbEvent 192
XPoint.x 0
XPoint.y 2
XPoint 4
@@ -633,6 +823,26 @@
XRectangle.width 4
XRectangle.height 6
XRectangle 8
+XkbNamesNotifyEvent.type 0
+XkbNamesNotifyEvent.serial 8
+XkbNamesNotifyEvent.send_event 16
+XkbNamesNotifyEvent.display 24
+XkbNamesNotifyEvent.time 32
+XkbNamesNotifyEvent.xkb_type 40
+XkbNamesNotifyEvent.device 44
+XkbNamesNotifyEvent.changed 48
+XkbNamesNotifyEvent.first_type 52
+XkbNamesNotifyEvent.num_types 56
+XkbNamesNotifyEvent.first_lvl 60
+XkbNamesNotifyEvent.num_lvls 64
+XkbNamesNotifyEvent.num_aliases 68
+XkbNamesNotifyEvent.num_radio_groups 72
+XkbNamesNotifyEvent.changed_vmods 76
+XkbNamesNotifyEvent.changed_groups 80
+XkbNamesNotifyEvent.changed_indicators 84
+XkbNamesNotifyEvent.first_key 88
+XkbNamesNotifyEvent.num_keys 92
+XkbNamesNotifyEvent 96
XCreateWindowEvent.type 0
XCreateWindowEvent.serial 8
XCreateWindowEvent.send_event 16
@@ -774,7 +984,8 @@
AwtGraphicsConfigData.pixelStride 136
AwtGraphicsConfigData.color_data 144
AwtGraphicsConfigData.glxInfo 152
-AwtGraphicsConfigData 160
+AwtGraphicsConfigData.isTranslucencySupported 160
+AwtGraphicsConfigData 168
XColor.pixel 0
XColor.red 8
XColor.green 10
--- a/jdk/src/solaris/classes/sun/awt/X11/generator/xlibtypes.txt Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/generator/xlibtypes.txt Mon Apr 27 12:33:57 2009 -0700
@@ -119,7 +119,7 @@
length short
feedback pointer
encoding_is_wchar Bool
- string pointer
+ string pointer
XKeymapEvent
type int
serial long
@@ -574,7 +574,7 @@
f.get_pixel pointer
f.put_pixel pointer
f.sub_image pointer
- f.add_pixel pointer
+ f.add_pixel pointer
XIMValuesList
count_values short
supported_values pointer
@@ -728,7 +728,7 @@
awt_icmLUT pointer int
awt_icmLUT2Colors pointer byte
img_grays pointer byte
- img_clr_tbl pointer byte
+ img_clr_tbl pointer byte
img_oda_red pointer byte
img_oda_green pointer byte
img_oda_blue pointer byte
@@ -750,6 +750,7 @@
pixelStride int
color_data pointer ColorData
glxInfo pointer
+ isTranslucencySupported int
AwtScreenData
numConfigs int
@@ -797,3 +798,227 @@
xerror struct XErrorEvent
xkeymap struct XKeymapEvent
pad array long 24
+
+XkbAnyEvent
+ type int
+ serial ulong
+ send_event Bool
+ display long
+ time ulong
+ xkb_type int
+ device int
+
+XkbNewKeyboardNotifyEvent
+ type int
+ serial ulong
+ send_event Bool
+ display long
+ time ulong
+ xkb_type int
+ device int
+ old_device int
+ min_key_code int
+ max_key_code int
+ old_min_key_code int
+ old_max_key_code int
+ changed int
+ req_major byte
+ req_minor byte
+
+XkbMapNotifyEvent
+ type int
+ serial ulong
+ send_event Bool
+ display long
+ time ulong
+ xkb_type int
+ device int
+ changed int
+ flags int
+ first_type int
+ num_types int
+ min_key_code int
+ max_key_code int
+ first_key_sym int
+ first_key_act int
+ first_key_behavior int
+ first_key_explicit int
+ first_modmap_key int
+ first_vmodmap_key int
+ num_key_syms int
+ num_key_acts int
+ num_key_behaviors int
+ num_key_explicit int
+ num_modmap_keys int
+ num_vmodmap_keys int
+ vmods int
+
+XkbStateNotifyEvent
+ type int
+ serial ulong
+ send_event Bool
+ display long
+ time ulong
+ xkb_type int
+ device int
+ changed int
+ group int
+ base_group int
+ latched_group int
+ locked_group int
+ mods int
+ base_mods int
+ latched_mods int
+ locked_mods int
+ compat_state int
+ grab_mods byte
+ compat_grab_mods byte
+ lookup_mods byte
+ compat_lookup_mods byte
+ ptr_buttons int
+ keycode int
+ event_type byte
+ req_major byte
+ req_minor byte
+
+XkbControlsNotifyEvent
+ type int
+ serial ulong
+ send_event Bool
+ display long
+ time ulong
+ xkb_type int
+ device int
+ changed_ctrls int
+ enabled_ctrls int
+ enabled_ctrl_changes int
+ num_groups int
+ keycode int
+ event_type byte
+ req_major byte
+ req_minor byte
+
+XkbIndicatorNotifyEvent
+ type int
+ serial ulong
+ send_event Bool
+ display long
+ time ulong
+ xkb_type int
+ device int
+ changed int
+ state int
+
+XkbNamesNotifyEvent
+ type int
+ serial ulong
+ send_event Bool
+ display long
+ time ulong
+ xkb_type int
+ device int
+ changed int
+ first_type int
+ num_types int
+ first_lvl int
+ num_lvls int
+ num_aliases int
+ num_radio_groups int
+ changed_vmods int
+ changed_groups int
+ changed_indicators int
+ first_key int
+ num_keys int
+
+
+XkbCompatMapNotifyEvent
+ type int
+ serial ulong
+ send_event Bool
+ display long
+ time ulong
+ xkb_type int
+ device int
+ changed_groups int
+ first_si int
+ num_si int
+ num_total_si int
+
+XkbBellNotifyEvent
+ type int
+ serial ulong
+ send_event Bool
+ display long
+ time ulong
+ xkb_type int
+ device int
+ percent int
+ pitch int
+ duration int
+ bell_class int
+ bell_id int
+ name Atom
+ window long
+ event_only Bool
+
+XkbActionMessageEvent
+ type int
+ serial ulong
+ send_event Bool
+ display long
+ time ulong
+ xkb_type int
+ device int
+ keycode int
+ press Bool
+ key_event_follows Bool
+ group int
+ mods int
+ message array byte 7 //XkbActionMessageLength+1
+
+XkbAccessXNotifyEvent
+ type int
+ serial ulong
+ send_event Bool
+ display long
+ time ulong
+ xkb_type int
+ device int
+ detail int
+ keycode int
+ sk_delay int
+ debounce_delay int
+
+XkbExtensionDeviceNotifyEvent
+ type int
+ serial ulong
+ send_event Bool
+ display long
+ time ulong
+ xkb_type int
+ device int
+ reason int
+ supported int
+ unsupported int
+ first_btn int
+ num_btns int
+ leds_defined int
+ led_state int
+ led_class int
+ led_id int
+
+XkbEvent
+ type int
+ any struct XkbAnyEvent
+ new_kbd struct XkbNewKeyboardNotifyEvent
+ map struct XkbMapNotifyEvent
+ state struct XkbStateNotifyEvent
+ ctrls struct XkbControlsNotifyEvent
+ indicators struct XkbIndicatorNotifyEvent
+ names struct XkbNamesNotifyEvent
+ compat struct XkbCompatMapNotifyEvent
+ bell struct XkbBellNotifyEvent
+ message struct XkbActionMessageEvent
+ accessx struct XkbAccessXNotifyEvent
+ device struct XkbExtensionDeviceNotifyEvent
+ core struct XEvent
--- a/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2005-2009 Sun Microsystems, Inc. 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,7 +39,7 @@
*/
tojava /*
-tojava * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved.
+tojava * Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved.
tojava * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
tojava *
tojava * This code is free software; you can redistribute it and/or modify it
@@ -127,14 +127,47 @@
tojava Character ch = keysym2UCSHash.get(ks);
tojava return ch == null ? (char)0 : ch.charValue();
tojava }
+tojava static long xkeycode2keysym_noxkb(XKeyEvent ev, int ndx) {
+tojava XToolkit.awtLock();
+tojava try {
+tojava return XlibWrapper.XKeycodeToKeysym(ev.get_display(), ev.get_keycode(), ndx);
+tojava } finally {
+tojava XToolkit.awtUnlock();
+tojava }
+tojava }
+tojava static long xkeycode2keysym_xkb(XKeyEvent ev, int ndx) {
+tojava XToolkit.awtLock();
+tojava try {
+tojava int mods = ev.get_state();
+tojava if ((ndx == 0) && ((mods & XConstants.ShiftMask) != 0)) {
+tojava // I don't know all possible meanings of 'ndx' in case of XKB
+tojava // and don't want to speculate. But this particular case
+tojava // clearly means that caller needs a so called primary keysym.
+tojava mods ^= XConstants.ShiftMask;
+tojava }
+tojava XlibWrapper.XkbTranslateKeyCode(XToolkit.getXKBKbdDesc(), ev.get_keycode(),
+tojava mods, XlibWrapper.iarg1, XlibWrapper.larg3);
+tojava //XXX unconsumed modifiers?
+tojava return Native.getLong(XlibWrapper.larg3);
+tojava } finally {
+tojava XToolkit.awtUnlock();
+tojava }
+tojava }
tojava static long xkeycode2keysym(XKeyEvent ev, int ndx) {
tojava XToolkit.awtLock();
tojava try {
-tojava return XlibWrapper.XKeycodeToKeysym(ev.get_display(), ev.get_keycode(), ndx );
+tojava if (XToolkit.canUseXKBCalls()) {
+tojava return xkeycode2keysym_xkb(ev, ndx);
+tojava }else{
+tojava return xkeycode2keysym_noxkb(ev, ndx);
+tojava }
tojava } finally {
tojava XToolkit.awtUnlock();
tojava }
tojava }
+tojava static long xkeycode2primary_keysym(XKeyEvent ev) {
+tojava return xkeycode2keysym(ev, 0);
+tojava }
tojava public static boolean isKPEvent( XKeyEvent ev )
tojava {
tojava // Xsun without XKB uses keysymarray[2] keysym to determine if it is KP event.
@@ -236,6 +269,27 @@
tojava Keysym2JavaKeycode jkc = getJavaKeycode( ev );
tojava return jkc == null ? java.awt.event.KeyEvent.VK_UNDEFINED : jkc.getJavaKeycode();
tojava }
+tojava /**
+tojava * Return an integer java keycode apprx as it was before extending keycodes range.
+tojava * This call would ignore for instance XKB and process whatever is on the bottom
+tojava * of keysym stack. Result will not depend on actual locale, will differ between
+tojava * dual/multiple keyboard setup systems (e.g. English+Russian vs French+Russian)
+tojava * but will be someway compatible with old releases.
+tojava */
+tojava static int getLegacyJavaKeycodeOnly( XKeyEvent ev ) {
+tojava long keysym = XConstants.NoSymbol;
+tojava int ndx = 0;
+tojava if( (ev.get_state() & XToolkit.numLockMask) != 0 &&
+tojava isKPEvent(ev)) {
+tojava keysym = getKeypadKeysym( ev );
+tojava } else {
+tojava // we only need primary-layer keysym to derive a java keycode.
+tojava ndx = 0;
+tojava keysym = xkeycode2keysym_noxkb(ev, ndx);
+tojava }
+tojava Keysym2JavaKeycode jkc = keysym2JavaKeycodeHash.get( keysym );
+tojava return jkc == null ? java.awt.event.KeyEvent.VK_UNDEFINED : jkc.getJavaKeycode();
+tojava }
tojava static long javaKeycode2Keysym( int jkey ) {
tojava Long ks = javaKeycode2KeysymHash.get( jkey );
tojava return (ks == null ? 0 : ks.longValue());
Binary file jdk/src/solaris/classes/sun/awt/X11/security-icon-bw16.png has changed
Binary file jdk/src/solaris/classes/sun/awt/X11/security-icon-bw24.png has changed
Binary file jdk/src/solaris/classes/sun/awt/X11/security-icon-bw32.png has changed
Binary file jdk/src/solaris/classes/sun/awt/X11/security-icon-bw48.png has changed
Binary file jdk/src/solaris/classes/sun/awt/X11/security-icon-interim16.png has changed
Binary file jdk/src/solaris/classes/sun/awt/X11/security-icon-interim24.png has changed
Binary file jdk/src/solaris/classes/sun/awt/X11/security-icon-interim32.png has changed
Binary file jdk/src/solaris/classes/sun/awt/X11/security-icon-interim48.png has changed
Binary file jdk/src/solaris/classes/sun/awt/X11/security-icon-yellow16.png has changed
Binary file jdk/src/solaris/classes/sun/awt/X11/security-icon-yellow24.png has changed
Binary file jdk/src/solaris/classes/sun/awt/X11/security-icon-yellow32.png has changed
Binary file jdk/src/solaris/classes/sun/awt/X11/security-icon-yellow48.png has changed
--- a/jdk/src/solaris/classes/sun/awt/X11GraphicsConfig.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11GraphicsConfig.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -450,4 +450,13 @@
return 0x00; // UNDEFINED
}
}
+
+ /*
+ @Override
+ */
+ public boolean isTranslucencyCapable() {
+ return isTranslucencyCapable(getAData());
+ }
+
+ private native boolean isTranslucencyCapable(long x11ConfigData);
}
--- a/jdk/src/solaris/classes/sun/awt/motif/MToolkit.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/awt/motif/MToolkit.java Mon Apr 27 12:33:57 2009 -0700
@@ -336,6 +336,10 @@
return null;
}
+ public KeyboardFocusManagerPeer createKeyboardFocusManagerPeer(KeyboardFocusManager manager) {
+ return null;
+ }
+
//public MEmbeddedFramePeer createEmbeddedFrame(MEmbeddedFrame target)
//{
//MEmbeddedFramePeer peer = new MEmbeddedFramePeer(target);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/classes/sun/net/NetHooks.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.net;
+
+import java.net.InetAddress;
+import java.io.FileDescriptor;
+import java.io.IOException;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import sun.security.action.GetPropertyAction;
+
+/**
+ * Defines static methods to be invoked prior to binding or connecting TCP sockets.
+ */
+
+public final class NetHooks {
+
+ /**
+ * A provider with hooks to allow sockets be converted prior to binding or
+ * connecting a TCP socket.
+ *
+ * <p> Concrete implementations of this class should define a zero-argument
+ * constructor and implement the abstract methods specified below.
+ */
+ public static abstract class Provider {
+ /**
+ * Initializes a new instance of this class.
+ */
+ protected Provider() {}
+
+ /**
+ * Invoked prior to binding a TCP socket.
+ */
+ public abstract void implBeforeTcpBind(FileDescriptor fdObj,
+ InetAddress address,
+ int port)
+ throws IOException;
+
+ /**
+ * Invoked prior to connecting an unbound TCP socket.
+ */
+ public abstract void implBeforeTcpConnect(FileDescriptor fdObj,
+ InetAddress address,
+ int port)
+ throws IOException;
+ }
+
+ /**
+ * For now, we load the SDP provider on Solaris. In the future this may
+ * be changed to use the ServiceLoader facility to allow the deployment of
+ * other providers.
+ */
+ private static Provider loadProvider(final String cn) {
+ return AccessController
+ .doPrivileged(new PrivilegedAction<Provider>() {
+ @Override public Provider run() {
+ Class<Provider> c;
+ try {
+ c = (Class<Provider>)Class.forName(cn, true, null);
+ } catch (ClassNotFoundException x) {
+ throw new AssertionError(x);
+ }
+ try {
+ return c.newInstance();
+ } catch (IllegalAccessException x) {
+ throw new AssertionError(x);
+ } catch (InstantiationException x) {
+ throw new AssertionError(x);
+ }
+ }});
+ }
+ private static final Provider provider = AccessController
+ .doPrivileged(new GetPropertyAction("os.name")).equals("SunOS") ?
+ loadProvider("sun.net.spi.SdpProvider") : null;
+
+ /**
+ * Invoke prior to binding a TCP socket.
+ */
+ public static void beforeTcpBind(FileDescriptor fdObj,
+ InetAddress address,
+ int port)
+ throws IOException
+ {
+ if (provider != null)
+ provider.implBeforeTcpBind(fdObj, address, port);
+ }
+
+ /**
+ * Invoke prior to connecting an unbound TCP socket.
+ */
+ public static void beforeTcpConnect(FileDescriptor fdObj,
+ InetAddress address,
+ int port)
+ throws IOException
+ {
+ if (provider != null)
+ provider.implBeforeTcpConnect(fdObj, address, port);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/classes/sun/net/spi/SdpProvider.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,339 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.net.spi;
+
+import sun.net.NetHooks;
+import java.net.InetAddress;
+import java.net.Inet4Address;
+import java.net.UnknownHostException;
+import java.util.*;
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.IOException;
+import java.io.PrintStream;
+
+import sun.misc.SharedSecrets;
+import sun.misc.JavaIOFileDescriptorAccess;
+
+/**
+ * A NetHooks provider that converts sockets from the TCP to SDP protocol prior
+ * to binding or connecting.
+ */
+
+public class SdpProvider extends NetHooks.Provider {
+ private static final JavaIOFileDescriptorAccess fdAccess =
+ SharedSecrets.getJavaIOFileDescriptorAccess();
+
+ // maximum port
+ private static final int MAX_PORT = 65535;
+
+ // indicates if SDP is enabled and the rules for when the protocol is used
+ private final boolean enabled;
+ private final List<Rule> rules;
+
+ // logging for debug purposes
+ private PrintStream log;
+
+ public SdpProvider() {
+ // if this property is not defined then there is nothing to do.
+ String file = System.getProperty("com.sun.sdp.conf");
+ if (file == null) {
+ this.enabled = false;
+ this.rules = null;
+ return;
+ }
+
+ // load configuration file
+ List<Rule> list = null;
+ if (file != null) {
+ try {
+ list = loadRulesFromFile(file);
+ } catch (IOException e) {
+ fail("Error reading %s: %s", file, e.getMessage());
+ }
+ }
+
+ // check if debugging is enabled
+ PrintStream out = null;
+ String logfile = System.getProperty("com.sun.sdp.debug");
+ if (logfile != null) {
+ out = System.out;
+ if (logfile.length() > 0) {
+ try {
+ out = new PrintStream(logfile);
+ } catch (IOException ignore) { }
+ }
+ }
+
+ this.enabled = !list.isEmpty();
+ this.rules = list;
+ this.log = out;
+ }
+
+ // supported actions
+ private static enum Action {
+ BIND,
+ CONNECT;
+ }
+
+ // a rule for matching a bind or connect request
+ private static interface Rule {
+ boolean match(Action action, InetAddress address, int port);
+ }
+
+ // rule to match port[-end]
+ private static class PortRangeRule implements Rule {
+ private final Action action;
+ private final int portStart;
+ private final int portEnd;
+ PortRangeRule(Action action, int portStart, int portEnd) {
+ this.action = action;
+ this.portStart = portStart;
+ this.portEnd = portEnd;
+ }
+ Action action() {
+ return action;
+ }
+ @Override
+ public boolean match(Action action, InetAddress address, int port) {
+ return (action == this.action &&
+ port >= this.portStart &&
+ port <= this.portEnd);
+ }
+ }
+
+ // rule to match address[/prefix] port[-end]
+ private static class AddressPortRangeRule extends PortRangeRule {
+ private final byte[] addressAsBytes;
+ private final int prefixByteCount;
+ private final byte mask;
+ AddressPortRangeRule(Action action, InetAddress address,
+ int prefix, int port, int end)
+ {
+ super(action, port, end);
+ this.addressAsBytes = address.getAddress();
+ this.prefixByteCount = prefix >> 3;
+ this.mask = (byte)(0xff << (8 - (prefix % 8)));
+ }
+ @Override
+ public boolean match(Action action, InetAddress address, int port) {
+ if (action != action())
+ return false;
+ byte[] candidate = address.getAddress();
+ // same address type?
+ if (candidate.length != addressAsBytes.length)
+ return false;
+ // check bytes
+ for (int i=0; i<prefixByteCount; i++) {
+ if (candidate[i] != addressAsBytes[i])
+ return false;
+ }
+ // check remaining bits
+ if ((prefixByteCount < addressAsBytes.length) &&
+ ((candidate[prefixByteCount] & mask) !=
+ (addressAsBytes[prefixByteCount] & mask)))
+ return false;
+ return super.match(action, address, port);
+ }
+ }
+
+ // parses port:[-end]
+ private static int[] parsePortRange(String s) {
+ int pos = s.indexOf('-');
+ try {
+ int[] result = new int[2];
+ if (pos < 0) {
+ boolean all = s.equals("*");
+ result[0] = all ? 0 : Integer.parseInt(s);
+ result[1] = all ? MAX_PORT : result[0];
+ } else {
+ String low = s.substring(0, pos);
+ if (low.length() == 0) low = "*";
+ String high = s.substring(pos+1);
+ if (high.length() == 0) high = "*";
+ result[0] = low.equals("*") ? 0 : Integer.parseInt(low);
+ result[1] = high.equals("*") ? MAX_PORT : Integer.parseInt(high);
+ }
+ return result;
+ } catch (NumberFormatException e) {
+ return new int[0];
+ }
+ }
+
+ private static void fail(String msg, Object... args) {
+ Formatter f = new Formatter();
+ f.format(msg, args);
+ throw new RuntimeException(f.out().toString());
+ }
+
+ // loads rules from the given file
+ // Each non-blank/non-comment line must have the format:
+ // ("bind" | "connect") 1*LWSP-char (hostname | ipaddress["/" prefix])
+ // 1*LWSP-char ("*" | port) [ "-" ("*" | port) ]
+ private static List<Rule> loadRulesFromFile(String file)
+ throws IOException
+ {
+ Scanner scanner = new Scanner(new File(file));
+ try {
+ List<Rule> result = new ArrayList<Rule>();
+ while (scanner.hasNextLine()) {
+ String line = scanner.nextLine().trim();
+
+ // skip blank lines and comments
+ if (line.length() == 0 || line.charAt(0) == '#')
+ continue;
+
+ // must have 3 fields
+ String[] s = line.split("\\s+");
+ if (s.length != 3) {
+ fail("Malformed line '%s'", line);
+ continue;
+ }
+
+ // first field is the action ("bind" or "connect")
+ Action action = null;
+ for (Action a: Action.values()) {
+ if (s[0].equalsIgnoreCase(a.name())) {
+ action = a;
+ break;
+ }
+ }
+ if (action == null) {
+ fail("Action '%s' not recognized", s[0]);
+ continue;
+ }
+
+ // * port[-end]
+ int[] ports = parsePortRange(s[2]);
+ if (ports.length == 0) {
+ fail("Malformed port range '%s'", s[2]);
+ continue;
+ }
+
+ // match all addresses
+ if (s[1].equals("*")) {
+ result.add(new PortRangeRule(action, ports[0], ports[1]));
+ continue;
+ }
+
+ // hostname | ipaddress[/prefix]
+ int pos = s[1].indexOf('/');
+ try {
+ if (pos < 0) {
+ // hostname or ipaddress (no prefix)
+ InetAddress[] addresses = InetAddress.getAllByName(s[1]);
+ for (InetAddress address: addresses) {
+ int prefix =
+ (address instanceof Inet4Address) ? 32 : 128;
+ result.add(new AddressPortRangeRule(action, address,
+ prefix, ports[0], ports[1]));
+ }
+ } else {
+ // ipaddress/prefix
+ InetAddress address = InetAddress
+ .getByName(s[1].substring(0, pos));
+ int prefix = -1;
+ try {
+ prefix = Integer.parseInt(s[1].substring(pos+1));
+ if (address instanceof Inet4Address) {
+ // must be 1-31
+ if (prefix < 0 || prefix > 32) prefix = -1;
+ } else {
+ // must be 1-128
+ if (prefix < 0 || prefix > 128) prefix = -1;
+ }
+ } catch (NumberFormatException e) {
+ }
+
+ if (prefix > 0) {
+ result.add(new AddressPortRangeRule(action,
+ address, prefix, ports[0], ports[1]));
+ } else {
+ fail("Malformed prefix '%s'", s[1]);
+ continue;
+ }
+ }
+ } catch (UnknownHostException uhe) {
+ fail("Unknown host or malformed IP address '%s'", s[1]);
+ continue;
+ }
+ }
+ return result;
+ } finally {
+ scanner.close();
+ }
+ }
+
+ // converts unbound TCP socket to a SDP socket if it matches the rules
+ private void convertTcpToSdpIfMatch(FileDescriptor fdObj,
+ Action action,
+ InetAddress address,
+ int port)
+ throws IOException
+ {
+ boolean matched = false;
+ for (Rule rule: rules) {
+ if (rule.match(action, address, port)) {
+ int fd = fdAccess.get(fdObj);
+ convert(fd);
+ matched = true;
+ break;
+ }
+ }
+ if (log != null) {
+ String addr = (address instanceof Inet4Address) ?
+ address.getHostAddress() : "[" + address.getHostAddress() + "]";
+ if (matched) {
+ log.format("%s to %s:%d (socket converted to SDP protocol)\n", action, addr, port);
+ } else {
+ log.format("%s to %s:%d (no match)\n", action, addr, port);
+ }
+ }
+ }
+
+ @Override
+ public void implBeforeTcpBind(FileDescriptor fdObj,
+ InetAddress address,
+ int port)
+ throws IOException
+ {
+ if (enabled)
+ convertTcpToSdpIfMatch(fdObj, Action.BIND, address, port);
+ }
+
+ @Override
+ public void implBeforeTcpConnect(FileDescriptor fdObj,
+ InetAddress address,
+ int port)
+ throws IOException
+ {
+ if (enabled)
+ convertTcpToSdpIfMatch(fdObj, Action.CONNECT, address, port);
+ }
+
+ // -- native methods --
+ private static native void convert(int fd) throws IOException;
+}
--- a/jdk/src/solaris/classes/sun/nio/ch/DevPollArrayWrapper.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/nio/ch/DevPollArrayWrapper.java Mon Apr 27 12:33:57 2009 -0700
@@ -76,20 +76,19 @@
// Base address of the native pollArray
private long pollArrayAddress;
+ // Array of pollfd structs used for driver updates
+ private AllocatedNativeObject updatePollArray;
+
// Maximum number of POLL_FD structs to update at once
- private int MAX_UPDATE_SIZE = 10000;
+ private int MAX_UPDATE_SIZE = Math.min(OPEN_MAX, 10000);
DevPollArrayWrapper() {
int allocationSize = NUM_POLLFDS * SIZE_POLLFD;
pollArray = new AllocatedNativeObject(allocationSize, true);
pollArrayAddress = pollArray.address();
+ allocationSize = MAX_UPDATE_SIZE * SIZE_POLLFD;
+ updatePollArray = new AllocatedNativeObject(allocationSize, true);
wfd = init();
-
- for (int i=0; i<NUM_POLLFDS; i++) {
- putDescriptor(i, 0);
- putEventOps(i, 0);
- putReventOps(i, 0);
- }
}
// Machinery for remembering fd registration changes
@@ -129,21 +128,11 @@
register(wfd, fd0, POLLIN);
}
- void putEventOps(int i, int event) {
- int offset = SIZE_POLLFD * i + EVENT_OFFSET;
- pollArray.putShort(offset, (short)event);
- }
-
void putReventOps(int i, int revent) {
int offset = SIZE_POLLFD * i + REVENT_OFFSET;
pollArray.putShort(offset, (short)revent);
}
- void putDescriptor(int i, int fd) {
- int offset = SIZE_POLLFD * i + FD_OFFSET;
- pollArray.putInt(offset, fd);
- }
-
int getEventOps(int i) {
int offset = SIZE_POLLFD * i + EVENT_OFFSET;
return pollArray.getShort(offset);
@@ -174,9 +163,10 @@
void closeDevPollFD() throws IOException {
FileDispatcherImpl.closeIntFD(wfd);
pollArray.free();
+ updatePollArray.free();
}
- int poll(long timeout) {
+ int poll(long timeout) throws IOException {
updateRegistrations();
updated = poll0(pollArrayAddress, NUM_POLLFDS, timeout, wfd);
for (int i=0; i<updated; i++) {
@@ -189,60 +179,34 @@
return updated;
}
- void updateRegistrations() {
- // take snapshot of the updateList size to see if there are
- // any registrations to update
- int updateSize;
+ void updateRegistrations() throws IOException {
+ // Populate pollfd array with updated masks
synchronized (updateList) {
- updateSize = updateList.size();
- }
- if (updateSize > 0) {
- // Construct a pollfd array with updated masks; we may overallocate
- // by some amount because if the events are already POLLREMOVE
- // then the second pollfd of that pair will not be needed. The
- // number of entries is limited to a reasonable number to avoid
- // allocating a lot of memory.
- int maxUpdates = Math.min(updateSize * 2, MAX_UPDATE_SIZE);
- int allocationSize = maxUpdates * SIZE_POLLFD;
- AllocatedNativeObject updatePollArray =
- new AllocatedNativeObject(allocationSize, true);
+ while (updateList.size() > 0) {
+ // We have to insert a dummy node in between each
+ // real update to use POLLREMOVE on the fd first because
+ // otherwise the changes are simply OR'd together
+ int index = 0;
+ Updator u = null;
+ while ((u = updateList.poll()) != null) {
+ // First add pollfd struct to clear out this fd
+ putPollFD(updatePollArray, index, u.fd, POLLREMOVE);
+ index++;
+ // Now add pollfd to update this fd, if necessary
+ if (u.mask != POLLREMOVE) {
+ putPollFD(updatePollArray, index, u.fd, (short)u.mask);
+ index++;
+ }
- try {
- synchronized (updateList) {
- while (updateList.size() > 0) {
- // We have to insert a dummy node in between each
- // real update to use POLLREMOVE on the fd first because
- // otherwise the changes are simply OR'd together
- int index = 0;
- Updator u = null;
- while ((u = updateList.poll()) != null) {
- // First add pollfd struct to clear out this fd
- putPollFD(updatePollArray, index, u.fd, POLLREMOVE);
- index++;
- // Now add pollfd to update this fd, if necessary
- if (u.mask != POLLREMOVE) {
- putPollFD(updatePollArray, index, u.fd,
- (short)u.mask);
- index++;
- }
-
- // Check against the max allocation size; these are
- // all we will process. Valid index ranges from 0 to
- // (maxUpdates - 1) and we can use up to 2 per loop
- if (index > maxUpdates - 2)
- break;
- }
- // Register the changes with /dev/poll
- registerMultiple(wfd, updatePollArray.address(), index);
- }
+ // Check against the max update size; these are
+ // all we will process. Valid index ranges from 0 to
+ // (MAX_UPDATE_SIZE - 1) and we can use up to 2 per loop
+ if (index > MAX_UPDATE_SIZE - 2)
+ break;
}
- } finally {
- // Free the native array
- updatePollArray.free();
- // BUG: If an exception was thrown then the selector now believes
- // that the last set of changes was updated but it probably
- // was not. This should not be a likely occurrence.
- }
+ // Register the changes with /dev/poll
+ registerMultiple(wfd, updatePollArray.address(), index);
+ }
}
}
@@ -275,7 +239,8 @@
private native int init();
private native void register(int wfd, int fd, int mask);
- private native void registerMultiple(int wfd, long address, int len);
+ private native void registerMultiple(int wfd, long address, int len)
+ throws IOException;
private native int poll0(long pollAddress, int numfds, long timeout,
int wfd);
private static native void interrupt(int fd);
--- a/jdk/src/solaris/classes/sun/nio/ch/EPollArrayWrapper.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/nio/ch/EPollArrayWrapper.java Mon Apr 27 12:33:57 2009 -0700
@@ -78,8 +78,8 @@
// Base address of the native pollArray
private final long pollArrayAddress;
- // Set of "idle" file descriptors
- private final HashSet<Integer> idleSet;
+ // Set of "idle" channels
+ private final HashSet<SelChImpl> idleSet;
EPollArrayWrapper() {
// creates the epoll file descriptor
@@ -96,19 +96,22 @@
}
// create idle set
- idleSet = new HashSet<Integer>();
+ idleSet = new HashSet<SelChImpl>();
}
// Used to update file description registrations
private static class Updator {
+ SelChImpl channel;
int opcode;
- int fd;
int events;
- Updator(int opcode, int fd, int events) {
+ Updator(SelChImpl channel, int opcode, int events) {
+ this.channel = channel;
this.opcode = opcode;
- this.fd = fd;
this.events = events;
}
+ Updator(SelChImpl channel, int opcode) {
+ this(channel, opcode, 0);
+ }
}
private LinkedList<Updator> updateList = new LinkedList<Updator>();
@@ -163,60 +166,54 @@
}
/**
- * Update the events for a given file descriptor.
+ * Update the events for a given channel.
*/
- void setInterest(int fd, int mask) {
+ void setInterest(SelChImpl channel, int mask) {
synchronized (updateList) {
-
- // if the interest events are 0 then add to idle set, and delete
- // from epoll if registered (or pending)
- if (mask == 0) {
- if (idleSet.add(fd)) {
- updateList.add(new Updator(EPOLL_CTL_DEL, fd, 0));
- }
- return;
- }
-
- // if file descriptor is idle then add to epoll
- if (!idleSet.isEmpty() && idleSet.remove(fd)) {
- updateList.add(new Updator(EPOLL_CTL_ADD, fd, mask));
- return;
- }
-
// if the previous pending operation is to add this file descriptor
// to epoll then update its event set
if (updateList.size() > 0) {
Updator last = updateList.getLast();
- if (last.fd == fd && last.opcode == EPOLL_CTL_ADD) {
+ if (last.channel == channel && last.opcode == EPOLL_CTL_ADD) {
last.events = mask;
return;
}
}
// update existing registration
- updateList.add(new Updator(EPOLL_CTL_MOD, fd, mask));
+ updateList.add(new Updator(channel, EPOLL_CTL_MOD, mask));
+ }
+ }
+
+ /**
+ * Add a channel's file descriptor to epoll
+ */
+ void add(SelChImpl channel) {
+ synchronized (updateList) {
+ updateList.add(new Updator(channel, EPOLL_CTL_ADD));
}
}
/**
- * Add a new file descriptor to epoll
+ * Remove a channel's file descriptor from epoll
*/
- void add(int fd) {
+ void release(SelChImpl channel) {
synchronized (updateList) {
- updateList.add(new Updator(EPOLL_CTL_ADD, fd, 0));
- }
- }
+ // flush any pending updates
+ int i = 0;
+ while (i < updateList.size()) {
+ if (updateList.get(i).channel == channel) {
+ updateList.remove(i);
+ } else {
+ i++;
+ }
+ }
- /**
- * Remove a file descriptor from epoll
- */
- void release(int fd) {
- synchronized (updateList) {
- // if file descriptor is idle then remove from idle set, otherwise
- // delete from epoll
- if (!idleSet.remove(fd)) {
- updateList.add(new Updator(EPOLL_CTL_DEL, fd, 0));
- }
+ // remove from the idle set (if present)
+ idleSet.remove(channel);
+
+ // remove from epoll (if registered)
+ epollCtl(epfd, EPOLL_CTL_DEL, channel.getFDVal(), 0);
}
}
@@ -248,7 +245,26 @@
synchronized (updateList) {
Updator u = null;
while ((u = updateList.poll()) != null) {
- epollCtl(epfd, u.opcode, u.fd, u.events);
+ SelChImpl ch = u.channel;
+ if (!ch.isOpen())
+ continue;
+
+ // if the events are 0 then file descriptor is put into "idle
+ // set" to prevent it being polled
+ if (u.events == 0) {
+ boolean added = idleSet.add(u.channel);
+ // if added to idle set then remove from epoll if registered
+ if (added && (u.opcode == EPOLL_CTL_MOD))
+ epollCtl(epfd, EPOLL_CTL_DEL, ch.getFDVal(), 0);
+ } else {
+ // events are specified. If file descriptor was in idle set
+ // it must be re-registered (by converting opcode to ADD)
+ boolean idle = false;
+ if (!idleSet.isEmpty())
+ idle = idleSet.remove(u.channel);
+ int opcode = (idle) ? EPOLL_CTL_ADD : u.opcode;
+ epollCtl(epfd, opcode, ch.getFDVal(), u.events);
+ }
}
}
}
--- a/jdk/src/solaris/classes/sun/nio/ch/EPollSelectorImpl.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/nio/ch/EPollSelectorImpl.java Mon Apr 27 12:33:57 2009 -0700
@@ -139,7 +139,6 @@
FileDispatcherImpl.closeIntFD(fd0);
FileDispatcherImpl.closeIntFD(fd1);
- pollWrapper.release(fd0);
pollWrapper.closeEPollFD();
// it is possible
selectedKeys = null;
@@ -162,17 +161,18 @@
protected void implRegister(SelectionKeyImpl ski) {
if (closed)
throw new ClosedSelectorException();
- int fd = IOUtil.fdVal(ski.channel.getFD());
- fdToKey.put(Integer.valueOf(fd), ski);
- pollWrapper.add(fd);
+ SelChImpl ch = ski.channel;
+ fdToKey.put(Integer.valueOf(ch.getFDVal()), ski);
+ pollWrapper.add(ch);
keys.add(ski);
}
protected void implDereg(SelectionKeyImpl ski) throws IOException {
assert (ski.getIndex() >= 0);
- int fd = ski.channel.getFDVal();
+ SelChImpl ch = ski.channel;
+ int fd = ch.getFDVal();
fdToKey.remove(Integer.valueOf(fd));
- pollWrapper.release(fd);
+ pollWrapper.release(ch);
ski.setIndex(-1);
keys.remove(ski);
selectedKeys.remove(ski);
@@ -185,8 +185,7 @@
void putEventOps(SelectionKeyImpl sk, int ops) {
if (closed)
throw new ClosedSelectorException();
- int fd = IOUtil.fdVal(sk.channel.getFD());
- pollWrapper.setInterest(fd, ops);
+ pollWrapper.setInterest(sk.channel, ops);
}
public Selector wakeup() {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/classes/sun/nio/ch/SctpAssocChange.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package sun.nio.ch;
+
+import com.sun.nio.sctp.Association;
+import com.sun.nio.sctp.AssociationChangeNotification;
+
+/**
+ * An implementation of AssociationChangeNotification
+ */
+public class SctpAssocChange extends AssociationChangeNotification
+ implements SctpNotification
+{
+ /* static final ints so that they can be referenced from native */
+ private final static int SCTP_COMM_UP = 1;
+ private final static int SCTP_COMM_LOST = 2;
+ private final static int SCTP_RESTART = 3;
+ private final static int SCTP_SHUTDOWN = 4;
+ private final static int SCTP_CANT_START = 5;
+
+ private Association association;
+
+ /* assocId is used to lookup the association before the notification is
+ * returned to user code */
+ private int assocId;
+ private AssocChangeEvent event;
+ private int maxOutStreams;
+ private int maxInStreams;
+
+ /* Invoked from native */
+ private SctpAssocChange(int assocId,
+ int intEvent,
+ int maxOutStreams,
+ int maxInStreams) {
+ switch (intEvent) {
+ case SCTP_COMM_UP :
+ this.event = AssocChangeEvent.COMM_UP;
+ break;
+ case SCTP_COMM_LOST :
+ this.event = AssocChangeEvent.COMM_LOST;
+ break;
+ case SCTP_RESTART :
+ this.event = AssocChangeEvent.RESTART;
+ break;
+ case SCTP_SHUTDOWN :
+ this.event = AssocChangeEvent.SHUTDOWN;
+ break;
+ case SCTP_CANT_START :
+ this.event = AssocChangeEvent.CANT_START;
+ break;
+ default :
+ throw new AssertionError(
+ "Unknown Association Change Event type: " + intEvent);
+ }
+
+ this.assocId = assocId;
+ this.maxOutStreams = maxOutStreams;
+ this.maxInStreams = maxInStreams;
+ }
+
+ @Override
+ public int assocId() {
+ return assocId;
+ }
+
+ @Override
+ public void setAssociation(Association association) {
+ this.association = association;
+ }
+
+ @Override
+ public Association association() {
+ assert association != null;
+ return association;
+ }
+
+ @Override
+ public AssocChangeEvent event() {
+ return event;
+ }
+
+ int maxOutStreams() {
+ return maxOutStreams;
+ }
+
+ int maxInStreams() {
+ return maxInStreams;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append(super.toString()).append(" [");
+ sb.append("Association:").append(association);
+ sb.append(", Event: ").append(event).append("]");
+ return sb.toString();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/classes/sun/nio/ch/SctpAssociationImpl.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package sun.nio.ch;
+
+import com.sun.nio.sctp.Association;
+
+/**
+ * An implementation of Association
+ */
+public class SctpAssociationImpl extends Association {
+ public SctpAssociationImpl(int associationID,
+ int maxInStreams,
+ int maxOutStreams) {
+ super(associationID, maxInStreams, maxOutStreams);
+ }
+
+ @Override
+ public String toString() {
+ StringBuffer sb = new StringBuffer(super.toString());
+ return sb.append("[associationID:")
+ .append(associationID())
+ .append(", maxIn:")
+ .append(maxInboundStreams())
+ .append(", maxOut:")
+ .append(maxOutboundStreams())
+ .append("]")
+ .toString();
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/classes/sun/nio/ch/SctpChannelImpl.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,1073 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package sun.nio.ch;
+
+import java.net.InetAddress;
+import java.net.SocketAddress;
+import java.net.InetSocketAddress;
+import java.io.FileDescriptor;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Set;
+import java.util.HashSet;
+import java.nio.ByteBuffer;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.ClosedChannelException;
+import java.nio.channels.ConnectionPendingException;
+import java.nio.channels.NoConnectionPendingException;
+import java.nio.channels.AlreadyBoundException;
+import java.nio.channels.AlreadyConnectedException;
+import java.nio.channels.NotYetBoundException;
+import java.nio.channels.NotYetConnectedException;
+import java.nio.channels.spi.SelectorProvider;
+import com.sun.nio.sctp.AbstractNotificationHandler;
+import com.sun.nio.sctp.Association;
+import com.sun.nio.sctp.AssociationChangeNotification;
+import com.sun.nio.sctp.HandlerResult;
+import com.sun.nio.sctp.IllegalReceiveException;
+import com.sun.nio.sctp.InvalidStreamException;
+import com.sun.nio.sctp.IllegalUnbindException;
+import com.sun.nio.sctp.MessageInfo;
+import com.sun.nio.sctp.NotificationHandler;
+import com.sun.nio.sctp.SctpChannel;
+import com.sun.nio.sctp.SctpSocketOption;
+import sun.nio.ch.NativeDispatcher;
+import sun.nio.ch.PollArrayWrapper;
+import sun.nio.ch.SelChImpl;
+import static com.sun.nio.sctp.SctpStandardSocketOption.*;
+import static sun.nio.ch.SctpResultContainer.SEND_FAILED;
+import static sun.nio.ch.SctpResultContainer.ASSOCIATION_CHANGED;
+import static sun.nio.ch.SctpResultContainer.PEER_ADDRESS_CHANGED;
+import static sun.nio.ch.SctpResultContainer.SHUTDOWN;
+
+/**
+ * An implementation of an SctpChannel
+ */
+public class SctpChannelImpl extends SctpChannel
+ implements SelChImpl
+{
+ /* Used to make native close and preClose calls */
+ private static NativeDispatcher nd;
+
+ private final FileDescriptor fd;
+
+ private final int fdVal;
+
+ /* IDs of native threads doing send and receivess, for signalling */
+ private volatile long receiverThread = 0;
+ private volatile long senderThread = 0;
+
+ /* Lock held by current receiving or connecting thread */
+ private final Object receiveLock = new Object();
+
+ /* Lock held by current sending or connecting thread */
+ private final Object sendLock = new Object();
+
+ private final ThreadLocal<Boolean> receiveInvoked =
+ new ThreadLocal<Boolean>() {
+ @Override protected Boolean initialValue() {
+ return Boolean.FALSE;
+ }
+ };
+
+ /* Lock held by any thread that modifies the state fields declared below
+ DO NOT invoke a blocking I/O operation while holding this lock! */
+ private final Object stateLock = new Object();
+
+ private enum ChannelState {
+ UNINITIALIZED,
+ UNCONNECTED,
+ PENDING,
+ CONNECTED,
+ KILLPENDING,
+ KILLED,
+ }
+ /* -- The following fields are protected by stateLock -- */
+ private ChannelState state = ChannelState.UNINITIALIZED;
+
+ /* Binding; Once bound the port will remain constant. */
+ int port = -1;
+ private HashSet<InetSocketAddress> localAddresses = new HashSet<InetSocketAddress>();
+ /* Has the channel been bound to the wildcard address */
+ private boolean wildcard; /* false */
+ //private InetSocketAddress remoteAddress = null;
+
+ /* Input/Output open */
+ private boolean readyToConnect;
+
+ /* Shutdown */
+ private boolean isShutdown;
+
+ private Association association;
+
+ /* -- End of fields protected by stateLock -- */
+
+ private SctpResultContainer commUpResultContainer; /* null */
+
+ /**
+ * Constructor for normal connecting sockets
+ */
+ public SctpChannelImpl(SelectorProvider provider) throws IOException {
+ //TODO: update provider remove public modifier
+ super(provider);
+ this.fd = SctpNet.socket(true);
+ this.fdVal = IOUtil.fdVal(fd);
+ this.state = ChannelState.UNCONNECTED;
+ }
+
+ /**
+ * Constructor for sockets obtained from server sockets
+ */
+ public SctpChannelImpl(SelectorProvider provider, FileDescriptor fd)
+ throws IOException {
+ super(provider);
+ this.fd = fd;
+ this.fdVal = IOUtil.fdVal(fd);
+ this.state = ChannelState.CONNECTED;
+ port = (Net.localAddress(fd)).getPort();
+
+ /* Receive COMM_UP */
+ ByteBuffer buf = Util.getTemporaryDirectBuffer(50);
+ try {
+ receive(buf, null, null, true);
+ } finally {
+ Util.releaseTemporaryDirectBuffer(buf);
+ }
+ }
+
+ /**
+ * Binds the channel's socket to a local address.
+ */
+ @Override
+ public SctpChannel bind(SocketAddress local) throws IOException {
+ synchronized (receiveLock) {
+ synchronized (sendLock) {
+ synchronized (stateLock) {
+ ensureOpenAndUnconnected();
+ if (isBound())
+ throw new AlreadyBoundException();
+ InetSocketAddress isa = (local == null) ?
+ new InetSocketAddress(0) : Net.checkAddress(local);
+ Net.bind(fd, isa.getAddress(), isa.getPort());
+ InetSocketAddress boundIsa = Net.localAddress(fd);
+ port = boundIsa.getPort();
+ localAddresses.add(isa);
+ if (isa.getAddress().isAnyLocalAddress())
+ wildcard = true;
+ }
+ }
+ }
+ return this;
+ }
+
+ @Override
+ public SctpChannel bindAddress(InetAddress address)
+ throws IOException {
+ bindUnbindAddress(address, true);
+ localAddresses.add(new InetSocketAddress(address, port));
+ return this;
+ }
+
+ @Override
+ public SctpChannel unbindAddress(InetAddress address)
+ throws IOException {
+ bindUnbindAddress(address, false);
+ localAddresses.remove(new InetSocketAddress(address, port));
+ return this;
+ }
+
+ private SctpChannel bindUnbindAddress(InetAddress address, boolean add)
+ throws IOException {
+ if (address == null)
+ throw new IllegalArgumentException();
+
+ synchronized (receiveLock) {
+ synchronized (sendLock) {
+ synchronized (stateLock) {
+ if (!isOpen())
+ throw new ClosedChannelException();
+ if (!isBound())
+ throw new NotYetBoundException();
+ if (wildcard)
+ throw new IllegalStateException(
+ "Cannot add or remove addresses from a channel that is bound to the wildcard address");
+ if (address.isAnyLocalAddress())
+ throw new IllegalArgumentException(
+ "Cannot add or remove the wildcard address");
+ if (add) {
+ for (InetSocketAddress addr : localAddresses) {
+ if (addr.getAddress().equals(address)) {
+ throw new AlreadyBoundException();
+ }
+ }
+ } else { /*removing */
+ /* Verify that there is more than one address
+ * and that address is already bound */
+ if (localAddresses.size() <= 1)
+ throw new IllegalUnbindException("Cannot remove address from a channel with only one address bound");
+ boolean foundAddress = false;
+ for (InetSocketAddress addr : localAddresses) {
+ if (addr.getAddress().equals(address)) {
+ foundAddress = true;
+ break;
+ }
+ }
+ if (!foundAddress )
+ throw new IllegalUnbindException("Cannot remove address from a channel that is not bound to that address");
+ }
+
+ SctpNet.bindx(fdVal, new InetAddress[]{address}, port, add);
+
+ /* Update our internal Set to reflect the addition/removal */
+ if (add)
+ localAddresses.add(new InetSocketAddress(address, port));
+ else {
+ for (InetSocketAddress addr : localAddresses) {
+ if (addr.getAddress().equals(address)) {
+ localAddresses.remove(addr);
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ return this;
+ }
+
+ private boolean isBound() {
+ synchronized (stateLock) {
+ return port == -1 ? false : true;
+ }
+ }
+
+ private boolean isConnected() {
+ synchronized (stateLock) {
+ return (state == ChannelState.CONNECTED);
+ }
+ }
+
+ private void ensureOpenAndUnconnected() throws IOException {
+ synchronized (stateLock) {
+ if (!isOpen())
+ throw new ClosedChannelException();
+ if (isConnected())
+ throw new AlreadyConnectedException();
+ if (state == ChannelState.PENDING)
+ throw new ConnectionPendingException();
+ }
+ }
+
+ private boolean ensureReceiveOpen() throws ClosedChannelException {
+ synchronized (stateLock) {
+ if (!isOpen())
+ throw new ClosedChannelException();
+ if (!isConnected())
+ throw new NotYetConnectedException();
+ else
+ return true;
+ }
+ }
+
+ private void ensureSendOpen() throws ClosedChannelException {
+ synchronized (stateLock) {
+ if (!isOpen())
+ throw new ClosedChannelException();
+ if (isShutdown)
+ throw new ClosedChannelException();
+ if (!isConnected())
+ throw new NotYetConnectedException();
+ }
+ }
+
+ private void receiverCleanup() throws IOException {
+ synchronized (stateLock) {
+ receiverThread = 0;
+ if (state == ChannelState.KILLPENDING)
+ kill();
+ }
+ }
+
+ private void senderCleanup() throws IOException {
+ synchronized (stateLock) {
+ senderThread = 0;
+ if (state == ChannelState.KILLPENDING)
+ kill();
+ }
+ }
+
+ @Override
+ public Association association() throws ClosedChannelException {
+ synchronized (stateLock) {
+ if (!isOpen())
+ throw new ClosedChannelException();
+ if (!isConnected())
+ return null;
+
+ return association;
+ }
+ }
+
+ @Override
+ public boolean connect(SocketAddress endpoint) throws IOException {
+ synchronized (receiveLock) {
+ synchronized (sendLock) {
+ ensureOpenAndUnconnected();
+ InetSocketAddress isa = Net.checkAddress(endpoint);
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null)
+ sm.checkConnect(isa.getAddress().getHostAddress(),
+ isa.getPort());
+ synchronized (blockingLock()) {
+ int n = 0;
+ try {
+ try {
+ begin();
+ synchronized (stateLock) {
+ if (!isOpen()) {
+ return false;
+ }
+ receiverThread = NativeThread.current();
+ }
+ for (;;) {
+ InetAddress ia = isa.getAddress();
+ if (ia.isAnyLocalAddress())
+ ia = InetAddress.getLocalHost();
+ n = Net.connect(fd, ia, isa.getPort());
+ if ( (n == IOStatus.INTERRUPTED)
+ && isOpen())
+ continue;
+ break;
+ }
+ } finally {
+ receiverCleanup();
+ end((n > 0) || (n == IOStatus.UNAVAILABLE));
+ assert IOStatus.check(n);
+ }
+ } catch (IOException x) {
+ /* If an exception was thrown, close the channel after
+ * invoking end() so as to avoid bogus
+ * AsynchronousCloseExceptions */
+ close();
+ throw x;
+ }
+
+ if (n > 0) {
+ synchronized (stateLock) {
+ /* Connection succeeded */
+ state = ChannelState.CONNECTED;
+ if (!isBound()) {
+ InetSocketAddress boundIsa =
+ Net.localAddress(fd);
+ port = boundIsa.getPort();
+ }
+
+ /* Receive COMM_UP */
+ ByteBuffer buf = Util.getTemporaryDirectBuffer(50);
+ try {
+ receive(buf, null, null, true);
+ } finally {
+ Util.releaseTemporaryDirectBuffer(buf);
+ }
+ return true;
+ }
+ } else {
+ synchronized (stateLock) {
+ /* If nonblocking and no exception then connection
+ * pending; disallow another invocation */
+ if (!isBlocking())
+ state = ChannelState.PENDING;
+ else
+ assert false;
+ }
+ }
+ }
+ return false;
+ }
+ }
+ }
+
+ @Override
+ public boolean connect(SocketAddress endpoint,
+ int maxOutStreams,
+ int maxInStreams)
+ throws IOException {
+ return setOption(SCTP_INIT_MAXSTREAMS, InitMaxStreams.
+ create(maxInStreams, maxOutStreams)).connect(endpoint);
+
+ }
+
+ @Override
+ public boolean isConnectionPending() {
+ synchronized (stateLock) {
+ return (state == ChannelState.PENDING);
+ }
+ }
+
+ @Override
+ public boolean finishConnect() throws IOException {
+ synchronized (receiveLock) {
+ synchronized (sendLock) {
+ synchronized (stateLock) {
+ if (!isOpen())
+ throw new ClosedChannelException();
+ if (isConnected())
+ return true;
+ if (state != ChannelState.PENDING)
+ throw new NoConnectionPendingException();
+ }
+ int n = 0;
+ try {
+ try {
+ begin();
+ synchronized (blockingLock()) {
+ synchronized (stateLock) {
+ if (!isOpen()) {
+ return false;
+ }
+ receiverThread = NativeThread.current();
+ }
+ if (!isBlocking()) {
+ for (;;) {
+ n = checkConnect(fd, false, readyToConnect);
+ if ( (n == IOStatus.INTERRUPTED)
+ && isOpen())
+ continue;
+ break;
+ }
+ } else {
+ for (;;) {
+ n = checkConnect(fd, true, readyToConnect);
+ if (n == 0) {
+ // Loop in case of
+ // spurious notifications
+ continue;
+ }
+ if ( (n == IOStatus.INTERRUPTED)
+ && isOpen())
+ continue;
+ break;
+ }
+ }
+ }
+ } finally {
+ synchronized (stateLock) {
+ receiverThread = 0;
+ if (state == ChannelState.KILLPENDING) {
+ kill();
+ /* poll()/getsockopt() does not report
+ * error (throws exception, with n = 0)
+ * on Linux platform after dup2 and
+ * signal-wakeup. Force n to 0 so the
+ * end() can throw appropriate exception */
+ n = 0;
+ }
+ }
+ end((n > 0) || (n == IOStatus.UNAVAILABLE));
+ assert IOStatus.check(n);
+ }
+ } catch (IOException x) {
+ /* If an exception was thrown, close the channel after
+ * invoking end() so as to avoid bogus
+ * AsynchronousCloseExceptions */
+ close();
+ throw x;
+ }
+
+ if (n > 0) {
+ synchronized (stateLock) {
+ state = ChannelState.CONNECTED;
+ if (!isBound()) {
+ InetSocketAddress boundIsa =
+ Net.localAddress(fd);
+ port = boundIsa.getPort();
+ }
+
+ /* Receive COMM_UP */
+ ByteBuffer buf = Util.getTemporaryDirectBuffer(50);
+ try {
+ receive(buf, null, null, true);
+ } finally {
+ Util.releaseTemporaryDirectBuffer(buf);
+ }
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ protected void implConfigureBlocking(boolean block) throws IOException {
+ IOUtil.configureBlocking(fd, block);
+ }
+
+ @Override
+ public void implCloseSelectableChannel() throws IOException {
+ synchronized (stateLock) {
+ nd.preClose(fd);
+
+ if (receiverThread != 0)
+ NativeThread.signal(receiverThread);
+
+ if (senderThread != 0)
+ NativeThread.signal(senderThread);
+
+ if (!isRegistered())
+ kill();
+ }
+ }
+
+ @Override
+ public FileDescriptor getFD() {
+ return fd;
+ }
+
+ @Override
+ public int getFDVal() {
+ return fdVal;
+ }
+
+ /**
+ * Translates native poll revent ops into a ready operation ops
+ */
+ private boolean translateReadyOps(int ops, int initialOps, SelectionKeyImpl sk) {
+ int intOps = sk.nioInterestOps();
+ int oldOps = sk.nioReadyOps();
+ int newOps = initialOps;
+
+ if ((ops & PollArrayWrapper.POLLNVAL) != 0) {
+ /* This should only happen if this channel is pre-closed while a
+ * selection operation is in progress
+ * ## Throw an error if this channel has not been pre-closed */
+ return false;
+ }
+
+ if ((ops & (PollArrayWrapper.POLLERR
+ | PollArrayWrapper.POLLHUP)) != 0) {
+ newOps = intOps;
+ sk.nioReadyOps(newOps);
+ /* No need to poll again in checkConnect,
+ * the error will be detected there */
+ readyToConnect = true;
+ return (newOps & ~oldOps) != 0;
+ }
+
+ if (((ops & PollArrayWrapper.POLLIN) != 0) &&
+ ((intOps & SelectionKey.OP_READ) != 0) &&
+ isConnected())
+ newOps |= SelectionKey.OP_READ;
+
+ if (((ops & PollArrayWrapper.POLLCONN) != 0) &&
+ ((intOps & SelectionKey.OP_CONNECT) != 0) &&
+ ((state == ChannelState.UNCONNECTED) || (state == ChannelState.PENDING))) {
+ newOps |= SelectionKey.OP_CONNECT;
+ readyToConnect = true;
+ }
+
+ if (((ops & PollArrayWrapper.POLLOUT) != 0) &&
+ ((intOps & SelectionKey.OP_WRITE) != 0) &&
+ isConnected())
+ newOps |= SelectionKey.OP_WRITE;
+
+ sk.nioReadyOps(newOps);
+ return (newOps & ~oldOps) != 0;
+ }
+
+ @Override
+ public boolean translateAndUpdateReadyOps(int ops, SelectionKeyImpl sk) {
+ return translateReadyOps(ops, sk.nioReadyOps(), sk);
+ }
+
+ @Override
+ @SuppressWarnings("all")
+ public boolean translateAndSetReadyOps(int ops, SelectionKeyImpl sk) {
+ return translateReadyOps(ops, 0, sk);
+ }
+
+ @Override
+ public void translateAndSetInterestOps(int ops, SelectionKeyImpl sk) {
+ int newOps = 0;
+ if ((ops & SelectionKey.OP_READ) != 0)
+ newOps |= PollArrayWrapper.POLLIN;
+ if ((ops & SelectionKey.OP_WRITE) != 0)
+ newOps |= PollArrayWrapper.POLLOUT;
+ if ((ops & SelectionKey.OP_CONNECT) != 0)
+ newOps |= PollArrayWrapper.POLLCONN;
+ sk.selector.putEventOps(sk, newOps);
+ }
+
+ @Override
+ public void kill() throws IOException {
+ synchronized (stateLock) {
+ if (state == ChannelState.KILLED)
+ return;
+ if (state == ChannelState.UNINITIALIZED) {
+ state = ChannelState.KILLED;
+ return;
+ }
+ assert !isOpen() && !isRegistered();
+
+ /* Postpone the kill if there is a waiting reader
+ * or writer thread. */
+ if (receiverThread == 0 && senderThread == 0) {
+ nd.close(fd);
+ state = ChannelState.KILLED;
+ } else {
+ state = ChannelState.KILLPENDING;
+ }
+ }
+ }
+
+ @Override
+ public <T> SctpChannel setOption(SctpSocketOption<T> name, T value)
+ throws IOException {
+ if (name == null)
+ throw new NullPointerException();
+ if (!supportedOptions().contains(name))
+ throw new UnsupportedOperationException("'" + name + "' not supported");
+
+ synchronized (stateLock) {
+ if (!isOpen())
+ throw new ClosedChannelException();
+
+ SctpNet.setSocketOption(fdVal, name, value, 0 /*oneToOne*/);
+ }
+ return this;
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public <T> T getOption(SctpSocketOption<T> name) throws IOException {
+ if (name == null)
+ throw new NullPointerException();
+ if (!supportedOptions().contains(name))
+ throw new UnsupportedOperationException("'" + name + "' not supported");
+
+ synchronized (stateLock) {
+ if (!isOpen())
+ throw new ClosedChannelException();
+
+ return (T)SctpNet.getSocketOption(fdVal, name, 0 /*oneToOne*/);
+ }
+ }
+
+ private static class DefaultOptionsHolder {
+ static final Set<SctpSocketOption<?>> defaultOptions = defaultOptions();
+
+ private static Set<SctpSocketOption<?>> defaultOptions() {
+ HashSet<SctpSocketOption<?>> set = new HashSet<SctpSocketOption<?>>(10);
+ set.add(SCTP_DISABLE_FRAGMENTS);
+ set.add(SCTP_EXPLICIT_COMPLETE);
+ set.add(SCTP_FRAGMENT_INTERLEAVE);
+ set.add(SCTP_INIT_MAXSTREAMS);
+ set.add(SCTP_NODELAY);
+ set.add(SCTP_PRIMARY_ADDR);
+ set.add(SCTP_SET_PEER_PRIMARY_ADDR);
+ set.add(SO_SNDBUF);
+ set.add(SO_RCVBUF);
+ set.add(SO_LINGER);
+ return Collections.unmodifiableSet(set);
+ }
+ }
+
+ @Override
+ public final Set<SctpSocketOption<?>> supportedOptions() {
+ return DefaultOptionsHolder.defaultOptions;
+ }
+
+ @Override
+ public <T> MessageInfo receive(ByteBuffer buffer,
+ T attachment,
+ NotificationHandler<T> handler)
+ throws IOException {
+ return receive(buffer, attachment, handler, false);
+ }
+
+ private <T> MessageInfo receive(ByteBuffer buffer,
+ T attachment,
+ NotificationHandler<T> handler,
+ boolean fromConnect)
+ throws IOException {
+ if (buffer == null)
+ throw new IllegalArgumentException("buffer cannot be null");
+
+ if (buffer.isReadOnly())
+ throw new IllegalArgumentException("Read-only buffer");
+
+ if (receiveInvoked.get())
+ throw new IllegalReceiveException(
+ "cannot invoke receive from handler");
+ receiveInvoked.set(Boolean.TRUE);
+
+ try {
+ SctpResultContainer resultContainer = new SctpResultContainer();
+ do {
+ resultContainer.clear();
+ synchronized (receiveLock) {
+ if (!ensureReceiveOpen())
+ return null;
+
+ if (commUpResultContainer != null) {
+ resultContainer = commUpResultContainer;
+ commUpResultContainer = null;
+ continue;
+ }
+
+ int n = 0;
+ try {
+ begin();
+
+ synchronized (stateLock) {
+ if(!isOpen())
+ return null;
+ receiverThread = NativeThread.current();
+ }
+
+ do {
+ n = receive(fdVal, buffer, resultContainer);
+ } while ((n == IOStatus.INTERRUPTED) && isOpen());
+ } finally {
+ receiverCleanup();
+ end((n > 0) || (n == IOStatus.UNAVAILABLE));
+ assert IOStatus.check(n);
+ }
+
+ if (!resultContainer.isNotification()) {
+ /* message or nothing */
+ if (resultContainer.hasSomething()) {
+ /* Set the association before returning */
+ SctpMessageInfoImpl info =
+ resultContainer.getMessageInfo();
+ synchronized (stateLock) {
+ assert association != null;
+ info.setAssociation(association);
+ }
+ return info;
+ } else
+ /* Non-blocking may return null if nothing available*/
+ return null;
+ } else { /* notification */
+ synchronized (stateLock) {
+ handleNotificationInternal(
+ resultContainer);
+ }
+ }
+
+ if (fromConnect) {
+ /* If we reach here, then it was connect that invoked
+ * receive an received the COMM_UP. Save it and allow
+ * the user handler to process it upon next receive. */
+ commUpResultContainer = resultContainer;
+ return null;
+ }
+ } /* receiveLock */
+ } while (handler == null ? true :
+ (invokeNotificationHandler(resultContainer, handler, attachment)
+ == HandlerResult.CONTINUE));
+
+ return null;
+ } finally {
+ receiveInvoked.set(Boolean.FALSE);
+ }
+ }
+
+ private int receive(int fd,
+ ByteBuffer dst,
+ SctpResultContainer resultContainer)
+ throws IOException {
+ int pos = dst.position();
+ int lim = dst.limit();
+ assert (pos <= lim);
+ int rem = (pos <= lim ? lim - pos : 0);
+ if (dst instanceof DirectBuffer && rem > 0)
+ return receiveIntoNativeBuffer(fd, resultContainer, dst, rem, pos);
+
+ /* Substitute a native buffer */
+ int newSize = Math.max(rem, 1);
+ ByteBuffer bb = Util.getTemporaryDirectBuffer(newSize);
+ try {
+ int n = receiveIntoNativeBuffer(fd, resultContainer, bb, newSize, 0);
+ bb.flip();
+ if (n > 0 && rem > 0)
+ dst.put(bb);
+ return n;
+ } finally {
+ Util.releaseTemporaryDirectBuffer(bb);
+ }
+ }
+
+ private int receiveIntoNativeBuffer(int fd,
+ SctpResultContainer resultContainer,
+ ByteBuffer bb,
+ int rem,
+ int pos)
+ throws IOException
+ {
+ int n = receive0(fd, resultContainer, ((DirectBuffer)bb).address() + pos, rem);
+
+ if (n > 0)
+ bb.position(pos + n);
+ return n;
+ }
+
+ private InternalNotificationHandler<?> internalNotificationHandler =
+ new InternalNotificationHandler();
+
+ private void handleNotificationInternal(SctpResultContainer resultContainer)
+ {
+ invokeNotificationHandler(resultContainer,
+ internalNotificationHandler, null);
+ }
+
+ private class InternalNotificationHandler<T>
+ extends AbstractNotificationHandler<T>
+ {
+ @Override
+ public HandlerResult handleNotification(
+ AssociationChangeNotification not, T unused) {
+ if (not.event().equals(
+ AssociationChangeNotification.AssocChangeEvent.COMM_UP)) {
+ assert association == null;
+ SctpAssocChange sac = (SctpAssocChange) not;
+ association = new SctpAssociationImpl
+ (sac.assocId(), sac.maxInStreams(), sac.maxOutStreams());
+ }
+ return HandlerResult.CONTINUE;
+ }
+ }
+
+ private <T> HandlerResult invokeNotificationHandler
+ (SctpResultContainer resultContainer,
+ NotificationHandler<T> handler,
+ T attachment) {
+ SctpNotification notification = resultContainer.notification();
+ synchronized (stateLock) {
+ notification.setAssociation(association);
+ }
+
+ if (!(handler instanceof AbstractNotificationHandler)) {
+ return handler.handleNotification(notification, attachment);
+ }
+
+ /* AbstractNotificationHandler */
+ AbstractNotificationHandler absHandler =
+ (AbstractNotificationHandler)handler;
+ switch(resultContainer.type()) {
+ case ASSOCIATION_CHANGED :
+ return absHandler.handleNotification(
+ resultContainer.getAssociationChanged(), attachment);
+ case PEER_ADDRESS_CHANGED :
+ return absHandler.handleNotification(
+ resultContainer.getPeerAddressChanged(), attachment);
+ case SEND_FAILED :
+ return absHandler.handleNotification(
+ resultContainer.getSendFailed(), attachment);
+ case SHUTDOWN :
+ return absHandler.handleNotification(
+ resultContainer.getShutdown(), attachment);
+ default :
+ /* implementation specific handlers */
+ return absHandler.handleNotification(
+ resultContainer.notification(), attachment);
+ }
+ }
+
+ private void checkAssociation(Association sendAssociation) {
+ synchronized (stateLock) {
+ if (sendAssociation != null && !sendAssociation.equals(association)) {
+ throw new IllegalArgumentException(
+ "Cannot send to another association");
+ }
+ }
+ }
+
+ private void checkStreamNumber(int streamNumber) {
+ synchronized (stateLock) {
+ if (association != null) {
+ if (streamNumber < 0 ||
+ streamNumber >= association.maxOutboundStreams())
+ throw new InvalidStreamException();
+ }
+ }
+ }
+
+ /* TODO: Add support for ttl and isComplete to both 121 12M
+ * SCTP_EOR not yet supported on reference platforms
+ * TTL support limited...
+ */
+ @Override
+ public int send(ByteBuffer buffer, MessageInfo messageInfo)
+ throws IOException {
+ if (buffer == null)
+ throw new IllegalArgumentException("buffer cannot be null");
+
+ if (messageInfo == null)
+ throw new IllegalArgumentException("messageInfo cannot be null");
+
+ checkAssociation(messageInfo.association());
+ checkStreamNumber(messageInfo.streamNumber());
+
+ synchronized (sendLock) {
+ ensureSendOpen();
+
+ int n = 0;
+ try {
+ begin();
+
+ synchronized (stateLock) {
+ if(!isOpen())
+ return 0;
+ senderThread = NativeThread.current();
+ }
+
+ do {
+ n = send(fdVal, buffer, messageInfo);
+ } while ((n == IOStatus.INTERRUPTED) && isOpen());
+
+ return IOStatus.normalize(n);
+ } finally {
+ senderCleanup();
+ end((n > 0) || (n == IOStatus.UNAVAILABLE));
+ assert IOStatus.check(n);
+ }
+ }
+ }
+
+ private int send(int fd, ByteBuffer src, MessageInfo messageInfo)
+ throws IOException {
+ int streamNumber = messageInfo.streamNumber();
+ SocketAddress target = messageInfo.address();
+ boolean unordered = messageInfo.isUnordered();
+ int ppid = messageInfo.payloadProtocolID();
+ int pos = src.position();
+ int lim = src.limit();
+
+ assert (pos <= lim && streamNumber > 0);
+ int rem = (pos <= lim ? lim - pos : 0);
+
+ if (src instanceof DirectBuffer)
+ return sendFromNativeBuffer(fd, src, rem, pos, target, streamNumber,
+ unordered, ppid);
+
+ /* Substitute a native buffer */
+ ByteBuffer bb = Util.getTemporaryDirectBuffer(rem);
+ try {
+ bb.put(src);
+ bb.flip();
+ /* Do not update src until we see how many bytes were written */
+ src.position(pos);
+
+ int n = sendFromNativeBuffer(fd, bb, rem, pos, target, streamNumber,
+ unordered, ppid);
+ if (n > 0) {
+ /* now update src */
+ src.position(pos + n);
+ }
+ return n;
+ } finally {
+ Util.releaseTemporaryDirectBuffer(bb);
+ }
+ }
+
+ private int sendFromNativeBuffer(int fd,
+ ByteBuffer bb,
+ int rem,
+ int pos,
+ SocketAddress target,
+ int streamNumber,
+ boolean unordered,
+ int ppid)
+ throws IOException {
+ int written = send0(fd, ((DirectBuffer)bb).address() + pos,
+ rem, target, -1 /*121*/, streamNumber, unordered, ppid);
+ if (written > 0)
+ bb.position(pos + written);
+ return written;
+ }
+
+ @Override
+ public SctpChannel shutdown() throws IOException {
+ synchronized(stateLock) {
+ if (isShutdown)
+ return this;
+
+ ensureSendOpen();
+ SctpNet.shutdown(fdVal, -1);
+ if (senderThread != 0)
+ NativeThread.signal(senderThread);
+ isShutdown = true;
+ }
+ return this;
+ }
+
+ @Override
+ public Set<SocketAddress> getAllLocalAddresses()
+ throws IOException {
+ synchronized (stateLock) {
+ if (!isOpen())
+ throw new ClosedChannelException();
+ if (!isBound())
+ return Collections.EMPTY_SET;
+
+ return SctpNet.getLocalAddresses(fdVal);
+ }
+ }
+
+ @Override
+ public Set<SocketAddress> getRemoteAddresses()
+ throws IOException {
+ synchronized (stateLock) {
+ if (!isOpen())
+ throw new ClosedChannelException();
+ if (!isConnected())
+ return Collections.EMPTY_SET;
+
+ return SctpNet.getRemoteAddresses(fdVal, 0/*unused*/);
+ }
+ }
+
+ /* Native */
+ private static native void initIDs();
+
+ static native int receive0(int fd, SctpResultContainer resultContainer,
+ long address, int length) throws IOException;
+
+ static native int send0(int fd, long address, int length,
+ SocketAddress target, int assocId, int streamNumber,
+ boolean unordered, int ppid) throws IOException;
+
+ private static native int checkConnect(FileDescriptor fd, boolean block,
+ boolean ready) throws IOException;
+
+ static {
+ Util.load(); /* loads nio & net native libraries */
+ java.security.AccessController.doPrivileged(
+ new sun.security.action.LoadLibraryAction("sctp"));
+ initIDs();
+ nd = new SctpSocketDispatcher();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/classes/sun/nio/ch/SctpMultiChannelImpl.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,959 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package sun.nio.ch;
+
+import java.net.InetAddress;
+import java.net.SocketAddress;
+import java.net.InetSocketAddress;
+import java.io.FileDescriptor;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.HashMap;
+import java.nio.ByteBuffer;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.AlreadyBoundException;
+import java.nio.channels.ClosedChannelException;
+import java.nio.channels.NotYetBoundException;
+import java.nio.channels.spi.SelectorProvider;
+import com.sun.nio.sctp.AbstractNotificationHandler;
+import com.sun.nio.sctp.Association;
+import com.sun.nio.sctp.AssociationChangeNotification;
+import com.sun.nio.sctp.HandlerResult;
+import com.sun.nio.sctp.IllegalReceiveException;
+import com.sun.nio.sctp.InvalidStreamException;
+import com.sun.nio.sctp.IllegalUnbindException;
+import com.sun.nio.sctp.NotificationHandler;
+import com.sun.nio.sctp.MessageInfo;
+import com.sun.nio.sctp.SctpChannel;
+import com.sun.nio.sctp.SctpMultiChannel;
+import com.sun.nio.sctp.SctpSocketOption;
+import static com.sun.nio.sctp.SctpStandardSocketOption.*;
+import static sun.nio.ch.SctpResultContainer.*;
+
+/**
+ * An implementation of SctpMultiChannel
+ */
+public class SctpMultiChannelImpl extends SctpMultiChannel
+ implements SelChImpl
+{
+ /* Used to make native close and preClose calls */
+ private static NativeDispatcher nd;
+
+ private final FileDescriptor fd;
+
+ private final int fdVal;
+
+ /* IDs of native threads doing send and receives, for signalling */
+ private volatile long receiverThread = 0;
+ private volatile long senderThread = 0;
+
+ /* Lock held by current receiving thread */
+ private final Object receiveLock = new Object();
+
+ /* Lock held by current sending thread */
+ private final Object sendLock = new Object();
+
+ /* Lock held by any thread that modifies the state fields declared below
+ * DO NOT invoke a blocking I/O operation while holding this lock! */
+ private final Object stateLock = new Object();
+
+ private enum ChannelState {
+ UNINITIALIZED,
+ KILLPENDING,
+ KILLED,
+ }
+
+ /* -- The following fields are protected by stateLock -- */
+ private ChannelState state = ChannelState.UNINITIALIZED;
+
+ /* Binding: Once bound the port will remain constant. */
+ int port = -1;
+ private HashSet<InetSocketAddress> localAddresses = new HashSet<InetSocketAddress>();
+ /* Has the channel been bound to the wildcard address */
+ private boolean wildcard; /* false */
+
+ /* Keeps a map of addresses to association, and visa versa */
+ private HashMap<SocketAddress, Association> addressMap =
+ new HashMap<SocketAddress, Association>();
+ private HashMap<Association, Set<SocketAddress>> associationMap =
+ new HashMap<Association, Set<SocketAddress>>();
+
+ /* -- End of fields protected by stateLock -- */
+
+ /* If an association has been shutdown mark it for removal after
+ * the user handler has been invoked */
+ private final ThreadLocal<Association> associationToRemove =
+ new ThreadLocal<Association>() {
+ @Override protected Association initialValue() {
+ return null;
+ }
+ };
+
+ /* A notification handler cannot invoke receive */
+ private final ThreadLocal<Boolean> receiveInvoked =
+ new ThreadLocal<Boolean>() {
+ @Override protected Boolean initialValue() {
+ return Boolean.FALSE;
+ }
+ };
+
+ public SctpMultiChannelImpl(SelectorProvider provider)
+ throws IOException {
+ //TODO: update provider, remove public modifier
+ super(provider);
+ this.fd = SctpNet.socket(false /*one-to-many*/);
+ this.fdVal = IOUtil.fdVal(fd);
+ }
+
+ @Override
+ public SctpMultiChannel bind(SocketAddress local, int backlog)
+ throws IOException {
+ synchronized (receiveLock) {
+ synchronized (sendLock) {
+ synchronized (stateLock) {
+ ensureOpen();
+ if (isBound())
+ throw new AlreadyBoundException();
+ InetSocketAddress isa = (local == null) ?
+ new InetSocketAddress(0) : Net.checkAddress(local);
+
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null)
+ sm.checkListen(isa.getPort());
+ Net.bind(fd, isa.getAddress(), isa.getPort());
+
+ InetSocketAddress boundIsa = Net.localAddress(fd);
+ port = boundIsa.getPort();
+ localAddresses.add(isa);
+ if (isa.getAddress().isAnyLocalAddress())
+ wildcard = true;
+
+ Net.listen(fd, backlog < 1 ? 50 : backlog);
+ }
+ }
+ }
+ return this;
+ }
+
+ @Override
+ public SctpMultiChannel bindAddress(InetAddress address)
+ throws IOException {
+ return bindUnbindAddress(address, true);
+ }
+
+ @Override
+ public SctpMultiChannel unbindAddress(InetAddress address)
+ throws IOException {
+ return bindUnbindAddress(address, false);
+ }
+
+ private SctpMultiChannel bindUnbindAddress(InetAddress address,
+ boolean add)
+ throws IOException {
+ if (address == null)
+ throw new IllegalArgumentException();
+
+ synchronized (receiveLock) {
+ synchronized (sendLock) {
+ synchronized (stateLock) {
+ if (!isOpen())
+ throw new ClosedChannelException();
+ if (!isBound())
+ throw new NotYetBoundException();
+ if (wildcard)
+ throw new IllegalStateException(
+ "Cannot add or remove addresses from a channel that is bound to the wildcard address");
+ if (address.isAnyLocalAddress())
+ throw new IllegalArgumentException(
+ "Cannot add or remove the wildcard address");
+ if (add) {
+ for (InetSocketAddress addr : localAddresses) {
+ if (addr.getAddress().equals(address)) {
+ throw new AlreadyBoundException();
+ }
+ }
+ } else { /*removing */
+ /* Verify that there is more than one address
+ * and that address is already bound */
+ if (localAddresses.size() <= 1)
+ throw new IllegalUnbindException("Cannot remove address from a channel with only one address bound");
+ boolean foundAddress = false;
+ for (InetSocketAddress addr : localAddresses) {
+ if (addr.getAddress().equals(address)) {
+ foundAddress = true;
+ break;
+ }
+ }
+ if (!foundAddress )
+ throw new IllegalUnbindException("Cannot remove address from a channel that is not bound to that address");
+ }
+
+ SctpNet.bindx(fdVal, new InetAddress[]{address}, port, add);
+
+ /* Update our internal Set to reflect the addition/removal */
+ if (add)
+ localAddresses.add(new InetSocketAddress(address, port));
+ else {
+ for (InetSocketAddress addr : localAddresses) {
+ if (addr.getAddress().equals(address)) {
+ localAddresses.remove(addr);
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ return this;
+ }
+
+ @Override
+ public Set<Association> associations()
+ throws ClosedChannelException, NotYetBoundException {
+ synchronized (stateLock) {
+ if (!isOpen())
+ throw new ClosedChannelException();
+ if (!isBound())
+ throw new NotYetBoundException();
+
+ return Collections.unmodifiableSet(associationMap.keySet());
+ }
+ }
+
+ private boolean isBound() {
+ synchronized (stateLock) {
+ return port == -1 ? false : true;
+ }
+ }
+
+ private void ensureOpen() throws IOException {
+ synchronized (stateLock) {
+ if (!isOpen())
+ throw new ClosedChannelException();
+ }
+ }
+
+ private void receiverCleanup() throws IOException {
+ synchronized (stateLock) {
+ receiverThread = 0;
+ if (state == ChannelState.KILLPENDING)
+ kill();
+ }
+ }
+
+ private void senderCleanup() throws IOException {
+ synchronized (stateLock) {
+ senderThread = 0;
+ if (state == ChannelState.KILLPENDING)
+ kill();
+ }
+ }
+
+ @Override
+ protected void implConfigureBlocking(boolean block) throws IOException {
+ IOUtil.configureBlocking(fd, block);
+ }
+
+ @Override
+ public void implCloseSelectableChannel() throws IOException {
+ synchronized (stateLock) {
+ nd.preClose(fd);
+
+ if (receiverThread != 0)
+ NativeThread.signal(receiverThread);
+
+ if (senderThread != 0)
+ NativeThread.signal(senderThread);
+
+ if (!isRegistered())
+ kill();
+ }
+ }
+
+ @Override
+ public FileDescriptor getFD() {
+ return fd;
+ }
+
+ @Override
+ public int getFDVal() {
+ return fdVal;
+ }
+
+ /**
+ * Translates native poll revent ops into a ready operation ops
+ */
+ private boolean translateReadyOps(int ops, int initialOps,
+ SelectionKeyImpl sk) {
+ int intOps = sk.nioInterestOps();
+ int oldOps = sk.nioReadyOps();
+ int newOps = initialOps;
+
+ if ((ops & PollArrayWrapper.POLLNVAL) != 0) {
+ /* This should only happen if this channel is pre-closed while a
+ * selection operation is in progress
+ * ## Throw an error if this channel has not been pre-closed */
+ return false;
+ }
+
+ if ((ops & (PollArrayWrapper.POLLERR
+ | PollArrayWrapper.POLLHUP)) != 0) {
+ newOps = intOps;
+ sk.nioReadyOps(newOps);
+ return (newOps & ~oldOps) != 0;
+ }
+
+ if (((ops & PollArrayWrapper.POLLIN) != 0) &&
+ ((intOps & SelectionKey.OP_READ) != 0))
+ newOps |= SelectionKey.OP_READ;
+
+ if (((ops & PollArrayWrapper.POLLOUT) != 0) &&
+ ((intOps & SelectionKey.OP_WRITE) != 0))
+ newOps |= SelectionKey.OP_WRITE;
+
+ sk.nioReadyOps(newOps);
+ return (newOps & ~oldOps) != 0;
+ }
+
+ @Override
+ public boolean translateAndUpdateReadyOps(int ops, SelectionKeyImpl sk) {
+ return translateReadyOps(ops, sk.nioReadyOps(), sk);
+ }
+
+ @Override
+ public boolean translateAndSetReadyOps(int ops, SelectionKeyImpl sk) {
+ return translateReadyOps(ops, 0, sk);
+ }
+
+ @Override
+ public void translateAndSetInterestOps(int ops, SelectionKeyImpl sk) {
+ int newOps = 0;
+ if ((ops & SelectionKey.OP_READ) != 0)
+ newOps |= PollArrayWrapper.POLLIN;
+ if ((ops & SelectionKey.OP_WRITE) != 0)
+ newOps |= PollArrayWrapper.POLLOUT;
+ sk.selector.putEventOps(sk, newOps);
+ }
+
+ @Override
+ public void kill() throws IOException {
+ synchronized (stateLock) {
+ if (state == ChannelState.KILLED)
+ return;
+ if (state == ChannelState.UNINITIALIZED) {
+ state = ChannelState.KILLED;
+ return;
+ }
+ assert !isOpen() && !isRegistered();
+
+ /* Postpone the kill if there is a thread sending or receiving. */
+ if (receiverThread == 0 && senderThread == 0) {
+ nd.close(fd);
+ state = ChannelState.KILLED;
+ } else {
+ state = ChannelState.KILLPENDING;
+ }
+ }
+ }
+
+ @Override
+ public <T> SctpMultiChannel setOption(SctpSocketOption<T> name,
+ T value,
+ Association association)
+ throws IOException {
+ if (name == null)
+ throw new NullPointerException();
+ if (!(supportedOptions().contains(name)))
+ throw new UnsupportedOperationException("'" + name + "' not supported");
+
+ synchronized (stateLock) {
+ if (association != null && (name.equals(SCTP_PRIMARY_ADDR) ||
+ name.equals(SCTP_SET_PEER_PRIMARY_ADDR))) {
+ checkAssociation(association);
+ }
+ if (!isOpen())
+ throw new ClosedChannelException();
+
+ SctpNet.setSocketOption(fdVal, name, value,
+ association.associationID());
+ }
+ return this;
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public <T> T getOption(SctpSocketOption<T> name, Association association)
+ throws IOException {
+ if (name == null)
+ throw new NullPointerException();
+ if (!supportedOptions().contains(name))
+ throw new UnsupportedOperationException("'" + name + "' not supported");
+
+ synchronized (stateLock) {
+ checkAssociation(association);
+ if (!isOpen())
+ throw new ClosedChannelException();
+
+ return (T)SctpNet.getSocketOption(fdVal, name,
+ association.associationID());
+ }
+ }
+
+ private static class DefaultOptionsHolder {
+ static final Set<SctpSocketOption<?>> defaultOptions = defaultOptions();
+
+ private static Set<SctpSocketOption<?>> defaultOptions() {
+ HashSet<SctpSocketOption<?>> set = new HashSet<SctpSocketOption<?>>(10);
+ set.add(SCTP_DISABLE_FRAGMENTS);
+ set.add(SCTP_EXPLICIT_COMPLETE);
+ set.add(SCTP_FRAGMENT_INTERLEAVE);
+ set.add(SCTP_INIT_MAXSTREAMS);
+ set.add(SCTP_NODELAY);
+ set.add(SCTP_PRIMARY_ADDR);
+ set.add(SCTP_SET_PEER_PRIMARY_ADDR);
+ set.add(SO_SNDBUF);
+ set.add(SO_RCVBUF);
+ set.add(SO_LINGER);
+ return Collections.unmodifiableSet(set);
+ }
+ }
+
+ @Override
+ public final Set<SctpSocketOption<?>> supportedOptions() {
+ return DefaultOptionsHolder.defaultOptions;
+ }
+
+ @Override
+ public <T> MessageInfo receive(ByteBuffer buffer,
+ T attachment,
+ NotificationHandler<T> handler)
+ throws IOException {
+ if (buffer == null)
+ throw new IllegalArgumentException("buffer cannot be null");
+
+ if (buffer.isReadOnly())
+ throw new IllegalArgumentException("Read-only buffer");
+
+ if (receiveInvoked.get())
+ throw new IllegalReceiveException(
+ "cannot invoke receive from handler");
+ receiveInvoked.set(Boolean.TRUE);
+
+ try {
+ SctpResultContainer resultContainer = new SctpResultContainer();
+ do {
+ resultContainer.clear();
+ synchronized (receiveLock) {
+ ensureOpen();
+ if (!isBound())
+ throw new NotYetBoundException();
+
+ int n = 0;
+ try {
+ begin();
+
+ synchronized (stateLock) {
+ if(!isOpen())
+ return null;
+ receiverThread = NativeThread.current();
+ }
+
+ do {
+ n = receive(fdVal, buffer, resultContainer);
+ } while ((n == IOStatus.INTERRUPTED) && isOpen());
+
+ } finally {
+ receiverCleanup();
+ end((n > 0) || (n == IOStatus.UNAVAILABLE));
+ assert IOStatus.check(n);
+ }
+
+ if (!resultContainer.isNotification()) {
+ /* message or nothing */
+ if (resultContainer.hasSomething()) {
+ /* Set the association before returning */
+ SctpMessageInfoImpl info =
+ resultContainer.getMessageInfo();
+ info.setAssociation(lookupAssociation(info.
+ associationID()));
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null) {
+ InetSocketAddress isa = (InetSocketAddress)info.address();
+ if (!addressMap.containsKey(isa)) {
+ /* must be a new association */
+ try {
+ sm.checkAccept(isa.getAddress().getHostAddress(),
+ isa.getPort());
+ } catch (SecurityException se) {
+ buffer.clear();
+ throw se;
+ }
+ }
+ }
+
+ assert info.association() != null;
+ return info;
+ } else {
+ /* Non-blocking may return null if nothing available*/
+ return null;
+ }
+ } else { /* notification */
+ synchronized (stateLock) {
+ handleNotificationInternal(
+ resultContainer);
+ }
+ }
+ } /* receiveLock */
+ } while (handler == null ? true :
+ (invokeNotificationHandler(resultContainer, handler, attachment)
+ == HandlerResult.CONTINUE));
+ } finally {
+ receiveInvoked.set(Boolean.FALSE);
+ }
+
+ return null;
+ }
+
+ private int receive(int fd,
+ ByteBuffer dst,
+ SctpResultContainer resultContainer)
+ throws IOException {
+ int pos = dst.position();
+ int lim = dst.limit();
+ assert (pos <= lim);
+ int rem = (pos <= lim ? lim - pos : 0);
+ if (dst instanceof DirectBuffer && rem > 0)
+ return receiveIntoNativeBuffer(fd, resultContainer, dst, rem, pos);
+
+ /* Substitute a native buffer. */
+ int newSize = Math.max(rem, 1);
+ ByteBuffer bb = Util.getTemporaryDirectBuffer(newSize);
+ try {
+ int n = receiveIntoNativeBuffer(fd, resultContainer, bb, newSize, 0);
+ bb.flip();
+ if (n > 0 && rem > 0)
+ dst.put(bb);
+ return n;
+ } finally {
+ Util.releaseTemporaryDirectBuffer(bb);
+ }
+ }
+
+ private int receiveIntoNativeBuffer(int fd,
+ SctpResultContainer resultContainer,
+ ByteBuffer bb,
+ int rem,
+ int pos)
+ throws IOException {
+ int n = receive0(fd, resultContainer, ((DirectBuffer)bb).address() + pos, rem);
+ if (n > 0)
+ bb.position(pos + n);
+ return n;
+ }
+
+ private InternalNotificationHandler internalNotificationHandler =
+ new InternalNotificationHandler();
+
+ private void handleNotificationInternal(SctpResultContainer resultContainer)
+ {
+ invokeNotificationHandler(resultContainer,
+ internalNotificationHandler, null);
+ }
+
+ private class InternalNotificationHandler<T>
+ extends AbstractNotificationHandler<T>
+ {
+ @Override
+ public HandlerResult handleNotification(
+ AssociationChangeNotification not, T unused) {
+ SctpAssocChange sac = (SctpAssocChange) not;
+
+ /* Update map to reflect change in association */
+ switch (not.event()) {
+ case COMM_UP :
+ Association newAssociation = new SctpAssociationImpl
+ (sac.assocId(), sac.maxInStreams(), sac.maxOutStreams());
+ addAssociation(newAssociation);
+ break;
+ case SHUTDOWN :
+ case COMM_LOST :
+ //case RESTART: ???
+ /* mark association for removal after user handler invoked*/
+ associationToRemove.set(lookupAssociation(sac.assocId()));
+ }
+ return HandlerResult.CONTINUE;
+ }
+ }
+
+ private <T> HandlerResult invokeNotificationHandler(
+ SctpResultContainer resultContainer,
+ NotificationHandler<T> handler,
+ T attachment) {
+ HandlerResult result;
+ SctpNotification notification = resultContainer.notification();
+ notification.setAssociation(lookupAssociation(notification.assocId()));
+
+ if (!(handler instanceof AbstractNotificationHandler)) {
+ result = handler.handleNotification(notification, attachment);
+ } else { /* AbstractNotificationHandler */
+ AbstractNotificationHandler absHandler =
+ (AbstractNotificationHandler)handler;
+ switch(resultContainer.type()) {
+ case ASSOCIATION_CHANGED :
+ result = absHandler.handleNotification(
+ resultContainer.getAssociationChanged(), attachment);
+ case PEER_ADDRESS_CHANGED :
+ result = absHandler.handleNotification(
+ resultContainer.getPeerAddressChanged(), attachment);
+ case SEND_FAILED :
+ result = absHandler.handleNotification(
+ resultContainer.getSendFailed(), attachment);
+ case SHUTDOWN :
+ result = absHandler.handleNotification(
+ resultContainer.getShutdown(), attachment);
+ default :
+ /* implementation specific handlers */
+ result = absHandler.handleNotification(
+ resultContainer.notification(), attachment);
+ }
+ }
+
+ if (!(handler instanceof InternalNotificationHandler)) {
+ /* Only remove associations after user handler
+ * has finished with them */
+ Association assoc = associationToRemove.get();
+ if (assoc != null) {
+ removeAssociation(assoc);
+ associationToRemove.set(null);
+ }
+
+ }
+
+ return result;
+ }
+
+ private Association lookupAssociation(int assocId) {
+ /* Lookup the association in our internal map */
+ synchronized (stateLock) {
+ Set<Association> assocs = associationMap.keySet();
+ for (Association a : assocs) {
+ if (a.associationID() == assocId) {
+ return a;
+ }
+ }
+ }
+ return null;
+ }
+
+ private void addAssociation(Association association) {
+ synchronized (stateLock) {
+ int assocId = association.associationID();
+ Set<SocketAddress> addresses = null;
+
+ try {
+ addresses = SctpNet.getRemoteAddresses(fdVal, assocId);
+ } catch (IOException unused) {
+ /* OK, determining connected addresses may not be possible
+ * shutdown, connection lost, etc */
+ }
+
+ associationMap.put(association, addresses);
+ if (addresses != null) {
+ for (SocketAddress addr : addresses)
+ addressMap.put(addr, association);
+ }
+ }
+ }
+
+ private void removeAssociation(Association association) {
+ synchronized (stateLock) {
+ int assocId = association.associationID();
+ Set<SocketAddress> addresses = null;
+
+ try {
+ addresses = SctpNet.getRemoteAddresses(fdVal, assocId);
+ } catch (IOException unused) {
+ /* OK, determining connected addresses may not be possible
+ * shutdown, connection lost, etc */
+ }
+
+ Set<Association> assocs = associationMap.keySet();
+ for (Association a : assocs) {
+ if (a.associationID() == assocId) {
+ associationMap.remove(a);
+ break;
+ }
+ }
+ if (addresses != null) {
+ for (SocketAddress addr : addresses)
+ addressMap.remove(addr);
+ } else {
+ /* We cannot determine the connected addresses */
+ Set<java.util.Map.Entry<SocketAddress, Association>> addrAssocs =
+ addressMap.entrySet();
+ for (java.util.Map.Entry<SocketAddress, Association> entry : addrAssocs) {
+ if (entry.getValue().equals(association)) {
+ addressMap.remove(entry.getKey());
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * @throws IllegalArgumentException
+ * If the given association is not controlled by this channel
+ *
+ * @return {@code true} if, and only if, the given association is one
+ * of the current associations controlled by this channel
+ */
+ private boolean checkAssociation(Association messageAssoc) {
+ synchronized (stateLock) {
+ for (Association association : associationMap.keySet()) {
+ if (messageAssoc.equals(association)) {
+ return true;
+ }
+ }
+ }
+ throw new IllegalArgumentException(
+ "Given Association is not controlled by this channel");
+ }
+
+ private void checkStreamNumber(Association assoc, int streamNumber) {
+ synchronized (stateLock) {
+ if (streamNumber < 0 || streamNumber >= assoc.maxOutboundStreams())
+ throw new InvalidStreamException();
+ }
+ }
+
+ /* TODO: Add support for ttl and isComplete to both 121 12M
+ * SCTP_EOR not yet supported on reference platforms
+ * TTL support limited...
+ */
+ @Override
+ public int send(ByteBuffer buffer, MessageInfo messageInfo)
+ throws IOException {
+ if (buffer == null)
+ throw new IllegalArgumentException("buffer cannot be null");
+
+ if (messageInfo == null)
+ throw new IllegalArgumentException("messageInfo cannot be null");
+
+ synchronized (sendLock) {
+ ensureOpen();
+
+ if (!isBound())
+ bind(null, 0);
+
+ int n = 0;
+ try {
+ int assocId = -1;
+ SocketAddress address = null;
+ begin();
+
+ synchronized (stateLock) {
+ if(!isOpen())
+ return 0;
+ senderThread = NativeThread.current();
+
+ /* Determine what address or association to send to */
+ Association assoc = messageInfo.association();
+ InetSocketAddress addr = (InetSocketAddress)messageInfo.address();
+ if (assoc != null) {
+ checkAssociation(assoc);
+ checkStreamNumber(assoc, messageInfo.streamNumber());
+ assocId = assoc.associationID();
+ /* have we also got a preferred address */
+ if (addr != null) {
+ if (!assoc.equals(addressMap.get(addr)))
+ throw new IllegalArgumentException("given preferred address is not part of this association");
+ address = addr;
+ }
+ } else if (addr != null) {
+ address = addr;
+ Association association = addressMap.get(addr);
+ if (association != null) {
+ checkStreamNumber(association, messageInfo.streamNumber());
+ assocId = association.associationID();
+
+ } else { /* must be new association */
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null)
+ sm.checkConnect(addr.getAddress().getHostAddress(),
+ addr.getPort());
+ }
+ } else {
+ throw new AssertionError(
+ "Both association and address cannot be null");
+ }
+ }
+
+ do {
+ n = send(fdVal, buffer, assocId, address, messageInfo);
+ } while ((n == IOStatus.INTERRUPTED) && isOpen());
+
+ return IOStatus.normalize(n);
+ } finally {
+ senderCleanup();
+ end((n > 0) || (n == IOStatus.UNAVAILABLE));
+ assert IOStatus.check(n);
+ }
+ }
+ }
+
+ private int send(int fd,
+ ByteBuffer src,
+ int assocId,
+ SocketAddress target,
+ MessageInfo messageInfo)
+ throws IOException {
+ int streamNumber = messageInfo.streamNumber();
+ boolean unordered = messageInfo.isUnordered();
+ int ppid = messageInfo.payloadProtocolID();
+ int pos = src.position();
+ int lim = src.limit();
+ assert (pos <= lim && streamNumber > 0);
+ int rem = (pos <= lim ? lim - pos : 0);
+
+ if (src instanceof DirectBuffer)
+ return sendFromNativeBuffer(fd, src, rem, pos, target, assocId,
+ streamNumber, unordered, ppid);
+
+ /* Substitute a native buffer */
+ ByteBuffer bb = Util.getTemporaryDirectBuffer(rem);
+ try {
+ bb.put(src);
+ bb.flip();
+ /* Do not update src until we see how many bytes were written */
+ src.position(pos);
+
+ int n = sendFromNativeBuffer(fd, bb, rem, pos, target, assocId,
+ streamNumber, unordered, ppid);
+ if (n > 0) {
+ /* now update src */
+ src.position(pos + n);
+ }
+ return n;
+ } finally {
+ Util.releaseTemporaryDirectBuffer(bb);
+ }
+ }
+
+ private int sendFromNativeBuffer(int fd,
+ ByteBuffer bb,
+ int rem,
+ int pos,
+ SocketAddress target,
+ int assocId,
+ int streamNumber,
+ boolean unordered,
+ int ppid)
+ throws IOException {
+ int written = send0(fd, ((DirectBuffer)bb).address() + pos,
+ rem, target, assocId, streamNumber, unordered, ppid);
+ if (written > 0)
+ bb.position(pos + written);
+ return written;
+ }
+
+ @Override
+ public SctpMultiChannel shutdown(Association association)
+ throws IOException {
+ synchronized (stateLock) {
+ checkAssociation(association);
+ if (!isOpen())
+ throw new ClosedChannelException();
+
+ SctpNet.shutdown(fdVal, association.associationID());
+ }
+ return this;
+ }
+
+ @Override
+ public Set<SocketAddress> getAllLocalAddresses()
+ throws IOException {
+ synchronized (stateLock) {
+ if (!isOpen())
+ throw new ClosedChannelException();
+ if (!isBound())
+ return Collections.EMPTY_SET;
+
+ return SctpNet.getLocalAddresses(fdVal);
+ }
+ }
+
+ @Override
+ public Set<SocketAddress> getRemoteAddresses(Association association)
+ throws IOException {
+ synchronized (stateLock) {
+ checkAssociation(association);
+ if (!isOpen())
+ throw new ClosedChannelException();
+
+ return SctpNet.getRemoteAddresses(fdVal, association.associationID());
+ }
+ }
+
+ @Override
+ public SctpChannel branch(Association association)
+ throws IOException {
+ synchronized (stateLock) {
+ return null; //TODO: implement
+ }
+ }
+
+ /* Use common native implementation shared between
+ * one-to-one and one-to-many */
+ private static int receive0(int fd,
+ SctpResultContainer resultContainer,
+ long address,
+ int length)
+ throws IOException{
+ return SctpChannelImpl.receive0(fd, resultContainer, address,
+ length);
+ }
+
+ private static int send0(int fd,
+ long address,
+ int length,
+ SocketAddress target,
+ int assocId,
+ int streamNumber,
+ boolean unordered,
+ int ppid)
+ throws IOException {
+ return SctpChannelImpl.send0(fd, address, length, target, assocId,
+ streamNumber, unordered, ppid);
+ }
+
+ static {
+ Util.load(); /* loads nio & net native libraries */
+ java.security.AccessController.doPrivileged(
+ new sun.security.action.LoadLibraryAction("sctp"));
+ nd = new SctpSocketDispatcher();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/classes/sun/nio/ch/SctpNet.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,268 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package sun.nio.ch;
+
+import java.io.FileDescriptor;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.util.Set;
+import java.util.HashSet;
+import java.security.AccessController;
+import sun.security.action.GetPropertyAction;
+import com.sun.nio.sctp.SctpSocketOption;
+import static com.sun.nio.sctp.SctpStandardSocketOption.*;
+
+public class SctpNet {
+ static final String osName = AccessController.doPrivileged(
+ new GetPropertyAction("os.name"));
+
+ /* -- Miscellaneous SCTP utilities -- */
+
+ static boolean bindxIPv4MappedAddresses() {
+ if ("SunOS".equals(osName)) {
+ /* Solaris supports IPv4Mapped Addresses with bindx */
+ return true;
+ } /* else { //other OS/implementations */
+
+ /* lksctp/linux requires Ipv4 addresses */
+ return false;
+ }
+
+ /**
+ * @param oneToone
+ * if {@code true} returns a one-to-one sctp socket, otherwise
+ * returns a one-to-many sctp socket
+ */
+ static FileDescriptor socket(boolean oneToOne) throws IOException {
+ int nativefd = socket0(oneToOne);
+ return IOUtil.newFD(nativefd);
+ }
+
+ static void bindx(int fd, InetAddress[] addrs, int port, boolean add)
+ throws IOException {
+ bindx(fd, addrs, port, addrs.length, add,
+ bindxIPv4MappedAddresses());
+ }
+
+ static Set<SocketAddress> getLocalAddresses(int fd)
+ throws IOException {
+ HashSet<SocketAddress> set = null;
+ SocketAddress[] saa = getLocalAddresses0(fd);
+
+ if (saa != null) {
+ set = new HashSet<SocketAddress>(saa.length);
+ for (SocketAddress sa : saa)
+ set.add(sa);
+ }
+
+ return set;
+ }
+
+ static Set<SocketAddress> getRemoteAddresses(int fd, int assocId)
+ throws IOException {
+ HashSet<SocketAddress> set = null;
+ SocketAddress[] saa = getRemoteAddresses0(fd, assocId);
+
+ if (saa != null) {
+ set = new HashSet<SocketAddress>(saa.length);
+ for (SocketAddress sa : saa)
+ set.add(sa);
+ }
+
+ return set;
+ }
+
+ static void setSocketOption(int fd,
+ SctpSocketOption name,
+ Object value,
+ int assocId)
+ throws IOException {
+ if (value == null)
+ throw new IllegalArgumentException("Invalid option value");
+
+ Class<?> type = name.type();
+ if (!type.isInstance(value))
+ throw new IllegalArgumentException("Invalid option value");
+
+ if (name.equals(SCTP_INIT_MAXSTREAMS)) {
+ InitMaxStreams maxStreamValue = (InitMaxStreams)value;
+ SctpNet.setInitMsgOption0(fd,
+ maxStreamValue.maxInStreams(), maxStreamValue.maxOutStreams());
+ } else if (name.equals(SCTP_PRIMARY_ADDR) ||
+ name.equals(SCTP_SET_PEER_PRIMARY_ADDR)) {
+
+ SocketAddress addr = (SocketAddress) value;
+ if (addr == null)
+ throw new IllegalArgumentException("Invalid option value");
+
+ Net.checkAddress(addr);
+ InetSocketAddress netAddr = (InetSocketAddress)addr;
+
+ if (name.equals(SCTP_PRIMARY_ADDR)) {
+ setPrimAddrOption0(fd, assocId,
+ netAddr.getAddress(), netAddr.getPort());
+ } else {
+ setPeerPrimAddrOption0(fd, assocId,
+ netAddr.getAddress(), netAddr.getPort());
+ }
+ } else if (name.equals(SCTP_DISABLE_FRAGMENTS) ||
+ name.equals(SCTP_EXPLICIT_COMPLETE) ||
+ name.equals(SCTP_FRAGMENT_INTERLEAVE) ||
+ name.equals(SCTP_NODELAY) ||
+ name.equals(SO_SNDBUF) ||
+ name.equals(SO_RCVBUF) ||
+ name.equals(SO_LINGER)) {
+ setIntOption(fd, name, value);
+ } else {
+ throw new AssertionError("Unknown socket option");
+ }
+ }
+
+ static Object getSocketOption(int fd, SctpSocketOption name, int assocId)
+ throws IOException {
+ if (name.equals(SCTP_SET_PEER_PRIMARY_ADDR)) {
+ throw new IllegalArgumentException(
+ "SCTP_SET_PEER_PRIMARY_ADDR cannot be retrieved");
+ } else if (name.equals(SCTP_INIT_MAXSTREAMS)) {
+ /* container for holding maxIn/Out streams */
+ int[] values = new int[2];
+ SctpNet.getInitMsgOption0(fd, values);
+ return InitMaxStreams.create(values[0], values[1]);
+ } else if (name.equals(SCTP_PRIMARY_ADDR)) {
+ return getPrimAddrOption0(fd, assocId);
+ } else if (name.equals(SCTP_DISABLE_FRAGMENTS) ||
+ name.equals(SCTP_EXPLICIT_COMPLETE) ||
+ name.equals(SCTP_FRAGMENT_INTERLEAVE) ||
+ name.equals(SCTP_NODELAY) ||
+ name.equals(SO_SNDBUF) ||
+ name.equals(SO_RCVBUF) ||
+ name.equals(SO_LINGER)) {
+ return getIntOption(fd, name);
+ } else {
+ throw new AssertionError("Unknown socket option");
+ }
+ }
+
+ static void setIntOption(int fd, SctpSocketOption name, Object value)
+ throws IOException {
+ if (value == null)
+ throw new IllegalArgumentException("Invalid option value");
+
+ Class<?> type = name.type();
+ if (type != Integer.class && type != Boolean.class)
+ throw new AssertionError("Should not reach here");
+
+ if (name == SO_RCVBUF ||
+ name == SO_SNDBUF)
+ {
+ int i = ((Integer)value).intValue();
+ if (i < 0)
+ throw new IllegalArgumentException(
+ "Invalid send/receive buffer size");
+ } else if (name == SO_LINGER) {
+ int i = ((Integer)value).intValue();
+ if (i < 0)
+ value = Integer.valueOf(-1);
+ if (i > 65535)
+ value = Integer.valueOf(65535);
+ } else if (name.equals(SCTP_FRAGMENT_INTERLEAVE)) {
+ int i = ((Integer)value).intValue();
+ if (i < 0 || i > 2)
+ throw new IllegalArgumentException(
+ "Invalid value for SCTP_FRAGMENT_INTERLEAVE");
+ }
+
+ int arg;
+ if (type == Integer.class) {
+ arg = ((Integer)value).intValue();
+ } else {
+ boolean b = ((Boolean)value).booleanValue();
+ arg = (b) ? 1 : 0;
+ }
+
+ setIntOption0(fd, ((SctpStdSocketOption)name).constValue(), arg);
+ }
+
+ static Object getIntOption(int fd, SctpSocketOption name)
+ throws IOException {
+ Class<?> type = name.type();
+
+ if (type != Integer.class && type != Boolean.class)
+ throw new AssertionError("Should not reach here");
+
+ if (!(name instanceof SctpStdSocketOption))
+ throw new AssertionError("Should not reach here");
+
+ int value = getIntOption0(fd,
+ ((SctpStdSocketOption)name).constValue());
+
+ if (type == Integer.class) {
+ return Integer.valueOf(value);
+ } else {
+ return (value == 0) ? Boolean.FALSE : Boolean.TRUE;
+ }
+ }
+
+ static void shutdown(int fd, int assocId)
+ throws IOException {
+ shutdown0(fd, assocId);
+ }
+
+ /* Native Methods */
+ static native int socket0(boolean oneToOne) throws IOException;
+
+ static native void bindx(int fd, InetAddress[] addrs, int port, int length,
+ boolean add, boolean preferIPv6) throws IOException;
+
+ static native int getIntOption0(int fd, int opt) throws IOException;
+
+ static native void setIntOption0(int fd, int opt, int arg)
+ throws IOException;
+
+ static native SocketAddress[] getLocalAddresses0(int fd) throws IOException;
+
+ static native SocketAddress[] getRemoteAddresses0(int fd, int assocId)
+ throws IOException;
+
+ static native void setPrimAddrOption0(int fd, int assocId, InetAddress ia,
+ int port) throws IOException;
+
+ static native void setPeerPrimAddrOption0(int fd, int assocId,
+ InetAddress ia, int port) throws IOException;
+
+ static native SocketAddress getPrimAddrOption0(int fd, int assocId)
+ throws IOException;
+
+ /* retVals [0] maxInStreams, [1] maxOutStreams */
+ static native void getInitMsgOption0(int fd, int[] retVals) throws IOException;
+
+ static native void setInitMsgOption0(int fd, int arg1, int arg2)
+ throws IOException;
+
+ static native void shutdown0(int fd, int assocId);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/classes/sun/nio/ch/SctpNotification.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package sun.nio.ch;
+
+import com.sun.nio.sctp.Association;
+import com.sun.nio.sctp.Notification;
+
+/**
+ * All Notification implemenations MUST implement this interface to provide
+ * access to the native association identidier.
+ */
+interface SctpNotification extends Notification {
+ int assocId();
+ void setAssociation(Association association);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/classes/sun/nio/ch/SctpPeerAddrChange.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package sun.nio.ch;
+
+import java.net.SocketAddress;
+import com.sun.nio.sctp.Association;
+import com.sun.nio.sctp.PeerAddressChangeNotification;
+
+/**
+ * An implementation of PeerAddressChangeNotification
+ */
+public class SctpPeerAddrChange extends PeerAddressChangeNotification
+ implements SctpNotification
+{
+ /* static final ints so that they can be referenced from native */
+ private final static int SCTP_ADDR_AVAILABLE = 1;
+ private final static int SCTP_ADDR_UNREACHABLE = 2;
+ private final static int SCTP_ADDR_REMOVED = 3;
+ private final static int SCTP_ADDR_ADDED = 4;
+ private final static int SCTP_ADDR_MADE_PRIM = 5;
+ private final static int SCTP_ADDR_CONFIRMED =6;
+
+ private Association association;
+
+ /* assocId is used to lookup the association before the notification is
+ * returned to user code */
+ private int assocId;
+ private SocketAddress address;
+ private AddressChangeEvent event;
+
+ /* Invoked from native */
+ private SctpPeerAddrChange(int assocId, SocketAddress address, int intEvent) {
+ switch (intEvent) {
+ case SCTP_ADDR_AVAILABLE :
+ this.event = AddressChangeEvent.ADDR_AVAILABLE;
+ break;
+ case SCTP_ADDR_UNREACHABLE :
+ this.event = AddressChangeEvent.ADDR_UNREACHABLE;
+ break;
+ case SCTP_ADDR_REMOVED :
+ this.event = AddressChangeEvent.ADDR_REMOVED;
+ break;
+ case SCTP_ADDR_ADDED :
+ this.event = AddressChangeEvent.ADDR_ADDED;
+ break;
+ case SCTP_ADDR_MADE_PRIM :
+ this.event = AddressChangeEvent.ADDR_MADE_PRIMARY;
+ break;
+ case SCTP_ADDR_CONFIRMED :
+ this.event = AddressChangeEvent.ADDR_CONFIRMED;
+ break;
+ default:
+ throw new AssertionError("Unknown event type");
+ }
+ this.assocId = assocId;
+ this.address = address;
+ }
+
+ @Override
+ public int assocId() {
+ return assocId;
+ }
+
+ @Override
+ public void setAssociation(Association association) {
+ this.association = association;
+ }
+
+ @Override
+ public SocketAddress address() {
+ assert address != null;
+ return address;
+ }
+
+ @Override
+ public Association association() {
+ assert association != null;
+ return association;
+ }
+
+ @Override
+ public AddressChangeEvent event() {
+ assert event != null;
+ return event;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append(super.toString()).append(" [");
+ sb.append("Address: ").append(address);
+ sb.append(", Association:").append(association);
+ sb.append(", Event: ").append(event).append("]");
+ return sb.toString();
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/classes/sun/nio/ch/SctpResultContainer.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package sun.nio.ch;
+
+/**
+ * Wraps the actual message or notification so that it can be
+ * set and returned from the native receive implementation.
+ */
+public class SctpResultContainer {
+ /* static final ints so that they can be referenced from native */
+ static final int NOTHING = 0;
+ static final int MESSAGE = 1;
+ static final int SEND_FAILED = 2;
+ static final int ASSOCIATION_CHANGED = 3;
+ static final int PEER_ADDRESS_CHANGED = 4;
+ static final int SHUTDOWN = 5;
+
+ private Object value;
+ private int type;
+
+ int type() {
+ return type;
+ }
+
+ boolean hasSomething() {
+ return type() != NOTHING;
+ }
+
+ boolean isNotification() {
+ return type() != MESSAGE && type() != NOTHING ? true : false;
+ }
+
+ void clear() {
+ type = NOTHING;
+ value = null;
+ }
+
+ SctpNotification notification() {
+ assert type() != MESSAGE && type() != NOTHING;
+
+ return (SctpNotification) value;
+ }
+
+ SctpMessageInfoImpl getMessageInfo() {
+ assert type() == MESSAGE;
+
+ if (value instanceof SctpMessageInfoImpl)
+ return (SctpMessageInfoImpl) value;
+
+ return null;
+ }
+
+ SctpSendFailed getSendFailed() {
+ assert type() == SEND_FAILED;
+
+ if (value instanceof SctpSendFailed)
+ return (SctpSendFailed) value;
+
+ return null;
+ }
+
+ SctpAssocChange getAssociationChanged() {
+ assert type() == ASSOCIATION_CHANGED;
+
+ if (value instanceof SctpAssocChange)
+ return (SctpAssocChange) value;
+
+ return null;
+ }
+
+ SctpPeerAddrChange getPeerAddressChanged() {
+ assert type() == PEER_ADDRESS_CHANGED;
+
+ if (value instanceof SctpPeerAddrChange)
+ return (SctpPeerAddrChange) value;
+
+ return null;
+ }
+
+ SctpShutdown getShutdown() {
+ assert type() == SHUTDOWN;
+
+ if (value instanceof SctpShutdown)
+ return (SctpShutdown) value;
+
+ return null;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("Type: ");
+ switch (type) {
+ case NOTHING: sb.append("NOTHING"); break;
+ case MESSAGE: sb.append("MESSAGE"); break;
+ case SEND_FAILED: sb.append("SEND FAILED"); break;
+ case ASSOCIATION_CHANGED: sb.append("ASSOCIATION CHANGE"); break;
+ case PEER_ADDRESS_CHANGED: sb.append("PEER ADDRESS CHANGE"); break;
+ case SHUTDOWN: sb.append("SHUTDOWN"); break;
+ default : sb.append("Unknown result type");
+ }
+ return sb.append(", Value: ").append(value.toString()).toString();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/classes/sun/nio/ch/SctpSendFailed.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package sun.nio.ch;
+
+import java.nio.ByteBuffer;
+import java.net.SocketAddress;
+import com.sun.nio.sctp.Association;
+import com.sun.nio.sctp.SendFailedNotification;
+
+/**
+ * An implementation of SendFailedNotification
+ */
+public class SctpSendFailed extends SendFailedNotification
+ implements SctpNotification
+{
+ private Association association;
+ /* assocId is used to lookup the association before the notification is
+ * returned to user code */
+ private int assocId;
+ private SocketAddress address;
+ private ByteBuffer buffer;
+ private int errorCode;
+ private int streamNumber;
+
+ /* Invoked from native */
+ private SctpSendFailed(int assocId,
+ SocketAddress address,
+ ByteBuffer buffer,
+ int errorCode,
+ int streamNumber) {
+ this.assocId = assocId;
+ this.errorCode = errorCode;
+ this.streamNumber = streamNumber;
+ this.address = address;
+ this.buffer = buffer;
+ }
+
+ @Override
+ public int assocId() {
+ return assocId;
+ }
+
+ @Override
+ public void setAssociation(Association association) {
+ this.association = association;
+ }
+
+ @Override
+ public Association association() {
+ /* may be null */
+ return association;
+ }
+
+ @Override
+ public SocketAddress address() {
+ assert address != null;
+ return address;
+ }
+
+ @Override
+ public ByteBuffer buffer() {
+ assert buffer != null;
+ return buffer;
+ }
+
+ @Override
+ public int errorCode() {
+ return errorCode;
+ }
+
+ @Override
+ public int streamNumber() {
+ return streamNumber;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append(super.toString()).append(" [");
+ sb.append("Association:").append(association);
+ sb.append(", Address: ").append(address);
+ sb.append(", buffer: ").append(buffer);
+ sb.append(", errorCode: ").append(errorCode);
+ sb.append(", streamNumber: ").append(streamNumber);
+ sb.append("]");
+ return sb.toString();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/classes/sun/nio/ch/SctpServerChannelImpl.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,429 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package sun.nio.ch;
+
+import java.net.SocketAddress;
+import java.net.InetSocketAddress;
+import java.net.InetAddress;
+import java.io.FileDescriptor;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Set;
+import java.util.HashSet;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.AlreadyBoundException;
+import java.nio.channels.ClosedChannelException;
+import java.nio.channels.NotYetBoundException;
+import java.nio.channels.spi.SelectorProvider;
+import com.sun.nio.sctp.IllegalUnbindException;
+import com.sun.nio.sctp.SctpChannel;
+import com.sun.nio.sctp.SctpServerChannel;
+import com.sun.nio.sctp.SctpSocketOption;
+import com.sun.nio.sctp.SctpStandardSocketOption;
+
+/**
+ * An implementation of SctpServerChannel
+ */
+public class SctpServerChannelImpl extends SctpServerChannel
+ implements SelChImpl
+{
+ /* Used to make native close and preClose calls */
+ private static NativeDispatcher nd;
+
+ private final FileDescriptor fd;
+
+ private final int fdVal;
+
+ /* IDs of native thread doing accept, for signalling */
+ private volatile long thread = 0;
+
+ /* Lock held by thread currently blocked in this channel */
+ private final Object lock = new Object();
+
+ /* Lock held by any thread that modifies the state fields declared below
+ * DO NOT invoke a blocking I/O operation while holding this lock! */
+ private final Object stateLock = new Object();
+
+ private enum ChannelState {
+ UNINITIALIZED,
+ INUSE,
+ KILLPENDING,
+ KILLED,
+ }
+ /* -- The following fields are protected by stateLock -- */
+ private ChannelState state = ChannelState.UNINITIALIZED;
+
+ /* Binding: Once bound the port will remain constant. */
+ int port = -1;
+ private HashSet<InetSocketAddress> localAddresses = new HashSet<InetSocketAddress>();
+ /* Has the channel been bound to the wildcard address */
+ private boolean wildcard; /* false */
+
+ /* -- End of fields protected by stateLock -- */
+
+ /**
+ * Initializes a new instance of this class.
+ */
+ public SctpServerChannelImpl(SelectorProvider provider)
+ throws IOException {
+ //TODO: update provider remove public modifier
+ super(provider);
+ this.fd = SctpNet.socket(true);
+ this.fdVal = IOUtil.fdVal(fd);
+ this.state = ChannelState.INUSE;
+ }
+
+ @Override
+ public SctpServerChannel bind(SocketAddress local, int backlog)
+ throws IOException {
+ synchronized (lock) {
+ synchronized (stateLock) {
+ if (!isOpen())
+ throw new ClosedChannelException();
+ if (isBound())
+ throw new AlreadyBoundException();
+
+ InetSocketAddress isa = (local == null) ?
+ new InetSocketAddress(0) : Net.checkAddress(local);
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null)
+ sm.checkListen(isa.getPort());
+ Net.bind(fd, isa.getAddress(), isa.getPort());
+
+ InetSocketAddress boundIsa = Net.localAddress(fd);
+ port = boundIsa.getPort();
+ localAddresses.add(isa);
+ if (isa.getAddress().isAnyLocalAddress())
+ wildcard = true;
+
+ Net.listen(fd, backlog < 1 ? 50 : backlog);
+ }
+ }
+ return this;
+ }
+
+ @Override
+ public SctpServerChannel bindAddress(InetAddress address)
+ throws IOException {
+ return bindUnbindAddress(address, true);
+ }
+
+ @Override
+ public SctpServerChannel unbindAddress(InetAddress address)
+ throws IOException {
+ return bindUnbindAddress(address, false);
+ }
+
+ private SctpServerChannel bindUnbindAddress(InetAddress address, boolean add)
+ throws IOException {
+ if (address == null)
+ throw new IllegalArgumentException();
+
+ synchronized (lock) {
+ synchronized (stateLock) {
+ if (!isOpen())
+ throw new ClosedChannelException();
+ if (!isBound())
+ throw new NotYetBoundException();
+ if (wildcard)
+ throw new IllegalStateException(
+ "Cannot add or remove addresses from a channel that is bound to the wildcard address");
+ if (address.isAnyLocalAddress())
+ throw new IllegalArgumentException(
+ "Cannot add or remove the wildcard address");
+ if (add) {
+ for (InetSocketAddress addr : localAddresses) {
+ if (addr.getAddress().equals(address)) {
+ throw new AlreadyBoundException();
+ }
+ }
+ } else { /*removing */
+ /* Verify that there is more than one address
+ * and that address is already bound */
+ if (localAddresses.size() <= 1)
+ throw new IllegalUnbindException("Cannot remove address from a channel with only one address bound");
+ boolean foundAddress = false;
+ for (InetSocketAddress addr : localAddresses) {
+ if (addr.getAddress().equals(address)) {
+ foundAddress = true;
+ break;
+ }
+ }
+ if (!foundAddress )
+ throw new IllegalUnbindException("Cannot remove address from a channel that is not bound to that address");
+ }
+
+ SctpNet.bindx(fdVal, new InetAddress[]{address}, port, add);
+
+ /* Update our internal Set to reflect the addition/removal */
+ if (add)
+ localAddresses.add(new InetSocketAddress(address, port));
+ else {
+ for (InetSocketAddress addr : localAddresses) {
+ if (addr.getAddress().equals(address)) {
+ localAddresses.remove(addr);
+ break;
+ }
+ }
+ }
+ }
+ }
+ return this;
+ }
+
+ private boolean isBound() {
+ synchronized (stateLock) {
+ return port == -1 ? false : true;
+ }
+ }
+
+ private void acceptCleanup() throws IOException {
+ synchronized (stateLock) {
+ thread = 0;
+ if (state == ChannelState.KILLPENDING)
+ kill();
+ }
+ }
+
+ @Override
+ public SctpChannel accept() throws IOException {
+ synchronized (lock) {
+ if (!isOpen())
+ throw new ClosedChannelException();
+ if (!isBound())
+ throw new NotYetBoundException();
+ SctpChannel sc = null;
+
+ int n = 0;
+ FileDescriptor newfd = new FileDescriptor();
+ InetSocketAddress[] isaa = new InetSocketAddress[1];
+
+ try {
+ begin();
+ if (!isOpen())
+ return null;
+ thread = NativeThread.current();
+ for (;;) {
+ n = accept0(fd, newfd, isaa);
+ if ((n == IOStatus.INTERRUPTED) && isOpen())
+ continue;
+ break;
+ }
+ } finally {
+ acceptCleanup();
+ end(n > 0);
+ assert IOStatus.check(n);
+ }
+
+ if (n < 1)
+ return null;
+
+ IOUtil.configureBlocking(newfd, true);
+ InetSocketAddress isa = isaa[0];
+ sc = new SctpChannelImpl(provider(), newfd);
+
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null)
+ sm.checkAccept(isa.getAddress().getHostAddress(),
+ isa.getPort());
+
+ return sc;
+ }
+ }
+
+ @Override
+ protected void implConfigureBlocking(boolean block) throws IOException {
+ IOUtil.configureBlocking(fd, block);
+ }
+
+ @Override
+ public void implCloseSelectableChannel() throws IOException {
+ synchronized (stateLock) {
+ nd.preClose(fd);
+ if (thread != 0)
+ NativeThread.signal(thread);
+ if (!isRegistered())
+ kill();
+ }
+ }
+
+ @Override
+ public void kill() throws IOException {
+ synchronized (stateLock) {
+ if (state == ChannelState.KILLED)
+ return;
+ if (state == ChannelState.UNINITIALIZED) {
+ state = ChannelState.KILLED;
+ return;
+ }
+ assert !isOpen() && !isRegistered();
+
+ // Postpone the kill if there is a thread in accept
+ if (thread == 0) {
+ nd.close(fd);
+ state = ChannelState.KILLED;
+ } else {
+ state = ChannelState.KILLPENDING;
+ }
+ }
+ }
+
+ @Override
+ public FileDescriptor getFD() {
+ return fd;
+ }
+
+ @Override
+ public int getFDVal() {
+ return fdVal;
+ }
+
+ /**
+ * Translates native poll revent ops into a ready operation ops
+ */
+ private boolean translateReadyOps(int ops, int initialOps,
+ SelectionKeyImpl sk) {
+ int intOps = sk.nioInterestOps();
+ int oldOps = sk.nioReadyOps();
+ int newOps = initialOps;
+
+ if ((ops & PollArrayWrapper.POLLNVAL) != 0) {
+ /* This should only happen if this channel is pre-closed while a
+ * selection operation is in progress
+ * ## Throw an error if this channel has not been pre-closed */
+ return false;
+ }
+
+ if ((ops & (PollArrayWrapper.POLLERR
+ | PollArrayWrapper.POLLHUP)) != 0) {
+ newOps = intOps;
+ sk.nioReadyOps(newOps);
+ return (newOps & ~oldOps) != 0;
+ }
+
+ if (((ops & PollArrayWrapper.POLLIN) != 0) &&
+ ((intOps & SelectionKey.OP_ACCEPT) != 0))
+ newOps |= SelectionKey.OP_ACCEPT;
+
+ sk.nioReadyOps(newOps);
+ return (newOps & ~oldOps) != 0;
+ }
+
+ @Override
+ public boolean translateAndUpdateReadyOps(int ops, SelectionKeyImpl sk) {
+ return translateReadyOps(ops, sk.nioReadyOps(), sk);
+ }
+
+ @Override
+ public boolean translateAndSetReadyOps(int ops, SelectionKeyImpl sk) {
+ return translateReadyOps(ops, 0, sk);
+ }
+
+ @Override
+ public void translateAndSetInterestOps(int ops, SelectionKeyImpl sk) {
+ int newOps = 0;
+
+ /* Translate ops */
+ if ((ops & SelectionKey.OP_ACCEPT) != 0)
+ newOps |= PollArrayWrapper.POLLIN;
+ /* Place ops into pollfd array */
+ sk.selector.putEventOps(sk, newOps);
+
+ }
+
+ @Override
+ public <T> SctpServerChannel setOption(SctpSocketOption<T> name, T value)
+ throws IOException {
+ if (name == null)
+ throw new NullPointerException();
+ if (!supportedOptions().contains(name))
+ throw new UnsupportedOperationException("'" + name + "' not supported");
+
+ synchronized (stateLock) {
+ if (!isOpen())
+ throw new ClosedChannelException();
+
+ SctpNet.setSocketOption(fdVal, name, value, 0 /*oneToOne*/);
+ return this;
+ }
+ }
+
+ @Override
+ public <T> T getOption(SctpSocketOption<T> name) throws IOException {
+ if (name == null)
+ throw new NullPointerException();
+ if (!supportedOptions().contains(name))
+ throw new UnsupportedOperationException("'" + name + "' not supported");
+
+ synchronized (stateLock) {
+ if (!isOpen())
+ throw new ClosedChannelException();
+
+ return (T) SctpNet.getSocketOption(fdVal, name, 0 /*oneToOne*/);
+ }
+ }
+
+ private static class DefaultOptionsHolder {
+ static final Set<SctpSocketOption<?>> defaultOptions = defaultOptions();
+
+ private static Set<SctpSocketOption<?>> defaultOptions() {
+ HashSet<SctpSocketOption<?>> set = new HashSet<SctpSocketOption<?>>(1);
+ set.add(SctpStandardSocketOption.SCTP_INIT_MAXSTREAMS);
+ return Collections.unmodifiableSet(set);
+ }
+ }
+
+ @Override
+ public final Set<SctpSocketOption<?>> supportedOptions() {
+ return DefaultOptionsHolder.defaultOptions;
+ }
+
+ @Override
+ public Set<SocketAddress> getAllLocalAddresses()
+ throws IOException {
+ synchronized (stateLock) {
+ if (!isOpen())
+ throw new ClosedChannelException();
+ if (!isBound())
+ return null;
+
+ return SctpNet.getLocalAddresses(fdVal);
+ }
+ }
+
+ /* Native */
+ private static native void initIDs();
+
+ private static native int accept0(FileDescriptor ssfd,
+ FileDescriptor newfd, InetSocketAddress[] isaa) throws IOException;
+
+ static {
+ Util.load(); // loads nio & net native libraries
+ java.security.AccessController.doPrivileged(
+ new sun.security.action.LoadLibraryAction("sctp"));
+ nd = new SctpSocketDispatcher();
+ initIDs();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/classes/sun/nio/ch/SctpShutdown.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package sun.nio.ch;
+
+import com.sun.nio.sctp.Association;
+import com.sun.nio.sctp.ShutdownNotification;
+
+/**
+ * An implementation of ShutdownNotification
+ */
+public class SctpShutdown extends ShutdownNotification
+ implements SctpNotification
+{
+ private Association association;
+ /* assocId is used to lookup the association before the notification is
+ * returned to user code */
+ private int assocId;
+
+ /* Invoked from native */
+ private SctpShutdown(int assocId) {
+ this.assocId = assocId;
+ }
+
+ @Override
+ public int assocId() {
+ return assocId;
+ }
+
+ @Override
+ public void setAssociation(Association association) {
+ this.association = association;
+ }
+
+ @Override
+ public Association association() {
+ assert association != null;
+ return association;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append(super.toString()).append(" [");
+ sb.append("Association:").append(association).append("]");
+ return sb.toString();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/classes/sun/nio/ch/SctpSocketDispatcher.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package sun.nio.ch;
+
+import java.io.IOException;
+import java.io.FileDescriptor;
+
+/**
+ * Only used for {@code close} and {@code preclose}. All other methods
+ * throw {@code IOException}.
+ */
+class SctpSocketDispatcher extends NativeDispatcher {
+ @Override
+ @SuppressWarnings("unused")
+ int read(FileDescriptor fd, long address, int len) throws IOException {
+ throw new IOException("Operation Unsupported");
+ }
+
+ @Override
+ @SuppressWarnings("unused")
+ long readv(FileDescriptor fd, long address, int len) throws IOException {
+ throw new IOException("Operation Unsupported");
+ }
+
+ @Override
+ @SuppressWarnings("unused")
+ int write(FileDescriptor fd, long address, int len) throws IOException {
+ throw new IOException("Operation Unsupported");
+ }
+
+ @Override
+ @SuppressWarnings("unused")
+ long writev(FileDescriptor fd, long address, int len) throws IOException {
+ throw new IOException("Operation Unsupported");
+ }
+
+ @Override
+ void close(FileDescriptor fd) throws IOException {
+ FileDispatcherImpl.close0(fd);
+ }
+
+ @Override
+ void preClose(FileDescriptor fd) throws IOException {
+ FileDispatcherImpl.preClose0(fd);
+ }
+}
--- a/jdk/src/solaris/classes/sun/nio/ch/UnixAsynchronousSocketChannelImpl.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/classes/sun/nio/ch/UnixAsynchronousSocketChannelImpl.java Mon Apr 27 12:33:57 2009 -0700
@@ -32,6 +32,7 @@
import java.io.IOException;
import java.io.FileDescriptor;
import java.security.AccessController;
+import sun.net.NetHooks;
import sun.security.action.GetPropertyAction;
/**
@@ -305,6 +306,7 @@
sm.checkConnect(isa.getAddress().getHostAddress(), isa.getPort());
// check and set state
+ boolean notifyBeforeTcpConnect;
synchronized (stateLock) {
if (state == ST_CONNECTED)
throw new AlreadyConnectedException();
@@ -312,12 +314,16 @@
throw new ConnectionPendingException();
state = ST_PENDING;
pendingRemote = remote;
+ notifyBeforeTcpConnect = (localAddress == null);
}
AbstractFuture<Void,A> result = null;
Throwable e = null;
try {
begin();
+ // notify hook if unbound
+ if (notifyBeforeTcpConnect)
+ NetHooks.beforeTcpConnect(fd, isa.getAddress(), isa.getPort());
int n = Net.connect(fd, isa.getAddress(), isa.getPort());
if (n == IOStatus.UNAVAILABLE) {
// connection could not be established immediately
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/lib/sdp/sdp.conf.template Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,30 @@
+#
+# Configuration file to enable InfiniBand Sockets Direct Protocol.
+#
+# Each line that does not start with a comment (#) is a rule to indicate when
+# the SDP transport protocol should be used. The format of a rule is as follows:
+# ("bind"|"connect") 1*LWSP-char (hostname|ipaddress["/"prefix]) 1*LWSP-char ("*"|port)["-"("*"|port)]
+#
+# A "bind" rule indicates that the SDP protocol transport should be used when
+# a TCP socket binds to an address/port that matches the rule. A "connect" rule
+# indicates that the SDP protocol transport should be used when an unbound
+# TCP socket attempts to connect to an address/port that matches the rule.
+# Addresses may be specified as hostnames or literal Internet Protocol (IP)
+# addresses. When a literal IP address is used then a prefix length may be used
+# to indicate the number of bits for matching (useful when a block of addresses
+# or subnet is allocated to the InfiniBand fabric).
+
+# Use SDP for all sockets that bind to specific local addresses
+#bind 192.168.1.1 *
+#bind fe80::21b:24ff:fe3d:7896 *
+
+# Use SDP for all sockets that bind to the wildcard address in a port range
+#bind 0.0.0.0 5000-5999
+#bind ::0 5000-5999
+
+# Use SDP when connecting to all application services on 192.168.1.*
+#connect 192.168.1.0/24 1024-*
+
+# Use SDP when connecting to the http server or MySQL database on hpccluster.
+#connect hpccluster.foo.com 80
+#connect hpccluster.foo.com 3306
--- a/jdk/src/solaris/native/sun/awt/awt_Component.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/native/sun/awt/awt_Component.h Mon Apr 27 12:33:57 2009 -0700
@@ -41,7 +41,6 @@
jfieldID appContext;
jmethodID getParent;
jmethodID getLocationOnScreen;
- jmethodID resetGCMID;
};
/* field and method IDs for Container */
@@ -65,7 +64,3 @@
extern void processTree(Widget from, Widget to, Boolean action);
#endif // HEADLESS
-/* fieldIDs for Canvas fields that may be accessed from C */
-struct CanvasIDs {
- jmethodID setGCFromPeerMID;
-};
--- a/jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -354,6 +354,48 @@
return NULL;
}
+/* Note: until we include the <X11/extensions/Xrender.h> explicitly
+ * we have to define a couple of things ourselves.
+ */
+typedef unsigned long PictFormat;
+#define PictTypeIndexed 0
+#define PictTypeDirect 1
+
+typedef struct {
+ short red;
+ short redMask;
+ short green;
+ short greenMask;
+ short blue;
+ short blueMask;
+ short alpha;
+ short alphaMask;
+} XRenderDirectFormat;
+
+typedef struct {
+ PictFormat id;
+ int type;
+ int depth;
+ XRenderDirectFormat direct;
+ Colormap colormap;
+} XRenderPictFormat;
+
+#define PictFormatID (1 << 0)
+#define PictFormatType (1 << 1)
+#define PictFormatDepth (1 << 2)
+#define PictFormatRed (1 << 3)
+#define PictFormatRedMask (1 << 4)
+#define PictFormatGreen (1 << 5)
+#define PictFormatGreenMask (1 << 6)
+#define PictFormatBlue (1 << 7)
+#define PictFormatBlueMask (1 << 8)
+#define PictFormatAlpha (1 << 9)
+#define PictFormatAlphaMask (1 << 10)
+#define PictFormatColormap (1 << 11)
+
+typedef XRenderPictFormat *
+XRenderFindVisualFormatFunc (Display *dpy, _Xconst Visual *visual);
+
static void
getAllConfigs (JNIEnv *env, int screen, AwtScreenDataPtr screenDataPtr) {
@@ -367,6 +409,9 @@
int ind;
char errmsg[128];
int xinawareScreen;
+ void* xrenderLibHandle = NULL;
+ XRenderFindVisualFormatFunc *XRenderFindVisualFormat = NULL;
+ int major_opcode, first_event, first_error;
if (usingXinerama) {
xinawareScreen = 0;
@@ -449,6 +494,26 @@
graphicsConfigs[0] = defaultConfig;
nConfig = 1; /* reserve index 0 for default config */
+ // Only use the RENDER extension if it is available on the X server
+ if (XQueryExtension(awt_display, "RENDER",
+ &major_opcode, &first_event, &first_error))
+ {
+ xrenderLibHandle = dlopen("libXrender.so.1", RTLD_LAZY | RTLD_GLOBAL);
+
+#ifndef __linux__ /* SOLARIS */
+ if (xrenderLibHandle == NULL) {
+ xrenderLibHandle = dlopen("/usr/sfw/lib/libXrender.so.1",
+ RTLD_LAZY | RTLD_GLOBAL);
+ }
+#endif
+
+ if (xrenderLibHandle != NULL) {
+ XRenderFindVisualFormat =
+ (XRenderFindVisualFormatFunc*)dlsym(xrenderLibHandle,
+ "XRenderFindVisualFormat");
+ }
+ }
+
for (i = 0; i < nTrue; i++) {
if (XVisualIDFromVisual(pVITrue[i].visual) ==
XVisualIDFromVisual(defaultConfig->awt_visInfo.visual) ||
@@ -462,6 +527,21 @@
graphicsConfigs [ind]->awt_depth = pVITrue [i].depth;
memcpy (&graphicsConfigs [ind]->awt_visInfo, &pVITrue [i],
sizeof (XVisualInfo));
+ if (XRenderFindVisualFormat != NULL) {
+ XRenderPictFormat *format = XRenderFindVisualFormat (awt_display,
+ pVITrue [i].visual);
+ if (format &&
+ format->type == PictTypeDirect &&
+ format->direct.alphaMask)
+ {
+ graphicsConfigs [ind]->isTranslucencySupported = 1;
+ }
+ }
+ }
+
+ if (xrenderLibHandle != NULL) {
+ dlclose(xrenderLibHandle);
+ xrenderLibHandle = NULL;
}
for (i = 0; i < n8p; i++) {
@@ -1506,6 +1586,26 @@
}
/*
+ * Class: sun_awt_X11GraphicsConfig
+ * Method: isTranslucencyCapable
+ * Signature: (J)V
+ */
+JNIEXPORT jboolean JNICALL
+Java_sun_awt_X11GraphicsConfig_isTranslucencyCapable
+ (JNIEnv *env, jobject this, jlong configData)
+{
+#ifdef HEADLESS
+ return JNI_FALSE;
+#else
+ AwtGraphicsConfigDataPtr aData = (AwtGraphicsConfigDataPtr)jlong_to_ptr(configData);
+ if (aData == NULL) {
+ return JNI_FALSE;
+ }
+ return (jboolean)aData->isTranslucencySupported;
+#endif
+}
+
+/*
* Class: sun_awt_X11GraphicsDevice
* Method: isDBESupported
* Signature: ()Z
--- a/jdk/src/solaris/native/sun/awt/awt_Window.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/native/sun/awt/awt_Window.h Mon Apr 27 12:33:57 2009 -0700
@@ -28,7 +28,6 @@
/* fieldIDs for Window fields that may be accessed from C */
struct WindowIDs {
jfieldID warningString;
- jmethodID resetGCMID;
jfieldID locationByPlatform;
jfieldID isAutoRequestFocus;
};
--- a/jdk/src/solaris/native/sun/awt/awt_p.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/native/sun/awt/awt_p.h Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1995-2005 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1995-2009 Sun Microsystems, Inc. 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
@@ -135,6 +135,7 @@
int pixelStride; /* Used in X11SurfaceData.c */
ColorData *color_data;
struct _GLXGraphicsConfigInfo *glxInfo;
+ int isTranslucencySupported; /* Uses Xrender to find this out. */
} AwtGraphicsConfigData;
typedef AwtGraphicsConfigData* AwtGraphicsConfigDataPtr;
--- a/jdk/src/solaris/native/sun/awt/gtk2_interface.c Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/native/sun/awt/gtk2_interface.c Mon Apr 27 12:33:57 2009 -0700
@@ -93,6 +93,7 @@
/* Static buffer for conversion from java.lang.String to UTF-8 */
static char convertionBuffer[CONV_BUFFER_SIZE];
+static gboolean new_combo = TRUE;
const char ENV_PREFIX[] = "GTK_MODULES=";
/*******************/
@@ -608,6 +609,7 @@
dlsym(gtk2_libhandle, "gtk_combo_box_entry_new");
if (fp_gtk_combo_box_entry_new == NULL) {
fp_gtk_combo_box_entry_new = dl_symbol("gtk_combo_new");
+ new_combo = FALSE;
}
fp_gtk_separator_tool_item_new =
@@ -1423,17 +1425,13 @@
*/
GtkWidget *combo = (*fp_gtk_combo_box_entry_new)();
- if (widget_type == COMBO_BOX_TEXT_FIELD)
- (*fp_gtk_container_add)((GtkContainer *)combo, result);
- else
- {
+ if (new_combo && widget_type == COMBO_BOX_ARROW_BUTTON) {
(*fp_gtk_widget_set_parent)(result, combo);
((GtkBin*)combo)->child = result;
+ } else {
+ (*fp_gtk_container_add)((GtkContainer *)combo, result);
}
-
(*fp_gtk_container_add)((GtkContainer *)gtk2_fixed, combo);
- (*fp_gtk_widget_realize)(result);
- return result;
}
else if (widget_type != TOOL_TIP &&
widget_type != INTERNAL_FRAME &&
--- a/jdk/src/solaris/native/sun/awt/utility/rect.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/native/sun/awt/utility/rect.h Mon Apr 27 12:33:57 2009 -0700
@@ -43,4 +43,15 @@
#define RECT_INC_HEIGHT(r) (r).height++
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+int BitmapToYXBandedRectangles(int bitsPerPixel, int width, int height,
+ unsigned char * buf, RECT_T * outBuf);
+
+#if defined(__cplusplus)
+}
+#endif
+
#endif // _AWT_RECT_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/native/sun/net/spi/SdpProvider.c Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#if defined(__solaris__) && !defined(PROTO_SDP)
+#define PROTO_SDP 257
+#endif
+
+#include "jni.h"
+#include "jni_util.h"
+#include "net_util.h"
+
+#define RESTARTABLE(_cmd, _result) do { \
+ do { \
+ _result = _cmd; \
+ } while((_result == -1) && (errno == EINTR)); \
+} while(0)
+
+JNIEXPORT void JNICALL
+Java_sun_net_spi_SdpProvider_convert(JNIEnv *env, jclass cls, jint fd)
+{
+#ifdef PROTO_SDP
+ int domain = ipv6_available() ? AF_INET6 : AF_INET;
+ int s = socket(domain, SOCK_STREAM, PROTO_SDP);
+ if (s < 0) {
+ JNU_ThrowIOExceptionWithLastError(env, "socket");
+ } else {
+ int arg, len, res;
+ struct linger linger;
+
+ /* copy socket options that are relevant to SDP */
+ len = sizeof(arg);
+ if (getsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char*)&arg, &len) == 0)
+ setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char*)&arg, len);
+ len = sizeof(arg);
+ if (getsockopt(fd, SOL_SOCKET, SO_OOBINLINE, (char*)&arg, &len) == 0)
+ setsockopt(s, SOL_SOCKET, SO_OOBINLINE, (char*)&arg, len);
+ len = sizeof(linger);
+ if (getsockopt(fd, SOL_SOCKET, SO_LINGER, (void*)&linger, &len) == 0)
+ setsockopt(s, SOL_SOCKET, SO_LINGER, (char*)&linger, len);
+
+ RESTARTABLE(dup2(s, fd), res);
+ if (res < 0)
+ JNU_ThrowIOExceptionWithLastError(env, "dup2");
+ RESTARTABLE(close(s), res);
+ }
+#else
+ JNU_ThrowInternalError(env, "should not reach here");
+#endif
+}
--- a/jdk/src/solaris/native/sun/nio/ch/DevPollArrayWrapper.c Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/native/sun/nio/ch/DevPollArrayWrapper.c Mon Apr 27 12:33:57 2009 -0700
@@ -28,6 +28,7 @@
#include "jvm.h"
#include "jlong.h"
#include "sun_nio_ch_DevPollArrayWrapper.h"
+#include "java_lang_Integer.h"
#include <sys/poll.h>
#include <sys/resource.h>
#include <unistd.h>
@@ -192,7 +193,11 @@
JNU_ThrowIOExceptionWithLastError(env,
"getrlimit failed");
}
- return (jint)rlp.rlim_max;
+ if (rlp.rlim_max < 0 || rlp.rlim_max > java_lang_Integer_MAX_VALUE) {
+ return java_lang_Integer_MAX_VALUE;
+ } else {
+ return (jint)rlp.rlim_max;
+ }
}
JNIEXPORT void JNICALL
--- a/jdk/src/solaris/native/sun/nio/ch/FileChannelImpl.c Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/native/sun/nio/ch/FileChannelImpl.c Mon Apr 27 12:33:57 2009 -0700
@@ -231,6 +231,8 @@
if (result < 0) {
if (errno == EAGAIN)
return IOS_UNAVAILABLE;
+ if (errno == EOPNOTSUPP)
+ return IOS_UNSUPPORTED_CASE;
if ((errno == EINVAL) && ((ssize_t)count >= 0))
return IOS_UNSUPPORTED_CASE;
if (errno == EINTR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/native/sun/nio/ch/Sctp.h Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,329 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+#ifndef SUN_NIO_CH_SCTP_H
+#define SUN_NIO_CH_SCTP_H
+
+#ifdef __solaris__
+
+#define _XPG4_2
+#define __EXTENSIONS__
+#include <sys/socket.h>
+#include <netinet/sctp.h>
+#include "jni.h"
+
+/* Current Solaris headers don't comply with draft rfc */
+#ifndef SCTP_EOF
+#define SCTP_EOF MSG_EOF
+#endif
+
+#ifndef SCTP_UNORDERED
+#define SCTP_UNORDERED MSG_UNORDERED
+#endif
+
+/* The current version of the socket API extension shipped with Solaris does
+ * not define the following options that the Java API (optionally) supports */
+#ifndef SCTP_EXPLICIT_EOR
+#define SCTP_EXPLICIT_EOR -1
+#endif
+#ifndef SCTP_FRAGMENT_INTERLEAVE
+#define SCTP_FRAGMENT_INTERLEAVE -1
+#endif
+#ifndef SCTP_SET_PEER_PRIMARY_ADDR
+#define SCTP_SET_PEER_PRIMARY_ADDR -1
+#endif
+
+/* Function types to support dynamic linking of socket API extension functions
+ * for SCTP. This is so that there is no linkage depandancy during build or
+ * runtime for libsctp.*/
+typedef int sctp_getladdrs_func(int sock, sctp_assoc_t id, void **addrs);
+typedef int sctp_freeladdrs_func(void* addrs);
+typedef int sctp_getpaddrs_func(int sock, sctp_assoc_t id, void **addrs);
+typedef int sctp_freepaddrs_func(void *addrs);
+typedef int sctp_bindx_func(int sock, void *addrs, int addrcnt, int flags);
+
+
+#else /* __linux__ */
+#include <stdint.h>
+#include <linux/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include "jni.h"
+
+//Causes compiler error if not found, should make warning and uncomment
+/*#include <netinet/sctp.h>*/
+
+#ifndef IPPROTO_SCTP
+#define IPPROTO_SCTP 132
+#endif
+
+/* The current version of lksctp does
+ * not define the following option that the Java API (optionally) supports */
+#ifndef SCTP_EXPLICIT_EOR
+#define SCTP_EXPLICIT_EOR -1
+#endif
+
+/* Definitions taken from lksctp-tools-1.0.8/src/include/netinet/sctp.h */
+#ifndef SCTP_INITMSG
+
+enum sctp_optname {
+ SCTP_RTOINFO,
+#define SCTP_RTOINFO SCTP_RTOINFO
+ SCTP_ASSOCINFO,
+#define SCTP_ASSOCINFO SCTP_ASSOCINFO
+ SCTP_INITMSG,
+#define SCTP_INITMSG SCTP_INITMSG
+ SCTP_NODELAY, /* Get/set nodelay option. */
+#define SCTP_NODELAY SCTP_NODELAY
+ SCTP_AUTOCLOSE,
+#define SCTP_AUTOCLOSE SCTP_AUTOCLOSE
+ SCTP_SET_PEER_PRIMARY_ADDR,
+#define SCTP_SET_PEER_PRIMARY_ADDR SCTP_SET_PEER_PRIMARY_ADDR
+ SCTP_PRIMARY_ADDR,
+#define SCTP_PRIMARY_ADDR SCTP_PRIMARY_ADDR
+ SCTP_ADAPTATION_LAYER,
+#define SCTP_ADAPTATION_LAYER SCTP_ADAPTATION_LAYER
+ SCTP_DISABLE_FRAGMENTS,
+#define SCTP_DISABLE_FRAGMENTS SCTP_DISABLE_FRAGMENTS
+ SCTP_PEER_ADDR_PARAMS,
+#define SCTP_PEER_ADDR_PARAMS SCTP_PEER_ADDR_PARAMS
+ SCTP_DEFAULT_SEND_PARAM,
+#define SCTP_DEFAULT_SEND_PARAM SCTP_DEFAULT_SEND_PARAM
+ SCTP_EVENTS,
+#define SCTP_EVENTS SCTP_EVENTS
+ SCTP_I_WANT_MAPPED_V4_ADDR, /* Turn on/off mapped v4 addresses */
+#define SCTP_I_WANT_MAPPED_V4_ADDR SCTP_I_WANT_MAPPED_V4_ADDR
+ SCTP_MAXSEG, /* Get/set maximum fragment. */
+#define SCTP_MAXSEG SCTP_MAXSEG
+ SCTP_STATUS,
+#define SCTP_STATUS SCTP_STATUS
+ SCTP_GET_PEER_ADDR_INFO,
+#define SCTP_GET_PEER_ADDR_INFO SCTP_GET_PEER_ADDR_INFO
+ SCTP_DELAYED_ACK_TIME,
+#define SCTP_DELAYED_ACK_TIME SCTP_DELAYED_ACK_TIME
+ SCTP_CONTEXT, /* Receive Context */
+#define SCTP_CONTEXT SCTP_CONTEXT
+ SCTP_FRAGMENT_INTERLEAVE,
+#define SCTP_FRAGMENT_INTERLEAVE SCTP_FRAGMENT_INTERLEAVE
+ SCTP_PARTIAL_DELIVERY_POINT, /* Set/Get partial delivery point */
+#define SCTP_PARTIAL_DELIVERY_POINT SCTP_PARTIAL_DELIVERY_POINT
+ SCTP_MAX_BURST, /* Set/Get max burst */
+#define SCTP_MAX_BURST SCTP_MAX_BURST
+};
+
+enum sctp_sac_state {
+ SCTP_COMM_UP,
+ SCTP_COMM_LOST,
+ SCTP_RESTART,
+ SCTP_SHUTDOWN_COMP,
+ SCTP_CANT_STR_ASSOC,
+};
+
+enum sctp_spc_state {
+ SCTP_ADDR_AVAILABLE,
+ SCTP_ADDR_UNREACHABLE,
+ SCTP_ADDR_REMOVED,
+ SCTP_ADDR_ADDED,
+ SCTP_ADDR_MADE_PRIM,
+ SCTP_ADDR_CONFIRMED,
+};
+
+enum sctp_sinfo_flags {
+ SCTP_UNORDERED = 1, /* Send/receive message unordered. */
+ SCTP_ADDR_OVER = 2, /* Override the primary destination. */
+ SCTP_ABORT=4, /* Send an ABORT message to the peer. */
+ SCTP_EOF=MSG_FIN, /* Initiate graceful shutdown process. */
+};
+
+enum sctp_sn_type {
+ SCTP_SN_TYPE_BASE = (1<<15),
+ SCTP_ASSOC_CHANGE,
+ SCTP_PEER_ADDR_CHANGE,
+ SCTP_SEND_FAILED,
+ SCTP_REMOTE_ERROR,
+ SCTP_SHUTDOWN_EVENT,
+ SCTP_PARTIAL_DELIVERY_EVENT,
+ SCTP_ADAPTATION_INDICATION,
+};
+
+typedef enum sctp_cmsg_type {
+ SCTP_INIT, /* 5.2.1 SCTP Initiation Structure */
+#define SCTP_INIT SCTP_INIT
+ SCTP_SNDRCV, /* 5.2.2 SCTP Header Information Structure */
+#define SCTP_SNDRCV SCTP_SNDRCV
+} sctp_cmsg_t;
+
+enum sctp_msg_flags {
+ MSG_NOTIFICATION = 0x8000,
+#define MSG_NOTIFICATION MSG_NOTIFICATION
+};
+
+#define SCTP_BINDX_ADD_ADDR 0x01
+#define SCTP_BINDX_REM_ADDR 0x02
+
+typedef __s32 sctp_assoc_t;
+
+struct sctp_initmsg {
+ __u16 sinit_num_ostreams;
+ __u16 sinit_max_instreams;
+ __u16 sinit_max_attempts;
+ __u16 sinit_max_init_timeo;
+};
+
+struct sctp_sndrcvinfo {
+ __u16 sinfo_stream;
+ __u16 sinfo_ssn;
+ __u16 sinfo_flags;
+ __u32 sinfo_ppid;
+ __u32 sinfo_context;
+ __u32 sinfo_timetolive;
+ __u32 sinfo_tsn;
+ __u32 sinfo_cumtsn;
+ sctp_assoc_t sinfo_assoc_id;
+};
+
+struct sctp_event_subscribe {
+ __u8 sctp_data_io_event;
+ __u8 sctp_association_event;
+ __u8 sctp_address_event;
+ __u8 sctp_send_failure_event;
+ __u8 sctp_peer_error_event;
+ __u8 sctp_shutdown_event;
+ __u8 sctp_partial_delivery_event;
+ __u8 sctp_adaptation_layer_event;
+};
+
+struct sctp_send_failed {
+ __u16 ssf_type;
+ __u16 ssf_flags;
+ __u32 ssf_length;
+ __u32 ssf_error;
+ struct sctp_sndrcvinfo ssf_info;
+ sctp_assoc_t ssf_assoc_id;
+ __u8 ssf_data[0];
+};
+
+struct sctp_assoc_change {
+ __u16 sac_type;
+ __u16 sac_flags;
+ __u32 sac_length;
+ __u16 sac_state;
+ __u16 sac_error;
+ __u16 sac_outbound_streams;
+ __u16 sac_inbound_streams;
+ sctp_assoc_t sac_assoc_id;
+ __u8 sac_info[0];
+};
+
+struct sctp_shutdown_event {
+ __u16 sse_type;
+ __u16 sse_flags;
+ __u32 sse_length;
+ sctp_assoc_t sse_assoc_id;
+};
+
+struct sctp_paddr_change {
+ __u16 spc_type;
+ __u16 spc_flags;
+ __u32 spc_length;
+ struct sockaddr_storage spc_aaddr;
+ int spc_state;
+ int spc_error;
+ sctp_assoc_t spc_assoc_id;
+} __attribute__((packed, aligned(4)));
+
+struct sctp_remote_error {
+ __u16 sre_type;
+ __u16 sre_flags;
+ __u32 sre_length;
+ __u16 sre_error;
+ sctp_assoc_t sre_assoc_id;
+ __u8 sre_data[0];
+};
+
+struct sctp_adaptation_event {
+ __u16 sai_type;
+ __u16 sai_flags;
+ __u32 sai_length;
+ __u32 sai_adaptation_ind;
+ sctp_assoc_t sai_assoc_id;
+};
+
+struct sctp_setprim {
+ sctp_assoc_t ssp_assoc_id;
+ struct sockaddr_storage ssp_addr;
+} __attribute__((packed, aligned(4)));
+
+struct sctp_setpeerprim {
+ sctp_assoc_t sspp_assoc_id;
+ struct sockaddr_storage sspp_addr;
+} __attribute__((packed, aligned(4)));
+
+
+struct sctp_pdapi_event {
+ __u16 pdapi_type;
+ __u16 pdapi_flags;
+ __u32 pdapi_length;
+ __u32 pdapi_indication;
+ sctp_assoc_t pdapi_assoc_id;
+};
+
+union sctp_notification {
+ struct {
+ __u16 sn_type; /* Notification type. */
+ __u16 sn_flags;
+ __u32 sn_length;
+ } sn_header;
+ struct sctp_assoc_change sn_assoc_change;
+ struct sctp_paddr_change sn_paddr_change;
+ struct sctp_remote_error sn_remote_error;
+ struct sctp_send_failed sn_send_failed;
+ struct sctp_shutdown_event sn_shutdown_event;
+ struct sctp_adaptation_event sn_adaptation_event;
+ struct sctp_pdapi_event sn_pdapi_event;
+};
+
+#endif /* SCTP_INITMSG */
+
+/* Function types to support dynamic linking of socket API extension functions
+ * for SCTP. This is so that there is no linkage depandancy during build or
+ * runtime for libsctp.*/
+typedef int sctp_getladdrs_func(int sd, sctp_assoc_t id, struct sockaddr **addrs);
+typedef int sctp_freeladdrs_func(struct sockaddr *addrs);
+typedef int sctp_getpaddrs_func(int sd, sctp_assoc_t id, struct sockaddr **addrs);
+typedef int sctp_freepaddrs_func(struct sockaddr *addrs);
+typedef int sctp_bindx_func(int sd, struct sockaddr *addrs, int addrcnt, int flags);
+
+#endif /* __linux__ */
+
+sctp_getladdrs_func* nio_sctp_getladdrs;
+sctp_freeladdrs_func* nio_sctp_freeladdrs;
+sctp_getpaddrs_func* nio_sctp_getpaddrs;
+sctp_freepaddrs_func* nio_sctp_freepaddrs;
+sctp_bindx_func* nio_sctp_bindx;
+
+jboolean loadSocketExtensionFuncs(JNIEnv* env);
+
+#endif /* !SUN_NIO_CH_SCTP_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/native/sun/nio/ch/SctpChannelImpl.c Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,594 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include "Sctp.h"
+
+#include "jni.h"
+#include "nio_util.h"
+#include "nio.h"
+#include "net_util.h"
+#include "net_util_md.h"
+#include "sun_nio_ch_SctpNet.h"
+#include "sun_nio_ch_SctpChannelImpl.h"
+#include "sun_nio_ch_SctpAssocChange.h"
+#include "sun_nio_ch_SctpResultContainer.h"
+#include "sun_nio_ch_SctpPeerAddrChange.h"
+
+/* sizeof(union sctp_notification */
+#define NOTIFICATION_BUFFER_SIZE 280
+
+#define MESSAGE_IMPL_CLASS "sun/nio/ch/SctpMessageInfoImpl"
+#define RESULT_CONTAINER_CLASS "sun/nio/ch/SctpResultContainer"
+#define SEND_FAILED_CLASS "sun/nio/ch/SctpSendFailed"
+#define ASSOC_CHANGE_CLASS "sun/nio/ch/SctpAssocChange"
+#define PEER_CHANGE_CLASS "sun/nio/ch/SctpPeerAddrChange"
+#define SHUTDOWN_CLASS "sun/nio/ch/SctpShutdown"
+
+struct controlData {
+ int assocId;
+ unsigned short streamNumber;
+ jboolean unordered;
+ unsigned int ppid;
+};
+
+static jclass smi_class; /* sun.nio.ch.SctpMessageInfoImpl */
+static jmethodID smi_ctrID; /* sun.nio.ch.SctpMessageInfoImpl.<init> */
+static jfieldID src_valueID; /* sun.nio.ch.SctpResultContainer.value */
+static jfieldID src_typeID; /* sun.nio.ch.SctpResultContainer.type */
+static jclass ssf_class; /* sun.nio.ch.SctpSendFailed */
+static jmethodID ssf_ctrID; /* sun.nio.ch.SctpSendFailed.<init> */
+static jclass sac_class; /* sun.nio.ch.SctpAssociationChanged */
+static jmethodID sac_ctrID; /* sun.nio.ch.SctpAssociationChanged.<init> */
+static jclass spc_class; /* sun.nio.ch.SctpPeerAddressChanged */
+static jmethodID spc_ctrID; /* sun.nio.ch.SctpPeerAddressChanged.<init> */
+static jclass ss_class; /* sun.nio.ch.SctpShutdown */
+static jmethodID ss_ctrID; /* sun.nio.ch.SctpShutdown.<init> */
+static jfieldID isa_addrID; /* java.net.InetSocketAddress.addr */
+static jfieldID isa_portID; /* java.net.InetSocketAddress.port */
+
+/* defined in SctpNet.c */
+jobject SockAddrToInetSocketAddress(JNIEnv* env, struct sockaddr* addr);
+
+/* use SocketChannelImpl's checkConnect implementation */
+extern jint Java_sun_nio_ch_SocketChannelImpl_checkConnect(JNIEnv* env,
+ jobject this, jobject fdo, jboolean block, jboolean ready);
+
+/*
+ * Class: sun_nio_ch_SctpChannelImpl
+ * Method: initIDs
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_sun_nio_ch_SctpChannelImpl_initIDs
+ (JNIEnv *env, jclass klass) {
+ jclass cls;
+
+ /* SctpMessageInfoImpl */
+ cls = (*env)->FindClass(env, MESSAGE_IMPL_CLASS);
+ CHECK_NULL(cls);
+ smi_class = (*env)->NewGlobalRef(env, cls);
+ CHECK_NULL(smi_class);
+ smi_ctrID = (*env)->GetMethodID(env, cls, "<init>",
+ "(ILjava/net/SocketAddress;IIZZI)V");
+ CHECK_NULL(smi_ctrID);
+
+ /* SctpResultContainer */
+ cls = (*env)->FindClass(env, RESULT_CONTAINER_CLASS);
+ CHECK_NULL(cls);
+ src_valueID = (*env)->GetFieldID(env, cls, "value", "Ljava/lang/Object;");
+ CHECK_NULL(src_valueID);
+ src_typeID = (*env)->GetFieldID(env, cls, "type", "I");
+ CHECK_NULL(src_typeID);
+
+ /* SctpSendFailed */
+ cls = (*env)->FindClass(env, SEND_FAILED_CLASS);
+ CHECK_NULL(cls);
+ ssf_class = (*env)->NewGlobalRef(env, cls);
+ CHECK_NULL(ssf_class);
+ ssf_ctrID = (*env)->GetMethodID(env, cls, "<init>",
+ "(ILjava/net/SocketAddress;Ljava/nio/ByteBuffer;II)V");
+ CHECK_NULL(ssf_ctrID);
+
+ /* SctpAssocChange */
+ cls = (*env)->FindClass(env, ASSOC_CHANGE_CLASS);
+ CHECK_NULL(cls);
+ sac_class = (*env)->NewGlobalRef(env, cls);
+ CHECK_NULL(sac_class);
+ sac_ctrID = (*env)->GetMethodID(env, cls, "<init>", "(IIII)V");
+ CHECK_NULL(sac_ctrID);
+
+ /* SctpPeerAddrChange */
+ cls = (*env)->FindClass(env, PEER_CHANGE_CLASS);
+ CHECK_NULL(cls);
+ spc_class = (*env)->NewGlobalRef(env, cls);
+ CHECK_NULL(spc_class);
+ spc_ctrID = (*env)->GetMethodID(env, cls, "<init>",
+ "(ILjava/net/SocketAddress;I)V");
+ CHECK_NULL(spc_ctrID);
+
+ /* sun.nio.ch.SctpShutdown */
+ cls = (*env)->FindClass(env, SHUTDOWN_CLASS);
+ CHECK_NULL(cls);
+ ss_class = (*env)->NewGlobalRef(env, cls);
+ CHECK_NULL(ss_class);
+ ss_ctrID = (*env)->GetMethodID(env, cls, "<init>", "(I)V");
+ CHECK_NULL(ss_ctrID);
+
+ /* InetSocketAddress */
+ cls = (*env)->FindClass(env, "java/net/InetSocketAddress");
+ CHECK_NULL(cls);
+ isa_addrID = (*env)->GetFieldID(env, cls, "addr", "Ljava/net/InetAddress;");
+ CHECK_NULL(isa_addrID);
+ isa_portID = (*env)->GetFieldID(env, cls, "port", "I");
+}
+
+void getControlData
+ (struct msghdr* msg, struct controlData* cdata) {
+ struct cmsghdr* cmsg;
+
+ for (cmsg = CMSG_FIRSTHDR(msg); cmsg != NULL; cmsg = CMSG_NXTHDR(msg, cmsg)) {
+ if (cmsg->cmsg_level == IPPROTO_SCTP && cmsg->cmsg_type == SCTP_SNDRCV) {
+ struct sctp_sndrcvinfo *sri;
+
+ sri = (struct sctp_sndrcvinfo *) CMSG_DATA(cmsg);
+ cdata->assocId = sri->sinfo_assoc_id;
+ cdata->streamNumber = sri->sinfo_stream;
+ cdata->unordered = (sri->sinfo_flags & SCTP_UNORDERED) ? JNI_TRUE :
+ JNI_FALSE;
+ cdata->ppid = ntohl(sri->sinfo_ppid);
+
+ return;
+ }
+ }
+ return;
+}
+
+void setControlData
+ (struct msghdr* msg, struct controlData* cdata) {
+ struct cmsghdr* cmsg;
+ struct sctp_sndrcvinfo *sri;
+
+ cmsg = CMSG_FIRSTHDR(msg);
+ cmsg->cmsg_level = IPPROTO_SCTP;
+ cmsg->cmsg_type = SCTP_SNDRCV;
+ cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
+
+ /* Initialize the payload */
+ sri = (struct sctp_sndrcvinfo*) CMSG_DATA(cmsg);
+ memset(sri, 0, sizeof (*sri));
+
+ if (cdata->streamNumber > 0) {
+ sri->sinfo_stream = cdata->streamNumber;
+ }
+ if (cdata->assocId > 0) {
+ sri->sinfo_assoc_id = cdata->assocId;
+ }
+ if (cdata->unordered == JNI_TRUE) {
+ sri->sinfo_flags = sri->sinfo_flags | SCTP_UNORDERED;
+ }
+
+ if (cdata->ppid > 0) {
+ sri->sinfo_ppid = htonl(cdata->ppid);
+ }
+
+ /* Sum of the length of all control messages in the buffer. */
+ msg->msg_controllen = cmsg->cmsg_len;
+}
+
+// TODO: test: can create send failed without any data? if so need to
+// update API so that buffer can be null if no data.
+void handleSendFailed
+ (JNIEnv* env, int fd, jobject resultContainerObj, struct sctp_send_failed *ssf,
+ int read, jboolean isEOR, struct sockaddr* sap) {
+ jobject bufferObj = NULL, resultObj, isaObj;
+ char *addressP;
+ struct sctp_sndrcvinfo *sri;
+ int remaining, dataLength;
+
+ /* the actual undelivered message data is directly after the ssf */
+ int dataOffset = sizeof(struct sctp_send_failed);
+
+ sri = (struct sctp_sndrcvinfo*) &ssf->ssf_info;
+
+ /* the number of bytes remaining to be read in the sctp_send_failed notif*/
+ remaining = ssf->ssf_length - read;
+
+ /* the size of the actual undelivered message */
+ dataLength = ssf->ssf_length - dataOffset;
+
+ /* retrieved address from sockaddr */
+ isaObj = SockAddrToInetSocketAddress(env, sap);
+
+ /* data retrieved from sff_data */
+ if (dataLength > 0) {
+ struct iovec iov[1];
+ struct msghdr msg[1];
+ int rv, alreadyRead;
+ char *dataP = (char*) ssf;
+ dataP += dataOffset;
+
+ if ((addressP = malloc(dataLength)) == NULL) {
+ JNU_ThrowOutOfMemoryError(env, "handleSendFailed");
+ return;
+ }
+
+ memset(msg, 0, sizeof (*msg));
+ msg->msg_iov = iov;
+ msg->msg_iovlen = 1;
+
+ bufferObj = (*env)->NewDirectByteBuffer(env, addressP, dataLength);
+ CHECK_NULL(bufferObj);
+
+ alreadyRead = read - dataOffset;
+ if (alreadyRead > 0) {
+ memcpy(addressP, /*ssf->ssf_data*/ dataP, alreadyRead);
+ iov->iov_base = addressP + alreadyRead;
+ iov->iov_len = dataLength - alreadyRead;
+ } else {
+ iov->iov_base = addressP;
+ iov->iov_len = dataLength;
+ }
+
+ if (remaining > 0) {
+ if ((rv = recvmsg(fd, msg, 0)) < 0) {
+ fprintf(stdout, "\nNative: handleSFN: recvmsg failed: errno = %d ", errno);
+ handleSocketError(env, errno);
+ return;
+ }
+
+ if (rv != (dataLength - alreadyRead) || !(msg->msg_flags & MSG_EOR)) {
+ //TODO: assert false: "should not reach here";
+ return;
+ }
+ // TODO: Set and document (in API) buffers position.
+ }
+ }
+
+ /* create SctpSendFailed */
+ resultObj = (*env)->NewObject(env, ssf_class, ssf_ctrID, ssf->ssf_assoc_id,
+ sri->sinfo_stream, ssf->ssf_error, isaObj, bufferObj);
+ CHECK_NULL(resultObj);
+ (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj);
+ (*env)->SetIntField(env, resultContainerObj, src_typeID,
+ sun_nio_ch_SctpResultContainer_SEND_FAILED);
+}
+
+void handleAssocChange
+ (JNIEnv* env, jobject resultContainerObj, struct sctp_assoc_change *sac) {
+ jobject resultObj;
+ int state = 0;
+
+ switch (sac->sac_state) {
+ case SCTP_COMM_UP :
+ state = sun_nio_ch_SctpAssocChange_SCTP_COMM_UP;
+ break;
+ case SCTP_COMM_LOST :
+ state = sun_nio_ch_SctpAssocChange_SCTP_COMM_LOST;
+ break;
+ case SCTP_RESTART :
+ state = sun_nio_ch_SctpAssocChange_SCTP_RESTART;
+ break;
+ case SCTP_SHUTDOWN_COMP :
+ state = sun_nio_ch_SctpAssocChange_SCTP_SHUTDOWN;
+ break;
+ case SCTP_CANT_STR_ASSOC :
+ state = sun_nio_ch_SctpAssocChange_SCTP_CANT_START;
+ }
+
+ /* create SctpAssociationChanged */
+ resultObj = (*env)->NewObject(env, sac_class, sac_ctrID, sac->sac_assoc_id,
+ state, sac->sac_outbound_streams, sac->sac_inbound_streams);
+ CHECK_NULL(resultObj);
+ (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj);
+ (*env)->SetIntField(env, resultContainerObj, src_typeID,
+ sun_nio_ch_SctpResultContainer_ASSOCIATION_CHANGED);
+}
+
+void handleShutdown
+ (JNIEnv* env, jobject resultContainerObj, struct sctp_shutdown_event* sse) {
+ /* create SctpShutdown */
+ jobject resultObj = (*env)->NewObject(env, ss_class, ss_ctrID, sse->sse_assoc_id);
+ CHECK_NULL(resultObj);
+ (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj);
+ (*env)->SetIntField(env, resultContainerObj, src_typeID,
+ sun_nio_ch_SctpResultContainer_SHUTDOWN);
+}
+
+void handlePeerAddrChange
+ (JNIEnv* env, jobject resultContainerObj, struct sctp_paddr_change* spc) {
+ int event = 0;
+ jobject addressObj, resultObj;
+ unsigned int state = spc->spc_state;
+
+ switch (state) {
+ case SCTP_ADDR_AVAILABLE :
+ event = sun_nio_ch_SctpPeerAddrChange_SCTP_ADDR_AVAILABLE;
+ break;
+ case SCTP_ADDR_UNREACHABLE :
+ event = sun_nio_ch_SctpPeerAddrChange_SCTP_ADDR_UNREACHABLE;
+ break;
+ case SCTP_ADDR_REMOVED :
+ event = sun_nio_ch_SctpPeerAddrChange_SCTP_ADDR_REMOVED;
+ break;
+ case SCTP_ADDR_ADDED :
+ event = sun_nio_ch_SctpPeerAddrChange_SCTP_ADDR_ADDED;
+ break;
+ case SCTP_ADDR_MADE_PRIM :
+ event = sun_nio_ch_SctpPeerAddrChange_SCTP_ADDR_MADE_PRIM;
+#ifdef __linux__ /* Solaris currently doesn't support SCTP_ADDR_CONFIRMED */
+ break;
+ case SCTP_ADDR_CONFIRMED :
+ event = sun_nio_ch_SctpPeerAddrChange_SCTP_ADDR_CONFIRMED;
+#endif /* __linux__ */
+ }
+
+ addressObj = SockAddrToInetSocketAddress(env, (struct sockaddr*)&spc->spc_aaddr);
+
+ /* create SctpPeerAddressChanged */
+ resultObj = (*env)->NewObject(env, spc_class, spc_ctrID, spc->spc_assoc_id,
+ addressObj, event);
+ CHECK_NULL(resultObj);
+ (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj);
+ (*env)->SetIntField(env, resultContainerObj, src_typeID,
+ sun_nio_ch_SctpResultContainer_PEER_ADDRESS_CHANGED);
+}
+
+void handleUninteresting
+ (union sctp_notification *snp) {
+ //fprintf(stdout,"\nNative: handleUninterestingNotification: Receive notification type [%u]", snp->sn_header.sn_type);
+}
+
+/**
+ * Handle notifications from the SCTP stack.
+ * Returns JNI_TRUE if the notification is one that is of interest to the
+ * Java API, otherwise JNI_FALSE.
+ */
+jboolean handleNotification
+ (JNIEnv* env, int fd, jobject resultContainerObj, union sctp_notification* snp,
+ int read, jboolean isEOR, struct sockaddr* sap) {
+ switch (snp->sn_header.sn_type) {
+ case SCTP_SEND_FAILED:
+ handleSendFailed(env, fd, resultContainerObj, &snp->sn_send_failed,
+ read, isEOR, sap);
+ return JNI_TRUE;
+ case SCTP_ASSOC_CHANGE:
+ handleAssocChange(env, resultContainerObj, &snp->sn_assoc_change);
+ return JNI_TRUE;
+ case SCTP_SHUTDOWN_EVENT:
+ handleShutdown(env, resultContainerObj, &snp->sn_shutdown_event);
+ return JNI_TRUE;
+ case SCTP_PEER_ADDR_CHANGE:
+ handlePeerAddrChange(env, resultContainerObj, &snp->sn_paddr_change);
+ return JNI_TRUE;
+ default :
+ /* the Java API is not interested in this event, maybe we are? */
+ handleUninteresting(snp);
+ }
+ return JNI_FALSE;
+}
+
+void handleMessage
+ (JNIEnv* env, jobject resultContainerObj, struct msghdr* msg,int read,
+ jboolean isEOR, struct sockaddr* sap) {
+ jobject isa, resultObj;
+ struct controlData cdata[1];
+
+ if (read == 0) {
+ /* we reached EOF */
+ read = -1;
+ }
+
+ isa = SockAddrToInetSocketAddress(env, sap);
+ getControlData(msg, cdata);
+
+ /* create SctpMessageInfoImpl */
+ resultObj = (*env)->NewObject(env, smi_class, smi_ctrID, cdata->assocId,
+ isa, read, cdata->streamNumber,
+ isEOR ? JNI_TRUE : JNI_FALSE,
+ cdata->unordered, cdata->ppid);
+ CHECK_NULL(resultObj);
+ (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj);
+ (*env)->SetIntField(env, resultContainerObj, src_typeID,
+ sun_nio_ch_SctpResultContainer_MESSAGE);
+}
+
+/*
+ * Class: sun_nio_ch_SctpChannelImpl
+ * Method: receive0
+ * Signature: (ILsun/nio/ch/SctpResultContainer;JI)I
+ */
+JNIEXPORT jint JNICALL Java_sun_nio_ch_SctpChannelImpl_receive0
+ (JNIEnv *env, jclass klass, jint fd, jobject resultContainerObj,
+ jlong address, jint length) {
+ SOCKADDR sa;
+ int sa_len = sizeof(sa);
+ ssize_t rv = 0;
+ jlong *addr = jlong_to_ptr(address);
+ struct iovec iov[1];
+ struct msghdr msg[1];
+ char cbuf[CMSG_SPACE(sizeof (struct sctp_sndrcvinfo))];
+
+ /* Set up the msghdr structure for receiving */
+ memset(msg, 0, sizeof (*msg));
+ msg->msg_name = &sa;
+ msg->msg_namelen = sa_len;
+ iov->iov_base = addr;
+ iov->iov_len = length;
+ msg->msg_iov = iov;
+ msg->msg_iovlen = 1;
+ msg->msg_control = cbuf;
+ msg->msg_controllen = sizeof(cbuf);
+ msg->msg_flags = 0;
+
+ do {
+ if ((rv = recvmsg(fd, msg, 0)) < 0) {
+ if (errno == EWOULDBLOCK) {
+ return IOS_UNAVAILABLE;
+ } else if (errno == EINTR) {
+ return IOS_INTERRUPTED;
+
+#ifdef __linux__
+ } else if (errno == ENOTCONN) {
+ /* ENOTCONN when EOF reached */
+ rv = 0;
+ /* there will be no control data */
+ msg->msg_controllen = 0;
+#endif /* __linux__ */
+
+ } else {
+ handleSocketError(env, errno);
+ return 0;
+ }
+ }
+
+ if (msg->msg_flags & MSG_NOTIFICATION) {
+ char *bufp = (char*)addr;
+ union sctp_notification *snp;
+
+ if (!(msg->msg_flags & MSG_EOR) && length < NOTIFICATION_BUFFER_SIZE) {
+ char buf[NOTIFICATION_BUFFER_SIZE];
+ int rvSAVE = rv;
+ memcpy(buf, addr, rv);
+ iov->iov_base = buf + rv;
+ iov->iov_len = NOTIFICATION_BUFFER_SIZE - rv;
+ if ((rv = recvmsg(fd, msg, 0)) < 0) {
+ handleSocketError(env, errno);
+ return 0;
+ }
+ bufp = buf;
+ rv += rvSAVE;
+ }
+ snp = (union sctp_notification *) bufp;
+ if (handleNotification(env, fd, resultContainerObj, snp, rv,
+ (msg->msg_flags & MSG_EOR),
+ (struct sockaddr*)&sa ) == JNI_TRUE) {
+ /* We have received a notification that is of interest to
+ to the Java API. The appropriate notification will be
+ set in the result container. */
+ return 0;
+ }
+
+ // set iov back to addr, and reset msg_controllen
+ iov->iov_base = addr;
+ iov->iov_len = length;
+ msg->msg_control = cbuf;
+ msg->msg_controllen = sizeof(cbuf);
+ }
+ } while (msg->msg_flags & MSG_NOTIFICATION);
+
+ handleMessage(env, resultContainerObj, msg, rv,
+ (msg->msg_flags & MSG_EOR), (struct sockaddr*)&sa);
+ return rv;
+}
+
+/*
+ * Class: sun_nio_ch_SctpChannelImpl
+ * Method: send0
+ * Signature: (IJILjava/net/SocketAddress;IIZI)I
+ */
+JNIEXPORT jint JNICALL Java_sun_nio_ch_SctpChannelImpl_send0
+ (JNIEnv *env, jclass klass, jint fd, jlong address, jint length,
+ jobject saTarget, jint assocId, jint streamNumber, jboolean unordered,
+ jint ppid) {
+ SOCKADDR sa;
+ int sa_len = sizeof(sa);
+ ssize_t rv = 0;
+ jlong *addr = jlong_to_ptr(address);
+ struct iovec iov[1];
+ struct msghdr msg[1];
+ int cbuf_size = CMSG_SPACE(sizeof (struct sctp_sndrcvinfo));
+ char cbuf[CMSG_SPACE(sizeof (struct sctp_sndrcvinfo))];
+ struct controlData cdata[1];
+
+ /* SctpChannel:
+ * saTarget may contain the preferred address or NULL to use primary,
+ * assocId will always be -1
+ * SctpMultiChannell:
+ * Setup new association, saTarget will contain address, assocId = -1
+ * Association already existing, assocId != -1, saTarget = preferred addr
+ */
+ if (saTarget != NULL /*&& assocId <= 0*/) {
+
+ jobject targetAddress = (*env)->GetObjectField(env, saTarget, isa_addrID);
+ jint targetPort = (*env)->GetIntField(env, saTarget, isa_portID);
+
+ if (NET_InetAddressToSockaddr(env, targetAddress, targetPort,
+ (struct sockaddr *)&sa,
+ &sa_len, JNI_TRUE) != 0) {
+ return IOS_THROWN;
+ }
+ } else {
+ memset(&sa, '\x0', sa_len);
+ sa_len = 0;
+ }
+
+ /* Set up the msghdr structure for sending */
+ memset(msg, 0, sizeof (*msg));
+ memset(cbuf, 0, cbuf_size);
+ msg->msg_name = &sa;
+ msg->msg_namelen = sa_len;
+ iov->iov_base = addr;
+ iov->iov_len = length;
+ msg->msg_iov = iov;
+ msg->msg_iovlen = 1;
+ msg->msg_control = cbuf;
+ msg->msg_controllen = cbuf_size;
+ msg->msg_flags = 0;
+
+ cdata->streamNumber = streamNumber;
+ cdata->assocId = assocId;
+ cdata->unordered = unordered;
+ cdata->ppid = ppid;
+ setControlData(msg, cdata);
+
+ if ((rv = sendmsg(fd, msg, 0)) < 0) {
+ if (errno == EWOULDBLOCK) {
+ return IOS_UNAVAILABLE;
+ } else if (errno == EINTR) {
+ return IOS_INTERRUPTED;
+ } else if (errno == EPIPE) {
+ JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
+ "Socket is shutdown for writing");
+ } else {
+ handleSocketError(env, errno);
+ return 0;
+ }
+ }
+
+ return rv;
+}
+
+/*
+ * Class: sun_nio_ch_SctpChannelImpl
+ * Method: checkConnect
+ * Signature: (Ljava/io/FileDescriptor;ZZ)I
+ */
+JNIEXPORT jint JNICALL Java_sun_nio_ch_SctpChannelImpl_checkConnect
+ (JNIEnv* env, jobject this, jobject fdo, jboolean block, jboolean ready) {
+ return Java_sun_nio_ch_SocketChannelImpl_checkConnect(env, this,
+ fdo, block, ready);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/native/sun/nio/ch/SctpNet.c Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,609 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <dlfcn.h>
+
+#include "Sctp.h"
+#include "jni.h"
+#include "jni_util.h"
+#include "nio_util.h"
+#include "nio.h"
+#include "net_util.h"
+#include "net_util_md.h"
+#include "sun_nio_ch_SctpNet.h"
+#include "sun_nio_ch_SctpStdSocketOption.h"
+
+static jclass isaCls = 0;
+static jmethodID isaCtrID = 0;
+
+static const char* nativeSctpLib = "libsctp.so.1";
+static jboolean funcsLoaded = JNI_FALSE;
+
+JNIEXPORT jint JNICALL JNI_OnLoad
+ (JavaVM *vm, void *reserved) {
+ return JNI_VERSION_1_2;
+}
+
+/**
+ * Loads the native sctp library that contains the socket extension
+ * functions, as well as locating the individual functions.
+ * There will be a pending exception if this method returns false.
+ */
+jboolean loadSocketExtensionFuncs
+ (JNIEnv* env) {
+ if (dlopen(nativeSctpLib, RTLD_GLOBAL | RTLD_LAZY) == NULL) {
+ JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
+ dlerror());
+ return JNI_FALSE;
+ }
+
+ if ((nio_sctp_getladdrs = (sctp_getladdrs_func*)
+ dlsym(RTLD_DEFAULT, "sctp_getladdrs")) == NULL) {
+ JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
+ dlerror());
+ return JNI_FALSE;
+ }
+
+ if ((nio_sctp_freeladdrs = (sctp_freeladdrs_func*)
+ dlsym(RTLD_DEFAULT, "sctp_freeladdrs")) == NULL) {
+ JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
+ dlerror());
+ return JNI_FALSE;
+ }
+
+ if ((nio_sctp_getpaddrs = (sctp_getpaddrs_func*)
+ dlsym(RTLD_DEFAULT, "sctp_getpaddrs")) == NULL) {
+ JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
+ dlerror());
+ return JNI_FALSE;
+ }
+
+ if ((nio_sctp_freepaddrs = (sctp_freepaddrs_func*)
+ dlsym(RTLD_DEFAULT, "sctp_freepaddrs")) == NULL) {
+ JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
+ dlerror());
+ return JNI_FALSE;
+ }
+
+ if ((nio_sctp_bindx = (sctp_bindx_func*)
+ dlsym(RTLD_DEFAULT, "sctp_bindx")) == NULL) {
+ JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
+ dlerror());
+ return JNI_FALSE;
+ }
+
+ funcsLoaded = JNI_TRUE;
+ return JNI_TRUE;
+}
+
+/*
+ * Class: sun_nio_ch_SctpNet
+ * Method: socket0
+ * Signature: (Z)I
+ */
+JNIEXPORT jint JNICALL Java_sun_nio_ch_SctpNet_socket0
+ (JNIEnv *env, jclass klass, jboolean oneToOne) {
+ int fd;
+ struct sctp_event_subscribe event;
+
+ /* Try to load the socket API extension functions */
+ if (!funcsLoaded && !loadSocketExtensionFuncs(env)) {
+ return 0;
+ }
+
+ fd = socket(ipv6_available() ? AF_INET6 : AF_INET,
+ (oneToOne ? SOCK_STREAM : SOCK_SEQPACKET), IPPROTO_SCTP);
+
+ if (fd < 0) {
+ return handleSocketError(env, errno);
+ }
+
+ /* Enable events */
+ memset(&event, 0, sizeof(event));
+ event.sctp_data_io_event = 1;
+ event.sctp_association_event = 1;
+ event.sctp_address_event = 1;
+ event.sctp_send_failure_event = 1;
+ //event.sctp_peer_error_event = 1;
+ event.sctp_shutdown_event = 1;
+ //event.sctp_partial_delivery_event = 1;
+ //event.sctp_adaptation_layer_event = 1;
+ if (setsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(event)) != 0) {
+ handleSocketError(env, errno);
+ }
+ return fd;
+}
+
+/*
+ * Class: sun_nio_ch_SctpNet
+ * Method: bindx
+ * Signature: (I[Ljava/net/InetAddress;IIZ)V
+ */
+JNIEXPORT void JNICALL Java_sun_nio_ch_SctpNet_bindx
+ (JNIEnv *env, jclass klass, jint fd, jobjectArray addrs, jint port,
+ jint addrsLength, jboolean add, jboolean preferIPv6) {
+ SOCKADDR *sap, *tmpSap;
+ int i, sa_len = sizeof(SOCKADDR);
+ jobject ia;
+
+ if (addrsLength < 1)
+ return;
+
+ if ((sap = calloc(addrsLength, sa_len)) == NULL) {
+ JNU_ThrowOutOfMemoryError(env, "heap allocation failure");
+ return;
+ }
+
+ tmpSap = sap;
+ for (i=0; i<addrsLength; i++) {
+ ia = (*env)->GetObjectArrayElement(env, addrs, i);
+ if (NET_InetAddressToSockaddr(env, ia, port, (struct sockaddr*)tmpSap,
+ &sa_len, preferIPv6) != 0) {
+ free(sap);
+ return;
+ }
+ tmpSap++;
+ }
+
+ if (nio_sctp_bindx(fd, (void*)sap, addrsLength, add ? SCTP_BINDX_ADD_ADDR :
+ SCTP_BINDX_REM_ADDR) != 0) {
+ handleSocketError(env, errno);
+ }
+
+ free(sap);
+}
+
+void initializeISA
+ (JNIEnv* env) {
+ if (isaCls == 0) {
+ jclass c = (*env)->FindClass(env, "java/net/InetSocketAddress");
+ CHECK_NULL(c);
+ isaCls = (*env)->NewGlobalRef(env, c);
+ CHECK_NULL(isaCls);
+ (*env)->DeleteLocalRef(env, c);
+ isaCtrID = (*env)->GetMethodID(env, isaCls, "<init>",
+ "(Ljava/net/InetAddress;I)V");
+ }
+}
+
+jobject SockAddrToInetSocketAddress
+ (JNIEnv *env, struct sockaddr* sap) {
+ int port = 0;
+
+ jobject ia = NET_SockaddrToInetAddress(env, sap, &port);
+ if (ia == NULL)
+ return NULL;
+
+ if (isaCls == 0) {
+ initializeISA(env);
+ CHECK_NULL_RETURN(isaCls, NULL);
+ }
+
+ return (*env)->NewObject(env, isaCls, isaCtrID, ia, port);
+}
+
+/*
+ * Class: sun_nio_ch_SctpNet
+ * Method: getLocalAddresses0
+ * Signature: (I)[Ljava/net/SocketAddress;
+ */
+JNIEXPORT jobjectArray JNICALL Java_sun_nio_ch_SctpNet_getLocalAddresses0
+ (JNIEnv *env, jclass klass, jint fd) {
+ void *addr_buf, *laddr;
+ struct sockaddr* sap;
+ int i, addrCount;
+ jobjectArray isaa;
+
+#ifdef __solaris__
+ if ((addrCount = nio_sctp_getladdrs(fd, 0, (void **)&addr_buf)) == -1) {
+#else /* __linux__ */
+ if ((addrCount = nio_sctp_getladdrs(fd, 0, (struct sockaddr **)&addr_buf)) == -1) {
+#endif
+ handleSocketError(env, errno);
+ return NULL;
+ }
+
+ if (addrCount < 1)
+ return NULL;
+
+ if (isaCls == 0) {
+ initializeISA(env);
+ CHECK_NULL_RETURN(isaCls, NULL);
+ }
+
+ isaa = (*env)->NewObjectArray(env, addrCount, isaCls, NULL);
+ if (isaa == NULL) {
+ nio_sctp_freeladdrs(addr_buf);
+ return NULL;
+ }
+
+ laddr = addr_buf;
+ for (i=0; i<addrCount; i++) {
+ int port = 0;
+ jobject isa = NULL, ia;
+ sap = (struct sockaddr*)addr_buf;
+ ia = NET_SockaddrToInetAddress(env, sap, &port);
+ if (ia != NULL)
+ isa = (*env)->NewObject(env, isaCls, isaCtrID, ia, port);
+ if (isa != NULL)
+ (*env)->SetObjectArrayElement(env, isaa, i, isa);
+
+ if (sap->sa_family == AF_INET)
+ addr_buf = ((struct sockaddr_in*)addr_buf) + 1;
+ else
+ addr_buf = ((struct sockaddr_in6*)addr_buf) + 1;
+ }
+
+ nio_sctp_freeladdrs(laddr);
+ return isaa;
+}
+
+jobjectArray getRemoteAddresses
+ (JNIEnv *env, jint fd, sctp_assoc_t id) {
+ void *addr_buf, *paddr;
+ struct sockaddr* sap;
+ int i, addrCount;
+ jobjectArray isaa;
+
+#if __solaris__
+ if ((addrCount = nio_sctp_getpaddrs(fd, id, (void **)&addr_buf)) == -1) {
+#else /* __linux__ */
+ if ((addrCount = nio_sctp_getpaddrs(fd, id, (struct sockaddr**)&addr_buf)) == -1) {
+#endif
+ handleSocketError(env, errno);
+ return NULL;
+ }
+
+ if (addrCount < 1)
+ return NULL;
+
+ if (isaCls == 0) {
+ initializeISA(env);
+ CHECK_NULL_RETURN(isaCls, NULL);
+ }
+
+ isaa = (*env)->NewObjectArray(env, addrCount, isaCls, NULL);
+ if (isaa == NULL) {
+ nio_sctp_freepaddrs(addr_buf);
+ return NULL;
+ }
+
+ paddr = addr_buf;
+ for (i=0; i<addrCount; i++) {
+ jobject ia, isa = NULL;
+ int port;
+ sap = (struct sockaddr*)addr_buf;
+ ia = NET_SockaddrToInetAddress(env, sap, &port);
+ if (ia != NULL)
+ isa = (*env)->NewObject(env, isaCls, isaCtrID, ia, port);
+ if (isa != NULL)
+ (*env)->SetObjectArrayElement(env, isaa, i, isa);
+
+ if (sap->sa_family == AF_INET)
+ addr_buf = ((struct sockaddr_in*)addr_buf) + 1;
+ else
+ addr_buf = ((struct sockaddr_in6*)addr_buf) + 1;
+ }
+
+ nio_sctp_freepaddrs(paddr);
+
+ return isaa;
+}
+
+ /*
+ * Class: sun_nio_ch_SctpNet
+ * Method: getRemoteAddresses0
+ * Signature: (II)[Ljava/net/SocketAddress;
+ */
+JNIEXPORT jobjectArray JNICALL Java_sun_nio_ch_SctpNet_getRemoteAddresses0
+ (JNIEnv *env, jclass klass, jint fd, jint assocId) {
+ return getRemoteAddresses(env, fd, assocId);
+}
+
+/* Map the Java level option to the native level */
+int mapSocketOption
+ (jint cmd, int *level, int *optname) {
+ static struct {
+ jint cmd;
+ int level;
+ int optname;
+ } const opts[] = {
+ { sun_nio_ch_SctpStdSocketOption_SCTP_DISABLE_FRAGMENTS, IPPROTO_SCTP, SCTP_DISABLE_FRAGMENTS },
+ { sun_nio_ch_SctpStdSocketOption_SCTP_EXPLICIT_COMPLETE, IPPROTO_SCTP, SCTP_EXPLICIT_EOR },
+ { sun_nio_ch_SctpStdSocketOption_SCTP_FRAGMENT_INTERLEAVE, IPPROTO_SCTP, SCTP_FRAGMENT_INTERLEAVE },
+ { sun_nio_ch_SctpStdSocketOption_SCTP_NODELAY, IPPROTO_SCTP, SCTP_NODELAY },
+ { sun_nio_ch_SctpStdSocketOption_SO_SNDBUF, SOL_SOCKET, SO_SNDBUF },
+ { sun_nio_ch_SctpStdSocketOption_SO_RCVBUF, SOL_SOCKET, SO_RCVBUF },
+ { sun_nio_ch_SctpStdSocketOption_SO_LINGER, SOL_SOCKET, SO_LINGER } };
+
+ int i;
+ for (i=0; i<(int)(sizeof(opts) / sizeof(opts[0])); i++) {
+ if (cmd == opts[i].cmd) {
+ *level = opts[i].level;
+ *optname = opts[i].optname;
+ return 0;
+ }
+ }
+
+ /* not found */
+ return -1;
+}
+
+/*
+ * Class: sun_nio_ch_SctpNet
+ * Method: setIntOption0
+ * Signature: (III)V
+ */
+JNIEXPORT void JNICALL Java_sun_nio_ch_SctpNet_setIntOption0
+ (JNIEnv *env, jclass klass, jint fd, jint opt, int arg) {
+ int klevel, kopt;
+ int result;
+ struct linger linger;
+ void *parg;
+ int arglen;
+
+ if (mapSocketOption(opt, &klevel, &kopt) < 0) {
+ JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
+ "Unsupported socket option");
+ return;
+ }
+
+ if (opt == sun_nio_ch_SctpStdSocketOption_SO_LINGER) {
+ parg = (void *)&linger;
+ arglen = sizeof(linger);
+ if (arg >= 0) {
+ linger.l_onoff = 1;
+ linger.l_linger = arg;
+ } else {
+ linger.l_onoff = 0;
+ linger.l_linger = 0;
+ }
+ } else {
+ parg = (void *)&arg;
+ arglen = sizeof(arg);
+ }
+
+ if (setsockopt(fd, klevel, kopt, parg, arglen) < 0) {
+ JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
+ "sun_nio_ch_SctpNet.setIntOption0");
+ }
+}
+
+/*
+ * Class: sun_nio_ch_SctpNet
+ * Method: getIntOption0
+ * Signature: (II)I
+ */
+JNIEXPORT int JNICALL Java_sun_nio_ch_SctpNet_getIntOption0
+ (JNIEnv *env, jclass klass, jint fd, jint opt) {
+ int klevel, kopt;
+ int result;
+ struct linger linger;
+ void *arg;
+ unsigned int arglen;
+
+ if (mapSocketOption(opt, &klevel, &kopt) < 0) {
+ JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
+ "Unsupported socket option");
+ return -1;
+ }
+
+ if (opt == sun_nio_ch_SctpStdSocketOption_SO_LINGER) {
+ arg = (void *)&linger;
+ arglen = sizeof(linger);
+ } else {
+ arg = (void *)&result;
+ arglen = sizeof(result);
+ }
+
+ if (getsockopt(fd, klevel, kopt, arg, &arglen) < 0) {
+ JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
+ "sun.nio.ch.Net.getIntOption");
+ return -1;
+ }
+
+ if (opt == sun_nio_ch_SctpStdSocketOption_SO_LINGER)
+ return linger.l_onoff ? linger.l_linger : -1;
+ else
+ return result;
+}
+
+/*
+ * Class: sun_nio_ch_SctpNet
+ * Method: getPrimAddrOption0
+ * Signature: (II)Ljava/net/SocketAddress;
+ */
+JNIEXPORT jobject JNICALL Java_sun_nio_ch_SctpNet_getPrimAddrOption0
+ (JNIEnv *env, jclass klass, jint fd, jint assocId) {
+ struct sctp_setprim prim;
+ struct sockaddr_storage ss;
+ int ss_len = sizeof(ss);
+ unsigned int prim_len = sizeof(prim);
+
+ prim.ssp_assoc_id = assocId;
+ prim.ssp_addr = ss;
+
+ if (getsockopt(fd, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, &prim, &prim_len) < 0) {
+ JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
+ "sun.nio.ch.SctpNet.getPrimAddrOption0");
+ return NULL;
+ }
+
+ return SockAddrToInetSocketAddress(env, (struct sockaddr*)&ss);
+}
+
+/*
+ * Class: sun_nio_ch_SctpNet
+ * Method: setPrimAddrOption0
+ * Signature: (IILjava/net/InetAddress;I)V
+ */
+JNIEXPORT void JNICALL Java_sun_nio_ch_SctpNet_setPrimAddrOption0
+ (JNIEnv *env, jclass klass, jint fd, jint assocId, jobject iaObj, jint port) {
+ struct sctp_setprim prim;
+ struct sockaddr_storage ss;
+ int ss_len = sizeof(ss);
+
+ if (NET_InetAddressToSockaddr(env, iaObj, port, (struct sockaddr *)&ss,
+ &ss_len, JNI_TRUE) != 0) {
+ return;
+ }
+
+ prim.ssp_assoc_id = assocId;
+ prim.ssp_addr = ss;
+
+ if (setsockopt(fd, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, &prim, sizeof(prim)) < 0) {
+ JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
+ "sun.nio.ch.SctpNet.setPrimAddrOption0");
+ }
+}
+
+/*
+ * Class: sun_nio_ch_SctpNet
+ * Method: setPeerPrimAddrOption0
+ * Signature: (IILjava/net/InetAddress;I)V
+ */
+JNIEXPORT void JNICALL Java_sun_nio_ch_SctpNet_setPeerPrimAddrOption0
+ (JNIEnv *env, jclass klass, jint fd, jint assocId, jobject iaObj, jint port) {
+ struct sctp_setpeerprim prim;
+ struct sockaddr_storage ss;
+ int ss_len = sizeof(ss);
+
+ if (NET_InetAddressToSockaddr(env, iaObj, port, (struct sockaddr *)&ss,
+ &ss_len, JNI_TRUE) != 0) {
+ return;
+ }
+
+ prim.sspp_assoc_id = assocId;
+ prim.sspp_addr = ss;
+
+ if (setsockopt(fd, IPPROTO_SCTP, SCTP_SET_PEER_PRIMARY_ADDR, &prim,
+ sizeof(prim)) < 0) {
+ JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
+ "sun.nio.ch.SctpNet.setPeerPrimAddrOption0");
+ }
+}
+
+/*
+ * Class: sun_nio_ch_SctpNet
+ * Method: getInitMsgOption0
+ * Signature: (I[I)V
+ */
+JNIEXPORT void JNICALL Java_sun_nio_ch_SctpNet_getInitMsgOption0
+ (JNIEnv *env, jclass klass, jint fd, jintArray retVal) {
+ struct sctp_initmsg sctp_initmsg;
+ unsigned int sim_len = sizeof(sctp_initmsg);
+ int vals[2];
+
+ if (getsockopt(fd, IPPROTO_SCTP, SCTP_INITMSG, &sctp_initmsg,
+ &sim_len) < 0) {
+ JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
+ "sun.nio.ch.SctpNet.getInitMsgOption0");
+ return;
+ }
+
+ vals[0] = sctp_initmsg.sinit_max_instreams;
+ vals[1] = sctp_initmsg.sinit_num_ostreams;
+ (*env)->SetIntArrayRegion(env, retVal, 0, 2, vals);
+}
+
+/*
+ * Class: sun_nio_ch_SctpNet
+ * Method: setInitMsgOption0
+ * Signature: (III)V
+ */
+JNIEXPORT void JNICALL Java_sun_nio_ch_SctpNet_setInitMsgOption0
+ (JNIEnv *env, jclass klass, jint fd, jint inArg, jint outArg) {
+ struct sctp_initmsg sctp_initmsg;
+
+ sctp_initmsg.sinit_max_instreams = (unsigned int)inArg;
+ sctp_initmsg.sinit_num_ostreams = (unsigned int)outArg;
+ sctp_initmsg.sinit_max_attempts = 0; // default
+ sctp_initmsg.sinit_max_init_timeo = 0; // default
+
+ if (setsockopt(fd, IPPROTO_SCTP, SCTP_INITMSG, &sctp_initmsg,
+ sizeof(sctp_initmsg)) < 0) {
+ JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
+ "sun.nio.ch.SctpNet.setInitMsgOption0");
+ }
+}
+
+/*
+ * Class: sun_nio_ch_SctpNet
+ * Method: shutdown0
+ * Signature: (II)V
+ */
+JNIEXPORT void JNICALL Java_sun_nio_ch_SctpNet_shutdown0
+ (JNIEnv *env, jclass klass, jint fd, jint assocId) {
+ int rv;
+ struct msghdr msg[1];
+ struct iovec iov[1];
+ int cbuf_size = CMSG_SPACE(sizeof (struct sctp_sndrcvinfo));
+ char cbuf[CMSG_SPACE(sizeof (struct sctp_sndrcvinfo))];
+ struct cmsghdr* cmsg;
+ struct sctp_sndrcvinfo *sri;
+
+ /* SctpSocketChannel */
+ if (assocId < 0) {
+ shutdown(fd, SHUT_WR);
+ return;
+ }
+
+ memset(msg, 0, sizeof (*msg));
+ memset(cbuf, 0, cbuf_size);
+ msg->msg_name = NULL;
+ msg->msg_namelen = 0;
+ iov->iov_base = NULL;
+ iov->iov_len = 0;
+ msg->msg_iov = iov;
+ msg->msg_iovlen = 1;
+ msg->msg_control = cbuf;
+ msg->msg_controllen = cbuf_size;
+ msg->msg_flags = 0;
+
+ cmsg = CMSG_FIRSTHDR(msg);
+ cmsg->cmsg_level = IPPROTO_SCTP;
+ cmsg->cmsg_type = SCTP_SNDRCV;
+ cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
+
+ /* Initialize the payload: */
+ sri = (struct sctp_sndrcvinfo*) CMSG_DATA(cmsg);
+ memset(sri, 0, sizeof (*sri));
+
+ if (assocId > 0) {
+ sri->sinfo_assoc_id = assocId;
+ }
+
+ sri->sinfo_flags = sri->sinfo_flags | SCTP_EOF;
+
+ /* Sum of the length of all control messages in the buffer. */
+ msg->msg_controllen = cmsg->cmsg_len;
+
+ if ((rv = sendmsg(fd, msg, 0)) < 0) {
+ handleSocketError(env, errno);
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/native/sun/nio/ch/SctpServerChannelImpl.c Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+#include "sun_nio_ch_SctpServerChannelImpl.h"
+
+extern void Java_sun_nio_ch_ServerSocketChannelImpl_initIDs(JNIEnv* env,
+ jclass c);
+
+extern jint Java_sun_nio_ch_ServerSocketChannelImpl_accept0(JNIEnv* env,
+ jobject this, jobject ssfdo, jobject newfdo, jobjectArray isaa);
+
+/*
+ * Class: sun_nio_ch_SctpServerChannelImpl
+ * Method: initIDs
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_sun_nio_ch_SctpServerChannelImpl_initIDs
+ (JNIEnv* env, jclass c) {
+ Java_sun_nio_ch_ServerSocketChannelImpl_initIDs(env, c);
+}
+
+/*
+ * Class: sun_nio_ch_SctpServerChannelImpl
+ * Method: accept0
+ * Signature: (Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;[Ljava/net/InetSocketAddress;)I
+ */
+JNIEXPORT jint JNICALL Java_sun_nio_ch_SctpServerChannelImpl_accept0
+ (JNIEnv* env, jobject this, jobject ssfdo, jobject newfdo, jobjectArray isaa) {
+ return Java_sun_nio_ch_ServerSocketChannelImpl_accept0(env, this,
+ ssfdo, newfdo, isaa);
+}
--- a/jdk/src/solaris/native/sun/xawt/XToolkit.c Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/native/sun/xawt/XToolkit.c Mon Apr 27 12:33:57 2009 -0700
@@ -182,9 +182,6 @@
(*env)->GetMethodID(env, cls, "getLocationOnScreen_NoTreeLock",
"()Ljava/awt/Point;");
- componentIDs.resetGCMID =
- (*env)->GetMethodID(env, cls, "resetGC", "()V");
-
keyclass = (*env)->FindClass(env, "java/awt/event/KeyEvent");
DASSERT (keyclass != NULL);
@@ -197,9 +194,6 @@
"Lsun/awt/AppContext;");
(*env)->DeleteLocalRef(env, keyclass);
-
- DASSERT(componentIDs.resetGCMID);
-
}
--- a/jdk/src/solaris/native/sun/xawt/XlibWrapper.c Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/solaris/native/sun/xawt/XlibWrapper.c Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2002-2009 Sun Microsystems, Inc. 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
@@ -42,7 +42,9 @@
#include <jvm.h>
#include <Region.h>
+#include "utility/rect.h"
+#include <X11/XKBlib.h>
#if defined(DEBUG) || defined(INTERNAL_BUILD)
static jmethodID lockIsHeldMID = NULL;
@@ -305,6 +307,20 @@
/*
* Class: XlibWrapper
+ * Method: XConfigureWindow
+ * Signature: (JJJJ)V
+ */
+JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XConfigureWindow
+(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong value_mask,
+ jlong values)
+{
+ AWT_CHECK_HAVE_LOCK();
+ XConfigureWindow((Display*)jlong_to_ptr(display), (Window)window,
+ (unsigned int)value_mask, (XWindowChanges*)jlong_to_ptr(values));
+}
+
+/*
+ * Class: XlibWrapper
* Method: XSetInputFocus
* Signature: (JJ)V
*/
@@ -434,6 +450,79 @@
XSelectInput((Display *) jlong_to_ptr(display), (Window) window, mask);
}
+JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbSelectEvents
+(JNIEnv *env, jclass clazz, jlong display, jlong device, jlong bits_to_change, jlong values_for_bits)
+{
+ AWT_CHECK_HAVE_LOCK();
+ XkbSelectEvents((Display *) jlong_to_ptr(display), (unsigned int)device,
+ (unsigned long)bits_to_change,
+ (unsigned long)values_for_bits);
+}
+JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbSelectEventDetails
+(JNIEnv *env, jclass clazz, jlong display, jlong device, jlong event_type, jlong bits_to_change, jlong values_for_bits)
+{
+ AWT_CHECK_HAVE_LOCK();
+ XkbSelectEventDetails((Display *) jlong_to_ptr(display), (unsigned int)device,
+ (unsigned int) event_type,
+ (unsigned long)bits_to_change,
+ (unsigned long)values_for_bits);
+}
+JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbQueryExtension
+(JNIEnv *env, jclass clazz, jlong display, jlong opcode_rtrn, jlong event_rtrn,
+ jlong error_rtrn, jlong major_in_out, jlong minor_in_out)
+{
+ AWT_CHECK_HAVE_LOCK();
+ return XkbQueryExtension( (Display *) jlong_to_ptr(display),
+ (int *) jlong_to_ptr(opcode_rtrn),
+ (int *) jlong_to_ptr(event_rtrn),
+ (int *) jlong_to_ptr(error_rtrn),
+ (int *) jlong_to_ptr(major_in_out),
+ (int *) jlong_to_ptr(minor_in_out));
+}
+JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbLibraryVersion
+(JNIEnv *env, jclass clazz, jlong lib_major_in_out, jlong lib_minor_in_out)
+{
+ AWT_CHECK_HAVE_LOCK();
+ *((int *)lib_major_in_out) = XkbMajorVersion;
+ *((int *)lib_minor_in_out) = XkbMinorVersion;
+ return XkbLibraryVersion((int *)jlong_to_ptr(lib_major_in_out), (int *)jlong_to_ptr(lib_minor_in_out));
+}
+
+JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XkbGetMap
+(JNIEnv *env, jclass clazz, jlong display, jlong which, jlong device_spec)
+{
+ AWT_CHECK_HAVE_LOCK();
+ return (jlong) XkbGetMap( (Display *) jlong_to_ptr(display),
+ (unsigned int) which,
+ (unsigned int) device_spec);
+}
+JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XkbGetUpdatedMap
+(JNIEnv *env, jclass clazz, jlong display, jlong which, jlong xkb)
+{
+ AWT_CHECK_HAVE_LOCK();
+ return (jlong) XkbGetUpdatedMap( (Display *) jlong_to_ptr(display),
+ (unsigned int) which,
+ (XkbDescPtr) jlong_to_ptr(xkb));
+}
+JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbFreeKeyboard
+(JNIEnv *env, jclass clazz, jlong xkb, jlong which, jboolean free_all)
+{
+ AWT_CHECK_HAVE_LOCK();
+ XkbFreeKeyboard(jlong_to_ptr(xkb), (unsigned int)which, free_all);
+}
+JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbTranslateKeyCode
+(JNIEnv *env, jclass clazz, jlong xkb, jint keycode, jlong mods, jlong mods_rtrn, jlong keysym_rtrn)
+{
+ Bool b;
+ b = XkbTranslateKeyCode((XkbDescPtr)xkb, (unsigned int)keycode, (unsigned int)mods,
+ (unsigned int *)jlong_to_ptr(mods_rtrn),
+ (KeySym *)jlong_to_ptr(keysym_rtrn));
+ //printf("native, input: keycode:0x%0X; mods:0x%0X\n", keycode, mods);
+ //printf("native, output: keysym:0x%0X; mods:0x%0X\n", *(unsigned int *)jlong_to_ptr(keysym_rtrn), *(unsigned int *)jlong_to_ptr(mods_rtrn));
+ return b;
+}
+
+
/*
* Class: sun_awt_X11_XlibWrapper
* Method: XNextEvent
@@ -1658,6 +1747,39 @@
}
JNIEXPORT jint JNICALL
+Java_sun_awt_X11_XlibWrapper_XkbGetEffectiveGroup(JNIEnv *env, jclass clazz,
+ jlong display) {
+ XkbStateRec sr;
+ AWT_CHECK_HAVE_LOCK();
+ memset(&sr, 0, sizeof(XkbStateRec));
+ XkbGetState((Display*) jlong_to_ptr(display), XkbUseCoreKbd, &sr);
+// printf("-------------------------------------VVVV\n");
+// printf(" group:0x%0X\n",sr.group);
+// printf(" base_group:0x%0X\n",sr.base_group);
+// printf(" latched_group:0x%0X\n",sr.latched_group);
+// printf(" locked_group:0x%0X\n",sr.locked_group);
+// printf(" mods:0x%0X\n",sr.mods);
+// printf(" base_mods:0x%0X\n",sr.base_mods);
+// printf(" latched_mods:0x%0X\n",sr.latched_mods);
+// printf(" locked_mods:0x%0X\n",sr.locked_mods);
+// printf(" compat_state:0x%0X\n",sr.compat_state);
+// printf(" grab_mods:0x%0X\n",sr.grab_mods);
+// printf(" compat_grab_mods:0x%0X\n",sr.compat_grab_mods);
+// printf(" lookup_mods:0x%0X\n",sr.lookup_mods);
+// printf(" compat_lookup_mods:0x%0X\n",sr.compat_lookup_mods);
+// printf(" ptr_buttons:0x%0X\n",sr.ptr_buttons);
+// printf("-------------------------------------^^^^\n");
+ return (jint)(sr.group);
+}
+JNIEXPORT jlong JNICALL
+Java_sun_awt_X11_XlibWrapper_XkbKeycodeToKeysym(JNIEnv *env, jclass clazz,
+ jlong display, jint keycode,
+ jint group, jint level) {
+ AWT_CHECK_HAVE_LOCK();
+ return XkbKeycodeToKeysym((Display*) jlong_to_ptr(display), (unsigned int)keycode, (unsigned int)group, (unsigned int)level);
+}
+
+JNIEXPORT jint JNICALL
Java_sun_awt_X11_XlibWrapper_XKeysymToKeycode(JNIEnv *env, jclass clazz,
jlong display, jlong keysym) {
AWT_CHECK_HAVE_LOCK();
@@ -1945,3 +2067,77 @@
ShapeBounding, 0, 0, None, ShapeSet);
}
}
+
+/*
+ * Class: XlibWrapper
+ * Method: SetZOrder
+ */
+
+JNIEXPORT void JNICALL
+Java_sun_awt_X11_XlibWrapper_SetZOrder
+(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong above)
+{
+ AWT_CHECK_HAVE_LOCK();
+
+ XWindowChanges wc;
+ wc.sibling = (Window)jlong_to_ptr(above);
+
+ unsigned int value_mask = CWStackMode;
+
+ if (above == 0) {
+ wc.stack_mode = Above;
+ } else {
+ wc.stack_mode = Below;
+ value_mask |= CWSibling;
+ }
+
+ XConfigureWindow((Display *)jlong_to_ptr(display),
+ (Window)jlong_to_ptr(window),
+ value_mask, &wc );
+}
+
+/*
+ * Class: XlibWrapper
+ * Method: SetBitmapShape
+ */
+JNIEXPORT void JNICALL
+Java_sun_awt_X11_XlibWrapper_SetBitmapShape
+(JNIEnv *env, jclass clazz, jlong display, jlong window,
+ jint width, jint height, jintArray bitmap)
+{
+ jsize len;
+ jint *values;
+ jboolean isCopy = JNI_FALSE;
+ size_t worstBufferSize = (size_t)((width / 2 + 1) * height);
+ RECT_T * pRect;
+
+ AWT_CHECK_HAVE_LOCK();
+
+ len = (*env)->GetArrayLength(env, bitmap);
+ if (len == 0 || len < width * height) {
+ return;
+ }
+
+ values = (*env)->GetIntArrayElements(env, bitmap, &isCopy);
+ if (JNU_IsNull(env, values)) {
+ return;
+ }
+
+ pRect = (RECT_T *)malloc(worstBufferSize * sizeof(RECT_T));
+
+ /* Note: the values[0] and values[1] are supposed to contain the width
+ * and height (see XIconInfo.getIntData() for details). So, we do +2.
+ */
+ int numrects = BitmapToYXBandedRectangles(32, (int)width, (int)height,
+ (unsigned char *)(values + 2), pRect);
+
+ XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),
+ ShapeClip, 0, 0, pRect, numrects, ShapeSet, YXBanded);
+ XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),
+ ShapeBounding, 0, 0, pRect, numrects, ShapeSet, YXBanded);
+
+ free(pRect);
+
+ (*env)->ReleaseIntArrayElements(env, bitmap, values, JNI_ABORT);
+}
+
--- a/jdk/src/windows/classes/sun/awt/Win32GraphicsConfig.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/classes/sun/awt/Win32GraphicsConfig.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -331,4 +331,12 @@
}
// the rest of the flip actions are not supported
}
+
+ /*
+ @Override
+ */
+ public boolean isTranslucencyCapable() {
+ //XXX: worth checking if 8-bit? Anyway, it doesn't hurt.
+ return true;
+ }
}
--- a/jdk/src/windows/classes/sun/awt/Win32GraphicsDevice.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/classes/sun/awt/Win32GraphicsDevice.java Mon Apr 27 12:33:57 2009 -0700
@@ -380,7 +380,6 @@
// fix for 4868278
peer.updateGC();
- peer.resetTargetGC();
}
}
--- a/jdk/src/windows/classes/sun/awt/Win32GraphicsEnvironment.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/classes/sun/awt/Win32GraphicsEnvironment.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -398,4 +398,11 @@
public boolean isDisplayLocal() {
return true;
}
+
+ /**
+ * Used to find out if the OS is Windows Vista or later.
+ *
+ * @return {@code true} if the OS is Vista or later, {@code false} otherwise
+ */
+ public static native boolean isVistaOS();
}
--- a/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java Mon Apr 27 12:33:57 2009 -0700
@@ -32,6 +32,7 @@
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.*;
+import java.util.concurrent.*;
import javax.swing.SwingConstants;
// NOTE: This class supersedes Win32ShellFolder, which was removed from
@@ -184,15 +185,20 @@
boolean disposed;
public void dispose() {
if (disposed) return;
- if (relativePIDL != 0) {
- releasePIDL(relativePIDL);
- }
- if (absolutePIDL != 0) {
- releasePIDL(absolutePIDL);
- }
- if (pIShellFolder != 0) {
- releaseIShellFolder(pIShellFolder);
- }
+ ShellFolder.getInvoker().invoke(new Callable<Void>() {
+ public Void call() throws Exception {
+ if (relativePIDL != 0) {
+ releasePIDL(relativePIDL);
+ }
+ if (absolutePIDL != 0) {
+ releasePIDL(absolutePIDL);
+ }
+ if (pIShellFolder != 0) {
+ releaseIShellFolder(pIShellFolder);
+ }
+ return null;
+ }
+ });
disposed = true;
}
}
@@ -218,50 +224,59 @@
*/
private boolean isPersonal;
+ private static String composePathForCsidl(int csidl) throws IOException {
+ String path = getFileSystemPath(csidl);
+ return path == null
+ ? ("ShellFolder: 0x" + Integer.toHexString(csidl))
+ : path;
+ }
/**
* Create a system special shell folder, such as the
* desktop or Network Neighborhood.
*/
- Win32ShellFolder2(int csidl) throws IOException {
+ Win32ShellFolder2(final int csidl) throws IOException {
// Desktop is parent of DRIVES and NETWORK, not necessarily
// other special shell folders.
- super(null,
- (getFileSystemPath(csidl) == null)
- ? ("ShellFolder: 0x"+Integer.toHexString(csidl)) : getFileSystemPath(csidl));
- if (csidl == DESKTOP) {
- initDesktop();
- } else {
- initSpecial(getDesktop().getIShellFolder(), csidl);
- // At this point, the native method initSpecial() has set our relativePIDL
- // relative to the Desktop, which may not be our immediate parent. We need
- // to traverse this ID list and break it into a chain of shell folders from
- // the top, with each one having an immediate parent and a relativePIDL
- // relative to that parent.
- long pIDL = disposer.relativePIDL;
- parent = getDesktop();
- while (pIDL != 0) {
- // Get a child pidl relative to 'parent'
- long childPIDL = copyFirstPIDLEntry(pIDL);
- if (childPIDL != 0) {
- // Get a handle to the the rest of the ID list
- // i,e, parent's grandchilren and down
- pIDL = getNextPIDLEntry(pIDL);
- if (pIDL != 0) {
- // Now we know that parent isn't immediate to 'this' because it
- // has a continued ID list. Create a shell folder for this child
- // pidl and make it the new 'parent'.
- parent = new Win32ShellFolder2((Win32ShellFolder2)parent, childPIDL);
- } else {
- // No grandchildren means we have arrived at the parent of 'this',
- // and childPIDL is directly relative to parent.
- disposer.relativePIDL = childPIDL;
+ super(null, composePathForCsidl(csidl));
+ ShellFolder.getInvoker().invoke(new Callable<Void>() {
+ public Void call() throws Exception {
+ if (csidl == DESKTOP) {
+ initDesktop();
+ } else {
+ initSpecial(getDesktop().getIShellFolder(), csidl);
+ // At this point, the native method initSpecial() has set our relativePIDL
+ // relative to the Desktop, which may not be our immediate parent. We need
+ // to traverse this ID list and break it into a chain of shell folders from
+ // the top, with each one having an immediate parent and a relativePIDL
+ // relative to that parent.
+ long pIDL = disposer.relativePIDL;
+ parent = getDesktop();
+ while (pIDL != 0) {
+ // Get a child pidl relative to 'parent'
+ long childPIDL = copyFirstPIDLEntry(pIDL);
+ if (childPIDL != 0) {
+ // Get a handle to the the rest of the ID list
+ // i,e, parent's grandchilren and down
+ pIDL = getNextPIDLEntry(pIDL);
+ if (pIDL != 0) {
+ // Now we know that parent isn't immediate to 'this' because it
+ // has a continued ID list. Create a shell folder for this child
+ // pidl and make it the new 'parent'.
+ parent = new Win32ShellFolder2((Win32ShellFolder2) parent, childPIDL);
+ } else {
+ // No grandchildren means we have arrived at the parent of 'this',
+ // and childPIDL is directly relative to parent.
+ disposer.relativePIDL = childPIDL;
+ }
+ } else {
+ break;
+ }
}
- } else {
- break;
}
+ return null;
}
- }
+ });
sun.java2d.Disposer.addRecord(this, disposer);
}
@@ -281,17 +296,26 @@
/**
* Creates a shell folder with a parent and relative PIDL
*/
- Win32ShellFolder2(Win32ShellFolder2 parent, long relativePIDL) {
- super(parent, getFileSystemPath(parent.getIShellFolder(), relativePIDL));
+ Win32ShellFolder2(final Win32ShellFolder2 parent, final long relativePIDL) {
+ super(parent,
+ ShellFolder.getInvoker().invoke(new Callable<String>() {
+ public String call() throws Exception {
+ return getFileSystemPath(parent.getIShellFolder(), relativePIDL);
+ }
+ })
+ );
this.disposer.relativePIDL = relativePIDL;
getAbsolutePath();
sun.java2d.Disposer.addRecord(this, disposer);
}
// Initializes the desktop shell folder
+ // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
private native void initDesktop();
+
// Initializes a special, non-file system shell folder
// from one of the above constants
+ // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
private native void initSpecial(long desktopIShellFolder, int csidl);
/** Marks this folder as being the My Documents (Personal) folder */
@@ -311,26 +335,30 @@
* drive (normally "C:\").
*/
protected Object writeReplace() throws java.io.ObjectStreamException {
- if (isFileSystem()) {
- return new File(getPath());
- } else {
- Win32ShellFolder2 drives = Win32ShellFolderManager2.getDrives();
- if (drives != null) {
- File[] driveRoots = drives.listFiles();
- if (driveRoots != null) {
- for (int i = 0; i < driveRoots.length; i++) {
- if (driveRoots[i] instanceof Win32ShellFolder2) {
- Win32ShellFolder2 sf = (Win32ShellFolder2)driveRoots[i];
- if (sf.isFileSystem() && !sf.hasAttribute(ATTRIB_REMOVABLE)) {
- return new File(sf.getPath());
+ return ShellFolder.getInvoker().invoke(new Callable<File>() {
+ public File call() throws Exception {
+ if (isFileSystem()) {
+ return new File(getPath());
+ } else {
+ Win32ShellFolder2 drives = Win32ShellFolderManager2.getDrives();
+ if (drives != null) {
+ File[] driveRoots = drives.listFiles();
+ if (driveRoots != null) {
+ for (int i = 0; i < driveRoots.length; i++) {
+ if (driveRoots[i] instanceof Win32ShellFolder2) {
+ Win32ShellFolder2 sf = (Win32ShellFolder2) driveRoots[i];
+ if (sf.isFileSystem() && !sf.hasAttribute(ATTRIB_REMOVABLE)) {
+ return new File(sf.getPath());
+ }
+ }
}
}
}
+ // Ouch, we have no hard drives. Return something "valid" anyway.
+ return new File("C:\\");
}
}
- // Ouch, we have no hard drives. Return something "valid" anyway.
- return new File("C:\\");
- }
+ });
}
@@ -364,6 +392,7 @@
static native void releasePIDL(long pIDL);
// Release an IShellFolder object
+ // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
private static native void releaseIShellFolder(long pIShellFolder);
/**
@@ -371,18 +400,28 @@
*/
public long getIShellFolder() {
if (disposer.pIShellFolder == 0) {
- assert(isDirectory());
- assert(parent != null);
- long parentIShellFolder = getParentIShellFolder();
- if (parentIShellFolder == 0) {
- throw new InternalError("Parent IShellFolder was null for " + getAbsolutePath());
- }
- // We are a directory with a parent and a relative PIDL.
- // We want to bind to the parent so we get an IShellFolder instance associated with us.
- disposer.pIShellFolder = bindToObject(parentIShellFolder, disposer.relativePIDL);
- if (disposer.pIShellFolder == 0) {
- throw new InternalError("Unable to bind " + getAbsolutePath() + " to parent");
- }
+ disposer.pIShellFolder =
+ ShellFolder.getInvoker().invoke(new Callable<Long>() {
+ public Long call() throws Exception {
+ assert(isDirectory());
+ assert(parent != null);
+ long parentIShellFolder = getParentIShellFolder();
+ if (parentIShellFolder == 0) {
+ throw new InternalError("Parent IShellFolder was null for "
+ + getAbsolutePath());
+ }
+ // We are a directory with a parent and a relative PIDL.
+ // We want to bind to the parent so we get an
+ // IShellFolder instance associated with us.
+ long pIShellFolder = bindToObject(parentIShellFolder,
+ disposer.relativePIDL);
+ if (pIShellFolder == 0) {
+ throw new InternalError("Unable to bind "
+ + getAbsolutePath() + " to parent");
+ }
+ return pIShellFolder;
+ }
+ });
}
return disposer.pIShellFolder;
}
@@ -472,24 +511,42 @@
return false;
}
- private static boolean pidlsEqual(long pIShellFolder, long pidl1, long pidl2) {
- return (compareIDs(pIShellFolder, pidl1, pidl2) == 0);
+ private static boolean pidlsEqual(final long pIShellFolder, final long pidl1, final long pidl2) {
+ return ShellFolder.getInvoker().invoke(new Callable<Boolean>() {
+ public Boolean call() throws Exception {
+ return (compareIDs(pIShellFolder, pidl1, pidl2) == 0);
+ }
+ });
}
+
+ // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
private static native int compareIDs(long pParentIShellFolder, long pidl1, long pidl2);
+ private Boolean cachedIsFileSystem;
+
/**
* @return Whether this is a file system shell folder
*/
- public boolean isFileSystem() {
- return hasAttribute(ATTRIB_FILESYSTEM);
+ public synchronized boolean isFileSystem() {
+ if (cachedIsFileSystem == null) {
+ cachedIsFileSystem = hasAttribute(ATTRIB_FILESYSTEM);
+ }
+
+ return cachedIsFileSystem;
}
/**
* Return whether the given attribute flag is set for this object
*/
- public boolean hasAttribute(int attribute) {
- // Caching at this point doesn't seem to be cost efficient
- return (getAttributes0(getParentIShellFolder(), getRelativePIDL(), attribute) & attribute) != 0;
+ public boolean hasAttribute(final int attribute) {
+ return ShellFolder.getInvoker().invoke(new Callable<Boolean>() {
+ public Boolean call() throws Exception {
+ // Caching at this point doesn't seem to be cost efficient
+ return (getAttributes0(getParentIShellFolder(),
+ getRelativePIDL(), attribute)
+ & attribute) != 0;
+ }
+ });
}
/**
@@ -498,26 +555,42 @@
* Could plausibly be used for attribute caching but have to be
* very careful not to touch network drives and file system roots
* with a full attrsMask
+ * NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
*/
+
private static native int getAttributes0(long pParentIShellFolder, long pIDL, int attrsMask);
// Return the path to the underlying file system object
- private static String getFileSystemPath(long parentIShellFolder, long relativePIDL) {
- int linkedFolder = ATTRIB_LINK | ATTRIB_FOLDER;
- if (parentIShellFolder == Win32ShellFolderManager2.getNetwork().getIShellFolder() &&
- getAttributes0(parentIShellFolder, relativePIDL, linkedFolder) == linkedFolder) {
+ private static String getFileSystemPath(final long parentIShellFolder, final long relativePIDL) {
+ return ShellFolder.getInvoker().invoke(new Callable<String>() {
+ public String call() throws Exception {
+ int linkedFolder = ATTRIB_LINK | ATTRIB_FOLDER;
+ if (parentIShellFolder == Win32ShellFolderManager2.getNetwork().getIShellFolder() &&
+ getAttributes0(parentIShellFolder, relativePIDL, linkedFolder) == linkedFolder) {
- String s =
- getFileSystemPath(Win32ShellFolderManager2.getDesktop().getIShellFolder(),
- getLinkLocation(parentIShellFolder, relativePIDL, false));
- if (s != null && s.startsWith("\\\\")) {
- return s;
+ String s =
+ getFileSystemPath(Win32ShellFolderManager2.getDesktop().getIShellFolder(),
+ getLinkLocation(parentIShellFolder, relativePIDL, false));
+ if (s != null && s.startsWith("\\\\")) {
+ return s;
+ }
+ }
+ return getDisplayNameOf(parentIShellFolder, relativePIDL, SHGDN_FORPARSING);
}
- }
- return getDisplayNameOf(parentIShellFolder, relativePIDL, SHGDN_NORMAL | SHGDN_FORPARSING);
+ });
}
+
// Needs to be accessible to Win32ShellFolderManager2
- static native String getFileSystemPath(int csidl) throws IOException;
+ static String getFileSystemPath(final int csidl) throws IOException {
+ return ShellFolder.getInvoker().invoke(new Callable<String>() {
+ public String call() throws Exception {
+ return getFileSystemPath0(csidl);
+ }
+ });
+ }
+
+ // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
+ private static native String getFileSystemPath0(int csidl) throws IOException;
// Return whether the path is a network root.
// Path is assumed to be non-null
@@ -557,24 +630,33 @@
*/
// Returns an IEnumIDList interface for an IShellFolder. The value
// returned must be released using releaseEnumObjects().
- private long getEnumObjects(long pIShellFolder, boolean includeHiddenFiles) {
- boolean isDesktop = (disposer.pIShellFolder == getDesktopIShellFolder());
- return getEnumObjects(disposer.pIShellFolder, isDesktop, includeHiddenFiles);
+ private long getEnumObjects(long pIShellFolder, final boolean includeHiddenFiles) {
+ final boolean isDesktop = (disposer.pIShellFolder == getDesktopIShellFolder());
+ return ShellFolder.getInvoker().invoke(new Callable<Long>() {
+ public Long call() throws Exception {
+ return getEnumObjects(disposer.pIShellFolder, isDesktop, includeHiddenFiles);
+ }
+ });
}
+
// Returns an IEnumIDList interface for an IShellFolder. The value
// returned must be released using releaseEnumObjects().
+ // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
private native long getEnumObjects(long pIShellFolder, boolean isDesktop,
boolean includeHiddenFiles);
// Returns the next sequential child as a relative PIDL
// from an IEnumIDList interface. The value returned must
// be released using releasePIDL().
+ // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
private native long getNextChild(long pEnumObjects);
// Releases the IEnumIDList interface
+ // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
private native void releaseEnumObjects(long pEnumObjects);
// Returns the IShellFolder of a child from a parent IShellFolder
// and a relative PIDL. The value returned must be released
// using releaseIShellFolder().
+ // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
private static native long bindToObject(long parentIShellFolder, long pIDL);
/**
@@ -582,60 +664,64 @@
* object. The array will be empty if the folder is empty. Returns
* <code>null</code> if this shellfolder does not denote a directory.
*/
- public File[] listFiles(boolean includeHiddenFiles) {
+ public File[] listFiles(final boolean includeHiddenFiles) {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkRead(getPath());
}
- if (!isDirectory()) {
- return null;
- }
- // Links to directories are not directories and cannot be parents.
- // This does not apply to folders in My Network Places (NetHood)
- // because they are both links and real directories!
- if (isLink() && !hasAttribute(ATTRIB_FOLDER)) {
- return new File[0];
- }
- Win32ShellFolder2 desktop = Win32ShellFolderManager2.getDesktop();
- Win32ShellFolder2 personal = Win32ShellFolderManager2.getPersonal();
-
- // If we are a directory, we have a parent and (at least) a
- // relative PIDL. We must first ensure we are bound to the
- // parent so we have an IShellFolder to query.
- long pIShellFolder = getIShellFolder();
- // Now we can enumerate the objects in this folder.
- ArrayList<Win32ShellFolder2> list = new ArrayList<Win32ShellFolder2>();
- long pEnumObjects = getEnumObjects(pIShellFolder, includeHiddenFiles);
- if (pEnumObjects != 0) {
- long childPIDL;
- int testedAttrs = ATTRIB_FILESYSTEM | ATTRIB_FILESYSANCESTOR;
- do {
- if (Thread.currentThread().isInterrupted()) {
+ return ShellFolder.getInvoker().invoke(new Callable<File[]>() {
+ public File[] call() throws Exception {
+ if (!isDirectory()) {
+ return null;
+ }
+ // Links to directories are not directories and cannot be parents.
+ // This does not apply to folders in My Network Places (NetHood)
+ // because they are both links and real directories!
+ if (isLink() && !hasAttribute(ATTRIB_FOLDER)) {
return new File[0];
}
- childPIDL = getNextChild(pEnumObjects);
- boolean releasePIDL = true;
- if (childPIDL != 0 &&
- (getAttributes0(pIShellFolder, childPIDL, testedAttrs) & testedAttrs) != 0) {
- Win32ShellFolder2 childFolder = null;
- if (this.equals(desktop)
- && personal != null
- && pidlsEqual(pIShellFolder, childPIDL, personal.disposer.relativePIDL)) {
- childFolder = personal;
- } else {
- childFolder = new Win32ShellFolder2(this, childPIDL);
- releasePIDL = false;
- }
- list.add(childFolder);
+
+ Win32ShellFolder2 desktop = Win32ShellFolderManager2.getDesktop();
+ Win32ShellFolder2 personal = Win32ShellFolderManager2.getPersonal();
+
+ // If we are a directory, we have a parent and (at least) a
+ // relative PIDL. We must first ensure we are bound to the
+ // parent so we have an IShellFolder to query.
+ long pIShellFolder = getIShellFolder();
+ // Now we can enumerate the objects in this folder.
+ ArrayList<Win32ShellFolder2> list = new ArrayList<Win32ShellFolder2>();
+ long pEnumObjects = getEnumObjects(pIShellFolder, includeHiddenFiles);
+ if (pEnumObjects != 0) {
+ long childPIDL;
+ int testedAttrs = ATTRIB_FILESYSTEM | ATTRIB_FILESYSANCESTOR;
+ do {
+ childPIDL = getNextChild(pEnumObjects);
+ boolean releasePIDL = true;
+ if (childPIDL != 0 &&
+ (getAttributes0(pIShellFolder, childPIDL, testedAttrs) & testedAttrs) != 0) {
+ Win32ShellFolder2 childFolder;
+ if (Win32ShellFolder2.this.equals(desktop)
+ && personal != null
+ && pidlsEqual(pIShellFolder, childPIDL, personal.disposer.relativePIDL)) {
+ childFolder = personal;
+ } else {
+ childFolder = new Win32ShellFolder2(Win32ShellFolder2.this, childPIDL);
+ releasePIDL = false;
+ }
+ list.add(childFolder);
+ }
+ if (releasePIDL) {
+ releasePIDL(childPIDL);
+ }
+ } while (childPIDL != 0 && !Thread.currentThread().isInterrupted());
+ releaseEnumObjects(pEnumObjects);
}
- if (releasePIDL) {
- releasePIDL(childPIDL);
- }
- } while (childPIDL != 0);
- releaseEnumObjects(pEnumObjects);
- }
- return list.toArray(new ShellFolder[list.size()]);
+ return Thread.currentThread().isInterrupted()
+ ? new File[0]
+ : list.toArray(new ShellFolder[list.size()]);
+ }
+ });
}
@@ -644,33 +730,43 @@
*
* @return The child shellfolder, or null if not found.
*/
- Win32ShellFolder2 getChildByPath(String filePath) {
- long pIShellFolder = getIShellFolder();
- long pEnumObjects = getEnumObjects(pIShellFolder, true);
- Win32ShellFolder2 child = null;
- long childPIDL;
+ Win32ShellFolder2 getChildByPath(final String filePath) {
+ return ShellFolder.getInvoker().invoke(new Callable<Win32ShellFolder2>() {
+ public Win32ShellFolder2 call() throws Exception {
+ long pIShellFolder = getIShellFolder();
+ long pEnumObjects = getEnumObjects(pIShellFolder, true);
+ Win32ShellFolder2 child = null;
+ long childPIDL = 0;
- while ((childPIDL = getNextChild(pEnumObjects)) != 0) {
- if (getAttributes0(pIShellFolder, childPIDL, ATTRIB_FILESYSTEM) != 0) {
- String path = getFileSystemPath(pIShellFolder, childPIDL);
- if (path != null && path.equalsIgnoreCase(filePath)) {
- long childIShellFolder = bindToObject(pIShellFolder, childPIDL);
- child = new Win32ShellFolder2(this, childIShellFolder, childPIDL, path);
- break;
+ while ((childPIDL = getNextChild(pEnumObjects)) != 0) {
+ if (getAttributes0(pIShellFolder, childPIDL, ATTRIB_FILESYSTEM) != 0) {
+ String path = getFileSystemPath(pIShellFolder, childPIDL);
+ if (path != null && path.equalsIgnoreCase(filePath)) {
+ long childIShellFolder = bindToObject(pIShellFolder, childPIDL);
+ child = new Win32ShellFolder2(Win32ShellFolder2.this,
+ childIShellFolder, childPIDL, path);
+ break;
+ }
+ }
+ releasePIDL(childPIDL);
}
+ releaseEnumObjects(pEnumObjects);
+ return child;
}
- releasePIDL(childPIDL);
- }
- releaseEnumObjects(pEnumObjects);
- return child;
+ });
}
+ private Boolean cachedIsLink;
/**
* @return Whether this shell folder is a link
*/
- public boolean isLink() {
- return hasAttribute(ATTRIB_LINK);
+ public synchronized boolean isLink() {
+ if (cachedIsLink == null) {
+ cachedIsLink = hasAttribute(ATTRIB_LINK);
+ }
+
+ return cachedIsLink;
}
/**
@@ -682,6 +778,7 @@
// Return the link location of a shell folder
+ // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
private static native long getLinkLocation(long parentIShellFolder,
long relativePIDL, boolean resolve);
@@ -693,38 +790,52 @@
return getLinkLocation(true);
}
- private ShellFolder getLinkLocation(boolean resolve) {
- if (!isLink()) {
- return null;
- }
+ private ShellFolder getLinkLocation(final boolean resolve) {
+ return ShellFolder.getInvoker().invoke(new Callable<ShellFolder>() {
+ public ShellFolder call() throws Exception {
+ if (!isLink()) {
+ return null;
+ }
- ShellFolder location = null;
- long linkLocationPIDL = getLinkLocation(getParentIShellFolder(),
- getRelativePIDL(), resolve);
- if (linkLocationPIDL != 0) {
- try {
- location =
- Win32ShellFolderManager2.createShellFolderFromRelativePIDL(getDesktop(),
- linkLocationPIDL);
- } catch (InternalError e) {
- // Could be a link to a non-bindable object, such as a network connection
- // TODO: getIShellFolder() should throw FileNotFoundException instead
+ ShellFolder location = null;
+ long linkLocationPIDL = getLinkLocation(getParentIShellFolder(),
+ getRelativePIDL(), resolve);
+ if (linkLocationPIDL != 0) {
+ try {
+ location =
+ Win32ShellFolderManager2.createShellFolderFromRelativePIDL(getDesktop(),
+ linkLocationPIDL);
+ } catch (InternalError e) {
+ // Could be a link to a non-bindable object, such as a network connection
+ // TODO: getIShellFolder() should throw FileNotFoundException instead
+ }
+ }
+ return location;
}
- }
- return location;
+ });
}
// Parse a display name into a PIDL relative to the current IShellFolder.
- long parseDisplayName(String name) throws FileNotFoundException {
+ long parseDisplayName(final String name) throws FileNotFoundException {
try {
- return parseDisplayName0(getIShellFolder(), name);
- } catch (IOException e) {
- throw new FileNotFoundException("Could not find file " + name);
+ return ShellFolder.getInvoker().invoke(new Callable<Long>() {
+ public Long call() throws Exception {
+ return parseDisplayName0(getIShellFolder(), name);
+ }
+ });
+ } catch (RuntimeException e) {
+ if (e.getCause() instanceof IOException) {
+ throw new FileNotFoundException("Could not find file " + name);
+ }
+ throw e;
}
}
+
+ // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
private static native long parseDisplayName0(long pIShellFolder, String name) throws IOException;
// Return the display name of a shell folder
+ // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
private static native String getDisplayNameOf(long parentIShellFolder,
long relativePIDL,
int attrs);
@@ -734,12 +845,19 @@
*/
public String getDisplayName() {
if (displayName == null) {
- displayName = getDisplayNameOf(getParentIShellFolder(), getRelativePIDL(), SHGDN_NORMAL);
+ displayName =
+ ShellFolder.getInvoker().invoke(new Callable<String>() {
+ public String call() throws Exception {
+ return getDisplayNameOf(getParentIShellFolder(),
+ getRelativePIDL(), SHGDN_NORMAL);
+ }
+ });
}
return displayName;
}
// Return the folder type of a shell folder
+ // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
private static native String getFolderType(long pIDL);
/**
@@ -747,7 +865,13 @@
*/
public String getFolderType() {
if (folderType == null) {
- folderType = getFolderType(getAbsolutePIDL());
+ final long absolutePIDL = getAbsolutePIDL();
+ folderType =
+ ShellFolder.getInvoker().invoke(new Callable<String>() {
+ public String call() throws Exception {
+ return getFolderType(absolutePIDL);
+ }
+ });
}
return folderType;
}
@@ -774,11 +898,16 @@
private static Map smallLinkedSystemImages = new HashMap();
private static Map largeLinkedSystemImages = new HashMap();
+ // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
private static native long getIShellIcon(long pIShellFolder);
+
+ // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
private static native int getIconIndex(long parentIShellIcon, long relativePIDL);
// Return the icon of a file system shell folder in the form of an HICON
private static native long getIcon(String absolutePath, boolean getLargeIcon);
+
+ // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
private static native long extractIcon(long parentIShellFolder, long relativePIDL,
boolean getLargeIcon);
@@ -799,7 +928,12 @@
private long getIShellIcon() {
if (pIShellIcon == -1L) {
- pIShellIcon = getIShellIcon(getIShellFolder());
+ pIShellIcon =
+ ShellFolder.getInvoker().invoke(new Callable<Long>() {
+ public Long call() throws Exception {
+ return getIShellIcon(getIShellFolder());
+ }
+ });
}
return pIShellIcon;
}
@@ -850,50 +984,60 @@
/**
* @return The icon image used to display this shell folder
*/
- public Image getIcon(boolean getLargeIcon) {
+ public Image getIcon(final boolean getLargeIcon) {
Image icon = getLargeIcon ? largeIcon : smallIcon;
if (icon == null) {
- long parentIShellIcon = (parent != null) ? ((Win32ShellFolder2)parent).getIShellIcon() : 0L;
- long relativePIDL = getRelativePIDL();
+ icon =
+ ShellFolder.getInvoker().invoke(new Callable<Image>() {
+ public Image call() throws Exception {
+ Image newIcon = null;
+ if (isFileSystem()) {
+ long parentIShellIcon = (parent != null)
+ ? ((Win32ShellFolder2) parent).getIShellIcon()
+ : 0L;
+ long relativePIDL = getRelativePIDL();
- if (isFileSystem()) {
- // These are cached per type (using the index in the system image list)
- int index = getIconIndex(parentIShellIcon, relativePIDL);
- if (index > 0) {
- Map imageCache;
- if (isLink()) {
- imageCache = getLargeIcon ? largeLinkedSystemImages : smallLinkedSystemImages;
- } else {
- imageCache = getLargeIcon ? largeSystemImages : smallSystemImages;
+ // These are cached per type (using the index in the system image list)
+ int index = getIconIndex(parentIShellIcon, relativePIDL);
+ if (index > 0) {
+ Map imageCache;
+ if (isLink()) {
+ imageCache = getLargeIcon ? largeLinkedSystemImages : smallLinkedSystemImages;
+ } else {
+ imageCache = getLargeIcon ? largeSystemImages : smallSystemImages;
+ }
+ newIcon = (Image) imageCache.get(Integer.valueOf(index));
+ if (newIcon == null) {
+ long hIcon = getIcon(getAbsolutePath(), getLargeIcon);
+ newIcon = makeIcon(hIcon, getLargeIcon);
+ disposeIcon(hIcon);
+ if (newIcon != null) {
+ imageCache.put(Integer.valueOf(index), newIcon);
+ }
+ }
+ }
+ }
+
+ if (newIcon == null) {
+ // These are only cached per object
+ long hIcon = extractIcon(getParentIShellFolder(),
+ getRelativePIDL(), getLargeIcon);
+ newIcon = makeIcon(hIcon, getLargeIcon);
+ disposeIcon(hIcon);
+ }
+
+ if (newIcon == null) {
+ newIcon = Win32ShellFolder2.super.getIcon(getLargeIcon);
+ }
+ return newIcon;
}
- icon = (Image)imageCache.get(Integer.valueOf(index));
- if (icon == null) {
- long hIcon = getIcon(getAbsolutePath(), getLargeIcon);
- icon = makeIcon(hIcon, getLargeIcon);
- disposeIcon(hIcon);
- if (icon != null) {
- imageCache.put(Integer.valueOf(index), icon);
- }
- }
- }
- }
-
- if (icon == null) {
- // These are only cached per object
- long hIcon = extractIcon(getParentIShellFolder(), getRelativePIDL(), getLargeIcon);
- icon = makeIcon(hIcon, getLargeIcon);
- disposeIcon(hIcon);
- }
-
+ });
if (getLargeIcon) {
largeIcon = icon;
} else {
smallIcon = icon;
}
}
- if (icon == null) {
- icon = super.getIcon(getLargeIcon);
- }
return icon;
}
@@ -969,39 +1113,50 @@
private static final int LVCFMT_CENTER = 2;
public ShellFolderColumnInfo[] getFolderColumns() {
- ShellFolderColumnInfo[] columns = doGetColumnInfo(getIShellFolder());
+ return ShellFolder.getInvoker().invoke(new Callable<ShellFolderColumnInfo[]>() {
+ public ShellFolderColumnInfo[] call() throws Exception {
+ ShellFolderColumnInfo[] columns = doGetColumnInfo(getIShellFolder());
- if (columns != null) {
- List<ShellFolderColumnInfo> notNullColumns =
- new ArrayList<ShellFolderColumnInfo>();
- for (int i = 0; i < columns.length; i++) {
- ShellFolderColumnInfo column = columns[i];
- if (column != null) {
- column.setAlignment(column.getAlignment() == LVCFMT_RIGHT
- ? SwingConstants.RIGHT
- : column.getAlignment() == LVCFMT_CENTER
- ? SwingConstants.CENTER
- : SwingConstants.LEADING);
+ if (columns != null) {
+ List<ShellFolderColumnInfo> notNullColumns =
+ new ArrayList<ShellFolderColumnInfo>();
+ for (int i = 0; i < columns.length; i++) {
+ ShellFolderColumnInfo column = columns[i];
+ if (column != null) {
+ column.setAlignment(column.getAlignment() == LVCFMT_RIGHT
+ ? SwingConstants.RIGHT
+ : column.getAlignment() == LVCFMT_CENTER
+ ? SwingConstants.CENTER
+ : SwingConstants.LEADING);
- column.setComparator(new ColumnComparator(getIShellFolder(), i));
+ column.setComparator(new ColumnComparator(getIShellFolder(), i));
- notNullColumns.add(column);
+ notNullColumns.add(column);
+ }
+ }
+ columns = new ShellFolderColumnInfo[notNullColumns.size()];
+ notNullColumns.toArray(columns);
}
+ return columns;
}
- columns = new ShellFolderColumnInfo[notNullColumns.size()];
- notNullColumns.toArray(columns);
- }
- return columns;
+ });
}
- public Object getFolderColumnValue(int column) {
- return doGetColumnValue(getParentIShellFolder(), getRelativePIDL(), column);
+ public Object getFolderColumnValue(final int column) {
+ return ShellFolder.getInvoker().invoke(new Callable<Object>() {
+ public Object call() throws Exception {
+ return doGetColumnValue(getParentIShellFolder(), getRelativePIDL(), column);
+ }
+ });
}
+ // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
private native ShellFolderColumnInfo[] doGetColumnInfo(long iShellFolder2);
+ // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
private native Object doGetColumnValue(long parentIShellFolder2, long childPIDL, int columnIdx);
+ // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
private static native int compareIDsByColumn(long pParentIShellFolder, long pidl1, long pidl2, int columnIdx);
@@ -1020,17 +1175,20 @@
}
// compares 2 objects within this folder by the specified column
- public int compare(File o, File o1) {
- if (o instanceof Win32ShellFolder2
- && o1 instanceof Win32ShellFolder2) {
- // delegates comparison to native method
- return compareIDsByColumn(parentIShellFolder,
- ((Win32ShellFolder2) o).getRelativePIDL(),
- ((Win32ShellFolder2) o1).getRelativePIDL(),
- columnIdx);
- }
- return 0;
+ public int compare(final File o, final File o1) {
+ return ShellFolder.getInvoker().invoke(new Callable<Integer>() {
+ public Integer call() throws Exception {
+ if (o instanceof Win32ShellFolder2
+ && o1 instanceof Win32ShellFolder2) {
+ // delegates comparison to native method
+ return compareIDsByColumn(parentIShellFolder,
+ ((Win32ShellFolder2) o).getRelativePIDL(),
+ ((Win32ShellFolder2) o1).getRelativePIDL(),
+ columnIdx);
+ }
+ return 0;
+ }
+ });
}
}
-
}
--- a/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java Mon Apr 27 12:33:57 2009 -0700
@@ -31,7 +31,10 @@
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.AccessController;
+import java.security.PrivilegedAction;
import java.util.*;
+import java.util.concurrent.*;
+
import sun.security.action.LoadLibraryAction;
import static sun.awt.shell.Win32ShellFolder2.*;
@@ -408,4 +411,102 @@
return name1.compareTo(name2);
}
}
+
+ @Override
+ protected Invoker createInvoker() {
+ return new ComInvoker();
+ }
+
+ private static class ComInvoker extends ThreadPoolExecutor implements ThreadFactory, ShellFolder.Invoker {
+ private static Thread comThread;
+
+ private ComInvoker() {
+ super(1, 1, 0, TimeUnit.DAYS, new LinkedBlockingQueue<Runnable>());
+ allowCoreThreadTimeOut(false);
+ setThreadFactory(this);
+ final Runnable shutdownHook = new Runnable() {
+ public void run() {
+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
+ public Void run() {
+ shutdownNow();
+ return null;
+ }
+ });
+ }
+ };
+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
+ public Void run() {
+ Runtime.getRuntime().addShutdownHook(
+ new Thread(shutdownHook)
+ );
+ return null;
+ }
+ });
+ }
+
+ public synchronized Thread newThread(final Runnable task) {
+ final Runnable comRun = new Runnable() {
+ public void run() {
+ try {
+ initializeCom();
+ task.run();
+ } finally {
+ uninitializeCom();
+ }
+ }
+ };
+ comThread =
+ AccessController.doPrivileged(
+ new PrivilegedAction<Thread>() {
+ public Thread run() {
+ /* The thread must be a member of a thread group
+ * which will not get GCed before VM exit.
+ * Make its parent the top-level thread group.
+ */
+ ThreadGroup tg = Thread.currentThread().getThreadGroup();
+ for (ThreadGroup tgn = tg;
+ tgn != null;
+ tg = tgn, tgn = tg.getParent());
+ Thread thread = new Thread(tg, comRun, "Swing-Shell");
+ thread.setDaemon(true);
+ return thread;
+ }
+ }
+ );
+ return comThread;
+ }
+
+ public <T> T invoke(Callable<T> task) {
+ try {
+ T result;
+ if (Thread.currentThread() == comThread) {
+ // if it's already called from the COM
+ // thread, we don't need to delegate the task
+ result = task.call();
+ } else {
+ Future<T> future = submit(task);
+ try {
+ result = future.get();
+ } catch (InterruptedException e) {
+ result = null;
+ future.cancel(true);
+ }
+ }
+ return result;
+ } catch (Exception e) {
+ Throwable cause = (e instanceof ExecutionException) ? e.getCause() : e;
+ if (cause instanceof RuntimeException) {
+ throw (RuntimeException) cause;
+ }
+ if (cause instanceof Error) {
+ throw (Error) cause;
+ }
+ throw new RuntimeException(cause);
+ }
+ }
+ }
+
+ static native void initializeCom();
+
+ static native void uninitializeCom();
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/windows/classes/sun/awt/windows/TranslucentWindowPainter.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,398 @@
+/*
+ * Copyright 2008-2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package sun.awt.windows;
+
+import java.awt.AlphaComposite;
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.GraphicsConfiguration;
+import java.awt.Image;
+import java.awt.Window;
+import java.awt.image.BufferedImage;
+import java.awt.image.DataBufferInt;
+import java.awt.image.VolatileImage;
+import java.lang.ref.WeakReference;
+import java.security.AccessController;
+import sun.awt.image.BufImgSurfaceData;
+import sun.java2d.DestSurfaceProvider;
+import sun.java2d.InvalidPipeException;
+import sun.java2d.Surface;
+import sun.java2d.pipe.RenderQueue;
+import sun.java2d.pipe.hw.AccelGraphicsConfig;
+import sun.java2d.pipe.hw.AccelSurface;
+import sun.security.action.GetPropertyAction;
+
+import static java.awt.image.VolatileImage.*;
+import static java.awt.Transparency.*;
+import static sun.java2d.pipe.hw.AccelSurface.*;
+import static sun.java2d.pipe.hw.ContextCapabilities.*;
+
+/**
+ * This class handles the updates of the non-opaque windows.
+ * The window associated with the peer is updated either given an image or
+ * the window is repainted to an internal buffer which is then used to update
+ * the window.
+ *
+ * Note: this class does not attempt to be thread safe, it is expected to be
+ * called from a single thread (EDT).
+ */
+public abstract class TranslucentWindowPainter {
+
+ protected Window window;
+ protected WWindowPeer peer;
+
+ // REMIND: we probably would want to remove this later
+ private static final boolean forceOpt =
+ Boolean.valueOf(AccessController.doPrivileged(
+ new GetPropertyAction("sun.java2d.twp.forceopt", "false")));
+ private static final boolean forceSW =
+ Boolean.valueOf(AccessController.doPrivileged(
+ new GetPropertyAction("sun.java2d.twp.forcesw", "false")));
+
+ /**
+ * Creates an instance of the painter for particular peer.
+ */
+ public static TranslucentWindowPainter createInstance(WWindowPeer peer) {
+ GraphicsConfiguration gc = peer.getGraphicsConfiguration();
+ if (!forceSW && gc instanceof AccelGraphicsConfig) {
+ String gcName = gc.getClass().getSimpleName();
+ AccelGraphicsConfig agc = (AccelGraphicsConfig)gc;
+ // this is a heuristic to check that we have a pcix board
+ // (those have higher transfer rate from gpu to cpu)
+ if ((agc.getContextCapabilities().getCaps() & CAPS_PS30) != 0 ||
+ forceOpt)
+ {
+ // we check for name to avoid loading classes unnecessarily if
+ // a pipeline isn't enabled
+ if (gcName.startsWith("D3D")) {
+ return new VIOptD3DWindowPainter(peer);
+ } else if (forceOpt && gcName.startsWith("WGL")) {
+ // on some boards (namely, ATI, even on pcix bus) ogl is
+ // very slow reading pixels back so for now it is disabled
+ // unless forced
+ return new VIOptWGLWindowPainter(peer);
+ }
+ }
+ }
+ return new BIWindowPainter(peer);
+ }
+
+ protected TranslucentWindowPainter(WWindowPeer peer) {
+ this.peer = peer;
+ this.window = (Window)peer.getTarget();
+ }
+
+ /**
+ * Creates (if needed), clears and returns the buffer for this painter.
+ */
+ protected abstract Image getBackBuffer();
+
+ /**
+ * Updates the the window associated with this painter with the contents
+ * of the passed image.
+ * The image can not be null, and NPE will be thrown if it is.
+ */
+ protected abstract boolean update(Image bb);
+
+ /**
+ * Flushes the resources associated with the painter. They will be
+ * recreated as needed.
+ */
+ public abstract void flush();
+
+ /**
+ * Updates the window associated with the painter given the passed image.
+ * If the passed image is null the painter will use its own buffer for
+ * rendering the contents of the window into it and updating the window.
+ *
+ * If the passed buffer has dimensions different from the window, it is
+ * copied into the internal buffer first and the latter is used to update
+ * the window.
+ *
+ * @param bb the image to update the non opaque window with, or null.
+ * If not null, the image must be of ARGB_PRE type.
+ */
+ public void updateWindow(Image bb) {
+ boolean done = false;
+ if (bb != null && (window.getWidth() != bb.getWidth(null) ||
+ window.getHeight() != bb.getHeight(null)))
+ {
+ Image ourBB = getBackBuffer();
+ Graphics2D g = (Graphics2D)ourBB.getGraphics();
+ g.drawImage(bb, 0, 0, null);
+ g.dispose();
+ bb = ourBB;
+ }
+ do {
+ if (bb == null) {
+ bb = getBackBuffer();
+ Graphics2D g = (Graphics2D)bb.getGraphics();
+ try {
+ window.paintAll(g);
+ } finally {
+ g.dispose();
+ }
+ }
+
+ peer.paintAppletWarning((Graphics2D)bb.getGraphics(),
+ bb.getWidth(null), bb.getHeight(null));
+
+ done = update(bb);
+ // in case they passed us a lost VI, next time around we'll use our
+ // own bb because we can not validate and restore the contents of
+ // their VI
+ if (!done) {
+ bb = null;
+ }
+ } while (!done);
+ }
+
+ private static final Image clearImage(Image bb) {
+ Graphics2D g = (Graphics2D)bb.getGraphics();
+ int w = bb.getWidth(null);
+ int h = bb.getHeight(null);
+
+ g.setComposite(AlphaComposite.Src);
+ g.setColor(new Color(0, 0, 0, 0));
+ g.fillRect(0, 0, w, h);
+
+ return bb;
+ }
+
+ /**
+ * A painter which uses BufferedImage as the internal buffer. The window
+ * is painted into this buffer, and the contents then are uploaded
+ * into the layered window.
+ *
+ * This painter handles all types of images passed to its paint(Image)
+ * method (VI, BI, regular Images).
+ */
+ private static class BIWindowPainter extends TranslucentWindowPainter {
+ private WeakReference<BufferedImage> biRef;
+
+ protected BIWindowPainter(WWindowPeer peer) {
+ super(peer);
+ }
+
+ private BufferedImage getBIBackBuffer() {
+ int w = window.getWidth();
+ int h = window.getHeight();
+ BufferedImage bb = biRef == null ? null : biRef.get();
+ if (bb == null || bb.getWidth() != w || bb.getHeight() != h) {
+ if (bb != null) {
+ bb.flush();
+ bb = null;
+ }
+ bb = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB_PRE);
+ biRef = new WeakReference<BufferedImage>(bb);
+ }
+ return (BufferedImage)clearImage(bb);
+ }
+
+ @Override
+ protected Image getBackBuffer() {
+ return getBIBackBuffer();
+ }
+
+ @Override
+ protected boolean update(Image bb) {
+ VolatileImage viBB = null;
+
+ if (bb instanceof BufferedImage) {
+ BufferedImage bi = (BufferedImage)bb;
+ int data[] =
+ ((DataBufferInt)bi.getRaster().getDataBuffer()).getData();
+ peer.updateWindowImpl(data, bi.getWidth(), bi.getHeight());
+ return true;
+ } else if (bb instanceof VolatileImage) {
+ viBB = (VolatileImage)bb;
+ if (bb instanceof DestSurfaceProvider) {
+ Surface s = ((DestSurfaceProvider)bb).getDestSurface();
+ if (s instanceof BufImgSurfaceData) {
+ // the image is probably lost, upload the data from the
+ // backup surface to avoid creating another heap-based
+ // image (the parent's buffer)
+ int w = viBB.getWidth();
+ int h = viBB.getHeight();
+ BufImgSurfaceData bisd = (BufImgSurfaceData)s;
+ int data[] = ((DataBufferInt)bisd.getRaster(0,0,w,h).
+ getDataBuffer()).getData();
+ peer.updateWindowImpl(data, w, h);
+ return true;
+ }
+ }
+ }
+
+ // copy the passed image into our own buffer, then upload
+ BufferedImage bi = getBIBackBuffer();
+ Graphics2D g = (Graphics2D)bi.getGraphics();
+ g.setComposite(AlphaComposite.Src);
+ g.drawImage(bb, 0, 0, null);
+
+ int data[] =
+ ((DataBufferInt)bi.getRaster().getDataBuffer()).getData();
+ peer.updateWindowImpl(data, bi.getWidth(), bi.getHeight());
+
+ return (viBB != null ? !viBB.contentsLost() : true);
+ }
+
+ public void flush() {
+ if (biRef != null) {
+ biRef.clear();
+ }
+ }
+ }
+
+ /**
+ * A version of the painter which uses VolatileImage as the internal buffer.
+ * The window is painted into this VI and then copied into the parent's
+ * Java heap-based buffer (which is then uploaded to the layered window)
+ */
+ private static class VIWindowPainter extends BIWindowPainter {
+ private WeakReference<VolatileImage> viRef;
+
+ protected VIWindowPainter(WWindowPeer peer) {
+ super(peer);
+ }
+
+ @Override
+ protected Image getBackBuffer() {
+ int w = window.getWidth();
+ int h = window.getHeight();
+ GraphicsConfiguration gc = peer.getGraphicsConfiguration();
+
+ VolatileImage viBB = viRef == null ? null : viRef.get();
+
+ if (viBB == null || viBB.getWidth() != w || viBB.getHeight() != h ||
+ viBB.validate(gc) == IMAGE_INCOMPATIBLE)
+ {
+ if (viBB != null) {
+ viBB.flush();
+ viBB = null;
+ }
+
+ if (gc instanceof AccelGraphicsConfig) {
+ AccelGraphicsConfig agc = ((AccelGraphicsConfig)gc);
+ viBB = agc.createCompatibleVolatileImage(w, h,
+ TRANSLUCENT,
+ RT_PLAIN);
+ }
+ if (viBB == null) {
+ viBB = gc.createCompatibleVolatileImage(w, h, TRANSLUCENT);
+ }
+ viBB.validate(gc);
+ viRef = new WeakReference<VolatileImage>(viBB);
+ }
+
+ return clearImage(viBB);
+ }
+
+ @Override
+ public void flush() {
+ if (viRef != null) {
+ VolatileImage viBB = viRef.get();
+ if (viBB != null) {
+ viBB.flush();
+ viBB = null;
+ }
+ viRef.clear();
+ }
+ }
+ }
+
+ /**
+ * Optimized version of hw painter. Uses VolatileImages for the
+ * buffer, and uses an optimized path to pull the data from those into
+ * the layered window, bypassing Java heap-based image.
+ */
+ private abstract static class VIOptWindowPainter extends VIWindowPainter {
+
+ protected VIOptWindowPainter(WWindowPeer peer) {
+ super(peer);
+ }
+
+ protected abstract boolean updateWindowAccel(long psdops, int w, int h);
+
+ @Override
+ protected boolean update(Image bb) {
+ if (bb instanceof DestSurfaceProvider) {
+ Surface s = ((DestSurfaceProvider)bb).getDestSurface();
+ if (s instanceof AccelSurface) {
+ final int w = bb.getWidth(null);
+ final int h = bb.getHeight(null);
+ final boolean arr[] = { false };
+ final AccelSurface as = (AccelSurface)s;
+ RenderQueue rq = as.getContext().getRenderQueue();
+ rq.lock();
+ try {
+ as.getContext().validateContext(as);
+ rq.flushAndInvokeNow(new Runnable() {
+ public void run() {
+ long psdops = as.getNativeOps();
+ arr[0] = updateWindowAccel(psdops, w, h);
+ }
+ });
+ } catch (InvalidPipeException e) {
+ // ignore, false will be returned
+ } finally {
+ rq.unlock();
+ }
+ return arr[0];
+ }
+ }
+ return super.update(bb);
+ }
+ }
+
+ private static class VIOptD3DWindowPainter extends VIOptWindowPainter {
+
+ protected VIOptD3DWindowPainter(WWindowPeer peer) {
+ super(peer);
+ }
+
+ @Override
+ protected boolean updateWindowAccel(long psdops, int w, int h) {
+ // note: this method is executed on the toolkit thread, no sync is
+ // necessary at the native level, and a pointer to peer can be used
+ return sun.java2d.d3d.D3DSurfaceData.
+ updateWindowAccelImpl(psdops, peer.getData(), w, h);
+ }
+ }
+
+ private static class VIOptWGLWindowPainter extends VIOptWindowPainter {
+
+ protected VIOptWGLWindowPainter(WWindowPeer peer) {
+ super(peer);
+ }
+
+ @Override
+ protected boolean updateWindowAccel(long psdops, int w, int h) {
+ // note: part of this method which deals with GDI will be on the
+ // toolkit thread
+ return sun.java2d.opengl.WGLSurfaceData.
+ updateWindowAccelImpl(psdops, peer, w, h);
+ }
+ }
+}
--- a/jdk/src/windows/classes/sun/awt/windows/WCanvasPeer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/classes/sun/awt/windows/WCanvasPeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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,6 +28,7 @@
import java.awt.peer.*;
import java.lang.ref.WeakReference;
import java.lang.reflect.Method;
+import sun.awt.AWTAccessor;
import sun.awt.ComponentAccessor;
import sun.awt.SunToolkit;
import sun.awt.Win32GraphicsDevice;
@@ -37,44 +38,12 @@
private boolean eraseBackground;
- Method resetGCMethod;
-
// Toolkit & peer internals
WCanvasPeer(Component target) {
super(target);
}
- /*
- * From the DisplayChangedListener interface.
- *
- * Overrides WComponentPeer version because Canvases can be created with
- * a non-defulat GraphicsConfiguration, which is no longer valid.
- * Up-called for other windows peer instances (WPanelPeer, WWindowPeer).
- */
- public void displayChanged() {
- clearLocalGC();
- resetTargetGC();
- super.displayChanged();
- }
-
- /*
- * Reset the graphicsConfiguration member of our target Component.
- * Component.resetGC() is a package-private method, so we have to call it
- * through reflection.
- */
- public void resetTargetGC() {
- ComponentAccessor.resetGC((Component)target);
- }
-
- /*
- * Clears the peer's winGraphicsConfig member.
- * Overridden by WWindowPeer, which shouldn't have a null winGraphicsConfig.
- */
- void clearLocalGC() {
- winGraphicsConfig = null;
- }
-
native void create(WComponentPeer parent);
void initialize() {
@@ -110,16 +79,20 @@
}
public void print(Graphics g) {
- Dimension d = ((Component)target).getSize();
- if (g instanceof Graphics2D ||
- g instanceof sun.awt.Graphics2Delegate) {
- // background color is setup correctly, so just use clearRect
- g.clearRect(0, 0, d.width, d.height);
- } else {
- // emulate clearRect
- g.setColor(((Component)target).getBackground());
- g.fillRect(0, 0, d.width, d.height);
- g.setColor(((Component)target).getForeground());
+ if (!(target instanceof Window) ||
+ AWTAccessor.getWindowAccessor().isOpaque((Window)target))
+ {
+ Dimension d = ((Component)target).getSize();
+ if (g instanceof Graphics2D ||
+ g instanceof sun.awt.Graphics2Delegate) {
+ // background color is setup correctly, so just use clearRect
+ g.clearRect(0, 0, d.width, d.height);
+ } else {
+ // emulate clearRect
+ g.setColor(((Component)target).getBackground());
+ g.fillRect(0, 0, d.width, d.height);
+ g.setColor(((Component)target).getForeground());
+ }
}
super.print(g);
}
@@ -147,4 +120,10 @@
*/
private native void setNativeBackgroundErase(boolean doErase,
boolean doEraseOnResize);
+
+ public GraphicsConfiguration getAppropriateGraphicsConfiguration(
+ GraphicsConfiguration gc)
+ {
+ return gc;
+ }
}
--- a/jdk/src/windows/classes/sun/awt/windows/WChoicePeer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/classes/sun/awt/windows/WChoicePeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -27,6 +27,10 @@
import java.awt.*;
import java.awt.peer.*;
import java.awt.event.ItemEvent;
+import java.awt.event.WindowEvent;
+import java.awt.event.WindowListener;
+import java.awt.event.WindowAdapter;
+import sun.awt.SunToolkit;
class WChoicePeer extends WComponentPeer implements ChoicePeer {
@@ -70,6 +74,8 @@
public synchronized native void reshape(int x, int y, int width, int height);
+ private WindowListener windowListener;
+
// Toolkit & peer internals
WChoicePeer(Choice target) {
@@ -91,9 +97,38 @@
select(opt.getSelectedIndex());
}
}
+
+ Window parentWindow = SunToolkit.getContainingWindow((Component)target);
+ if (parentWindow != null) {
+ WWindowPeer wpeer = (WWindowPeer)parentWindow.getPeer();
+ if (wpeer != null) {
+ windowListener = new WindowAdapter() {
+ public void windowIconified(WindowEvent e) {
+ closeList();
+ }
+ public void windowClosing(WindowEvent e) {
+ closeList();
+ }
+ };
+ wpeer.addWindowListener(windowListener);
+ }
+ }
super.initialize();
}
+ protected void disposeImpl() {
+ // TODO: we should somehow reset the listener when the choice
+ // is moved to another toplevel without destroying its peer.
+ Window parentWindow = SunToolkit.getContainingWindow((Component)target);
+ if (parentWindow != null) {
+ WWindowPeer wpeer = (WWindowPeer)parentWindow.getPeer();
+ if (wpeer != null) {
+ wpeer.removeWindowListener(windowListener);
+ }
+ }
+ super.disposeImpl();
+ }
+
// native callbacks
void handleAction(final int index) {
@@ -121,4 +156,5 @@
return getMinimumSize();
}
+ native void closeList();
}
--- a/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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,27 +38,32 @@
import java.awt.event.PaintEvent;
import java.awt.event.InvocationEvent;
import java.awt.event.KeyEvent;
+import java.awt.event.FocusEvent;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseWheelEvent;
+import java.awt.event.InputEvent;
import sun.awt.Win32GraphicsConfig;
+import sun.awt.Win32GraphicsEnvironment;
import sun.java2d.InvalidPipeException;
import sun.java2d.SurfaceData;
-import sun.java2d.d3d.D3DScreenUpdateManager;
-import static sun.java2d.d3d.D3DSurfaceData.*;
import sun.java2d.ScreenUpdateManager;
+import sun.java2d.d3d.D3DSurfaceData;
import sun.java2d.opengl.OGLSurfaceData;
+import sun.java2d.pipe.Region;
import sun.awt.DisplayChangedListener;
import sun.awt.PaintEventDispatcher;
+import sun.awt.SunToolkit;
import sun.awt.event.IgnorePaintEvent;
import java.awt.dnd.DropTarget;
import java.awt.dnd.peer.DropTargetPeer;
import sun.awt.ComponentAccessor;
-
import java.util.logging.*;
public abstract class WComponentPeer extends WObjectPeer
- implements ComponentPeer, DropTargetPeer, DisplayChangedListener
+ implements ComponentPeer, DropTargetPeer
{
/**
* Handle to native window
@@ -67,6 +72,7 @@
private static final Logger log = Logger.getLogger("sun.awt.windows.WComponentPeer");
private static final Logger shapeLog = Logger.getLogger("sun.awt.windows.shape.WComponentPeer");
+ private static final Logger focusLog = Logger.getLogger("sun.awt.windows.focus.WComponentPeer");
// ComponentPeer implementation
SurfaceData surfaceData;
@@ -186,7 +192,7 @@
cont.invalidate();
cont.validate();
- if (surfaceData instanceof D3DWindowSurfaceData ||
+ if (surfaceData instanceof D3DSurfaceData.D3DWindowSurfaceData ||
surfaceData instanceof OGLSurfaceData)
{
// When OGL or D3D is enabled, it is necessary to
@@ -258,7 +264,7 @@
int[] pix = createPrintedPixels(0, startY, totalW, h);
if (pix != null) {
BufferedImage bim = new BufferedImage(totalW, h,
- BufferedImage.TYPE_INT_RGB);
+ BufferedImage.TYPE_INT_ARGB);
bim.setRGB(0, 0, totalW, h, pix, 0, totalW);
g.drawImage(bim, 0, startY, null);
bim.flush();
@@ -295,14 +301,35 @@
// on handling '\n' to prevent it from being passed to native code
public boolean handleJavaKeyEvent(KeyEvent e) { return false; }
+ public void handleJavaMouseEvent(MouseEvent e) {
+ switch (e.getID()) {
+ case MouseEvent.MOUSE_PRESSED:
+ // Note that Swing requests focus in its own mouse event handler.
+ if (target == e.getSource() &&
+ !((Component)target).isFocusOwner() &&
+ WKeyboardFocusManagerPeer.shouldFocusOnClick((Component)target))
+ {
+ WKeyboardFocusManagerPeer.requestFocusFor((Component)target,
+ CausedFocusEvent.Cause.MOUSE_EVENT);
+ }
+ break;
+ }
+ }
+
native void nativeHandleEvent(AWTEvent e);
public void handleEvent(AWTEvent e) {
int id = e.getID();
- if (((Component)target).isEnabled() && (e instanceof KeyEvent) && !((KeyEvent)e).isConsumed()) {
- if (handleJavaKeyEvent((KeyEvent)e)) {
- return;
+ if ((e instanceof InputEvent) && !((InputEvent)e).isConsumed() &&
+ ((Component)target).isEnabled())
+ {
+ if (e instanceof MouseEvent && !(e instanceof MouseWheelEvent)) {
+ handleJavaMouseEvent((MouseEvent) e);
+ } else if (e instanceof KeyEvent) {
+ if (handleJavaKeyEvent((KeyEvent)e)) {
+ return;
+ }
}
}
@@ -318,6 +345,9 @@
paintArea.paint(target,shouldClearRectBeforePaint());
}
return;
+ case FocusEvent.FOCUS_LOST:
+ case FocusEvent.FOCUS_GAINED:
+ handleJavaFocusEvent((FocusEvent)e);
default:
break;
}
@@ -326,6 +356,13 @@
nativeHandleEvent(e);
}
+ void handleJavaFocusEvent(FocusEvent fe) {
+ if (focusLog.isLoggable(Level.FINER)) focusLog.finer(fe.toString());
+ setFocus(fe.getID() == FocusEvent.FOCUS_GAINED);
+ }
+
+ native void setFocus(boolean doSetFocus);
+
public Dimension getMinimumSize() {
return ((Component)target).getSize();
}
@@ -451,15 +488,8 @@
}
}
- /**
- * From the DisplayChangedListener interface.
- *
- * Called after a change in the display mode. This event
- * triggers replacing the surfaceData object (since that object
- * reflects the current display depth information, which has
- * just changed).
- */
- public void displayChanged() {
+ public void updateGraphicsData(GraphicsConfiguration gc) {
+ winGraphicsConfig = (Win32GraphicsConfig)gc;
try {
replaceSurfaceData();
} catch (InvalidPipeException e) {
@@ -467,13 +497,6 @@
}
}
- /**
- * Part of the DisplayChangedListener interface: components
- * do not need to react to this event
- */
- public void paletteChanged() {
- }
-
//This will return null for Components not yet added to a Container
public ColorModel getColorModel() {
GraphicsConfiguration gc = getGraphicsConfiguration();
@@ -585,22 +608,64 @@
WGlobalCursorManager.getCursorManager().updateCursorImmediately();
}
- native static boolean processSynchronousLightweightTransfer(Component heavyweight, Component descendant,
- boolean temporary, boolean focusedWindowChangeAllowed,
- long time);
- public boolean requestFocus
- (Component lightweightChild, boolean temporary,
- boolean focusedWindowChangeAllowed, long time, CausedFocusEvent.Cause cause) {
- if (processSynchronousLightweightTransfer((Component)target, lightweightChild, temporary,
- focusedWindowChangeAllowed, time)) {
+ // TODO: consider moving it to KeyboardFocusManagerPeerImpl
+ public boolean requestFocus(Component lightweightChild, boolean temporary,
+ boolean focusedWindowChangeAllowed, long time,
+ CausedFocusEvent.Cause cause)
+ {
+ if (WKeyboardFocusManagerPeer.
+ processSynchronousLightweightTransfer((Component)target, lightweightChild, temporary,
+ focusedWindowChangeAllowed, time))
+ {
return true;
- } else {
- return _requestFocus(lightweightChild, temporary, focusedWindowChangeAllowed, time, cause);
}
+
+ int result = WKeyboardFocusManagerPeer
+ .shouldNativelyFocusHeavyweight((Component)target, lightweightChild,
+ temporary, focusedWindowChangeAllowed,
+ time, cause);
+
+ switch (result) {
+ case WKeyboardFocusManagerPeer.SNFH_FAILURE:
+ return false;
+ case WKeyboardFocusManagerPeer.SNFH_SUCCESS_PROCEED:
+ if (focusLog.isLoggable(Level.FINER)) {
+ focusLog.finer("Proceeding with request to " + lightweightChild + " in " + target);
+ }
+ Window parentWindow = SunToolkit.getContainingWindow((Component)target);
+ if (parentWindow == null) {
+ return rejectFocusRequestHelper("WARNING: Parent window is null");
+ }
+ WWindowPeer wpeer = (WWindowPeer)parentWindow.getPeer();
+ if (wpeer == null) {
+ return rejectFocusRequestHelper("WARNING: Parent window's peer is null");
+ }
+ boolean res = wpeer.requestWindowFocus(cause);
+
+ if (focusLog.isLoggable(Level.FINER)) focusLog.finer("Requested window focus: " + res);
+ // If parent window can be made focused and has been made focused(synchronously)
+ // then we can proceed with children, otherwise we retreat.
+ if (!(res && parentWindow.isFocused())) {
+ return rejectFocusRequestHelper("Waiting for asynchronous processing of the request");
+ }
+ return WKeyboardFocusManagerPeer.deliverFocus(lightweightChild,
+ (Component)target,
+ temporary,
+ focusedWindowChangeAllowed,
+ time, cause);
+
+ case WKeyboardFocusManagerPeer.SNFH_SUCCESS_HANDLED:
+ // Either lightweight or excessive request - all events are generated.
+ return true;
+ }
+ return false;
}
- public native boolean _requestFocus
- (Component lightweightChild, boolean temporary,
- boolean focusedWindowChangeAllowed, long time, CausedFocusEvent.Cause cause);
+
+ private boolean rejectFocusRequestHelper(String logMsg) {
+ if (focusLog.isLoggable(Level.FINER)) focusLog.finer(logMsg);
+ WKeyboardFocusManagerPeer.removeLastFocusRequest((Component)target);
+ return false;
+ }
public Image createImage(ImageProducer producer) {
return new ToolkitImage(producer);
@@ -713,7 +778,7 @@
* NOTE: This is called on the privileged toolkit thread. Do not
* call directly into user code using this thread!
*/
- void handlePaint(int x, int y, int w, int h) {
+ public void handlePaint(int x, int y, int w, int h) {
postPaintIfNecessary(x, y, w, h);
}
@@ -731,9 +796,12 @@
* Post an event. Queue it for execution by the callback thread.
*/
void postEvent(AWTEvent event) {
+ preprocessPostEvent(event);
WToolkit.postEvent(WToolkit.targetToAppContext(target), event);
}
+ void preprocessPostEvent(AWTEvent event) {}
+
// Routines to support deferred window positioning.
public void beginLayout() {
// Skip all painting till endLayout
@@ -895,9 +963,29 @@
public void setBoundsOperation(int operation) {
}
+ /**
+ * Returns whether this component is capable of being hw accelerated.
+ * More specifically, whether rendering to this component or a
+ * BufferStrategy's back-buffer for this component can be hw accelerated.
+ *
+ * Conditions which could prevent hw acceleration include the toplevel
+ * window containing this component being
+ * {@link com.sun.awt.AWTUtilities.Translucency#TRANSLUCENT TRANSLUCENT}.
+ *
+ * @return {@code true} if this component is capable of being hw
+ * accelerated, {@code false} otherwise
+ * @see com.sun.awt.AWTUtilities.Translucency#TRANSLUCENT
+ */
+ public boolean isAccelCapable() {
+ boolean isTranslucent =
+ SunToolkit.isContainingTopLevelTranslucent((Component)target);
+ // D3D/OGL and translucent windows interacted poorly in Windows XP;
+ // these problems are no longer present in Vista
+ return !isTranslucent || Win32GraphicsEnvironment.isVistaOS();
+ }
native void setRectangularShape(int lox, int loy, int hix, int hiy,
- sun.java2d.pipe.Region region);
+ Region region);
// REMIND: Temp workaround for issues with using HW acceleration
@@ -915,41 +1003,10 @@
}
/**
- * Returns whether this component is capable of being hw accelerated.
- * More specifically, whether rendering to this component or a
- * BufferStrategy's back-buffer for this component can be hw accelerated.
- *
- * Conditions which could prevent hw acceleration include the toplevel
- * window containing this component being
- * {@link com.sun.awt.AWTUtilities.Translucency#TRANSLUCENT TRANSLUCENT}.
- *
- * @return {@code true} if this component is capable of being hw
- * accelerated, {@code false} otherwise
- * @see com.sun.awt.AWTUtilities.Translucency#TRANSLUCENT
- */
- public boolean isAccelCapable() {
- // REMIND: Temp workaround for issues with using HW acceleration
- // in the browser on Vista when DWM is enabled
- if (!isContainingTopLevelAccelCapable((Component)target)) {
- return false;
- }
-
- // REMIND: translucent windows support-related
-/*
- boolean isTranslucent =
- SunToolkit.isContainingTopLevelTranslucent((Component)target);
- // D3D/OGL and translucent windows interacted poorly in Windows XP;
- // these problems are no longer present in Vista
- return !isTranslucent || Win32GraphicsEnvironment.isVistaOS();
-*/
- return true;
- }
-
- /**
* Applies the shape to the native component window.
* @since 1.7
*/
- public void applyShape(sun.java2d.pipe.Region shape) {
+ public void applyShape(Region shape) {
if (shapeLog.isLoggable(Level.FINER)) {
shapeLog.finer(
"*** INFO: Setting shape: PEER: " + this
@@ -965,4 +1022,15 @@
}
}
+ /**
+ * Lowers this component at the bottom of the above component. If the above parameter
+ * is null then the method places this component at the top of the Z-order.
+ */
+ public void setZOrder(ComponentPeer above) {
+ long aboveHWND = (above != null) ? ((WComponentPeer)above).getHWnd() : 0;
+
+ setZOrder(aboveHWND);
+ }
+
+ private native void setZOrder(long above);
}
--- a/jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -225,23 +225,16 @@
public void addDropTarget(DropTarget dt) {}
public void removeDropTarget(DropTarget dt) {}
public void updateFocusableWindowState() {}
+ public void setZOrder(ComponentPeer above) {}
/**
* Initialize JNI field and method ids
*/
private static native void initIDs();
- /**
- * WFileDialogPeer doesn't have native pData so we don't do restack on it
- * @see java.awt.peer.ContainerPeer#restack
- */
- public void restack() {
- }
-
- /**
- * @see java.awt.peer.ContainerPeer#isRestackSupported
- */
- public boolean isRestackSupported() {
- return false;
- }
+ // The effects are not supported for system dialogs.
+ public void applyShape(sun.java2d.pipe.Region shape) {}
+ public void setOpacity(float opacity) {}
+ public void setOpaque(boolean isOpaque) {}
+ public void updateWindow(java.awt.image.BufferedImage backBuffer) {}
}
--- a/jdk/src/windows/classes/sun/awt/windows/WFramePeer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/classes/sun/awt/windows/WFramePeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -25,27 +25,46 @@
package sun.awt.windows;
import java.util.Vector;
+
import java.awt.*;
import java.awt.peer.*;
import java.awt.image.ImageObserver;
-import sun.awt.image.ImageRepresentation;
-import sun.awt.image.IntegerComponentRaster;
-import sun.awt.image.ToolkitImage;
+
import java.awt.image.Raster;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferInt;
import java.awt.image.BufferedImage;
+
+import java.awt.image.ColorModel;
+
+import sun.awt.image.ImageRepresentation;
+import sun.awt.image.IntegerComponentRaster;
+import sun.awt.image.ToolkitImage;
import sun.awt.im.*;
import sun.awt.Win32GraphicsDevice;
-import java.awt.image.ColorModel;
-
+import sun.awt.AWTAccessor;
class WFramePeer extends WWindowPeer implements FramePeer {
+ static {
+ initIDs();
+ }
+
+ // initialize JNI field and method IDs
+ private static native void initIDs();
+
// FramePeer implementation
public native void setState(int state);
public native int getState();
+ // sync target and peer
+ public void setExtendedState(int state) {
+ AWTAccessor.getFrameAccessor().setExtendedState((Frame)target, state);
+ }
+ public int getExtendedState() {
+ return AWTAccessor.getFrameAccessor().getExtendedState((Frame)target);
+ }
+
// Convenience methods to save us from trouble of extracting
// Rectangle fields in native code.
private native void setMaximizedBounds(int x, int y, int w, int h);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/windows/classes/sun/awt/windows/WKeyboardFocusManagerPeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.awt.windows;
+
+import java.awt.KeyboardFocusManager;
+import java.awt.Window;
+import java.awt.Component;
+import java.awt.peer.ComponentPeer;
+import sun.awt.KeyboardFocusManagerPeerImpl;
+import sun.awt.CausedFocusEvent;
+
+class WKeyboardFocusManagerPeer extends KeyboardFocusManagerPeerImpl {
+ static native void setNativeFocusOwner(ComponentPeer peer);
+ static native Component getNativeFocusOwner();
+ static native Window getNativeFocusedWindow();
+
+ WKeyboardFocusManagerPeer(KeyboardFocusManager manager) {
+ super(manager);
+ }
+
+ @Override
+ public void setCurrentFocusOwner(Component comp) {
+ setNativeFocusOwner(comp != null ? comp.getPeer() : null);
+ }
+
+ @Override
+ public Component getCurrentFocusOwner() {
+ return getNativeFocusOwner();
+ }
+
+ @Override
+ public Window getCurrentFocusedWindow() {
+ return getNativeFocusedWindow();
+ }
+
+ public static boolean deliverFocus(Component lightweightChild,
+ Component target,
+ boolean temporary,
+ boolean focusedWindowChangeAllowed,
+ long time,
+ CausedFocusEvent.Cause cause)
+ {
+ // TODO: do something to eliminate this forwarding
+ return KeyboardFocusManagerPeerImpl.deliverFocus(lightweightChild,
+ target,
+ temporary,
+ focusedWindowChangeAllowed,
+ time,
+ cause,
+ getNativeFocusOwner());
+ }
+}
--- a/jdk/src/windows/classes/sun/awt/windows/WPanelPeer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/classes/sun/awt/windows/WPanelPeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -100,34 +100,6 @@
return getInsets();
}
- /*
- * From the DisplayChangedListener interface. Often is
- * up-called from a WWindowPeer instance.
- */
- public void displayChanged() {
- super.displayChanged();
- displayChanged((Container)target);
- }
-
- /*
- * Recursively iterates through all the HW and LW children
- * of the container and calls displayChanged() for HW peers.
- * Iteration through children peers only is not enough as the
- * displayChanged notification may not be propagated to HW
- * components inside LW containers, see 4452373 for details.
- */
- private static void displayChanged(Container target) {
- Component children[] = ((Container)target).getComponents();
- for (Component child : children) {
- ComponentPeer cpeer = child.getPeer();
- if (cpeer instanceof WComponentPeer) {
- ((WComponentPeer)cpeer).displayChanged();
- } else if (child instanceof Container) {
- displayChanged((Container)child);
- }
- }
- }
-
private native void pRestack(Object[] peers);
private void restack(Container cont, Vector peers) {
for (int i = 0; i < cont.getComponentCount(); i++) {
--- a/jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1999-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,7 @@
import java.awt.*;
import java.awt.peer.DialogPeer;
+import java.awt.peer.ComponentPeer;
import java.awt.dnd.DropTarget;
import java.util.Vector;
import sun.awt.AppContext;
@@ -137,23 +138,16 @@
void invalidate(int x, int y, int width, int height) {}
public void addDropTarget(DropTarget dt) {}
public void removeDropTarget(DropTarget dt) {}
+ public void setZOrder(ComponentPeer above) {}
/**
* Initialize JNI field and method ids
*/
private static native void initIDs();
- /**
- * WPrintDialogPeer doesn't have native pData so we don't do restack on it
- * @see java.awt.peer.ContainerPeer#restack
- */
- public void restack() {
- }
-
- /**
- * @see java.awt.peer.ContainerPeer#isRestackSupported
- */
- public boolean isRestackSupported() {
- return false;
- }
+ // The effects are not supported for system dialogs.
+ public void applyShape(sun.java2d.pipe.Region shape) {}
+ public void setOpacity(float opacity) {}
+ public void setOpaque(boolean isOpaque) {}
+ public void updateWindow(java.awt.image.BufferedImage backBuffer) {}
}
--- a/jdk/src/windows/classes/sun/awt/windows/WScrollPanePeer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/classes/sun/awt/windows/WScrollPanePeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -269,10 +269,4 @@
}
}
- /**
- * @see java.awt.peer.ContainerPeer#restack
- */
- public void restack() {
- // Since ScrollPane can only have one child its restacking does nothing.
- }
}
--- a/jdk/src/windows/classes/sun/awt/windows/WToolkit.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/classes/sun/awt/windows/WToolkit.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -494,6 +494,12 @@
return true;
}
+ public KeyboardFocusManagerPeer createKeyboardFocusManagerPeer(KeyboardFocusManager manager)
+ throws HeadlessException
+ {
+ return new WKeyboardFocusManagerPeer(manager);
+ }
+
protected native void setDynamicLayoutNative(boolean b);
public void setDynamicLayout(boolean b) {
@@ -975,4 +981,34 @@
public boolean areExtraMouseButtonsEnabled() throws HeadlessException {
return areExtraMouseButtonsEnabled;
}
+
+ @Override
+ public boolean isWindowOpacitySupported() {
+ // supported in Win2K and later
+ return true;
+ }
+
+ @Override
+ public boolean isWindowShapingSupported() {
+ return true;
+ }
+
+ @Override
+ public boolean isWindowTranslucencySupported() {
+ // supported in Win2K and later
+ return true;
+ }
+
+ @Override
+ public boolean isTranslucencyCapable(GraphicsConfiguration gc) {
+ //XXX: worth checking if 8-bit? Anyway, it doesn't hurt.
+ return true;
+ }
+
+ // On MS Windows one must use the peer.updateWindow() to implement
+ // non-opaque windows.
+ @Override
+ public boolean needUpdateWindow() {
+ return true;
+ }
}
--- a/jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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,19 @@
import java.beans.*;
-import java.lang.ref.*;
import java.lang.reflect.*;
-import java.security.*;
-
import java.util.*;
import java.util.List;
import java.util.logging.*;
import sun.awt.*;
-import sun.awt.image.*;
+
+import sun.java2d.pipe.Region;
-public class WWindowPeer extends WPanelPeer implements WindowPeer {
+public class WWindowPeer extends WPanelPeer implements WindowPeer,
+ DisplayChangedListener
+{
private static final Logger log = Logger.getLogger("sun.awt.windows.WWindowPeer");
private static final Logger screenLog = Logger.getLogger("sun.awt.windows.screen.WWindowPeer");
@@ -52,6 +52,10 @@
// extends WWindowPeer, not WDialogPeer
private WWindowPeer modalBlocker = null;
+ private boolean isOpaque;
+
+ private volatile TranslucentWindowPainter painter;
+
/*
* A key used for storing a list of active windows in AppContext. The value
* is a list of windows, sorted by the time of activation: later a window is
@@ -73,6 +77,12 @@
private final static PropertyChangeListener guiDisposedListener =
new GuiDisposedListener();
+ /*
+ * Called (on the Toolkit thread) before the appropriate
+ * WindowStateEvent is posted to the EventQueue.
+ */
+ private WindowListener windowListener;
+
/**
* Initialize JNI field IDs
*/
@@ -91,9 +101,18 @@
l.remove(this);
}
}
+
// Remove ourself from the Map of DisplayChangeListeners
GraphicsConfiguration gc = getGraphicsConfiguration();
((Win32GraphicsDevice)gc.getDevice()).removeDisplayChangedListener(this);
+
+ TranslucentWindowPainter currentPainter = painter;
+ if (currentPainter != null) {
+ currentPainter.flush();
+ // don't set the current one to null here; reduces the chances of
+ // MT issues (like NPEs)
+ }
+
super.disposeImpl();
}
@@ -158,6 +177,10 @@
initActiveWindowsTracking((Window)target);
updateIconImages();
+
+ updateShape();
+ updateOpacity();
+ updateOpaque();
}
native void createAwtWindow(WComponentPeer parent);
@@ -183,7 +206,6 @@
// super.displayChanged() in WWindowPeer.displayChanged() regardless of whether
// GraphicsDevice was really changed, or not. So we need to track it here.
updateGC();
- resetTargetGC();
realShow();
updateMinimumSize();
@@ -191,6 +213,8 @@
if (((Window)target).isAlwaysOnTopSupported() && alwaysOnTop) {
setAlwaysOnTop(alwaysOnTop);
}
+
+ updateWindow(null);
}
// Synchronize the insets members (here & in helper) with actual window
@@ -214,25 +238,62 @@
int[] smallIconRaster, int smw, int smh);
synchronized native void reshapeFrame(int x, int y, int width, int height);
- public boolean requestWindowFocus() {
- // Win32 window doesn't need this
- return false;
+
+ public boolean requestWindowFocus(CausedFocusEvent.Cause cause) {
+ if (!focusAllowedFor()) {
+ return false;
+ }
+ return requestWindowFocus(cause == CausedFocusEvent.Cause.MOUSE_EVENT);
}
+ public native boolean requestWindowFocus(boolean isMouseEventCause);
public boolean focusAllowedFor() {
- Window target = (Window)this.target;
- if (!target.isVisible() ||
- !target.isEnabled() ||
- !target.isFocusable())
+ Window window = (Window)this.target;
+ if (!window.isVisible() ||
+ !window.isEnabled() ||
+ !window.isFocusableWindow())
{
return false;
}
-
if (isModalBlocked()) {
return false;
}
+ return true;
+ }
- return true;
+ public void hide() {
+ WindowListener listener = windowListener;
+ if (listener != null) {
+ // We're not getting WINDOW_CLOSING from the native code when hiding
+ // the window programmatically. So, create it and notify the listener.
+ listener.windowClosing(new WindowEvent((Window)target, WindowEvent.WINDOW_CLOSING));
+ }
+ super.hide();
+ }
+
+ // WARNING: it's called on the Toolkit thread!
+ void preprocessPostEvent(AWTEvent event) {
+ if (event instanceof WindowEvent) {
+ WindowListener listener = windowListener;
+ if (listener != null) {
+ switch(event.getID()) {
+ case WindowEvent.WINDOW_CLOSING:
+ listener.windowClosing((WindowEvent)event);
+ break;
+ case WindowEvent.WINDOW_ICONIFIED:
+ listener.windowIconified((WindowEvent)event);
+ break;
+ }
+ }
+ }
+ }
+
+ synchronized void addWindowListener(WindowListener l) {
+ windowListener = AWTEventMulticaster.add(windowListener, l);
+ }
+
+ synchronized void removeWindowListener(WindowListener l) {
+ windowListener = AWTEventMulticaster.remove(windowListener, l);
}
public void updateMinimumSize() {
@@ -273,6 +334,31 @@
}
}
+ private void updateShape() {
+ // Shape shape = ((Window)target).getShape();
+ Shape shape = AWTAccessor.getWindowAccessor().getShape((Window)target);
+ if (shape != null) {
+ applyShape(Region.getInstance(shape, null));
+ }
+ }
+
+ private void updateOpacity() {
+ // float opacity = ((Window)target).getOpacity();
+ float opacity = AWTAccessor.getWindowAccessor().getOpacity((Window)target);
+ if (opacity < 1.0f) {
+ setOpacity(opacity);
+ }
+ }
+
+ private void updateOpaque() {
+ this.isOpaque = true;
+ // boolean opaque = ((Window)target).isOpaque();
+ boolean opaque = AWTAccessor.getWindowAccessor().isOpaque((Window)target);
+ if (!opaque) {
+ setOpaque(opaque);
+ }
+ }
+
native void setMinSize(int width, int height);
/*
@@ -358,14 +444,6 @@
});
}
-
- /*
- * Called from WCanvasPeer.displayChanged().
- * Override to do nothing - Window and WWindowPeer GC must never be set to
- * null!
- */
- void clearLocalGC() {}
-
public void updateGC() {
int scrn = getScreenImOn();
if (screenLog.isLoggable(Level.FINER)) {
@@ -404,18 +482,36 @@
oldDev.removeDisplayChangedListener(this);
newDev.addDisplayChangedListener(this);
}
+
+ SunToolkit.executeOnEventHandlerThread((Component)target,
+ new Runnable() {
+ public void run() {
+ AWTAccessor.getComponentAccessor().
+ setGraphicsConfiguration((Component)target, winGraphicsConfig);
+ }
+ });
}
- /*
- * From the DisplayChangedListener interface
+ /**
+ * From the DisplayChangedListener interface.
*
* This method handles a display change - either when the display settings
* are changed, or when the window has been dragged onto a different
* display.
+ * Called after a change in the display mode. This event
+ * triggers replacing the surfaceData object (since that object
+ * reflects the current display depth information, which has
+ * just changed).
*/
public void displayChanged() {
updateGC();
- super.displayChanged();
+ }
+
+ /**
+ * Part of the DisplayChangedListener interface: components
+ * do not need to react to this event
+ */
+ public void paletteChanged() {
}
private native int getScreenImOn();
@@ -451,8 +547,10 @@
private volatile int sysH = 0;
Rectangle constrainBounds(int x, int y, int width, int height) {
+ GraphicsConfiguration gc = this.winGraphicsConfig;
+
// We don't restrict the setBounds() operation if the code is trusted.
- if (!hasWarningWindow()) {
+ if (!hasWarningWindow() || gc == null) {
return new Rectangle(x, y, width, height);
}
@@ -461,24 +559,24 @@
int newW = width;
int newH = height;
- GraphicsConfiguration gc = ((Window)target).getGraphicsConfiguration();
Rectangle sB = gc.getBounds();
- Insets sIn = ((Window)target).getToolkit().getScreenInsets(gc);
+ Insets sIn = Toolkit.getDefaultToolkit().getScreenInsets(gc);
int screenW = sB.width - sIn.left - sIn.right;
int screenH = sB.height - sIn.top - sIn.bottom;
// If it's undecorated or is not currently visible
- if (!((Window)target).isVisible() || isTargetUndecorated()) {
+ if (!AWTAccessor.getComponentAccessor().isVisible_NoClientCode(
+ (Component)target) || isTargetUndecorated())
+ {
// Now check each point is within the visible part of the screen
int screenX = sB.x + sIn.left;
int screenY = sB.y + sIn.top;
- // First make sure the size is withing the visible part of the screen
+ // First make sure the size is within the visible part of the screen
if (newW > screenW) {
newW = screenW;
}
-
if (newH > screenH) {
newH = screenH;
}
@@ -489,7 +587,6 @@
} else if (newX + newW > screenX + screenW) {
newX = screenX + screenW - newW;
}
-
if (newY < screenY) {
newY = screenY;
} else if (newY + newH > screenY + screenH) {
@@ -504,7 +601,6 @@
if (newW > maxW) {
newW = maxW;
}
-
if (newH > maxH) {
newH = maxH;
}
@@ -513,6 +609,8 @@
return new Rectangle(newX, newY, newW, newH);
}
+ public native void repositionSecurityWarning();
+
@Override
public void setBounds(int x, int y, int width, int height, int op) {
Rectangle newBounds = constrainBounds(x, y, width, height);
@@ -525,6 +623,135 @@
super.setBounds(newBounds.x, newBounds.y, newBounds.width, newBounds.height, op);
}
+ @Override
+ public void print(Graphics g) {
+ // We assume we print the whole frame,
+ // so we expect no clip was set previously
+ Shape shape = AWTAccessor.getWindowAccessor().getShape((Window)target);
+ if (shape != null) {
+ g.setClip(shape);
+ }
+ super.print(g);
+ }
+
+ private void replaceSurfaceDataRecursively(Component c) {
+ if (c instanceof Container) {
+ for (Component child : ((Container)c).getComponents()) {
+ replaceSurfaceDataRecursively(child);
+ }
+ }
+ ComponentPeer cp = c.getPeer();
+ if (cp instanceof WComponentPeer) {
+ ((WComponentPeer)cp).replaceSurfaceDataLater();
+ }
+ }
+
+ private native void setOpacity(int iOpacity);
+
+ public void setOpacity(float opacity) {
+ if (!((SunToolkit)((Window)target).getToolkit()).
+ isWindowOpacitySupported())
+ {
+ return;
+ }
+
+ replaceSurfaceDataRecursively((Component)getTarget());
+
+ final int maxOpacity = 0xff;
+ int iOpacity = (int)(opacity * maxOpacity);
+ if (iOpacity < 0) {
+ iOpacity = 0;
+ }
+ if (iOpacity > maxOpacity) {
+ iOpacity = maxOpacity;
+ }
+
+ setOpacity(iOpacity);
+ updateWindow(null);
+ }
+
+ private native void setOpaqueImpl(boolean isOpaque);
+
+ public void setOpaque(boolean isOpaque) {
+ Window target = (Window)getTarget();
+
+ SunToolkit sunToolkit = (SunToolkit)target.getToolkit();
+ if (!sunToolkit.isWindowTranslucencySupported() ||
+ !sunToolkit.isTranslucencyCapable(target.getGraphicsConfiguration()))
+ {
+ return;
+ }
+
+ boolean opaqueChanged = this.isOpaque != isOpaque;
+ boolean isVistaOS = Win32GraphicsEnvironment.isVistaOS();
+
+ if (opaqueChanged && !isVistaOS){
+ // non-Vista OS: only replace the surface data if the opacity
+ // status changed (see WComponentPeer.isAccelCapable() for more)
+ replaceSurfaceDataRecursively(target);
+ }
+
+ this.isOpaque = isOpaque;
+
+ setOpaqueImpl(isOpaque);
+
+ if (opaqueChanged) {
+ if (isOpaque) {
+ TranslucentWindowPainter currentPainter = painter;
+ if (currentPainter != null) {
+ currentPainter.flush();
+ painter = null;
+ }
+ } else {
+ painter = TranslucentWindowPainter.createInstance(this);
+ }
+ }
+
+ if (opaqueChanged && isVistaOS) {
+ // On Vista: setting the window non-opaque makes the window look
+ // rectangular, though still catching the mouse clicks within
+ // its shape only. To restore the correct visual appearance
+ // of the window (i.e. w/ the correct shape) we have to reset
+ // the shape.
+ Shape shape = AWTAccessor.getWindowAccessor().getShape(target);
+ if (shape != null) {
+ AWTAccessor.getWindowAccessor().setShape(target, shape);
+ }
+ }
+
+ updateWindow(null);
+ }
+
+ public native void updateWindowImpl(int[] data, int width, int height);
+
+ public void updateWindow(BufferedImage backBuffer) {
+ if (isOpaque) {
+ return;
+ }
+
+ TranslucentWindowPainter currentPainter = painter;
+ if (currentPainter != null) {
+ currentPainter.updateWindow(backBuffer);
+ } else if (log.isLoggable(Level.FINER)) {
+ log.log(Level.FINER,
+ "Translucent window painter is null in updateWindow");
+ }
+ }
+
+ /**
+ * Paints the Applet Warning into the passed Graphics2D. This method is
+ * called by the TranslucentWindowPainter before updating the layered
+ * window.
+ *
+ * @param g Graphics context to paint the warning to
+ * @param w the width of the area
+ * @param h the height of the area
+ * @see TranslucentWindowPainter
+ */
+ public void paintAppletWarning(Graphics2D g, int w, int h) {
+ // REMIND: the applet warning needs to be painted here
+ }
+
/*
* The method maps the list of the active windows to the window's AppContext,
* then the method registers ActiveWindowListener, GuiDisposedListener listeners;
--- a/jdk/src/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007-2009 Sun Microsystems, Inc. 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,6 +37,7 @@
import java.util.ArrayList;
import java.util.HashMap;
import sun.awt.SunToolkit;
+import sun.awt.AWTAccessor;
import sun.awt.Win32GraphicsConfig;
import sun.awt.windows.WComponentPeer;
import sun.java2d.InvalidPipeException;
@@ -284,14 +285,12 @@
* @param peer for which target's the repaint should be issued
*/
private void repaintPeerTarget(WComponentPeer peer) {
- // we don't want to call user code on our priveleged
- // thread, delegate to EDT
- final Component target = (Component)peer.getTarget();
- SunToolkit.executeOnEventHandlerThread(target, new Runnable() {
- public void run() {
- target.repaint();
- }
- });
+ Component target = (Component)peer.getTarget();
+ Rectangle bounds = AWTAccessor.getComponentAccessor().getBounds(target);
+ // the system-level painting operations should call the handlePaint()
+ // method of the WComponentPeer class to repaint the component;
+ // calling repaint() forces AWT to make call to update()
+ peer.handlePaint(0, 0, bounds.width, bounds.height);
}
/**
--- a/jdk/src/windows/classes/sun/java2d/opengl/WGLSurfaceData.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/classes/sun/java2d/opengl/WGLSurfaceData.java Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2004-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2004-2009 Sun Microsystems, Inc. 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
@@ -72,9 +72,8 @@
// the OGL pipeline can render directly to the screen and interfere
// with layered windows, which is why we don't allow accelerated
// surfaces in this case
- if (!peer.isAccelCapable())
- // REMIND: commented until toplevel translucency is implemented
-// || !SunToolkit.isContainingTopLevelOpaque((Component)peer.getTarget()))
+ if (!peer.isAccelCapable() ||
+ !SunToolkit.isContainingTopLevelOpaque((Component)peer.getTarget()))
{
return null;
}
@@ -93,9 +92,8 @@
// the OGL pipeline can render directly to the screen and interfere
// with layered windows, which is why we don't allow accelerated
// surfaces in this case
- if (!peer.isAccelCapable())
- // REMIND: commented until toplevel translucency is implemented
-// || !SunToolkit.isContainingTopLevelOpaque((Component)peer.getTarget()))
+ if (!peer.isAccelCapable() ||
+ !SunToolkit.isContainingTopLevelOpaque((Component)peer.getTarget()))
{
return null;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/windows/classes/sun/net/NetHooks.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package sun.net;
+
+import java.net.InetAddress;
+import java.io.FileDescriptor;
+import java.io.IOException;
+
+/**
+ * Defines static methods to ensure that any installed net hooks are invoked
+ * prior to binding or connecting TCP sockets.
+ */
+
+public final class NetHooks {
+
+ /**
+ * Invoke prior to binding a TCP socket.
+ */
+ public static void beforeTcpBind(FileDescriptor fdObj,
+ InetAddress address,
+ int port)
+ throws IOException
+ {
+ // nothing to do
+ }
+
+ /**
+ * Invoke prior to connecting an unbound TCP socket.
+ */
+ public static void beforeTcpConnect(FileDescriptor fdObj,
+ InetAddress address,
+ int port)
+ throws IOException
+ {
+ // nothing to do
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/windows/classes/sun/nio/ch/SctpChannelImpl.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,150 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package sun.nio.ch;
+
+import java.net.SocketAddress;
+import java.net.InetAddress;
+import java.io.IOException;
+import java.util.Set;
+import java.nio.ByteBuffer;
+import java.nio.channels.spi.SelectorProvider;
+import com.sun.nio.sctp.Association;
+import com.sun.nio.sctp.MessageInfo;
+import com.sun.nio.sctp.NotificationHandler;
+import com.sun.nio.sctp.SctpChannel;
+import com.sun.nio.sctp.SctpSocketOption;
+
+/**
+ * Unimplemented.
+ */
+public class SctpChannelImpl extends SctpChannel
+{
+ private static final String message = "SCTP not supported on this platform";
+
+ public SctpChannelImpl(SelectorProvider provider) {
+ super(provider);
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public Association association() {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public SctpChannel bind(SocketAddress local)
+ throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public SctpChannel bindAddress(InetAddress address)
+ throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public SctpChannel unbindAddress(InetAddress address)
+ throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public boolean connect(SocketAddress remote) throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public boolean connect(SocketAddress remote, int maxOutStreams,
+ int maxInStreams) throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public boolean isConnectionPending() {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public boolean finishConnect() throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public Set<SocketAddress> getAllLocalAddresses()
+ throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public Set<SocketAddress> getRemoteAddresses()
+ throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public SctpChannel shutdown() throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public <T> T getOption(SctpSocketOption<T> name)
+ throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public <T> SctpChannel setOption(SctpSocketOption<T> name, T value)
+ throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public Set<SctpSocketOption<?>> supportedOptions() {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public <T> MessageInfo receive(ByteBuffer dst, T attachment,
+ NotificationHandler<T> handler) throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public int send(ByteBuffer src, MessageInfo messageInfo)
+ throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ protected void implConfigureBlocking(boolean block) throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public void implCloseSelectableChannel() throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/windows/classes/sun/nio/ch/SctpMultiChannelImpl.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,137 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package sun.nio.ch;
+
+import java.net.SocketAddress;
+import java.net.InetAddress;
+import java.io.IOException;
+import java.util.Set;
+import java.nio.ByteBuffer;
+import java.nio.channels.spi.SelectorProvider;
+import com.sun.nio.sctp.Association;
+import com.sun.nio.sctp.SctpChannel;
+import com.sun.nio.sctp.MessageInfo;
+import com.sun.nio.sctp.NotificationHandler;
+import com.sun.nio.sctp.SctpMultiChannel;
+import com.sun.nio.sctp.SctpSocketOption;
+
+/**
+ * Unimplemented.
+ */
+public class SctpMultiChannelImpl extends SctpMultiChannel
+{
+ private static final String message = "SCTP not supported on this platform";
+
+ public SctpMultiChannelImpl(SelectorProvider provider) {
+ super(provider);
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public Set<Association> associations() {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public SctpMultiChannel bind(SocketAddress local,
+ int backlog) throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public SctpMultiChannel bindAddress(InetAddress address)
+ throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public SctpMultiChannel unbindAddress(InetAddress address)
+ throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public Set<SocketAddress> getAllLocalAddresses()
+ throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public Set<SocketAddress> getRemoteAddresses
+ (Association association) throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public SctpMultiChannel shutdown(Association association)
+ throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public <T> T getOption(SctpSocketOption<T> name,
+ Association association) throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public <T> SctpMultiChannel setOption(SctpSocketOption<T> name,
+ T value, Association association) throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public Set<SctpSocketOption<?>> supportedOptions() {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public <T> MessageInfo receive(ByteBuffer buffer, T attachment,
+ NotificationHandler<T> handler) throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public int send(ByteBuffer buffer, MessageInfo messageInfo)
+ throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public SctpChannel branch(Association association)
+ throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ protected void implConfigureBlocking(boolean block) throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public void implCloseSelectableChannel() throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/windows/classes/sun/nio/ch/SctpServerChannelImpl.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package sun.nio.ch;
+
+import java.net.SocketAddress;
+import java.net.InetAddress;
+import java.io.IOException;
+import java.util.Set;
+import java.nio.channels.spi.SelectorProvider;
+import com.sun.nio.sctp.SctpChannel;
+import com.sun.nio.sctp.SctpServerChannel;
+import com.sun.nio.sctp.SctpSocketOption;
+
+/**
+ * Unimplemented.
+ */
+public class SctpServerChannelImpl extends SctpServerChannel
+{
+ private static final String message = "SCTP not supported on this platform";
+
+ public SctpServerChannelImpl(SelectorProvider provider) {
+ super(provider);
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public SctpChannel accept() throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public SctpServerChannel bind(SocketAddress local,
+ int backlog) throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public SctpServerChannel bindAddress(InetAddress address)
+ throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public SctpServerChannel unbindAddress(InetAddress address)
+ throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public Set<SocketAddress> getAllLocalAddresses()
+ throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public <T> T getOption(SctpSocketOption<T> name) throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public <T> SctpServerChannel setOption(SctpSocketOption<T> name,
+ T value) throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public Set<SctpSocketOption<?>> supportedOptions() {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ protected void implConfigureBlocking(boolean block) throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+
+ @Override
+ public void implCloseSelectableChannel() throws IOException {
+ throw new UnsupportedOperationException(message);
+ }
+}
--- a/jdk/src/windows/classes/sun/nio/ch/WindowsSelectorImpl.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/classes/sun/nio/ch/WindowsSelectorImpl.java Mon Apr 27 12:33:57 2009 -0700
@@ -34,7 +34,6 @@
import java.nio.channels.ClosedSelectorException;
import java.nio.channels.Pipe;
import java.nio.channels.SelectableChannel;
-import java.nio.channels.SelectionKey;
import java.io.IOException;
import java.util.List;
import java.util.ArrayList;
@@ -72,7 +71,7 @@
private int threadsCount = 0;
// A list of helper threads for select.
- private final List<Thread> threads = new ArrayList<Thread>();
+ private final List<SelectThread> threads = new ArrayList<SelectThread>();
//Pipe used as a wakeup object.
private final Pipe wakeupPipe;
@@ -201,7 +200,7 @@
Thread.currentThread().interrupt();
}
}
- if (thread.index >= threads.size()) { // redundant thread
+ if (thread.isZombie()) { // redundant thread
return true; // will cause run() to exit.
} else {
thread.lastRun = runsCounter; // update lastRun
@@ -388,9 +387,10 @@
// Represents a helper thread used for select.
private final class SelectThread extends Thread {
- private int index; // index of this thread
- SubSelector subSelector;
+ private final int index; // index of this thread
+ final SubSelector subSelector;
private long lastRun = 0; // last run number
+ private volatile boolean zombie;
// Creates a new thread
private SelectThread(int i) {
this.index = i;
@@ -398,6 +398,12 @@
//make sure we wait for next round of poll
this.lastRun = startLock.runsCounter;
}
+ void makeZombie() {
+ zombie = true;
+ }
+ boolean isZombie() {
+ return zombie;
+ }
public void run() {
while (true) { // poll loop
// wait for the start of poll. If this thread has become
@@ -432,7 +438,7 @@
} else if (threadsCount < threads.size()) {
// Some threads become redundant. Remove them from the threads List.
for (int i = threads.size() - 1 ; i >= threadsCount; i--)
- threads.remove(i);
+ threads.remove(i).makeZombie();
}
}
@@ -468,10 +474,9 @@
updateCount++;
int numKeysUpdated = 0;
numKeysUpdated += subSelector.processSelectedKeys(updateCount);
- Iterator it = threads.iterator();
- while (it.hasNext())
- numKeysUpdated += ((SelectThread)it.next()).subSelector.
- processSelectedKeys(updateCount);
+ for (SelectThread t: threads) {
+ numKeysUpdated += t.subSelector.processSelectedKeys(updateCount);
+ }
return numKeysUpdated;
}
@@ -495,13 +500,13 @@
}
pollWrapper.free();
pollWrapper = null;
- selectedKeys = null;
- channelArray = null;
- threads.clear();
- // Call startThreads. All remaining helper threads now exit,
- // since threads.size() = 0;
- startLock.startThreads();
- }
+ selectedKeys = null;
+ channelArray = null;
+ // Make all remaining helper threads exit
+ for (SelectThread t: threads)
+ t.makeZombie();
+ startLock.startThreads();
+ }
}
}
}
--- a/jdk/src/windows/native/java/io/WinNTFileSystem_md.c Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/java/io/WinNTFileSystem_md.c Mon Apr 27 12:33:57 2009 -0700
@@ -309,12 +309,13 @@
/* No template file */
NULL);
if (h != INVALID_HANDLE_VALUE) {
- GetFileTime(h, NULL, NULL, &t);
+ if (GetFileTime(h, NULL, NULL, &t)) {
+ modTime.LowPart = (DWORD) t.dwLowDateTime;
+ modTime.HighPart = (LONG) t.dwHighDateTime;
+ rv = modTime.QuadPart / 10000;
+ rv -= 11644473600000;
+ }
CloseHandle(h);
- modTime.LowPart = (DWORD) t.dwLowDateTime;
- modTime.HighPart = (LONG) t.dwHighDateTime;
- rv = modTime.QuadPart / 10000;
- rv -= 11644473600000;
}
free(pathbuf);
return rv;
--- a/jdk/src/windows/native/java/lang/java_props_md.c Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/java/lang/java_props_md.c Mon Apr 27 12:33:57 2009 -0700
@@ -717,6 +717,7 @@
* Windows Vista family 6 0
* Windows 2008 6 0
* where ((&ver.wServicePackMinor) + 2) = 1
+ * Windows 7 6 1
*
* This mapping will presumably be augmented as new Windows
* versions are released.
@@ -773,13 +774,18 @@
* and Windows Vista are identical, you must also test
* whether the wProductType member is VER_NT_WORKSTATION.
* If wProductType is VER_NT_WORKSTATION, the operating
- * system is Windows Vista; otherwise, it is Windows
+ * system is Windows Vista or 7; otherwise, it is Windows
* Server 2008."
*/
- if (ver.wProductType == VER_NT_WORKSTATION)
- sprops.os_name = "Windows Vista";
- else
+ if (ver.wProductType == VER_NT_WORKSTATION) {
+ switch (ver.dwMinorVersion) {
+ case 0: sprops.os_name = "Windows Vista"; break;
+ case 1: sprops.os_name = "Windows 7"; break;
+ default: sprops.os_name = "Windows NT (unknown)";
+ }
+ } else {
sprops.os_name = "Windows Server 2008";
+ }
} else {
sprops.os_name = "Windows NT (unknown)";
}
--- a/jdk/src/windows/native/sun/awt/utility/rect.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/awt/utility/rect.h Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007-2009 Sun Microsystems, Inc. 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
@@ -43,5 +43,15 @@
#define RECT_INC_HEIGHT(r) (r).bottom++
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+int BitmapToYXBandedRectangles(int bitsPerPixel, int width, int height,
+ unsigned char * buf, RECT_T * outBuf);
+
+#if defined(__cplusplus)
+}
+#endif
#endif // _AWT_RECT_H
--- a/jdk/src/windows/native/sun/java2d/d3d/D3DSurfaceData.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/java2d/d3d/D3DSurfaceData.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007-2009 Sun Microsystems, Inc. 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
@@ -613,17 +613,15 @@
res = pTmpSurface->LockRect(&lockedRect, NULL, D3DLOCK_NOSYSLOCK);
if (SUCCEEDED(res)) {
- // REMIND: commented until translucent window support is integrated
-// hBitmap =
-// BitmapUtil::CreateBitmapFromARGBPre(w, h,
-// lockedRect.Pitch,
-// (int*)lockedRect.pBits);
+ hBitmap =
+ BitmapUtil::CreateBitmapFromARGBPre(w, h,
+ lockedRect.Pitch,
+ (int*)lockedRect.pBits);
pTmpSurface->UnlockRect();
}
RETURN_STATUS_IF_NULL(hBitmap, JNI_FALSE);
- // REMIND: commented until translucent window support is integrated
-// window->UpdateWindow(env, NULL, w, h, hBitmap);
+ window->UpdateWindow(env, NULL, w, h, hBitmap);
// hBitmap is released in UpdateWindow
--- a/jdk/src/windows/native/sun/java2d/opengl/WGLSurfaceData.c Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/java2d/opengl/WGLSurfaceData.c Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2004-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2004-2009 Sun Microsystems, Inc. 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
@@ -625,17 +625,15 @@
j2d_glPixelStorei(GL_PACK_ALIGNMENT, 4);
// the pixels read from the surface are already premultiplied
- // REMIND: commented until translucent window support is integrated
-// hBitmap = BitmapUtil_CreateBitmapFromARGBPre(w, h, scanStride,
-// (int*)pDst);
+ hBitmap = BitmapUtil_CreateBitmapFromARGBPre(w, h, scanStride,
+ (int*)pDst);
free(pDst);
if (hBitmap == NULL) {
return JNI_FALSE;
}
- // REMIND: commented until translucent window support is integrated
- // AwtWindow_UpdateWindow(env, peer, w, h, hBitmap);
+ AwtWindow_UpdateWindow(env, peer, w, h, hBitmap);
// hBitmap is released in UpdateWindow
--- a/jdk/src/windows/native/sun/windows/ComCtl32Util.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/ComCtl32Util.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -27,6 +27,7 @@
#include "ComCtl32Util.h"
ComCtl32Util::ComCtl32Util() {
+ m_bToolTipControlInitialized = FALSE;
}
ComCtl32Util::~ComCtl32Util() {
@@ -36,7 +37,8 @@
INITCOMMONCONTROLSEX iccex;
memset(&iccex, 0, sizeof(INITCOMMONCONTROLSEX));
iccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
- ::InitCommonControlsEx(&iccex);
+ iccex.dwICC = ICC_TAB_CLASSES;
+ m_bToolTipControlInitialized = ::InitCommonControlsEx(&iccex);
}
WNDPROC ComCtl32Util::SubclassHWND(HWND hwnd, WNDPROC _WindowProc) {
--- a/jdk/src/windows/native/sun/windows/ComCtl32Util.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/ComCtl32Util.h Mon Apr 27 12:33:57 2009 -0700
@@ -40,6 +40,10 @@
void InitLibraries();
+ INLINE BOOL IsToolTipControlInitialized() {
+ return m_bToolTipControlInitialized;
+ }
+
WNDPROC SubclassHWND(HWND hwnd, WNDPROC _WindowProc);
// DefWindowProc is the same as returned from SubclassHWND
void UnsubclassHWND(HWND hwnd, WNDPROC _WindowProc, WNDPROC _DefWindowProc);
@@ -50,6 +54,8 @@
ComCtl32Util();
~ComCtl32Util();
+ BOOL m_bToolTipControlInitialized;
+
// comctl32.dll version 6 window proc
static LRESULT CALLBACK SharedWindowProc(HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam,
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/windows/native/sun/windows/DllUtil.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+
+#include "DllUtil.h"
+
+// Disable warning about using this in the initializer list.
+#pragma warning( disable : 4355)
+
+DllUtil::~DllUtil()
+{
+ if (module != NULL) {
+ ::FreeLibrary(module);
+ module = NULL;
+ }
+}
+
+HMODULE DllUtil::GetModule()
+{
+ if (!module) {
+ module = ::LoadLibrary(name);
+ }
+ return module;
+}
+
+FARPROC DllUtil::GetProcAddress(LPCSTR name)
+{
+ if (GetModule()) {
+ return ::GetProcAddress(GetModule(), name);
+ }
+ throw LibraryUnavailableException();
+}
+
+DwmAPI & DwmAPI::GetInstance()
+{
+ static DwmAPI dll;
+ return dll;
+}
+
+DwmAPI::DwmAPI() :
+ DllUtil(_T("DWMAPI.DLL")),
+ DwmIsCompositionEnabledFunction((DllUtil*)this, "DwmIsCompositionEnabled"),
+ DwmGetWindowAttributeFunction((DllUtil*)this, "DwmGetWindowAttribute")
+{
+}
+
+HRESULT DwmAPI::DwmIsCompositionEnabled(BOOL * pfEnabled)
+{
+ if (GetInstance().DwmIsCompositionEnabledFunction()) {
+ return GetInstance().DwmIsCompositionEnabledFunction()(pfEnabled);
+ }
+ throw FunctionUnavailableException();
+}
+
+HRESULT DwmAPI::DwmGetWindowAttribute(HWND hwnd, DWORD dwAttribute,
+ PVOID pvAttribute, DWORD cbAttribute)
+{
+ if (GetInstance().DwmGetWindowAttributeFunction()) {
+ return GetInstance().DwmGetWindowAttributeFunction()(hwnd, dwAttribute,
+ pvAttribute, cbAttribute);
+ }
+ throw FunctionUnavailableException();
+}
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/windows/native/sun/windows/DllUtil.h Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+#ifndef DLLUTIL_H
+#define DLLUTIL_H
+
+#include <tchar.h>
+#include <windows.h>
+
+/**
+ * Utility class to handle dynamically loadable libraries.
+ *
+ * NOTE: THIS CLASS IS NOT THREAD-SAFE!
+ */
+class DllUtil {
+ public:
+ class Exception {};
+ class LibraryUnavailableException : public Exception {};
+ class FunctionUnavailableException : public Exception {};
+
+ FARPROC GetProcAddress(LPCSTR name);
+
+ protected:
+ DllUtil(const TCHAR * name) : name(name), module(NULL) {}
+ virtual ~DllUtil();
+
+ HMODULE GetModule();
+
+ template <class FunctionType> class Function {
+ public:
+ Function(DllUtil * dll, LPCSTR name) :
+ dll(dll), name(name), function(NULL) {}
+
+ inline FunctionType operator () () {
+ if (!function) {
+ function = (FunctionType)dll->GetProcAddress(name);
+ }
+ return function;
+ }
+
+ private:
+ DllUtil * const dll;
+ LPCSTR name;
+
+ FunctionType function;
+ };
+
+ private:
+ const TCHAR * const name;
+ HMODULE module;
+};
+
+class DwmAPI : public DllUtil {
+ public:
+ // See DWMWINDOWATTRIBUTE enum in dwmapi.h
+ static const DWORD DWMWA_EXTENDED_FRAME_BOUNDS = 9;
+
+ static HRESULT DwmIsCompositionEnabled(BOOL * pfEnabled);
+ static HRESULT DwmGetWindowAttribute(HWND hwnd, DWORD dwAttribute,
+ PVOID pvAttribute, DWORD cbAttribute);
+
+ private:
+ static DwmAPI & GetInstance();
+ DwmAPI();
+
+ typedef HRESULT (WINAPI *DwmIsCompositionEnabledType)(BOOL*);
+ Function<DwmIsCompositionEnabledType> DwmIsCompositionEnabledFunction;
+
+ typedef HRESULT (WINAPI *DwmGetWindowAttributeType)(HWND hwnd, DWORD dwAttribute,
+ PVOID pvAttribute, DWORD cbAttribute);
+ Function<DwmGetWindowAttributeType> DwmGetWindowAttributeFunction;
+};
+
+#endif // DLLUTIL_H
+
--- a/jdk/src/windows/native/sun/windows/ShellFolder2.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/ShellFolder2.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -225,6 +225,34 @@
FID_folderType = env->GetFieldID(cls, "folderType", "Ljava/lang/String;");
}
+
+/*
+* Class: sun_awt_shell_Win32ShellFolderManager2
+* Method: initializeCom
+* Signature: ()V
+*/
+JNIEXPORT void JNICALL Java_sun_awt_shell_Win32ShellFolderManager2_initializeCom
+ (JNIEnv* env, jclass cls)
+{
+ HRESULT hr = ::CoInitialize(NULL);
+ if (FAILED(hr)) {
+ char c[64];
+ sprintf(c, "Could not initialize COM: HRESULT=0x%08X", hr);
+ JNU_ThrowInternalError(env, c);
+ }
+}
+
+/*
+* Class: sun_awt_shell_Win32ShellFolderManager2
+* Method: uninitializeCom
+* Signature: ()V
+*/
+JNIEXPORT void JNICALL Java_sun_awt_shell_Win32ShellFolderManager2_uninitializeCom
+ (JNIEnv* env, jclass cls)
+{
+ ::CoUninitialize();
+}
+
static IShellIcon* getIShellIcon(IShellFolder* pIShellFolder) {
// http://msdn.microsoft.com/library/en-us/shellcc/platform/Shell/programmersguide/shell_int/shell_int_programming/std_ifaces.asp
HRESULT hres;
@@ -239,29 +267,6 @@
return (IShellIcon*)NULL;
}
-// Fixed 6263669
-//
-// CoInitialize wrapper
-// call CoInitialize to initialize COM in STA mode and check result
-// RPC_E_CHANGED_MODE means COM has already been initialized in MTA mode,
-// so don't set the flag to call CoUninitialize later
-
-BOOL CoInit(BOOL& doCoUninit) { // returns TRUE if initialized successfully
- switch(::CoInitialize(NULL)) {
- case S_OK:
- case S_FALSE:
- doCoUninit = TRUE;
- return TRUE;
- break;
- case RPC_E_CHANGED_MODE:
- doCoUninit = FALSE;
- return TRUE;
- break;
- default:
- return FALSE;
- }
-}
-
/*
* Class: sun_awt_shell_Win32ShellFolder2
@@ -507,10 +512,10 @@
/*
* Class: sun_awt_shell_Win32ShellFolder2
- * Method: getFileSystemPath
+ * Method: getFileSystemPath0
* Signature: (I)Ljava/lang/String;
*/
-JNIEXPORT jstring JNICALL Java_sun_awt_shell_Win32ShellFolder2_getFileSystemPath__I
+JNIEXPORT jstring JNICALL Java_sun_awt_shell_Win32ShellFolder2_getFileSystemPath0
(JNIEnv* env, jclass cls, jint csidl)
{
LPITEMIDLIST relPIDL;
@@ -611,18 +616,6 @@
if (SUCCEEDED (hr)) {
return (jlong)pFolder;
}
- if (IS_WINVISTA) {
- BOOL doCoUninit;
- if (CoInit(doCoUninit)) {
- hr = pParent->BindToObject(pidl, NULL, IID_IShellFolder, (void**)&pFolder);
- if (doCoUninit) {
- ::CoUninitialize();
- }
- if (SUCCEEDED (hr)) {
- return (jlong)pFolder;
- }
- }
- }
return 0;
}
@@ -650,7 +643,10 @@
return NULL;
}
- pParent->GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_FORPARSING, &strret);
+ hres = pParent->GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_FORPARSING, &strret);
+ if (FAILED(hres)) {
+ return NULL;
+ }
switch (strret.uType) {
case STRRET_CSTR :
@@ -669,10 +665,6 @@
break;
}
- BOOL doCoUninit;
- if (!CoInit(doCoUninit)) {
- return 0;
- }
IShellLinkW* psl;
hres = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (LPVOID *)&psl);
if (SUCCEEDED(hres)) {
@@ -692,10 +684,10 @@
}
psl->Release();
}
- if (doCoUninit) {
- ::CoUninitialize();
+
+ if (strret.uType == STRRET_WSTR) {
+ CoTaskMemFree(strret.pOleStr);
}
-
if (SUCCEEDED(hres)) {
return (jlong)pidl;
} else {
@@ -741,7 +733,7 @@
/*
* Class: sun_awt_shell_Win32ShellFolder2
* Method: getDisplayNameOf
- * Signature: (JJ)Ljava/lang/String;
+ * Signature: (JJI)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_sun_awt_shell_Win32ShellFolder2_getDisplayNameOf
(JNIEnv* env, jclass cls, jlong parentIShellFolder, jlong relativePIDL, jint attrs)
@@ -758,7 +750,11 @@
if (pParent->GetDisplayNameOf(pidl, attrs, &strret) != S_OK) {
return NULL;
}
- return jstringFromSTRRET(env, pidl, &strret);
+ jstring result = jstringFromSTRRET(env, pidl, &strret);
+ if (strret.uType == STRRET_WSTR) {
+ CoTaskMemFree(strret.pOleStr);
+ }
+ return result;
}
/*
@@ -833,10 +829,6 @@
}
INT index = -1;
- BOOL doCoUninit;
- if (!CoInit(doCoUninit)) {
- return (jint)index;
- }
HRESULT hres;
// http://msdn.microsoft.com/library/en-us/shellcc/platform/Shell/programmersguide/shell_int/shell_int_programming/std_ifaces.asp
@@ -844,9 +836,6 @@
hres = pIShellIcon->GetIconOf(pidl, GIL_FORSHELL, &index);
}
- if (doCoUninit) {
- ::CoUninitialize();
- }
return (jint)index;
}
@@ -866,10 +855,6 @@
}
HICON hIcon = NULL;
- BOOL doCoUninit;
- if (!CoInit(doCoUninit)) {
- return (jlong)hIcon;
- }
HRESULT hres;
IExtractIconW* pIcon;
@@ -894,9 +879,6 @@
}
pIcon->Release();
}
- if (doCoUninit) {
- ::CoUninitialize();
- }
return (jlong)hIcon;
}
@@ -994,14 +976,10 @@
HINSTANCE libComCtl32;
HINSTANCE libShell32;
-
libShell32 = LoadLibrary(TEXT("shell32.dll"));
if (libShell32 != NULL) {
- long osVersion = GetVersion();
- BOOL isVista = (!(osVersion & 0x80000000) && (LOBYTE(LOWORD(osVersion)) >= 6));
-
hBitmap = (HBITMAP)LoadImage(libShell32,
- isVista ? TEXT("IDB_TB_SH_DEF_16") : MAKEINTRESOURCE(216),
+ IS_WINVISTA ? TEXT("IDB_TB_SH_DEF_16") : MAKEINTRESOURCE(216),
IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
}
if (hBitmap == NULL) {
@@ -1095,46 +1073,6 @@
}
-// Helper functions for workaround COM initialization:
-
-static HRESULT GetDetailsOfFolder(
- IShellFolder2 *folder,
- LPCITEMIDLIST pidl,
- UINT column,
- SHELLDETAILS *psd)
-{
- HRESULT hr = folder->GetDetailsOf(pidl, column, psd);
- if (IS_WINVISTA && FAILED (hr)) {
- BOOL doCoUninit;
- if (CoInit(doCoUninit)) {
- hr = folder->GetDetailsOf(pidl, column, psd);
- if (doCoUninit) {
- ::CoUninitialize();
- }
- }
- }
- return hr;
-}
-
-static HRESULT GetDetailsOf(
- IShellDetails *details,
- LPCITEMIDLIST pidl,
- UINT column,
- SHELLDETAILS *psd)
-{
- HRESULT hr = details->GetDetailsOf(pidl, column, psd);
- if (IS_WINVISTA && FAILED (hr)) {
- BOOL doCoUninit;
- if (CoInit(doCoUninit)) {
- hr = details->GetDetailsOf(pidl, column, psd);
- if (doCoUninit) {
- ::CoUninitialize();
- }
- }
- }
- return hr;
-}
-
/*
* Helper function for creating Java column info object
*/
@@ -1187,7 +1125,7 @@
int colNum = -1;
hr = S_OK;
do{
- hr = GetDetailsOfFolder(pIShellFolder2, NULL, ++colNum, &sd);
+ hr = pIShellFolder2->GetDetailsOf(NULL, ++colNum, &sd);
} while (SUCCEEDED (hr));
jobjectArray columns =
@@ -1202,7 +1140,7 @@
colNum = 0;
hr = S_OK;
while (SUCCEEDED (hr)) {
- hr = GetDetailsOfFolder(pIShellFolder2, NULL, colNum, &sd);
+ hr = pIShellFolder2->GetDetailsOf(NULL, colNum, &sd);
if (SUCCEEDED (hr)) {
hr = pIShellFolder2->GetDefaultColumnState(colNum, &csFlags);
@@ -1232,7 +1170,7 @@
int colNum = -1;
hr = S_OK;
do{
- hr = GetDetailsOf(pIShellDetails, NULL, ++colNum, &sd);
+ hr = pIShellDetails->GetDetailsOf(NULL, ++colNum, &sd);
} while (SUCCEEDED (hr));
jobjectArray columns =
@@ -1246,7 +1184,7 @@
colNum = 0;
hr = S_OK;
while (SUCCEEDED (hr)) {
- hr = GetDetailsOf(pIShellDetails, NULL, colNum, &sd);
+ hr = pIShellDetails->GetDetailsOf(NULL, colNum, &sd);
if (SUCCEEDED (hr)) {
jobject column = CreateColumnInfo(env,
&columnClass, &columnConstructor,
@@ -1288,7 +1226,7 @@
if(SUCCEEDED (hr)) {
// The folder exposes IShellFolder2 interface
IShellFolder2 *pIShellFolder2 = (IShellFolder2*) pIUnknown;
- hr = GetDetailsOfFolder(pIShellFolder2, pidl, (UINT)columnIdx, &sd);
+ hr = pIShellFolder2->GetDetailsOf(pidl, (UINT)columnIdx, &sd);
pIShellFolder2->Release();
if (SUCCEEDED (hr)) {
STRRET strRet = sd.str;
@@ -1300,7 +1238,7 @@
if(SUCCEEDED (hr)) {
// The folder exposes IShellDetails interface
IShellDetails *pIShellDetails = (IShellDetails*) pIUnknown;
- hr = GetDetailsOf(pIShellDetails, pidl, (UINT)columnIdx, &sd);
+ hr = pIShellDetails->GetDetailsOf(pidl, (UINT)columnIdx, &sd);
pIShellDetails->Release();
if (SUCCEEDED (hr)) {
STRRET strRet = sd.str;
--- a/jdk/src/windows/native/sun/windows/awt.rc Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt.rc Mon Apr 27 12:33:57 2009 -0700
@@ -35,6 +35,13 @@
AWT_ICON ICON DISCARDABLE "awt.ico"
CHECK_BITMAP BITMAP DISCARDABLE "check.bmp"
+// Note: the number of icons used is specified in the
+// securityWarningIconCounter constant in awt_Toolkit.cpp.
+SECURITY_WARNING_0 ICON DISCARDABLE "security_warning_bw.ico"
+SECURITY_WARNING_1 ICON DISCARDABLE "security_warning_int.ico"
+SECURITY_WARNING_2 ICON DISCARDABLE "security_warning.ico"
+
+
/////////////////////////////////////////////////////////////////////////////
//
// Version
--- a/jdk/src/windows/native/sun/windows/awt_BitmapUtil.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_BitmapUtil.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2006-2009 Sun Microsystems, Inc. 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,9 +28,14 @@
#include <windowsx.h>
#include <zmouse.h>
+#include "GraphicsPrimitiveMgr.h"
+
#include "awt.h"
#include "awt_BitmapUtil.h"
+// Platform-dependent RECT_[EQ | SET | INC_HEIGHT] macros
+#include "utility/rect.h"
+
HBITMAP BitmapUtil::CreateTransparencyMaskFromARGB(int width, int height, int* imageData)
{
//Scan lines should be aligned to word boundary
@@ -148,3 +153,222 @@
::GdiFlush();
return hBitmap;
}
+
+/*
+ * Creates 32-bit premultiplied ARGB bitmap from specified ARGBPre data.
+ * This function may not work on OS prior to Win95.
+ * See MSDN articles for CreateDIBitmap, BITMAPINFOHEADER,
+ * BITMAPV4HEADER, BITMAPV5HEADER for additional info.
+ */
+HBITMAP BitmapUtil::CreateBitmapFromARGBPre(int width, int height,
+ int srcStride,
+ int* imageData)
+{
+ BITMAPINFOHEADER bmi;
+ void *bitmapBits = NULL;
+
+ ZeroMemory(&bmi, sizeof(bmi));
+ bmi.biSize = sizeof(bmi);
+ bmi.biWidth = width;
+ bmi.biHeight = -height;
+ bmi.biPlanes = 1;
+ bmi.biBitCount = 32;
+ bmi.biCompression = BI_RGB;
+
+ HBITMAP hBitmap =
+ ::CreateDIBSection(NULL, (BITMAPINFO *) & bmi, DIB_RGB_COLORS,
+ &bitmapBits, NULL, 0);
+
+ if (!bitmapBits) {
+ return NULL;
+ }
+
+ int dstStride = width * 4;
+
+ if (srcStride == dstStride) {
+ memcpy(bitmapBits, (void*)imageData, srcStride * height);
+ } else if (height > 0) {
+ void *pSrcPixels = (void*)imageData;
+ void *pDstPixels = bitmapBits;
+ do {
+ memcpy(pDstPixels, pSrcPixels, dstStride);
+ pSrcPixels = PtrAddBytes(pSrcPixels, srcStride);
+ pDstPixels = PtrAddBytes(pDstPixels, dstStride);
+ } while (--height > 0);
+ }
+
+ return hBitmap;
+}
+
+extern "C" {
+
+/**
+ * This method is called from the WGL pipeline when it needs to create a bitmap
+ * needed to update the layered window.
+ */
+HBITMAP BitmapUtil_CreateBitmapFromARGBPre(int width, int height,
+ int srcStride,
+ int* imageData)
+{
+ return BitmapUtil::CreateBitmapFromARGBPre(width, height,
+ srcStride, imageData);
+
+}
+
+} /* extern "C" */
+
+
+/**
+ * Transforms the given bitmap into an HRGN representing the transparency
+ * of the bitmap. The bitmap MUST BE 32bpp. Alpha value == 0 is considered
+ * transparent, alpha > 0 - opaque.
+ */
+HRGN BitmapUtil::BitmapToRgn(HBITMAP hBitmap)
+{
+ HDC hdc = ::CreateCompatibleDC(NULL);
+ ::SelectObject(hdc, hBitmap);
+
+ BITMAPINFOEX bi;
+ ::ZeroMemory(&bi, sizeof(bi));
+
+ bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+
+ BOOL r = ::GetDIBits(hdc, hBitmap, 0, 0, NULL,
+ reinterpret_cast<BITMAPINFO*>(&bi), DIB_RGB_COLORS);
+
+ if (!r || bi.bmiHeader.biBitCount != 32)
+ {
+ ::DeleteDC(hdc);
+ return NULL;
+ }
+
+ UINT width = bi.bmiHeader.biWidth;
+ UINT height = abs(bi.bmiHeader.biHeight);
+
+ BYTE * buf = (BYTE*)safe_Malloc(bi.bmiHeader.biSizeImage);
+ bi.bmiHeader.biHeight = -height;
+ ::GetDIBits(hdc, hBitmap, 0, height, buf,
+ reinterpret_cast<BITMAPINFO*>(&bi), DIB_RGB_COLORS);
+
+ /* reserving memory for the worst case */
+ RGNDATA * pRgnData = (RGNDATA *) safe_Malloc(sizeof(RGNDATAHEADER) +
+ sizeof(RECT) * (width / 2 + 1) * height);
+ RGNDATAHEADER * pRgnHdr = (RGNDATAHEADER *) pRgnData;
+ pRgnHdr->dwSize = sizeof(RGNDATAHEADER);
+ pRgnHdr->iType = RDH_RECTANGLES;
+ pRgnHdr->nRgnSize = 0;
+ pRgnHdr->rcBound.top = 0;
+ pRgnHdr->rcBound.left = 0;
+ pRgnHdr->rcBound.bottom = height;
+ pRgnHdr->rcBound.right = width;
+
+ pRgnHdr->nCount = BitmapToYXBandedRectangles(32, width, height, buf,
+ (RECT_T *) (((BYTE *) pRgnData) + sizeof(RGNDATAHEADER)));
+
+ HRGN rgn = ::ExtCreateRegion(NULL,
+ sizeof(RGNDATAHEADER) + sizeof(RECT_T) * pRgnHdr->nCount,
+ pRgnData);
+
+ free(pRgnData);
+ ::DeleteDC(hdc);
+ free(buf);
+
+ return rgn;
+}
+
+/**
+ * Makes a copy of the given bitmap. Blends every pixel of the source
+ * with the given blendColor and alpha. If alpha == 0, the function
+ * simply makes a plain copy of the source without any blending.
+ */
+HBITMAP BitmapUtil::BlendCopy(HBITMAP hSrcBitmap, COLORREF blendColor,
+ BYTE alpha)
+{
+ HDC hdc = ::CreateCompatibleDC(NULL);
+ HBITMAP oldBitmap = (HBITMAP)::SelectObject(hdc, hSrcBitmap);
+
+ BITMAPINFOEX bi;
+ ::ZeroMemory(&bi, sizeof(bi));
+
+ bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+
+ BOOL r = ::GetDIBits(hdc, hSrcBitmap, 0, 0, NULL,
+ reinterpret_cast<BITMAPINFO*>(&bi), DIB_RGB_COLORS);
+
+ if (!r || bi.bmiHeader.biBitCount != 32)
+ {
+ ::DeleteDC(hdc);
+ return NULL;
+ }
+
+ UINT width = bi.bmiHeader.biWidth;
+ UINT height = abs(bi.bmiHeader.biHeight);
+
+ BYTE * buf = (BYTE*)safe_Malloc(bi.bmiHeader.biSizeImage);
+ bi.bmiHeader.biHeight = -height;
+ ::GetDIBits(hdc, hSrcBitmap, 0, height, buf,
+ reinterpret_cast<BITMAPINFO*>(&bi), DIB_RGB_COLORS);
+
+ UINT widthBytes = width * bi.bmiHeader.biBitCount / 8;
+ UINT alignedWidth = (((widthBytes - 1) / 4) + 1) * 4;
+ UINT i, j;
+
+ for (j = 0; j < height; j++) {
+ BYTE *pSrc = (BYTE *) buf + j * alignedWidth;
+ for (i = 0; i < width; i++, pSrc += 4) {
+ // Note: if the current alpha is zero, the other three color
+ // components may (theoretically) contain some uninitialized
+ // data. The developer does not expect to display them,
+ // hence we handle this situation differently.
+ if (pSrc[3] == 0) {
+ pSrc[0] = GetBValue(blendColor) * alpha / 255;
+ pSrc[1] = GetGValue(blendColor) * alpha / 255;
+ pSrc[2] = GetRValue(blendColor) * alpha / 255;
+ pSrc[3] = alpha;
+ } else {
+ pSrc[0] = (GetBValue(blendColor) * alpha / 255) +
+ (pSrc[0] * (255 - alpha) / 255);
+ pSrc[1] = (GetGValue(blendColor) * alpha / 255) +
+ (pSrc[1] * (255 - alpha) / 255);
+ pSrc[2] = (GetRValue(blendColor) * alpha / 255) +
+ (pSrc[2] * (255 - alpha) / 255);
+ pSrc[3] = (alpha * alpha / 255) +
+ (pSrc[3] * (255 - alpha) / 255);
+ }
+ }
+ }
+
+ HBITMAP hDstBitmap = ::CreateDIBitmap(hdc,
+ reinterpret_cast<BITMAPINFOHEADER*>(&bi),
+ CBM_INIT,
+ buf,
+ reinterpret_cast<BITMAPINFO*>(&bi),
+ DIB_RGB_COLORS
+ );
+
+ ::SelectObject(hdc, oldBitmap);
+ ::DeleteDC(hdc);
+ free(buf);
+
+ return hDstBitmap;
+}
+
+/**
+ * Creates a 32 bit ARGB bitmap. Returns the bitmap handle. The *bitmapBits
+ * contains the pointer to the bitmap data or NULL if an error occured.
+ */
+HBITMAP BitmapUtil::CreateARGBBitmap(int width, int height, void ** bitmapBitsPtr)
+{
+ BITMAPINFOHEADER bmi;
+
+ ::ZeroMemory(&bmi, sizeof(bmi));
+ bmi.biSize = sizeof(BITMAPINFOHEADER);
+ bmi.biWidth = width;
+ bmi.biHeight = -height;
+ bmi.biPlanes = 1;
+ bmi.biBitCount = 32;
+ bmi.biCompression = BI_RGB;
+
+ return ::CreateDIBSection(NULL, (BITMAPINFO *) & bmi, DIB_RGB_COLORS,
+ bitmapBitsPtr, NULL, 0);
+}
--- a/jdk/src/windows/native/sun/windows/awt_BitmapUtil.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_BitmapUtil.h Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2006-2009 Sun Microsystems, Inc. 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,6 +45,32 @@
*/
static HBITMAP CreateV4BitmapFromARGB(int width, int height, int* imageData);
+ /**
+ * Creates 32-bit premultiplied ARGB V4 Bitmap (Win95-compatible) from
+ * specified ARGB Pre input data.
+ */
+ static HBITMAP CreateBitmapFromARGBPre(int width, int height,
+ int srcStride,
+ int* imageData);
+
+ /**
+ * Transforms the given bitmap into an HRGN representing the transparency
+ * of the bitmap.
+ */
+ static HRGN BitmapToRgn(HBITMAP hBitmap);
+
+ /**
+ * Makes a copy of the given bitmap. Blends every pixel of the source
+ * with the given blendColor and alpha. If alpha == 0, the function
+ * simply makes a plain copy of the source without any blending.
+ */
+ static HBITMAP BlendCopy(HBITMAP hSrcBitmap, COLORREF blendColor, BYTE alpha);
+
+ /**
+ * Creates a 32 bit ARGB bitmap. Returns the bitmap handle.
+ * The pointer to the bitmap data is stored into bitmapBitsPtr.
+ */
+ static HBITMAP CreateARGBBitmap(int width, int height, void ** bitmapBitsPtr);
};
#endif
--- a/jdk/src/windows/native/sun/windows/awt_Button.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_Button.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -30,7 +30,6 @@
#include "awt_Button.h"
#include "awt_Canvas.h"
#include "awt_Window.h"
-#include "awt_KeyboardFocusManager.h"
/* IMPORTANT! Read the README.JNI file for notes on JNI converted AWT code.
*/
@@ -143,19 +142,6 @@
return c;
}
-BOOL AwtButton::ActMouseMessage(MSG * pMsg) {
- if (!IsFocusingMessage(pMsg->message)) {
- return FALSE;
- }
-
- if (pMsg->message == WM_LBUTTONDOWN) {
- SendMessage(BM_SETSTATE, TRUE, 0);
- } else if (pMsg->message == WM_LBUTTONUP) {
- SendMessage(BM_SETSTATE, FALSE, 0);
- }
- return TRUE;
-}
-
MsgRouting
AwtButton::WmMouseDown(UINT flags, int x, int y, int button)
{
@@ -204,23 +190,6 @@
(jint)AwtComponent::GetJavaModifiers());
}
-/* 4531849 fix. Previous to 1.4, mouse clicks and typing space bar on a
- * Button would notify ActionListeners via WM_COMMAND/WmNotify(). In 1.4, mouse
- * grabs are done for all presses in order to correctly send drag and release
- * events. However, WM_COMMAND message aren't sent when the mouse is grabbed,
- * so ActionListeners for mouse clicks are sent via WmMouseUp/WmNotify().
- * For some reason, if the right mouse button is held down when left-clicking
- * on a Button, WM_COMMAND _IS_ sent. This resulted in two ActionEvents being
- * sent in this case. To fix the problem, we handle typing space bar similar to
- * left clicks - in WmKeyUp(), and do nothing for WM_COMMAND. -bchristi
- */
-MsgRouting
-AwtButton::WmKeyUp(UINT wkey, UINT repCnt, UINT flags, BOOL system)
-{
- MsgRouting mrResult = AwtComponent::WmKeyUp(wkey, repCnt, flags, system);
- return mrResult;
-}
-
MsgRouting
AwtButton::OwnerDrawItem(UINT /*ctrlId*/, DRAWITEMSTRUCT& drawInfo)
{
@@ -293,18 +262,26 @@
return mrDoDefault;
}
+BOOL AwtButton::IsFocusingMouseMessage(MSG *pMsg) {
+ return pMsg->message == WM_LBUTTONDOWN || pMsg->message == WM_LBUTTONUP;
+}
+
+BOOL AwtButton::IsFocusingKeyMessage(MSG *pMsg) {
+ return (pMsg->message == WM_KEYDOWN || pMsg->message == WM_KEYUP) &&
+ pMsg->wParam == VK_SPACE;
+}
+
MsgRouting AwtButton::HandleEvent(MSG *msg, BOOL synthetic)
{
- if (AwtComponent::sm_focusOwner != GetHWnd() &&
- (msg->message == WM_LBUTTONDOWN || msg->message == WM_LBUTTONDBLCLK))
- {
- JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
- jobject target = GetTarget(env);
- env->CallStaticVoidMethod
- (AwtKeyboardFocusManager::keyboardFocusManagerCls,
- AwtKeyboardFocusManager::heavyweightButtonDownMID,
- target, ((jlong)msg->time) & 0xFFFFFFFF);
- env->DeleteLocalRef(target);
+ if (IsFocusingMouseMessage(msg)) {
+ SendMessage(BM_SETSTATE, msg->message == WM_LBUTTONDOWN ? TRUE : FALSE, 0);
+ delete msg;
+ return mrConsume;
+ }
+ if (IsFocusingKeyMessage(msg)) {
+ SendMessage(BM_SETSTATE, msg->message == WM_KEYDOWN ? TRUE : FALSE, 0);
+ delete msg;
+ return mrConsume;
}
return AwtComponent::HandleEvent(msg, synthetic);
}
--- a/jdk/src/windows/native/sun/windows/awt_Button.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_Button.h Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2004 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -50,13 +50,13 @@
/* Windows message handler functions */
MsgRouting WmMouseDown(UINT flags, int x, int y, int button);
MsgRouting WmMouseUp(UINT flags, int x, int y, int button);
- MsgRouting WmKeyUp(UINT vkey, UINT repCnt, UINT flags, BOOL system);
MsgRouting OwnerDrawItem(UINT ctrlId, DRAWITEMSTRUCT& drawInfo);
MsgRouting WmPaint(HDC hDC);
MsgRouting HandleEvent(MSG *msg, BOOL synthetic);
- BOOL ActMouseMessage(MSG * pMsg);
+ BOOL IsFocusingMouseMessage(MSG *pMsg);
+ BOOL IsFocusingKeyMessage(MSG *pMsg);
// called on Toolkit thread from JNI
static void _SetLabel(void *param);
--- a/jdk/src/windows/native/sun/windows/awt_Canvas.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_Canvas.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -26,7 +26,6 @@
#include "awt_Toolkit.h"
#include "awt_Canvas.h"
#include "awt_Win32GraphicsConfig.h"
-#include "awt_KeyboardFocusManager.h"
#include "awt_Window.h"
/* IMPORTANT! Read the README.JNI file for notes on JNI converted AWT code.
@@ -176,27 +175,9 @@
MsgRouting AwtCanvas::HandleEvent(MSG *msg, BOOL synthetic)
{
- if (msg->message == WM_LBUTTONDOWN || msg->message == WM_LBUTTONDBLCLK) {
- /*
- * Fix for BugTraq ID 4041703: keyDown not being invoked.
- * Give the focus to a Canvas or Panel if it doesn't have heavyweight
- * subcomponents so that they will behave the same way as on Solaris
- * providing a possibility of giving keyboard focus to an empty Applet.
- * Since ScrollPane doesn't receive focus on mouse press on Solaris,
- * HandleEvent() is overriden there to do nothing with focus.
- */
- if (AwtComponent::sm_focusOwner != GetHWnd() &&
- ::GetWindow(GetHWnd(), GW_CHILD) == NULL)
- {
- JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
- jobject target = GetTarget(env);
- env->CallStaticVoidMethod
- (AwtKeyboardFocusManager::keyboardFocusManagerCls,
- AwtKeyboardFocusManager::heavyweightButtonDownMID,
- target, ((jlong)msg->time) & 0xFFFFFFFF);
- env->DeleteLocalRef(target);
- AwtSetFocus();
- }
+ if (IsFocusingMouseMessage(msg)) {
+ delete msg;
+ return mrConsume;
}
return AwtComponent::HandleEvent(msg, synthetic);
}
--- a/jdk/src/windows/native/sun/windows/awt_Checkbox.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_Checkbox.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -26,7 +26,6 @@
#include "awt.h"
#include "awt_Toolkit.h"
#include "awt_Checkbox.h"
-#include "awt_KeyboardFocusManager.h"
#include "awt_Canvas.h"
#include "awt_Window.h"
@@ -143,17 +142,6 @@
return checkbox;
}
-BOOL AwtCheckbox::ActMouseMessage(MSG* pMsg) {
- if (!IsFocusingMessage(pMsg->message)) {
- return FALSE;
- }
-
- if (pMsg->message == WM_LBUTTONDOWN) {
- SendMessage(BM_SETSTATE, ~SendMessage(BM_GETSTATE, 0, 0), 0);
- }
- return TRUE;
-}
-
MsgRouting
AwtCheckbox::WmMouseUp(UINT flags, int x, int y, int button)
{
@@ -329,18 +317,32 @@
return mrDoDefault;
}
+BOOL AwtCheckbox::IsFocusingMouseMessage(MSG *pMsg) {
+ return pMsg->message == WM_LBUTTONDOWN || pMsg->message == WM_LBUTTONUP;
+}
+
+BOOL AwtCheckbox::IsFocusingKeyMessage(MSG *pMsg) {
+ return (pMsg->message == WM_KEYDOWN || pMsg->message == WM_KEYUP) &&
+ pMsg->wParam == VK_SPACE;
+}
+
MsgRouting AwtCheckbox::HandleEvent(MSG *msg, BOOL synthetic)
{
- if (IsFocusable() && AwtComponent::sm_focusOwner != GetHWnd() &&
- (msg->message == WM_LBUTTONDOWN || msg->message == WM_LBUTTONDBLCLK))
- {
- JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
- jobject target = GetTarget(env);
- env->CallStaticVoidMethod
- (AwtKeyboardFocusManager::keyboardFocusManagerCls,
- AwtKeyboardFocusManager::heavyweightButtonDownMID,
- target, ((jlong)msg->time) & 0xFFFFFFFF);
- env->DeleteLocalRef(target);
+ if (IsFocusingMouseMessage(msg)) {
+ SendMessage(BM_SETSTATE, (WPARAM)(msg->message == WM_LBUTTONDOWN ? TRUE : FALSE));
+ delete msg;
+ return mrConsume;
+ }
+ if (IsFocusingKeyMessage(msg)) {
+ SendMessage(BM_SETSTATE, (WPARAM)(msg->message == WM_KEYDOWN ? TRUE : FALSE));
+ if (msg->message == WM_KEYDOWN) {
+ m_fLButtonDowned = TRUE;
+ } else if (m_fLButtonDowned == TRUE) {
+ WmNotify(BN_CLICKED);
+ m_fLButtonDowned = TRUE;
+ }
+ delete msg;
+ return mrConsume;
}
return AwtComponent::HandleEvent(msg, synthetic);
}
--- a/jdk/src/windows/native/sun/windows/awt_Checkbox.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_Checkbox.h Mon Apr 27 12:33:57 2009 -0700
@@ -69,7 +69,8 @@
MsgRouting HandleEvent(MSG *msg, BOOL synthetic);
- BOOL ActMouseMessage(MSG* pMsg);
+ BOOL IsFocusingMouseMessage(MSG *pMsg);
+ BOOL IsFocusingKeyMessage(MSG *pMsg);
// called on Toolkit thread from JNI
static void _SetLabel(void *param);
--- a/jdk/src/windows/native/sun/windows/awt_Choice.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_Choice.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -23,14 +23,17 @@
* have any questions.
*/
+#include <windowsx.h>
+
#include "awt_Toolkit.h"
#include "awt_Choice.h"
-#include "awt_KeyboardFocusManager.h"
#include "awt_Canvas.h"
#include "awt_Dimension.h"
#include "awt_Container.h"
+#include "ComCtl32Util.h"
+
#include <java_awt_Toolkit.h>
#include <java_awt_FontMetrics.h>
#include <java_awt_event_InputEvent.h>
@@ -71,18 +74,31 @@
/* Bug #4338368: consume the spurious MouseUp when the choice loses focus */
BOOL AwtChoice::skipNextMouseUp = FALSE;
+
+BOOL AwtChoice::sm_isMouseMoveInList = FALSE;
+
+static const UINT MINIMUM_NUMBER_OF_VISIBLE_ITEMS = 8;
+
/*************************************************************************
* AwtChoice class methods
*/
AwtChoice::AwtChoice() {
- killFocusRouting = mrPassAlong;
+ m_hList = NULL;
+ m_listDefWindowProc = NULL;
}
LPCTSTR AwtChoice::GetClassName() {
return TEXT("COMBOBOX"); /* System provided combobox class */
}
+void AwtChoice::Dispose() {
+ if (m_hList != NULL && m_listDefWindowProc != NULL) {
+ ComCtl32Util::GetInstance().UnsubclassHWND(m_hList, ListWindowProc, m_listDefWindowProc);
+ }
+ AwtComponent::Dispose();
+}
+
AwtChoice* AwtChoice::Create(jobject peer, jobject parent) {
@@ -162,6 +178,10 @@
env->SetIntField(target, AwtComponent::widthID, (jint) rc.right);
env->SetIntField(target, AwtComponent::heightID, (jint) rc.bottom);
+ if (IS_WINXP) {
+ ::SendMessage(c->GetHWnd(), CB_SETMINVISIBLE, (WPARAM) MINIMUM_NUMBER_OF_VISIBLE_ITEMS, 0);
+ }
+
env->DeleteLocalRef(dimension);
}
} catch (...) {
@@ -175,24 +195,13 @@
return c;
}
-BOOL AwtChoice::ActMouseMessage(MSG* pMsg) {
- if (!IsFocusingMessage(pMsg->message)) {
- return FALSE;
- }
-
- if (pMsg->message == WM_LBUTTONDOWN) {
- SendMessage(CB_SHOWDROPDOWN, ~SendMessage(CB_GETDROPPEDSTATE, 0, 0), 0);
- }
- return TRUE;
-}
-
// calculate height of drop-down list part of the combobox
// to show all the items up to a maximum of eight
int AwtChoice::GetDropDownHeight()
{
int itemHeight =(int)::SendMessage(GetHWnd(), CB_GETITEMHEIGHT, (UINT)0,0);
int numItemsToShow = (int)::SendMessage(GetHWnd(), CB_GETCOUNT, 0,0);
- numItemsToShow = numItemsToShow > 8 ? 8 : numItemsToShow;
+ numItemsToShow = min(MINIMUM_NUMBER_OF_VISIBLE_ITEMS, numItemsToShow);
// drop-down height snaps to nearest line, so add a
// fudge factor of 1/2 line to ensure last line shows
return itemHeight*numItemsToShow + itemHeight/2;
@@ -253,6 +262,7 @@
}
return;
}
+
// don't want to interfere with other controls
if (::GetCapture() == NULL) {
::SetCapture(GetHWnd());
@@ -370,6 +380,58 @@
env->DeleteLocalRef(target);
}
+static int lastClickX = -1;
+static int lastClickY = -1;
+
+LRESULT CALLBACK AwtChoice::ListWindowProc(HWND hwnd, UINT message,
+ WPARAM wParam, LPARAM lParam)
+{
+ /*
+ * We don't pass the choice WM_LBUTTONDOWN message. As the result the choice's list
+ * doesn't forward mouse messages it captures. Below we do forward what we need.
+ */
+
+ TRY;
+
+ DASSERT(::IsWindow(hwnd));
+
+ switch (message) {
+ case WM_LBUTTONDOWN: {
+ DWORD curPos = ::GetMessagePos();
+ lastClickX = GET_X_LPARAM(curPos);
+ lastClickY = GET_Y_LPARAM(curPos);
+ break;
+ }
+ case WM_MOUSEMOVE: {
+ RECT rect;
+ ::GetClientRect(hwnd, &rect);
+
+ POINT pt = {GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)};
+ if (::PtInRect(&rect, pt)) {
+ sm_isMouseMoveInList = TRUE;
+ }
+
+ POINT lastPt = {lastClickX, lastClickY};
+ ::ScreenToClient(hwnd, &lastPt);
+ if (::PtInRect(&rect, lastPt)) {
+ break; // ignore when dragging inside the list
+ }
+ }
+ case WM_LBUTTONUP: {
+ lastClickX = -1;
+ lastClickY = -1;
+
+ AwtChoice *c = (AwtChoice *)::GetWindowLongPtr(hwnd, GWLP_USERDATA);
+ if (c != NULL) {
+ // forward the msg to the choice
+ c->WindowProc(message, wParam, lParam);
+ }
+ }
+ }
+ return ComCtl32Util::GetInstance().DefWindowProc(NULL, hwnd, message, wParam, lParam);
+
+ CATCH_BAD_ALLOC_RET(0);
+}
MsgRouting AwtChoice::WmNotify(UINT notifyCode)
@@ -379,15 +441,24 @@
if (itemSelect != CB_ERR){
DoCallback("handleAction", "(I)V", itemSelect);
}
- } else if (notifyCode == CBN_DROPDOWN && !IsFocusable()) {
- // While non-focusable Choice is shown all WM_KILLFOCUS messages should be consumed.
- killFocusRouting = mrConsume;
- } else if (notifyCode == CBN_CLOSEUP && !IsFocusable()) {
- // When non-focusable Choice is about to close, send it synthetic WM_KILLFOCUS
- // message that should be processed by the native widget only. This will allow
- // the native widget to properly process WM_KILLFOCUS that was earlier consumed.
- killFocusRouting = mrDoDefault;
- ::PostMessage(GetHWnd(), WM_KILLFOCUS, (LPARAM)sm_focusOwner, 0);
+ } else if (notifyCode == CBN_DROPDOWN) {
+
+ if (m_hList == NULL) {
+ COMBOBOXINFO cbi;
+ cbi.cbSize = sizeof(COMBOBOXINFO);
+ ::GetComboBoxInfo(GetHWnd(), &cbi);
+ m_hList = cbi.hwndList;
+ m_listDefWindowProc = ComCtl32Util::GetInstance().SubclassHWND(m_hList, ListWindowProc);
+ DASSERT(::GetWindowLongPtr(m_hList, GWLP_USERDATA) == NULL);
+ ::SetWindowLongPtr(m_hList, GWLP_USERDATA, (LONG_PTR)this);
+ }
+ sm_isMouseMoveInList = FALSE;
+
+ // Clicking in the dropdown list steals focus from the proxy.
+ // So, set the focus-restore flag up.
+ SetRestoreFocus(TRUE);
+ } else if (notifyCode == CBN_CLOSEUP) {
+ SetRestoreFocus(FALSE);
}
return mrDoDefault;
}
@@ -414,19 +485,7 @@
AwtChoice::WmKillFocus(HWND hWndGotFocus)
{
skipNextMouseUp = TRUE;
-
- switch (killFocusRouting) {
- case mrConsume:
- return mrConsume;
- case mrDoDefault:
- killFocusRouting = mrPassAlong;
- return mrDoDefault;
- case mrPassAlong:
- return AwtComponent::WmKillFocus(hWndGotFocus);
- }
-
- DASSERT(false); // must never reach here
- return mrDoDefault;
+ return AwtComponent::WmKillFocus(hWndGotFocus);
}
MsgRouting
@@ -441,27 +500,17 @@
MsgRouting AwtChoice::HandleEvent(MSG *msg, BOOL synthetic)
{
- /*
- * 6366006
- * Note: the event can be sent in two cases:
- * 1) The Choice is closed and user clicks on it to drop it down.
- * 2) The Choice is non-focusable, it's droped down, user
- * clicks on it (or outside) to close it.
- * So, if the Choice is in droped down state, we shouldn't call
- * heavyweightButtonDown() method. Otherwise it will set a typeahead marker
- * that won't be removed, because no focus events will be generated.
- */
- if (AwtComponent::sm_focusOwner != GetHWnd() &&
- (msg->message == WM_LBUTTONDOWN || msg->message == WM_LBUTTONDBLCLK) &&
- !IsChoiceOpened())
+ if (IsFocusingMouseMessage(msg)) {
+ SendMessage(CB_SHOWDROPDOWN, ~SendMessage(CB_GETDROPPEDSTATE, 0, 0), 0);
+ delete msg;
+ return mrConsume;
+ }
+ // To simulate the native behavior, we close the list on WM_LBUTTONUP if
+ // WM_MOUSEMOVE has been dedected on the list since it has been dropped down.
+ if (msg->message == WM_LBUTTONUP && SendMessage(CB_GETDROPPEDSTATE, 0, 0) &&
+ sm_isMouseMoveInList)
{
- JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
- jobject target = GetTarget(env);
- env->CallStaticVoidMethod
- (AwtKeyboardFocusManager::keyboardFocusManagerCls,
- AwtKeyboardFocusManager::heavyweightButtonDownMID,
- target, ((jlong)msg->time) & 0xFFFFFFFF);
- env->DeleteLocalRef(target);
+ SendMessage(CB_SHOWDROPDOWN, FALSE, 0);
}
return AwtComponent::HandleEvent(msg, synthetic);
}
@@ -618,6 +667,26 @@
env->DeleteGlobalRef(choice);
}
+void AwtChoice::_CloseList(void *param)
+{
+ JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+
+ jobject choice = (jobject)param;
+
+ AwtChoice *c = NULL;
+
+ PDATA pData;
+ JNI_CHECK_PEER_GOTO(choice, done);
+
+ c = (AwtChoice *)pData;
+ if (::IsWindow(c->GetHWnd()) && c->SendMessage(CB_GETDROPPEDSTATE, 0, 0)) {
+ c->SendMessage(CB_SHOWDROPDOWN, FALSE, 0);
+ }
+
+done:
+ env->DeleteGlobalRef(choice);
+}
+
/************************************************************************
* WChoicePeer native methods
*/
@@ -752,6 +821,23 @@
CATCH_BAD_ALLOC;
}
+/*
+ * Class: sun_awt_windows_WChoicePeer
+ * Method: closeList
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL
+Java_sun_awt_windows_WChoicePeer_closeList(JNIEnv *env, jobject self)
+{
+ TRY;
+
+ jobject selfGlobalRef = env->NewGlobalRef(self);
+
+ AwtToolkit::GetInstance().SyncCall(AwtChoice::_CloseList, (void *)selfGlobalRef);
+ // global ref is deleted in _CloseList
+
+ CATCH_BAD_ALLOC;
+}
} /* extern "C" */
--- a/jdk/src/windows/native/sun/windows/awt_Choice.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_Choice.h Mon Apr 27 12:33:57 2009 -0700
@@ -43,6 +43,8 @@
virtual LPCTSTR GetClassName();
static AwtChoice* Create(jobject peer, jobject hParent);
+ virtual void Dispose();
+
virtual void Reshape(int x, int y, int w, int h);
void ResetDropDownHeight();
int GetDropDownHeight();
@@ -75,9 +77,6 @@
virtual void SetDragCapture(UINT flags);
virtual void ReleaseDragCapture(UINT flags);
- BOOL ActMouseMessage(MSG * pMsg);
- INLINE BOOL AwtChoice::IsChoiceOpened() {return SendMessage(CB_GETDROPPEDSTATE, 0, 0);}
-
static BOOL mouseCapture;
static BOOL skipNextMouseUp;
@@ -87,11 +86,16 @@
static void _AddItems(void *param);
static void _Remove(void *param);
static void _RemoveAll(void *param);
+ static void _CloseList(void *param);
private:
int GetFieldHeight();
int GetTotalHeight();
- MsgRouting killFocusRouting;
+ static BOOL sm_isMouseMoveInList;
+ HWND m_hList;
+ WNDPROC m_listDefWindowProc;
+ static LRESULT CALLBACK ListWindowProc(HWND hwnd, UINT message,
+ WPARAM wParam, LPARAM lParam);
};
#endif /* AWT_CHOICE_H */
--- a/jdk/src/windows/native/sun/windows/awt_Component.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_Component.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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,7 +38,6 @@
#include "awt_InputTextInfor.h"
#include "awt_Insets.h"
#include "awt_KeyEvent.h"
-#include "awt_KeyboardFocusManager.h"
#include "awt_MenuItem.h"
#include "awt_MouseEvent.h"
#include "awt_Palette.h"
@@ -58,7 +57,6 @@
#include <java_awt_Event.h>
#include <java_awt_event_KeyEvent.h>
#include <java_awt_Insets.h>
-#include <java_awt_KeyboardFocusManager.h>
#include <sun_awt_windows_WPanelPeer.h>
#include <java_awt_event_InputEvent.h>
#include <java_awt_event_InputMethodEvent.h>
@@ -94,12 +92,13 @@
BOOL g_bUserHasChangedInputLang = FALSE;
}
-BOOL AwtComponent::sm_suppressFocusAndActivation;
-HWND AwtComponent::sm_focusOwner;
-HWND AwtComponent::sm_focusedWindow;
-HWND AwtComponent::sm_realFocusOpposite;
+BOOL AwtComponent::sm_suppressFocusAndActivation = FALSE;
+BOOL AwtComponent::sm_restoreFocusAndActivation = FALSE;
+HWND AwtComponent::sm_focusOwner = NULL;
+HWND AwtComponent::sm_focusedWindow = NULL;
BOOL AwtComponent::sm_bMenuLoop = FALSE;
AwtComponent* AwtComponent::sm_getComponentCache = NULL;
+BOOL AwtComponent::sm_inSynthesizeFocus = FALSE;
/************************************************************************/
// Struct for _Reshape() and ReshapeNoCheck() methods
@@ -123,15 +122,6 @@
jobject component;
jobject font;
};
-// Struct for _RequestFocus() method
-struct RequestFocusStruct {
- jobject component;
- jobject lightweightChild;
- jboolean temporary;
- jboolean focusedWindowChangeAllowed;
- jlong time;
- jobject cause;
-};
// Struct for _CreatePrintedPixels() method
struct CreatePrintedPixelsStruct {
jobject component;
@@ -149,6 +139,16 @@
jobject window;
RECT *insets;
};
+// Struct for _SetZOrder function
+struct SetZOrderStruct {
+ jobject component;
+ jlong above;
+};
+// Struct for _SetFocus function
+struct SetFocusStruct {
+ jobject component;
+ jboolean doSetFocus;
+};
/************************************************************************/
//////////////////////////////////////////////////////////////////////////
@@ -199,8 +199,7 @@
BOOL AwtComponent::sm_rtlReadingOrder =
PRIMARYLANGID(GetInputLanguage()) == LANG_ARABIC;
-UINT AwtComponent::sm_95WheelMessage = WM_NULL;
-UINT AwtComponent::sm_95WheelSupport = WM_NULL;
+BOOL AwtComponent::sm_PrimaryDynamicTableBuilt = FALSE;
HWND AwtComponent::sm_cursorOn;
BOOL AwtComponent::m_QueryNewPaletteCalled = FALSE;
@@ -208,8 +207,6 @@
CriticalSection windowMoveLock;
BOOL windowMoveLockHeld = FALSE;
-int AwtComponent::sm_wheelRotationAmount = 0;
-
/************************************************************************
* AwtComponent methods
*/
@@ -237,7 +234,6 @@
m_InputMethod = NULL;
m_useNativeCompWindow = TRUE;
m_PendingLeadByte = 0;
- m_skipNextSetFocus = FALSE;
m_bitsCandType = 0;
windowMoveLockPosX = 0;
@@ -250,6 +246,12 @@
m_bSubclassed = FALSE;
m_MessagesProcessing = 0;
+ m_wheelRotationAmount = 0;
+ if (!sm_PrimaryDynamicTableBuilt) {
+ // do it once.
+ AwtComponent::BuildPrimaryDynamicTable();
+ sm_PrimaryDynamicTableBuilt = TRUE;
+ }
}
AwtComponent::~AwtComponent()
@@ -265,8 +267,7 @@
* the native one anymore. So we can safely destroy component's
* handle.
*/
- AwtToolkit::DestroyComponentHWND(m_hwnd);
- m_hwnd = NULL;
+ DestroyHWnd();
if (sm_getComponentCache == this) {
sm_getComponentCache = NULL;
@@ -275,15 +276,8 @@
void AwtComponent::Dispose()
{
- if (sm_focusOwner == GetHWnd()) {
- ::SetFocus(NULL);
- }
- if (sm_focusedWindow == GetHWnd()) {
- sm_focusedWindow = NULL;
- }
- if (sm_realFocusOpposite == GetHWnd()) {
- sm_realFocusOpposite = NULL;
- }
+ // NOTE: in case the component/toplevel was focused, Java should
+ // have already taken care of proper transfering it or clearing.
if (m_hdwp != NULL) {
// end any deferred window positioning, regardless
@@ -588,6 +582,17 @@
}
/*
+ * Destroy this window's HWND
+ */
+void AwtComponent::DestroyHWnd() {
+ if (m_hwnd != NULL) {
+ AwtToolkit::DestroyComponentHWND(m_hwnd);
+ //AwtToolkit::DestroyComponent(this);
+ m_hwnd = NULL;
+ }
+}
+
+/*
* Returns hwnd for target on non Toolkit thread
*/
HWND
@@ -888,27 +893,8 @@
void AwtComponent::Hide()
{
- JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
- jobject peer = GetPeer(env);
- BOOL oldValue = sm_suppressFocusAndActivation;
m_visible = false;
-
- // On disposal the focus owner actually loses focus at the moment of hiding.
- // So, focus change suppression (if requested) should be made here.
- if (GetHWnd() == sm_focusOwner &&
- !JNU_CallMethodByName(env, NULL, peer, "isAutoFocusTransferOnDisposal", "()Z").z)
- {
- sm_suppressFocusAndActivation = TRUE;
- // The native system may autotransfer focus on hiding to the parent
- // of the component. Nevertheless this focus change won't be posted
- // to the Java level, we're better to avoid this. Anyway, after
- // the disposal focus should be requested to the right component.
- ::SetFocus(NULL);
- sm_focusOwner = NULL;
- }
::ShowWindow(GetHWnd(), SW_HIDE);
-
- sm_suppressFocusAndActivation = oldValue;
}
BOOL
@@ -1252,6 +1238,7 @@
WIN_MSG(WM_AWT_COMPONENT_SHOW)
WIN_MSG(WM_AWT_COMPONENT_HIDE)
WIN_MSG(WM_AWT_COMPONENT_SETFOCUS)
+ WIN_MSG(WM_AWT_WINDOW_SETACTIVE)
WIN_MSG(WM_AWT_LIST_SETMULTISELECT)
WIN_MSG(WM_AWT_HANDLE_EVENT)
WIN_MSG(WM_AWT_PRINT_COMPONENT)
@@ -1503,67 +1490,54 @@
sm_bMenuLoop = FALSE;
break;
+ // We don't expect any focus messages on non-proxy component,
+ // except those that came from Java.
case WM_SETFOCUS:
- mr = (!sm_suppressFocusAndActivation && !m_skipNextSetFocus)
- ? WmSetFocus((HWND)wParam) : mrConsume;
- m_skipNextSetFocus = FALSE;
+ if (sm_inSynthesizeFocus) {
+ mr = WmSetFocus((HWND)wParam);
+ } else {
+ mr = mrConsume;
+ }
break;
case WM_KILLFOCUS:
- mr = (!sm_suppressFocusAndActivation)
- ? WmKillFocus((HWND)wParam) : mrConsume;
+ if (sm_inSynthesizeFocus) {
+ mr = WmKillFocus((HWND)wParam);
+ } else {
+ mr = mrConsume;
+ }
break;
- case WM_ACTIVATE:
- {
+ case WM_ACTIVATE: {
UINT nState = LOWORD(wParam);
BOOL fMinimized = (BOOL)HIWORD(wParam);
+ mr = mrConsume;
+
if (!sm_suppressFocusAndActivation &&
(!fMinimized || (nState == WA_INACTIVE)))
{
mr = WmActivate(nState, fMinimized, (HWND)lParam);
- m_skipNextSetFocus = FALSE;
+
// When the window is deactivated, send WM_IME_ENDCOMPOSITION
// message to deactivate the composition window so that
// it won't receive keyboard input focus.
if (ImmGetContext() != NULL) {
DefWindowProc(WM_IME_ENDCOMPOSITION, 0, 0);
}
- } else {
- if (!sm_suppressFocusAndActivation
- && fMinimized && (nState != WA_INACTIVE))
- {
- m_skipNextSetFocus = TRUE;
- }
- mr = mrConsume;
}
+ break;
}
- break;
- case WM_MOUSEACTIVATE: {
- AwtWindow * window = (AwtWindow*)GetComponent((HWND)wParam);
- if (window != NULL) {
- if (!window->IsFocusableWindow()) {
- // if it is non-focusable window we can return
- // MA_NOACTIVATExxx and it will not be activated. We
- // return NOACTIVATE for a client part of the window so we
- // receive mouse event responsible for activation. We
- // return NOACTIVEA for Frame's non-client so user be able
- // to resize and move frames by title and borders. We
- // return NOACTIVATEANDEAT for Window non-client area as
- // there is noone to listen for this event.
- mr = mrConsume;
- if ((window == this) && LOWORD(lParam) != HTCLIENT ) {
- if (window->IsSimpleWindow()) {
- retValue = MA_NOACTIVATEANDEAT;
- } else {
- retValue = MA_NOACTIVATE;
- }
- } else {
- retValue = MA_NOACTIVATE;
- }
- }
- }
- break;
- }
-
+ case WM_MOUSEACTIVATE: {
+ AwtWindow *window = GetContainer();
+ if (window && window->IsFocusableWindow()) {
+ // AWT/Swing will later request focus to a proper component
+ // on handling the Java mouse event. Anyway, we have to
+ // activate the window here as it works both for AWT & Swing.
+ // Do it in our own fassion,
+ window->AwtSetActiveWindow(TRUE, LOWORD(lParam)/*hittest*/);
+ }
+ mr = mrConsume;
+ retValue = MA_NOACTIVATE;
+ break;
+ }
case WM_CTLCOLORMSGBOX:
case WM_CTLCOLOREDIT:
case WM_CTLCOLORLISTBOX:
@@ -1920,7 +1894,15 @@
break;
case WM_AWT_COMPONENT_SETFOCUS:
- retValue = (LRESULT)WmComponentSetFocus((WmComponentSetFocusData *)wParam);
+ if ((BOOL)wParam) {
+ retValue = SynthesizeWmSetFocus(GetHWnd(), NULL);
+ } else {
+ retValue = SynthesizeWmKillFocus(GetHWnd(), NULL);
+ }
+ mr = mrConsume;
+ break;
+ case WM_AWT_WINDOW_SETACTIVE:
+ retValue = (LRESULT)((AwtWindow*)this)->AwtSetActiveWindow((BOOL)wParam);
mr = mrConsume;
break;
@@ -2048,188 +2030,16 @@
MsgRouting AwtComponent::WmSetFocus(HWND hWndLostFocus)
{
- if (sm_focusOwner == GetHWnd()) {
- sm_realFocusOpposite = NULL;
- return mrConsume;
- }
-
- HWND toplevelHWnd = AwtComponent::GetTopLevelParentForWindow(GetHWnd());
- AwtComponent *comp = AwtComponent::GetComponent(toplevelHWnd);
-
- if (comp && comp->IsEmbeddedFrame() &&
- !((AwtFrame*)comp)->activateEmbeddedFrameOnSetFocus(hWndLostFocus))
- {
- // Fix for 6562716.
- // In order that AwtSetFocus() returns FALSE.
- sm_suppressFocusAndActivation = TRUE;
- ::SetFocus(NULL);
- sm_suppressFocusAndActivation = FALSE;
-
- return mrConsume;
- }
-
- sm_focusOwner = GetHWnd();
- sm_focusedWindow = toplevelHWnd;
-
- if (sm_realFocusOpposite != NULL) {
- hWndLostFocus = sm_realFocusOpposite;
- sm_realFocusOpposite = NULL;
- }
-
- sm_wheelRotationAmount = 0;
-
- SendFocusEvent(java_awt_event_FocusEvent_FOCUS_GAINED, hWndLostFocus);
-
+ m_wheelRotationAmount = 0;
return mrDoDefault;
}
MsgRouting AwtComponent::WmKillFocus(HWND hWndGotFocus)
{
- if (sm_focusOwner != NULL && sm_focusOwner == hWndGotFocus) {
- return mrConsume;
- }
-
- if (sm_focusOwner != GetHWnd()) {
- if (sm_focusOwner != NULL) {
- if (hWndGotFocus != NULL &&
- AwtComponent::GetComponent(hWndGotFocus) != NULL)
- {
- sm_realFocusOpposite = sm_focusOwner;
- }
- ::SendMessage(sm_focusOwner, WM_KILLFOCUS, (WPARAM)hWndGotFocus,
- 0);
- }
- return mrConsume;
- }
-
- AwtComponent *comp = AwtComponent::GetComponent(sm_focusedWindow);
-
- if (comp && comp->IsEmbeddedFrame()) {
- ((AwtFrame*)comp)->deactivateEmbeddedFrameOnKillFocus(hWndGotFocus);
- }
-
- sm_focusOwner = NULL;
- sm_wheelRotationAmount = 0;
-
- SendFocusEvent(java_awt_event_FocusEvent_FOCUS_LOST, hWndGotFocus);
+ m_wheelRotationAmount = 0;
return mrDoDefault;
}
-jboolean
-AwtComponent::WmComponentSetFocus(WmComponentSetFocusData *data)
-{
- JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
- if (env->EnsureLocalCapacity(1) < 0) {
- env->DeleteGlobalRef(data->lightweightChild);
- delete data;
- return JNI_FALSE;
- }
-
- jboolean result = JNI_FALSE;
-
- BOOL setSuppressFocusAndActivation = FALSE;
-
- /*
- * This is a fix for 4628933.
- * If sm_suppressFocusAndActivation is TRUE here then
- * this means that we dispatch WM_COMPONENT_SET_FOCUS inside
- * dispatching bounce activation, this unlikely but possible.
- * So we reset sm_suppressFocusAndActivation to give a chance
- * to dispatch focus events which will generate due this focus
- * request to Java.
- *
- * son@sparc.spb.su
- */
- if (sm_suppressFocusAndActivation) {
- sm_suppressFocusAndActivation = FALSE;
- setSuppressFocusAndActivation = TRUE;
- }
-
- jobject heavyweight = GetTarget(env);
- jint retval = env->CallStaticIntMethod
- (AwtKeyboardFocusManager::keyboardFocusManagerCls,
- AwtKeyboardFocusManager::shouldNativelyFocusHeavyweightMID,
- heavyweight, data->lightweightChild, data->temporary,
- data->focusedWindowChangeAllowed, data->time, data->cause);
-
- if (retval == java_awt_KeyboardFocusManager_SNFH_SUCCESS_HANDLED) {
- result = JNI_TRUE;
- } else if (retval == java_awt_KeyboardFocusManager_SNFH_SUCCESS_PROCEED) {
- result = (AwtSetFocus()) ? JNI_TRUE : JNI_FALSE;
- if (result == JNI_FALSE) {
- env->CallStaticVoidMethod
- (AwtKeyboardFocusManager::keyboardFocusManagerCls,
- AwtKeyboardFocusManager::removeLastFocusRequestMID,
- heavyweight);
- }
- } else {
- DASSERT(retval == java_awt_KeyboardFocusManager_SNFH_FAILURE);
- result = JNI_FALSE;
- }
- env->DeleteLocalRef(heavyweight);
-
- /*
- * Set sm_suppressFocusAndActivation back to TRUE if needed.
- * Fix for 4628933 (son@sparc.spb.su)
- */
- if (setSuppressFocusAndActivation) {
- sm_suppressFocusAndActivation = TRUE;
- }
-
- env->DeleteGlobalRef(data->lightweightChild);
- delete data;
- return result;
-}
-
-BOOL
-AwtComponent::AwtSetFocus()
-{
- HWND hwnd = GetHWnd();
-
- if (sm_focusOwner == hwnd) {
- return TRUE;
- }
-
- HWND fgWindow = ::GetForegroundWindow();
- if (NULL != fgWindow) {
- DWORD fgProcessID;
- ::GetWindowThreadProcessId(fgWindow, &fgProcessID);
-
- if (fgProcessID != ::GetCurrentProcessId()
- && !AwtToolkit::GetInstance().IsEmbedderProcessId(fgProcessID))
- {
- // fix for 6458497. we shouldn't request focus if it is out of both
- // our and embedder process.
- return FALSE;
- }
- }
-
- AwtWindow *pCont = GetContainer();
- AwtFrame *owner = pCont ? pCont->GetOwningFrameOrDialog() : NULL;
-
- if (owner == NULL) {
- ::SetFocus(hwnd);
- if (::GetFocus() != hwnd) {
- return FALSE;
- }
- } else {
- HWND oldFocusOwner = sm_focusOwner;
- if (oldFocusOwner != NULL) {
- ::SendMessage(oldFocusOwner, WM_KILLFOCUS, (WPARAM)hwnd, 0);
- }
-
- sm_suppressFocusAndActivation = TRUE;
- ::SetActiveWindow(owner->GetHWnd());
- ::SetFocus(owner->GetProxyFocusOwner());
- sm_suppressFocusAndActivation = FALSE;
-
- sm_focusedWindow = GetTopLevelParentForWindow(GetHWnd());
- ::SendMessage(hwnd, WM_SETFOCUS, (WPARAM)oldFocusOwner, 0);
- }
-
- return TRUE;
-}
-
MsgRouting AwtComponent::WmCtlColor(HDC hDC, HWND hCtrl,
UINT ctlColor, HBRUSH& retBrush)
{
@@ -2524,7 +2334,6 @@
AwtWindow::GetGrabbedWindow()->Ungrab();
}
}
-
return mrConsume;
}
@@ -2638,11 +2447,11 @@
BOOL result;
UINT platformLines;
- sm_wheelRotationAmount += wheelRotation;
+ m_wheelRotationAmount += wheelRotation;
// AWT interprets wheel rotation differently than win32, so we need to
// decode wheel amount.
- jint roundedWheelRotation = sm_wheelRotationAmount / (-1 * WHEEL_DELTA);
+ jint roundedWheelRotation = m_wheelRotationAmount / (-1 * WHEEL_DELTA);
jdouble preciseWheelRotation = (jdouble) wheelRotation / (-1 * WHEEL_DELTA);
MSG msg;
@@ -2668,7 +2477,9 @@
eventPt.x, eventPt.y, GetJavaModifiers(), 0, 0, scrollType,
scrollLines, roundedWheelRotation, preciseWheelRotation, &msg);
- sm_wheelRotationAmount %= WHEEL_DELTA;
+ m_wheelRotationAmount %= WHEEL_DELTA;
+ // this message could be propagated up to the parent chain
+ // by the mouse message post processors
return mrConsume;
}
@@ -3088,6 +2899,19 @@
{0,0}
};
+// The full map of the current keyboard state including
+// windows virtual key, scancode, java virtual key, and unicode
+// for this key sans modifiers.
+// All but first element may be 0.
+// XXX in the update releases this is an addition to the unchanged existing code
+struct DynPrimaryKeymapEntry {
+ UINT wkey;
+ UINT scancode;
+ UINT jkey;
+ WCHAR unicode;
+};
+
+static DynPrimaryKeymapEntry dynPrimaryKeymap[256];
void
AwtComponent::InitDynamicKeyMapTable()
@@ -3096,6 +2920,8 @@
if (!kbdinited) {
AwtComponent::BuildDynamicKeyMapTable();
+ // We cannot build it here since JNI is not available yet:
+ //AwtComponent::BuildPrimaryDynamicTable();
kbdinited = TRUE;
}
}
@@ -3321,7 +3147,11 @@
for (int j = 0; dynamicKeyMapTable[j].windowsKey != 0; j++) {
if (dynamicKeyMapTable[j].windowsKey == windowsKey) {
- return dynamicKeyMapTable[j].javaKey;
+ if (dynamicKeyMapTable[j].javaKey != java_awt_event_KeyEvent_VK_UNDEFINED) {
+ return dynamicKeyMapTable[j].javaKey;
+ }else{
+ break;
+ }
}
}
@@ -3398,6 +3228,122 @@
return FALSE;
}
+static void
+resetKbdState( BYTE kstate[256]) {
+ BYTE tmpState[256];
+ WCHAR wc[2];
+ memmove(tmpState, kstate, sizeof(kstate));
+ tmpState[VK_SHIFT] = 0;
+ tmpState[VK_CONTROL] = 0;
+ tmpState[VK_MENU] = 0;
+
+ ::ToUnicodeEx(VK_SPACE,::MapVirtualKey(VK_SPACE, 0), tmpState, wc, 2, 0, GetKeyboardLayout(0));
+}
+
+// XXX in the update releases this is an addition to the unchanged existing code
+// After the call, a table will have a unicode associated with a windows virtual keycode
+// sans modifiers. With some further simplification, one can
+// derive java keycode from it, and anyway we will pass this unicode value
+// all the way up in a comment to a KeyEvent.
+void
+AwtComponent::BuildPrimaryDynamicTable() {
+ JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+ // XXX: how about that?
+ //CriticalSection::Lock l(GetLock());
+ //if (GetPeer(env) == NULL) {
+ // /* event received during termination. */
+ // return;
+ //}
+
+ HKL hkl = GetKeyboardLayout();
+ UINT sc = 0;
+ BYTE kbdState[AwtToolkit::KB_STATE_SIZE];
+ memset(kbdState, 0, sizeof (kbdState));
+
+ // Use JNI call to obtain java key code. We should keep a list
+ // of currently available keycodes in a single place.
+ static jclass extKeyCodesCls;
+ if( extKeyCodesCls == NULL) {
+ jclass extKeyCodesClsLocal = env->FindClass("sun/awt/ExtendedKeyCodes");
+ DASSERT(extKeyCodesClsLocal);
+ if (extKeyCodesClsLocal == NULL) {
+ /* exception already thrown */
+ return;
+ }
+ extKeyCodesCls = (jclass)env->NewGlobalRef(extKeyCodesClsLocal);
+ env->DeleteLocalRef(extKeyCodesClsLocal);
+ }
+ static jmethodID getExtendedKeyCodeForChar;
+ if (getExtendedKeyCodeForChar == NULL) {
+ getExtendedKeyCodeForChar =
+ env->GetStaticMethodID(extKeyCodesCls, "getExtendedKeyCodeForChar", "(I)I");
+ DASSERT(getExtendedKeyCodeForChar);
+ }
+ jint extJKC; //extended Java key code
+
+ for (UINT i = 0; i < 256; i++) {
+ dynPrimaryKeymap[i].wkey = i;
+ dynPrimaryKeymap[i].jkey = java_awt_event_KeyEvent_VK_UNDEFINED;
+ dynPrimaryKeymap[i].unicode = 0;
+
+ if ((sc = MapVirtualKey (i, 0)) == 0) {
+ dynPrimaryKeymap[i].scancode = 0;
+ continue;
+ }
+ dynPrimaryKeymap[i].scancode = sc;
+
+ // XXX process cases like VK_SHIFT etc.
+ kbdState[i] = 0x80; // "key pressed".
+ WCHAR wc[16];
+ int k = ::ToUnicodeEx(i, sc, kbdState, wc, 16, 0, hkl);
+ if (k == 1) {
+ // unicode
+ dynPrimaryKeymap[i].unicode = wc[0];
+ if (dynPrimaryKeymap[i].jkey == java_awt_event_KeyEvent_VK_UNDEFINED) {
+ // Convert unicode to java keycode.
+ //dynPrimaryKeymap[i].jkey = ((UINT)(wc[0]) + 0x01000000);
+ //
+ //XXX If this key in on the keypad, we should force a special value equal to
+ //XXX an old java keycode: but how to say if it is a keypad key?
+ //XXX We'll do it in WmKeyUp/Down.
+ extJKC = env->CallStaticIntMethod(extKeyCodesCls,
+ getExtendedKeyCodeForChar, (jint)(wc[0]));
+ dynPrimaryKeymap[i].jkey = extJKC;
+ }
+ }else if (k == -1) {
+ // dead key: use charToDeadVKTable
+ dynPrimaryKeymap[i].unicode = wc[0];
+ resetKbdState( kbdState );
+ for (const CharToVKEntry *map = charToDeadVKTable; map->c != 0; ++map) {
+ if (wc[0] == map->c) {
+ dynPrimaryKeymap[i].jkey = map->javaKey;
+ break;
+ }
+ }
+ } else if (k == 0) {
+ // reset
+ resetKbdState( kbdState );
+ }else {
+ printf ("++++Whats that? wkey 0x%x (%d)\n", i,i);
+ }
+ kbdState[i] = 0; // "key unpressed"
+ }
+}
+void
+AwtComponent::UpdateDynPrimaryKeymap(UINT wkey, UINT jkeyLegacy, jint keyLocation, UINT modifiers)
+{
+ if( wkey && wkey < 256 ) {
+ if(keyLocation == java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD) {
+ // At the creation time,
+ // dynPrimaryKeymap cannot distinguish between e.g. "/" and "NumPad /"
+ dynPrimaryKeymap[wkey].jkey = jkeyLegacy;
+ }
+ if(dynPrimaryKeymap[wkey].jkey == java_awt_event_KeyEvent_VK_UNDEFINED) {
+ // E.g. it is non-unicode key
+ dynPrimaryKeymap[wkey].jkey = jkeyLegacy;
+ }
+ }
+}
UINT AwtComponent::WindowsKeyToJavaChar(UINT wkey, UINT modifiers, TransOps ops)
{
@@ -3554,10 +3500,12 @@
jint keyLocation = GetKeyLocation(wkey, flags);
UINT jkey = WindowsKeyToJavaKey(wkey, modifiers);
UINT character = WindowsKeyToJavaChar(wkey, modifiers, SAVE);
+ UpdateDynPrimaryKeymap(wkey, jkey, keyLocation, modifiers);
+
SendKeyEventToFocusOwner(java_awt_event_KeyEvent_KEY_PRESSED,
TimeHelper::windowsToUTC(msg.time), jkey, character,
- modifiers, keyLocation, &msg);
+ modifiers, keyLocation, (jlong)wkey, &msg);
// bugid 4724007: Windows does not create a WM_CHAR for the Del key
// for some reason, so we need to create the KEY_TYPED event on the
@@ -3569,7 +3517,7 @@
TimeHelper::windowsToUTC(msg.time),
java_awt_event_KeyEvent_VK_UNDEFINED,
character, modifiers,
- java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN);
+ java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, (jlong)0);
}
return mrConsume;
@@ -3594,10 +3542,11 @@
jint keyLocation = GetKeyLocation(wkey, flags);
UINT jkey = WindowsKeyToJavaKey(wkey, modifiers);
UINT character = WindowsKeyToJavaChar(wkey, modifiers, LOAD);
+ UpdateDynPrimaryKeymap(wkey, jkey, keyLocation, modifiers);
SendKeyEventToFocusOwner(java_awt_event_KeyEvent_KEY_RELEASED,
TimeHelper::windowsToUTC(msg.time), jkey, character,
- modifiers, keyLocation, &msg);
+ modifiers, keyLocation, (jlong)wkey, &msg);
return mrConsume;
}
@@ -3613,6 +3562,7 @@
m_idLang = LOWORD(hKeyboardLayout); // lower word of HKL is LANGID
m_CodePage = LangToCodePage(m_idLang);
BuildDynamicKeyMapTable(); // compute new mappings for VK_OEM
+ BuildPrimaryDynamicTable();
return mrConsume; // do not propagate to children
}
@@ -3643,7 +3593,7 @@
TimeHelper::windowsToUTC(msg.time),
java_awt_event_KeyEvent_VK_UNDEFINED,
unicodeChar, modifiers,
- java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN,
+ java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, (jlong)0,
&msg);
return mrConsume;
}
@@ -3712,7 +3662,7 @@
TimeHelper::windowsToUTC(msg.time),
java_awt_event_KeyEvent_VK_UNDEFINED,
unicodeChar, modifiers,
- java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN,
+ java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, (jlong)0,
&msg);
return mrConsume;
}
@@ -4033,14 +3983,15 @@
HWND AwtComponent::GetProxyFocusOwner()
{
- AwtWindow * window = GetContainer();
+ AwtWindow *window = GetContainer();
if (window != 0) {
- AwtFrame * owner = window->GetOwningFrameOrDialog();
+ AwtFrame *owner = window->GetOwningFrameOrDialog();
if (owner != 0) {
return owner->GetProxyFocusOwner();
+ } else if (!window->IsSimpleWindow()) { // isn't an owned simple window
+ return ((AwtFrame*)window)->GetProxyFocusOwner();
}
}
-
return (HWND)NULL;
}
@@ -4562,6 +4513,25 @@
return hdc;
}
+void AwtComponent::FillBackground(HDC hMemoryDC, SIZE &size)
+{
+ RECT eraseR = { 0, 0, size.cx, size.cy };
+ VERIFY(::FillRect(hMemoryDC, &eraseR, GetBackgroundBrush()));
+}
+
+void AwtComponent::FillAlpha(void *bitmapBits, SIZE &size, BYTE alpha)
+{
+ if (bitmapBits) {
+ DWORD* dest = (DWORD*)bitmapBits;
+ //XXX: might be optimized to use one loop (cy*cx -> 0).
+ for (int i = 0; i < size.cy; i++ ) {
+ for (int j = 0; j < size.cx; j++ ) {
+ ((BYTE*)(dest++))[3] = alpha;
+ }
+ }
+ }
+}
+
jintArray AwtComponent::CreatePrintedPixels(SIZE &loc, SIZE &size) {
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
@@ -4619,26 +4589,53 @@
return pixelArray;
}
-void *
-AwtComponent::GetNativeFocusOwner() {
+void* AwtComponent::SetNativeFocusOwner(void *self) {
+ if (self == NULL) {
+ // It means that the KFM wants to set focus to null
+ sm_focusOwner = NULL;
+ return NULL;
+ }
+
+ JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+
+ AwtComponent *c = NULL;
+ jobject peer = (jobject)self;
+
+ PDATA pData;
+ JNI_CHECK_NULL_GOTO(peer, "peer", ret);
+ pData = JNI_GET_PDATA(peer);
+ if (pData == NULL) {
+ goto ret;
+ }
+ c = (AwtComponent *)pData;
+
+ret:
+ if (c && ::IsWindow(c->GetHWnd())) {
+ sm_focusOwner = c->GetHWnd();
+ AwtFrame *owner = (AwtFrame*)GetComponent(c->GetProxyToplevelContainer());
+ if (owner) {
+ owner->SetLastProxiedFocusOwner(sm_focusOwner);
+ }
+ } else {
+ sm_focusOwner = NULL;
+ }
+ env->DeleteGlobalRef(peer);
+ return NULL;
+}
+
+void* AwtComponent::GetNativeFocusedWindow() {
+ JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+ AwtComponent *comp =
+ AwtComponent::GetComponent(AwtComponent::GetFocusedWindow());
+ return (comp != NULL) ? comp->GetTargetAsGlobalRef(env) : NULL;
+}
+
+void* AwtComponent::GetNativeFocusOwner() {
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
AwtComponent *comp =
AwtComponent::GetComponent(AwtComponent::sm_focusOwner);
return (comp != NULL) ? comp->GetTargetAsGlobalRef(env) : NULL;
}
-void *
-AwtComponent::GetNativeFocusedWindow() {
- JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
- AwtComponent *comp =
- AwtComponent::GetComponent(AwtComponent::sm_focusedWindow);
- return (comp != NULL) ? comp->GetTargetAsGlobalRef(env) : NULL;
-}
-void
-AwtComponent::ClearGlobalFocusOwner() {
- if (AwtComponent::sm_focusOwner != NULL) {
- ::SetFocus(NULL);
- }
-}
AwtComponent* AwtComponent::SearchChild(UINT id) {
ChildListItem* child;
@@ -4674,7 +4671,7 @@
}
void AwtComponent::SendKeyEvent(jint id, jlong when, jint raw, jint cooked,
- jint modifiers, jint keyLocation, MSG *pMsg)
+ jint modifiers, jint keyLocation, jlong nativeCode, MSG *pMsg)
{
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
CriticalSection::Lock l(GetLock());
@@ -4711,6 +4708,18 @@
if (safe_ExceptionOccurred(env)) env->ExceptionDescribe();
DASSERT(!safe_ExceptionOccurred(env));
DASSERT(keyEvent != NULL);
+ env->SetLongField(keyEvent, AwtKeyEvent::rawCodeID, nativeCode);
+ if( nativeCode && nativeCode < 256 ) {
+ env->SetLongField(keyEvent, AwtKeyEvent::primaryLevelUnicodeID, (jlong)(dynPrimaryKeymap[nativeCode].unicode));
+ env->SetLongField(keyEvent, AwtKeyEvent::extendedKeyCodeID, (jlong)(dynPrimaryKeymap[nativeCode].jkey));
+ if( nativeCode < 255 ) {
+ env->SetLongField(keyEvent, AwtKeyEvent::scancodeID, (jlong)(dynPrimaryKeymap[nativeCode].scancode));
+ }else if( pMsg != NULL ) {
+ // unknown key with virtual keycode 0xFF.
+ // Its scancode is not in the table, pickup it from the message.
+ env->SetLongField(keyEvent, AwtKeyEvent::scancodeID, (jlong)(HIWORD(pMsg->lParam) & 0xFF));
+ }
+ }
if (pMsg != NULL) {
AwtAWTEvent::saveMSG(env, pMsg, keyEvent);
}
@@ -4724,16 +4733,17 @@
AwtComponent::SendKeyEventToFocusOwner(jint id, jlong when,
jint raw, jint cooked,
jint modifiers, jint keyLocation,
+ jlong nativeCode,
MSG *msg)
{
/*
* if focus owner is null, but focused window isn't
* we will send key event to focused window
*/
- HWND hwndTarget = ((sm_focusOwner != NULL) ? sm_focusOwner : sm_focusedWindow);
+ HWND hwndTarget = ((sm_focusOwner != NULL) ? sm_focusOwner : AwtComponent::GetFocusedWindow());
if (hwndTarget == GetHWnd()) {
- SendKeyEvent(id, when, raw, cooked, modifiers, keyLocation, msg);
+ SendKeyEvent(id, when, raw, cooked, modifiers, keyLocation, nativeCode, msg);
} else {
AwtComponent *target = NULL;
if (hwndTarget != NULL) {
@@ -4744,7 +4754,7 @@
}
if (target != NULL) {
target->SendKeyEvent(id, when, raw, cooked, modifiers,
- keyLocation, msg);
+ keyLocation, nativeCode, msg);
}
}
}
@@ -5158,14 +5168,7 @@
jint x = (env)->GetIntField(mouseEvent, AwtMouseEvent::xID);
jint y = (env)->GetIntField(mouseEvent, AwtMouseEvent::yID);
MSG* msg = CreateMessage(message, wParam, MAKELPARAM(x, y), x, y);
- // If the window is not focusable but if this is a focusing
- // message we should skip it then and perform our own actions.
- AwtWindow *pCont = GetContainer();
- if ((pCont && pCont->IsFocusableWindow()) || !ActMouseMessage(msg)) {
- PostHandleEventMessage(msg, TRUE);
- } else {
- delete msg;
- }
+ PostHandleEventMessage(msg, TRUE);
}
BOOL AwtComponent::InheritsNativeMouseWheelBehavior() {return false;}
@@ -5251,15 +5254,14 @@
void AwtComponent::Enable(BOOL bEnable)
{
- sm_suppressFocusAndActivation = TRUE;
-
if (bEnable && IsTopLevel()) {
// we should not enable blocked toplevels
bEnable = !::IsWindow(AwtWindow::GetModalBlocker(GetHWnd()));
}
+ // Shouldn't trigger native focus change
+ // (only the proxy may be the native focus owner).
::EnableWindow(GetHWnd(), bEnable);
- sm_suppressFocusAndActivation = FALSE;
CriticalSection::Lock l(GetLock());
VerifyState();
}
@@ -5286,23 +5288,12 @@
}
}
-/**
- * Special procedure responsible for performing the actions which
- * usually happen with component when mouse buttons are being
- * pressed. It is required in case of non-focusable components - we
- * don't pass mouse messages directly to the windows because otherwise
- * it will try to focus component first which we don't want. This
- * function receives MSG and should return TRUE if it processed the
- * message and no furhter processing is allowed, FALSE otherwise.
- * Default implementation returns TRUE it is the message on which
- * Windows try to focus the component. Descendant components write
- * their own implementation of this procedure.
- */
-BOOL AwtComponent::ActMouseMessage(MSG * pMsg) {
- if (IsFocusingMessage(pMsg->message)) {
- return TRUE;
- }
- return FALSE;
+BOOL AwtComponent::IsFocusingMouseMessage(MSG *pMsg) {
+ return pMsg->message == WM_LBUTTONDOWN || pMsg->message == WM_LBUTTONDBLCLK;
+}
+
+BOOL AwtComponent::IsFocusingKeyMessage(MSG *pMsg) {
+ return pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_SPACE;
}
void AwtComponent::_Show(void *param)
@@ -5640,22 +5631,12 @@
return;
}
- /* Post the message directly to the subclassed component. */
- if (self && (pData = JNI_GET_PDATA(self))) {
- AwtComponent* p = (AwtComponent*)pData;
- // If the window is not focusable but if this is a focusing
- // message we should skip it then and perform our own actions.
- AwtWindow *pCont = (AwtWindow*)(p->GetContainer());
- if ((pCont && pCont->IsFocusableWindow()) ||
- !p->ActMouseMessage(&msg))
- {
- // Create copy for local msg
- MSG* pCopiedMsg = new MSG;
- memmove(pCopiedMsg, &msg, sizeof(MSG));
- // Event handler deletes msg
- p->PostHandleEventMessage(pCopiedMsg, FALSE);
- }
- }
+ // Create copy for local msg
+ MSG* pCopiedMsg = new MSG;
+ memmove(pCopiedMsg, &msg, sizeof(MSG));
+ // Event handler deletes msg
+ p->PostHandleEventMessage(pCopiedMsg, FALSE);
+
env->DeleteGlobalRef(self);
env->DeleteGlobalRef(event);
delete nhes;
@@ -5777,19 +5758,15 @@
delete sfs;
}
-jboolean AwtComponent::_RequestFocus(void *param)
+// Sets or kills focus for a component.
+void AwtComponent::_SetFocus(void *param)
{
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
- RequestFocusStruct *rfs = (RequestFocusStruct *)param;
- jobject self = rfs->component;
- jobject lightweightChild = rfs->lightweightChild;
- jboolean temporary = rfs->temporary;
- jboolean focusedWindowChangeAllowed = rfs->focusedWindowChangeAllowed;
- jlong time = rfs->time;
- jobject cause = rfs->cause;
-
- jboolean result = JNI_FALSE;
+ SetFocusStruct *sfs = (SetFocusStruct *)param;
+ jobject self = sfs->component;
+ jboolean doSetFocus = sfs->doSetFocus;
+
AwtComponent *c = NULL;
PDATA pData;
@@ -5801,25 +5778,13 @@
}
c = (AwtComponent *)pData;
- if (::IsWindow(c->GetHWnd()))
- {
- WmComponentSetFocusData *data = new WmComponentSetFocusData;
- data->lightweightChild = env->NewGlobalRef(lightweightChild);
- data->temporary = temporary;
- data->focusedWindowChangeAllowed = focusedWindowChangeAllowed;
- data->time = time;
- data->cause = cause;
- result = (jboolean)c->SendMessage(WM_AWT_COMPONENT_SETFOCUS, (WPARAM)data, 0);
- // data and global ref in it are deleted in WmComponentSetFocus
+ if (::IsWindow(c->GetHWnd())) {
+ c->SendMessage(WM_AWT_COMPONENT_SETFOCUS, (WPARAM)doSetFocus, 0);
}
ret:
env->DeleteGlobalRef(self);
- env->DeleteGlobalRef(lightweightChild);
- env->DeleteGlobalRef(cause);
-
- delete rfs;
-
- return result;
+
+ delete sfs;
}
void AwtComponent::_Start(void *param)
@@ -6082,9 +6047,9 @@
HWND selfWnd = comps[0]->GetHWnd();
HWND parentWnd = comps[1]->GetHWnd();
if (::IsWindow(selfWnd) && ::IsWindow(parentWnd)) {
- sm_suppressFocusAndActivation = TRUE;
+ // Shouldn't trigger native focus change
+ // (only the proxy may be the native focus owner).
::SetParent(selfWnd, parentWnd);
- sm_suppressFocusAndActivation = FALSE;
}
}
delete[] comps;
@@ -6107,15 +6072,12 @@
AwtComponent *c = NULL;
-
-
PDATA pData;
JNI_CHECK_PEER_GOTO(self, ret);
+
c = (AwtComponent *)pData;
- if (::IsWindow(c->GetHWnd()))
- {
+ if (::IsWindow(c->GetHWnd())) {
HRGN hRgn = NULL;
-
if (region || x1 || x2 || y1 || y2) {
// If all the params are zeros, the shape must be simply reset.
// Otherwise, convert it into a region.
@@ -6157,6 +6119,33 @@
delete data;
}
+void AwtComponent::_SetZOrder(void *param) {
+ JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+
+ SetZOrderStruct *data = (SetZOrderStruct *)param;
+ jobject self = data->component;
+ HWND above = HWND_TOP;
+ if (data->above != 0) {
+ above = reinterpret_cast<HWND>(data->above);
+ }
+
+ AwtComponent *c = NULL;
+
+ PDATA pData;
+ JNI_CHECK_PEER_GOTO(self, ret);
+
+ c = (AwtComponent *)pData;
+ if (::IsWindow(c->GetHWnd())) {
+ ::SetWindowPos(c->GetHWnd(), above, 0, 0, 0, 0,
+ SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_DEFERERASE | SWP_ASYNCWINDOWPOS);
+ }
+
+ret:
+ env->DeleteGlobalRef(self);
+
+ delete data;
+}
+
void AwtComponent::PostUngrabEvent() {
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
jobject target = GetTarget(env);
@@ -6173,6 +6162,14 @@
}
}
+void AwtComponent::SetFocusedWindow(HWND window)
+{
+ HWND old = sm_focusedWindow;
+ sm_focusedWindow = window;
+
+ AwtWindow::FocusedWindowChanged(old, window);
+}
+
/************************************************************************
* Component native methods
*/
@@ -6587,31 +6584,25 @@
/*
* Class: sun_awt_windows_WComponentPeer
- * Method: requestFocus
- * Signature: (Ljava/awt/Component;ZZJ)Z
+ * Method: focusGained
+ * Signature: (Z)
*/
-JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WComponentPeer__1requestFocus
- (JNIEnv *env, jobject self, jobject lightweightChild, jboolean temporary,
- jboolean focusedWindowChangeAllowed, jlong time, jobject cause)
+JNIEXPORT void JNICALL Java_sun_awt_windows_WComponentPeer_setFocus
+ (JNIEnv *env, jobject self, jboolean doSetFocus)
{
TRY;
jobject selfGlobalRef = env->NewGlobalRef(self);
- jobject lightweightChildGlobalRef = env->NewGlobalRef(lightweightChild);
-
- RequestFocusStruct *rfs = new RequestFocusStruct;
- rfs->component = selfGlobalRef;
- rfs->lightweightChild = lightweightChildGlobalRef;
- rfs->temporary = temporary;
- rfs->focusedWindowChangeAllowed = focusedWindowChangeAllowed;
- rfs->time = time;
- rfs->cause = env->NewGlobalRef(cause);
-
- return (jboolean)AwtToolkit::GetInstance().SyncCall(
- (void*(*)(void*))AwtComponent::_RequestFocus, rfs);
- // global refs and rfs are deleted in _RequestFocus
-
- CATCH_BAD_ALLOC_RET(JNI_FALSE);
+
+ SetFocusStruct *sfs = new SetFocusStruct;
+ sfs->component = selfGlobalRef;
+ sfs->doSetFocus = doSetFocus;
+
+ AwtToolkit::GetInstance().SyncCall(
+ (void*(*)(void*))AwtComponent::_SetFocus, sfs);
+ // global refs and self are deleted in _SetFocus
+
+ CATCH_BAD_ALLOC;
}
/*
@@ -6823,25 +6814,6 @@
CATCH_BAD_ALLOC_RET(NULL);
}
-JNIEXPORT jboolean JNICALL
-Java_sun_awt_windows_WComponentPeer_processSynchronousLightweightTransfer(JNIEnv *env, jclass cls,
- jobject heavyweight,
- jobject descendant,
- jboolean temporary,
- jboolean focusedWindowChangeAllowed,
- jlong time)
-{
- TRY;
-
- return env->CallStaticBooleanMethod(AwtKeyboardFocusManager::keyboardFocusManagerCls,
- AwtKeyboardFocusManager::processSynchronousTransfer,
- heavyweight, descendant, temporary,
- focusedWindowChangeAllowed,
- time);
-
- CATCH_BAD_ALLOC_RET(JNI_TRUE);
-}
-
JNIEXPORT void JNICALL
Java_sun_awt_windows_WComponentPeer_pSetParent(JNIEnv* env, jobject self, jobject parent) {
TRY;
@@ -6883,6 +6855,21 @@
CATCH_BAD_ALLOC;
}
+JNIEXPORT void JNICALL
+Java_sun_awt_windows_WComponentPeer_setZOrder(JNIEnv* env, jobject self, jlong above)
+{
+ TRY;
+
+ SetZOrderStruct * data = new SetZOrderStruct;
+ data->component = env->NewGlobalRef(self);
+ data->above = above;
+
+ AwtToolkit::GetInstance().SyncCall(AwtComponent::_SetZOrder, data);
+ // global refs and data are deleted in _SetLower
+
+ CATCH_BAD_ALLOC;
+}
+
} /* extern "C" */
--- a/jdk/src/windows/native/sun/windows/awt_Component.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_Component.h Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -78,8 +78,6 @@
class AwtDropTarget;
-struct WmComponentSetFocusData;
-
/*
* Message routing codes
*/
@@ -139,12 +137,13 @@
virtual void RegisterClass();
virtual void UnregisterClass();
- void CreateHWnd(JNIEnv *env, LPCWSTR title,
+ virtual void CreateHWnd(JNIEnv *env, LPCWSTR title,
DWORD windowStyle, DWORD windowExStyle,
int x, int y, int w, int h,
HWND hWndParent, HMENU hMenu,
COLORREF colorForeground, COLORREF colorBackground,
jobject peer);
+ virtual void DestroyHWnd();
void InitPeerGraphicsConfig(JNIEnv *env, jobject peer);
virtual void Dispose();
@@ -221,17 +220,10 @@
virtual BOOL IsContainer() { return FALSE;} // Plain components can't
/**
- * Perform some actions which by default are being performed by Default Window procedure of
- * this window class
- * For detailed comments see implementation in awt_Component.cpp
+ * Returns TRUE if this message will trigger native focus change, FALSE otherwise.
*/
- virtual BOOL ActMouseMessage(MSG * pMsg);
- /**
- * Returns TRUE if this message will this component to become focused. Returns FALSE otherwise.
- */
- inline BOOL IsFocusingMessage(UINT message) {
- return message == WM_LBUTTONDOWN || message == WM_LBUTTONUP || message == WM_LBUTTONDBLCLK;
- }
+ virtual BOOL IsFocusingKeyMessage(MSG *pMsg);
+ virtual BOOL IsFocusingMouseMessage(MSG *pMsg);
BOOL IsFocusable();
@@ -373,7 +365,7 @@
}
void SendKeyEventToFocusOwner(jint id, jlong when, jint raw, jint cooked,
- jint modifiers, jint keyLocation,
+ jint modifiers, jint keyLocation, jlong nativeCode,
MSG *msg = NULL);
/*
* Allocate and initialize a new java.awt.event.KeyEvent, and
@@ -381,7 +373,7 @@
* from the target.
*/
void SendKeyEvent(jint id, jlong when, jint raw, jint cooked,
- jint modifiers, jint keyLocation,
+ jint modifiers, jint keyLocation, jlong nativeCode,
MSG *msg = NULL);
/*
@@ -431,13 +423,6 @@
*/
virtual BOOL InheritsNativeMouseWheelBehavior();
- /* Functions for MouseWheel support on Windows95
- * These should only be called if running on 95
- */
- static void Wheel95Init();
- INLINE static UINT Wheel95GetMsg() {return sm_95WheelMessage;}
- static UINT Wheel95GetScrLines();
-
/* Determines whether the component is obscured by another window */
// Called on Toolkit thread
static jboolean _IsObscured(void *param);
@@ -457,6 +442,7 @@
static UINT GetButtonMK(int mouseButton);
static UINT WindowsKeyToJavaKey(UINT windowsKey, UINT modifiers);
static void JavaKeyToWindowsKey(UINT javaKey, UINT *windowsKey, UINT *modifiers, UINT originalWindowsKey);
+ static void UpdateDynPrimaryKeymap(UINT wkey, UINT jkeyLegacy, jint keyLocation, UINT modifiers);
INLINE static void AwtComponent::JavaKeyToWindowsKey(UINT javaKey,
UINT *windowsKey, UINT *modifiers)
@@ -480,6 +466,12 @@
HIMC ImmGetContext();
HIMC ImmAssociateContext(HIMC himc);
HWND GetProxyFocusOwner();
+
+ INLINE HWND GetProxyToplevelContainer() {
+ HWND proxyHWnd = GetProxyFocusOwner();
+ return ::GetAncestor(proxyHWnd, GA_ROOT); // a browser in case of EmbeddedFrame
+ }
+
void CallProxyDefWindowProc(UINT message,
WPARAM wParam,
LPARAM lParam,
@@ -517,11 +509,6 @@
virtual MsgRouting WmShowWindow(BOOL show, UINT status);
virtual MsgRouting WmSetFocus(HWND hWndLost);
virtual MsgRouting WmKillFocus(HWND hWndGot);
- jboolean WmComponentSetFocus(WmComponentSetFocusData *data);
- // Use instead of ::SetFocus to maintain special focusing semantics for
- // Windows which are not Frames/Dialogs.
- BOOL AwtSetFocus();
-
virtual MsgRouting WmCtlColor(HDC hDC, HWND hCtrl,
UINT ctlColor, HBRUSH& retBrush);
virtual MsgRouting WmHScroll(UINT scrollCode, UINT pos, HWND hScrollBar);
@@ -611,10 +598,6 @@
jintArray CreatePrintedPixels(SIZE &loc, SIZE &size);
- static void * GetNativeFocusOwner();
- static void * GetNativeFocusedWindow();
- static void ClearGlobalFocusOwner();
-
/*
* HWND, AwtComponent and Java Peer interaction
*
@@ -673,7 +656,6 @@
static void _SetForeground(void *param);
static void _SetBackground(void *param);
static void _SetFont(void *param);
- static jboolean _RequestFocus(void *param);
static void _Start(void *param);
static void _BeginValidate(void *param);
static void _EndValidate(void *param);
@@ -683,10 +665,40 @@
static jintArray _CreatePrintedPixels(void *param);
static jboolean _NativeHandlesWheelScrolling(void *param);
static void _SetRectangularShape(void *param);
+ static void _SetZOrder(void *param);
static HWND sm_focusOwner;
+
+private:
static HWND sm_focusedWindow;
+public:
+ static inline HWND GetFocusedWindow() { return sm_focusedWindow; }
+ static void SetFocusedWindow(HWND window);
+
+ static void _SetFocus(void *param);
+
+ static void *SetNativeFocusOwner(void *self);
+ static void *GetNativeFocusedWindow();
+ static void *GetNativeFocusOwner();
+
+ static BOOL sm_inSynthesizeFocus;
+
+ // Execute on Toolkit only.
+ INLINE static LRESULT SynthesizeWmSetFocus(HWND targetHWnd, HWND oppositeHWnd) {
+ sm_inSynthesizeFocus = TRUE;
+ LRESULT res = ::SendMessage(targetHWnd, WM_SETFOCUS, (WPARAM)oppositeHWnd, 0);
+ sm_inSynthesizeFocus = FALSE;
+ return res;
+ }
+ // Execute on Toolkit only.
+ INLINE static LRESULT SynthesizeWmKillFocus(HWND targetHWnd, HWND oppositeHWnd) {
+ sm_inSynthesizeFocus = TRUE;
+ LRESULT res = ::SendMessage(targetHWnd, WM_KILLFOCUS, (WPARAM)oppositeHWnd, 0);
+ sm_inSynthesizeFocus = FALSE;
+ return res;
+ }
+
static BOOL sm_bMenuLoop;
static INLINE BOOL isMenuLoopActive() {
return sm_bMenuLoop;
@@ -710,14 +722,25 @@
BOOL m_visible; /* copy of Component.visible */
static BOOL sm_suppressFocusAndActivation;
- static HWND sm_realFocusOpposite;
+ static BOOL sm_restoreFocusAndActivation;
+
+ /*
+ * The function sets the focus-restore flag ON/OFF.
+ * When the flag is ON, focus is restored immidiately after the proxy loses it.
+ * All focus messages are suppressed. It's also assumed that sm_focusedWindow and
+ * sm_focusOwner don't change after the flag is set ON and before it's set OFF.
+ */
+ static INLINE void SetRestoreFocus(BOOL doSet) {
+ sm_suppressFocusAndActivation = doSet;
+ sm_restoreFocusAndActivation = doSet;
+ }
virtual void SetDragCapture(UINT flags);
virtual void ReleaseDragCapture(UINT flags);
- // 95 support for mouse wheel
- static UINT sm_95WheelMessage;
- static UINT sm_95WheelSupport;
+ //These functions are overridden in AwtWindow to handle non-opaque windows.
+ virtual void FillBackground(HDC hMemoryDC, SIZE &size);
+ virtual void FillAlpha(void *bitmapBits, SIZE &size, BYTE alpha);
private:
/* A bitmask keeps the button's numbers as MK_LBUTTON, MK_MBUTTON, MK_RBUTTON
@@ -761,6 +784,8 @@
static BOOL sm_rtl;
static BOOL sm_rtlReadingOrder;
+ static BOOL sm_PrimaryDynamicTableBuilt;
+
jobject m_InputMethod;
BOOL m_useNativeCompWindow;
LPARAM m_bitsCandType;
@@ -780,8 +805,6 @@
static BOOL m_QueryNewPaletteCalled;
- BOOL m_skipNextSetFocus;
-
static AwtComponent* sm_getComponentCache; // a cache for the GetComponent(..) method.
int windowMoveLockPosX;
@@ -790,7 +813,7 @@
int windowMoveLockPosCY;
// 6524352: support finer-resolution
- static int sm_wheelRotationAmount;
+ int m_wheelRotationAmount;
/*
* The association list of children's IDs and corresponding components.
@@ -826,6 +849,7 @@
AwtComponent* SearchChild(UINT id);
void RemoveChild(UINT id) ;
static BOOL IsNavigationKey(UINT wkey);
+ static void BuildPrimaryDynamicTable();
ChildListItem* m_childList;
@@ -876,14 +900,6 @@
void RealizePalettes(int screen);
};
-struct WmComponentSetFocusData {
- jobject lightweightChild;
- jboolean temporary;
- jboolean focusedWindowChangeAllowed;
- jlong time;
- jobject cause;
-};
-
void ReleaseDCList(HWND hwnd, DCList &list);
void MoveDCToPassiveList(HDC hDC);
--- a/jdk/src/windows/native/sun/windows/awt_Dialog.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_Dialog.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -230,25 +230,8 @@
if (::IsIconic(hWnd)) {
::ShowWindow(hWnd, SW_RESTORE);
}
- HWND topMostBlocker = blocker;
- HWND toolkitHWnd = AwtToolkit::GetInstance().GetHWnd();
- while (::IsWindow(blocker)) {
- topMostBlocker = blocker;
- // fix for 6494032: restore the blocker if it was minimized
- // together with its parent frame; in such cases the check
- // ::IsIconic() for the blocker returns false, so we use
- // ::IsWindowVisible() instead
- if (!::IsWindowVisible(topMostBlocker) &&
- (topMostBlocker != toolkitHWnd))
- {
- ::ShowWindow(topMostBlocker, SW_SHOWNA);
- }
- ::BringWindowToTop(blocker);
- blocker = AwtWindow::GetModalBlocker(blocker);
- }
- if (topMostBlocker != toolkitHWnd) {
- ::SetForegroundWindow(topMostBlocker);
- }
+ PopupAllDialogs(blocker, TRUE, ::GetForegroundWindow(), FALSE);
+ // return 1 to prevent the system from allowing the operation
return 1;
}
return CallNextHookEx(0, code, wParam, lParam);
@@ -271,30 +254,11 @@
(wParam == WM_NCRBUTTONDOWN))
{
HWND blocker = AwtWindow::GetModalBlocker(AwtComponent::GetTopLevelParentForWindow(hWnd));
- HWND topMostBlocker = blocker;
- HWND prevForegroundWindow = ::GetForegroundWindow();
if (::IsWindow(blocker)) {
- ::BringWindowToTop(hWnd);
- }
- while (::IsWindow(blocker)) {
- topMostBlocker = blocker;
- ::BringWindowToTop(blocker);
- blocker = AwtWindow::GetModalBlocker(blocker);
- }
- if (::IsWindow(topMostBlocker)) {
- // no beep/flash if the mouse was clicked in the taskbar menu
- // or the dialog is currently inactive
- if ((::WindowFromPoint(mhs->pt) == hWnd) &&
- (prevForegroundWindow == topMostBlocker))
- {
- ::MessageBeep(MB_OK);
- // some heuristics: 3 times x 64 milliseconds
- AwtWindow::FlashWindowEx(topMostBlocker, 3, 64, FLASHW_CAPTION);
- }
- if (topMostBlocker != AwtToolkit::GetInstance().GetHWnd()) {
- ::BringWindowToTop(topMostBlocker);
- ::SetForegroundWindow(topMostBlocker);
- }
+ BOOL onTaskbar = !(::WindowFromPoint(mhs->pt) == hWnd);
+ PopupAllDialogs(hWnd, FALSE, ::GetForegroundWindow(), onTaskbar);
+ // return a nonzero value to prevent the system from passing
+ // the message to the target window procedure
return 1;
}
}
@@ -303,6 +267,63 @@
return CallNextHookEx(0, nCode, wParam, lParam);
}
+/*
+ * The function goes through the heirarchy of the blocker dialogs and
+ * popups all the dialogs. Note that the function starts from the top
+ * blocker dialog and goes down to the dialog which is the bottom dialog.
+ * Using another traversal may cause to the flickering issue as a bottom
+ * dialog will cover a top dialog for some period of time.
+ */
+void AwtDialog::PopupAllDialogs(HWND dialog, BOOL isModalHook, HWND prevFGWindow, BOOL onTaskbar)
+{
+ HWND blocker = AwtWindow::GetModalBlocker(dialog);
+ BOOL isBlocked = ::IsWindow(blocker);
+ if (isBlocked) {
+ PopupAllDialogs(blocker, isModalHook, prevFGWindow, onTaskbar);
+ }
+ PopupOneDialog(dialog, blocker, isModalHook, prevFGWindow, onTaskbar);
+}
+
+/*
+ * The function popups the dialog, it distinguishes non-blocked dialogs
+ * and activates the dialogs (sets as foreground window). If the dialog is
+ * blocked, then it changes the Z-order of the dialog.
+ */
+void AwtDialog::PopupOneDialog(HWND dialog, HWND blocker, BOOL isModalHook, HWND prevFGWindow, BOOL onTaskbar)
+{
+ if (dialog == AwtToolkit::GetInstance().GetHWnd()) {
+ return;
+ }
+
+ // fix for 6494032
+ if (isModalHook && !::IsWindowVisible(dialog)) {
+ ::ShowWindow(dialog, SW_SHOWNA);
+ }
+
+ BOOL isBlocked = ::IsWindow(blocker);
+ UINT flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE;
+
+ if (isBlocked) {
+ ::SetWindowPos(dialog, blocker, 0, 0, 0, 0, flags);
+ } else {
+ ::SetWindowPos(dialog, HWND_TOP, 0, 0, 0, 0, flags);
+ // no beep/flash if the mouse was clicked in the taskbar menu
+ // or the dialog is currently inactive
+ if (!isModalHook && !onTaskbar && (dialog == prevFGWindow)) {
+ AnimateModalBlocker(dialog);
+ }
+ ::BringWindowToTop(dialog);
+ ::SetForegroundWindow(dialog);
+ }
+}
+
+void AwtDialog::AnimateModalBlocker(HWND window)
+{
+ ::MessageBeep(MB_OK);
+ // some heuristics: 3 times x 64 milliseconds
+ AwtWindow::FlashWindowEx(window, 3, 64, FLASHW_CAPTION);
+}
+
LRESULT CALLBACK AwtDialog::MouseHookProc_NonTT(int nCode,
WPARAM wParam, LPARAM lParam)
{
--- a/jdk/src/windows/native/sun/windows/awt_Dialog.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_Dialog.h Mon Apr 27 12:33:57 2009 -0700
@@ -76,7 +76,7 @@
* Thus we don't have to perform any transitive (a blocker of a blocker) checks.
*/
INLINE virtual BOOL IsFocusedWindowModalBlocker() {
- return (sm_focusedWindow != NULL) && (GetModalBlocker(sm_focusedWindow) == GetHWnd());
+ return (AwtComponent::GetFocusedWindow() != NULL) && (GetModalBlocker(AwtComponent::GetFocusedWindow()) == GetHWnd());
}
// finds and activates some window after the modal dialog is hidden
@@ -113,6 +113,9 @@
*/
static void ModalPerformActivation(HWND hWnd);
+ static void PopupAllDialogs(HWND dialog, BOOL isModalHook, HWND prevFGWindow, BOOL onTaskbar);
+ static void PopupOneDialog(HWND dialog, HWND blocker, BOOL isModalHook, HWND prevFGWindow, BOOL onTaskbar);
+
public:
// WH_CBT hook procedure used in modality, prevents modal
@@ -129,6 +132,8 @@
// example on browser's thread when running in Java Plugin
static LRESULT CALLBACK MouseHookProc_NonTT(int code,
WPARAM wParam, LPARAM lParam);
+
+ static void AnimateModalBlocker(HWND window);
};
#endif /* AWT_DIALOG_H */
--- a/jdk/src/windows/native/sun/windows/awt_FileDialog.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_FileDialog.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -101,7 +101,8 @@
}
}
- return ComCtl32Util::GetInstance().DefWindowProc(NULL, hWnd, message, wParam, lParam);
+ WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(hWnd, NativeDialogWndProcProp));
+ return ComCtl32Util::GetInstance().DefWindowProc(lpfnWndProc, hWnd, message, wParam, lParam);
}
static UINT_PTR CALLBACK
@@ -135,16 +136,19 @@
}
// subclass dialog's parent to receive additional messages
- ComCtl32Util::GetInstance().SubclassHWND(parent,
- FileDialogWndProc);
+ WNDPROC lpfnWndProc = ComCtl32Util::GetInstance().SubclassHWND(parent,
+ FileDialogWndProc);
+ ::SetProp(parent, NativeDialogWndProcProp, reinterpret_cast<HANDLE>(lpfnWndProc));
break;
}
case WM_DESTROY: {
+ WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(parent, NativeDialogWndProcProp));
ComCtl32Util::GetInstance().UnsubclassHWND(parent,
FileDialogWndProc,
- NULL);
+ lpfnWndProc);
::RemoveProp(parent, ModalDialogPeerProp);
+ ::RemoveProp(parent, NativeDialogWndProcProp);
break;
}
case WM_NOTIFY: {
--- a/jdk/src/windows/native/sun/windows/awt_Frame.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_Frame.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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,8 +39,6 @@
#include <sun_awt_windows_WEmbeddedFramePeer.h>
-BOOL isAppActive = FALSE;
-
/* IMPORTANT! Read the README.JNI file for notes on JNI converted AWT code.
*/
@@ -90,8 +88,10 @@
*/
jfieldID AwtFrame::handleID;
-jfieldID AwtFrame::stateID;
+
jfieldID AwtFrame::undecoratedID;
+jmethodID AwtFrame::getExtendedStateMID;
+jmethodID AwtFrame::setExtendedStateMID;
jmethodID AwtFrame::activateEmbeddingTopLevelMID;
@@ -110,6 +110,7 @@
m_isInputMethodWindow = FALSE;
m_isUndecorated = FALSE;
m_proxyFocusOwner = NULL;
+ m_lastProxiedFocusOwner = NULL;
m_actualFocusedWindow = NULL;
m_iconic = FALSE;
m_zoomed = FALSE;
@@ -232,7 +233,7 @@
frame->InitPeerGraphicsConfig(env, self);
AwtToolkit::GetInstance().RegisterEmbedderProcessId(hwndParent);
} else {
- jint state = env->GetIntField(target, AwtFrame::stateID);
+ jint state = env->CallIntMethod(self, AwtFrame::getExtendedStateMID);
DWORD exStyle;
DWORD style;
@@ -285,7 +286,6 @@
::GetSysColor(COLOR_WINDOWTEXT),
::GetSysColor(COLOR_WINDOWFRAME),
self);
-
/*
* Reshape here instead of during create, so that a
* WM_NCCALCSIZE is sent.
@@ -319,12 +319,13 @@
AwtComponent::GetComponentImpl(::GetParent(hwnd));
if (!parent || parent->GetProxyFocusOwner() != hwnd ||
- message == AwtComponent::WmAwtIsComponent)
+ message == AwtComponent::WmAwtIsComponent ||
+ message == WM_GETOBJECT)
{
return ComCtl32Util::GetInstance().DefWindowProc(NULL, hwnd, message, wParam, lParam);
}
- AwtComponent *p = NULL;
+ AwtComponent *focusOwner = NULL;
// IME and input language related messages need to be sent to a window
// which has the Java input focus
switch (message) {
@@ -342,16 +343,37 @@
case WM_IME_KEYUP:
case WM_INPUTLANGCHANGEREQUEST:
case WM_INPUTLANGCHANGE:
- p = AwtComponent::GetComponent(sm_focusOwner);
- if (p != NULL) {
- return p->WindowProc(message, wParam, lParam);
+ // TODO: when a Choice's list is dropped down and we're scrolling in
+ // the list WM_MOUSEWHEEL messages come to the poxy, not to the list. Why?
+ case WM_MOUSEWHEEL:
+ focusOwner = AwtComponent::GetComponent(parent->GetLastProxiedFocusOwner());
+ if (focusOwner != NULL) {
+ return focusOwner->WindowProc(message, wParam, lParam);
}
break;
+ case WM_SETFOCUS:
+ if (!sm_suppressFocusAndActivation && parent->IsEmbeddedFrame()) {
+ parent->AwtSetActiveWindow();
+ }
+ return 0;
+ case WM_KILLFOCUS:
+ if (!sm_suppressFocusAndActivation && parent->IsEmbeddedFrame()) {
+ AwtWindow::SynthesizeWmActivate(FALSE, parent->GetHWnd(), NULL);
+
+ } else if (sm_restoreFocusAndActivation) {
+ if (AwtComponent::GetFocusedWindow() != NULL) {
+ AwtWindow *focusedWindow = (AwtWindow*)GetComponent(AwtComponent::GetFocusedWindow());
+ if (focusedWindow != NULL) {
+ // Will just silently restore native focus & activation.
+ focusedWindow->AwtSetActiveWindow();
+ }
+ }
+ }
+ return 0;
case 0x0127: // WM_CHANGEUISTATE
case 0x0128: // WM_UPDATEUISTATE
return 0;
}
-
return parent->WindowProc(message, wParam, lParam);
CATCH_BAD_ALLOC_RET(0);
@@ -554,7 +576,6 @@
if (m_grabbedWindow != NULL/* && !m_grabbedWindow->IsOneOfOwnersOf(this)*/) {
m_grabbedWindow->Ungrab();
}
-
if (!IsFocusableWindow() && (button & LEFT_BUTTON)) {
switch (hitTest) {
case HTTOP:
@@ -586,11 +607,6 @@
return AwtWindow::WmNcMouseDown(hitTest, x, y, button);
}
-MsgRouting AwtFrame::WmWindowPosChanged(LPARAM windowPos) {
- return mrDoDefault;
-}
-
-
// Override AwtWindow::Reshape() to handle minimized/maximized
// frames (see 6525850, 4065534)
void AwtFrame::Reshape(int x, int y, int width, int height)
@@ -827,6 +843,11 @@
MsgRouting AwtFrame::WmSize(UINT type, int w, int h)
{
+ currentWmSizeState = type;
+ if (currentWmSizeState == SIZE_MINIMIZED) {
+ UpdateSecurityWarningVisibility();
+ }
+
if (m_ignoreWmSize) {
return mrDoDefault;
}
@@ -883,6 +904,11 @@
if (changed != 0) {
DTRACE_PRINTLN2("AwtFrame::WmSize: reporting state change %x -> %x",
oldState, newState);
+
+ // sync target with peer
+ JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+ env->CallVoidMethod(GetPeer(env), AwtFrame::setExtendedStateMID, newState);
+
// report (de)iconification to old clients
if (changed & java_awt_Frame_ICONIFIED) {
if (newState & java_awt_Frame_ICONIFIED) {
@@ -907,33 +933,16 @@
MsgRouting AwtFrame::WmActivate(UINT nState, BOOL fMinimized, HWND opposite)
{
jint type;
- BOOL doActivateFrame = TRUE;
if (nState != WA_INACTIVE) {
- if (!::IsWindow(AwtWindow::GetModalBlocker(GetHWnd()))) {
- ::SetFocus(NULL); // The KeyboardFocusManager will set focus later
- type = java_awt_event_WindowEvent_WINDOW_GAINED_FOCUS;
- isAppActive = TRUE;
- sm_focusedWindow = GetHWnd();
+ if (::IsWindow(AwtWindow::GetModalBlocker(GetHWnd())) ||
+ CheckActivateActualFocusedWindow(opposite))
+ {
+ return mrConsume;
+ }
+ type = java_awt_event_WindowEvent_WINDOW_GAINED_FOCUS;
+ AwtComponent::SetFocusedWindow(GetHWnd());
- /*
- * Fix for 4823903.
- * If the window to be focused is actually not this Frame
- * and it's visible then send it WM_ACTIVATE.
- */
- if (m_actualFocusedWindow != NULL) {
- HWND hwnd = m_actualFocusedWindow->GetHWnd();
-
- if (hwnd != NULL && ::IsWindowVisible(hwnd)) {
-
- ::SendMessage(hwnd, WM_ACTIVATE, MAKEWPARAM(nState, fMinimized), (LPARAM)opposite);
- doActivateFrame = FALSE;
- }
- m_actualFocusedWindow = NULL;
- }
- } else {
- doActivateFrame = FALSE;
- }
} else {
if (!::IsWindow(AwtWindow::GetModalBlocker(opposite))) {
// If deactivation happens because of press on grabbing
@@ -955,37 +964,63 @@
}
}
}
-
- // If actual focused window is not this Frame
- if (sm_focusedWindow != GetHWnd()) {
-
- // Check that the Frame is going to be really inactive (i.e. the opposite is not its owned window)
- if (opposite != NULL) {
- AwtWindow *wOpposite = (AwtWindow *)AwtComponent::GetComponent(opposite);
-
- if (wOpposite != NULL &&
- wOpposite->GetOwningFrameOrDialog() != this)
- {
- AwtWindow *window = (AwtWindow *)AwtComponent::GetComponent(sm_focusedWindow);
-
- // If actual focused window is one of Frame's owned windows
- if (window != NULL && window->GetOwningFrameOrDialog() == this) {
- m_actualFocusedWindow = window;
- }
- }
- }
- }
+ CheckRetainActualFocusedWindow(opposite);
type = java_awt_event_WindowEvent_WINDOW_LOST_FOCUS;
- isAppActive = FALSE;
- sm_focusedWindow = NULL;
+ AwtComponent::SetFocusedWindow(NULL);
+ sm_focusOwner = NULL;
}
}
- if (doActivateFrame) {
- SendWindowEvent(type, opposite);
+ SendWindowEvent(type, opposite);
+ return mrConsume;
+}
+
+BOOL AwtFrame::CheckActivateActualFocusedWindow(HWND deactivatedOpositeHWnd)
+{
+ if (m_actualFocusedWindow != NULL) {
+ HWND hwnd = m_actualFocusedWindow->GetHWnd();
+ if (hwnd != NULL && ::IsWindowVisible(hwnd)) {
+ SynthesizeWmActivate(TRUE, hwnd, deactivatedOpositeHWnd);
+ return TRUE;
+ }
+ m_actualFocusedWindow = NULL;
}
- return mrConsume;
+ return FALSE;
+}
+
+void AwtFrame::CheckRetainActualFocusedWindow(HWND activatedOpositeHWnd)
+{
+ // If actual focused window is not this Frame
+ if (AwtComponent::GetFocusedWindow() != GetHWnd()) {
+ // Make sure the actual focused window is an owned window of this frame
+ AwtWindow *focusedWindow = (AwtWindow *)AwtComponent::GetComponent(AwtComponent::GetFocusedWindow());
+ if (focusedWindow != NULL && focusedWindow->GetOwningFrameOrDialog() == this) {
+
+ // Check that the opposite window is not this frame, nor an owned window of this frame
+ if (activatedOpositeHWnd != NULL) {
+ AwtWindow *oppositeWindow = (AwtWindow *)AwtComponent::GetComponent(activatedOpositeHWnd);
+ if (oppositeWindow && oppositeWindow != this &&
+ oppositeWindow->GetOwningFrameOrDialog() != this)
+ {
+ m_actualFocusedWindow = focusedWindow;
+ }
+ } else {
+ m_actualFocusedWindow = focusedWindow;
+ }
+ }
+ }
+}
+
+BOOL AwtFrame::AwtSetActiveWindow(BOOL isMouseEventCause, UINT hittest)
+{
+ if (hittest == HTCLIENT) {
+ // Don't let the actualFocusedWindow to steal focus if:
+ // a) the frame is clicked in its client area;
+ // b) focus is requested to some of the frame's child.
+ m_actualFocusedWindow = NULL;
+ }
+ return AwtWindow::AwtSetActiveWindow(isMouseEventCause);
}
MsgRouting AwtFrame::WmEnterMenuLoop(BOOL isTrackPopupMenu)
@@ -1161,60 +1196,6 @@
return 0L;
}
-/*
- * hWndLostFocus - the opposite component
- * Returns TRUE if WM_SETFOCUS may be processed further, otherwise FALSE.
- */
-BOOL AwtFrame::activateEmbeddedFrameOnSetFocus(HWND hWndLostFocus) {
-
- // If the EmbeddedFrame is not yet active, then this is either:
- // - requesting focus on smth in the EmbeddedFrame, or
- // - Alt hitting in IE while its menu is active (see 6374321).
- // In both these cases we get WM_SETFOCUS without WM_ACTIVATE
- // on the EmbeddedFrame.
- if (sm_focusedWindow != GetHWnd()) {
- HWND oppositeToplevelHWnd = AwtComponent::GetTopLevelParentForWindow(hWndLostFocus);
-
- // As we get WM_SETFOCUS from the native system we expect
- // the native toplevel be set to the active window.
- HWND activeWindowHWnd = ::GetActiveWindow();
- DASSERT(activeWindowHWnd == ::GetAncestor(GetHWnd(), GA_ROOT));
-
- // See 6538154.
- ::BringWindowToTop(activeWindowHWnd);
- ::SetForegroundWindow(activeWindowHWnd);
-
- SynthesizeWmActivate(TRUE, oppositeToplevelHWnd);
-
- return FALSE;
- }
- // If the EmbeddedFrame is already active, then this is a mouse click
- // or activation (by Alt-Tab, start etc).
- return TRUE;
-}
-
-/*
- * hWndGotFocus - the opposite component
- * Returns TRUE if WM_KILLFOCUS may be processed further, otherwise FALSE.
- */
-BOOL AwtFrame::deactivateEmbeddedFrameOnKillFocus(HWND hWndGotFocus) {
- HWND oppositeToplevelHWnd = AwtComponent::GetTopLevelParentForWindow(hWndGotFocus);
-
- if (oppositeToplevelHWnd != sm_focusedWindow) {
- SynthesizeWmActivate(FALSE, oppositeToplevelHWnd);
- }
- return TRUE;
-}
-
-/*
- * Execute on Toolkit only.
- */
-void AwtFrame::SynthesizeWmActivate(BOOL doActivate, HWND opposite) {
- if (::IsWindowVisible(GetHWnd())) {
- ::SendMessage(GetHWnd(), WM_ACTIVATE, MAKEWPARAM(doActivate ? WA_ACTIVE : WA_INACTIVE, FALSE), (LPARAM) opposite);
- }
-}
-
void AwtFrame::_SynthesizeWmActivate(void *param)
{
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
@@ -1229,7 +1210,7 @@
JNI_CHECK_PEER_GOTO(self, ret);
frame = (AwtFrame *)pData;
- frame->SynthesizeWmActivate(doActivate, NULL);
+ SynthesizeWmActivate(doActivate, frame->GetHWnd(), NULL);
ret:
env->DeleteGlobalRef(self);
@@ -1594,7 +1575,7 @@
extern "C" {
/*
- * Class: sun_awt_windows_WFramePeer
+ * Class: java_awt_Frame
* Method: initIDs
* Signature: ()V
*/
@@ -1603,9 +1584,6 @@
{
TRY;
- AwtFrame::stateID = env->GetFieldID(cls, "state", "I");
- DASSERT(AwtFrame::stateID != NULL);
-
AwtFrame::undecoratedID = env->GetFieldID(cls,"undecorated","Z");
DASSERT(AwtFrame::undecoratedID != NULL);
@@ -1614,6 +1592,25 @@
/*
* Class: sun_awt_windows_WFramePeer
+ * Method: initIDs
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL
+Java_sun_awt_windows_WFramePeer_initIDs(JNIEnv *env, jclass cls)
+{
+ TRY;
+
+ AwtFrame::setExtendedStateMID = env->GetMethodID(cls, "setExtendedState", "(I)V");
+ AwtFrame::getExtendedStateMID = env->GetMethodID(cls, "getExtendedState", "()I");
+
+ DASSERT(AwtFrame::setExtendedStateMID);
+ DASSERT(AwtFrame::getExtendedStateMID);
+
+ CATCH_BAD_ALLOC;
+}
+
+/*
+ * Class: sun_awt_windows_WFramePeer
* Method: setState
* Signature: (I)V
*/
--- a/jdk/src/windows/native/sun/windows/awt_Frame.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_Frame.h Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -48,14 +48,14 @@
FRAME_SETMENUBAR
};
- /* int handle field for sun.awt.windows.WEmbeddedFrame */
+ /* java.awt.Frame fields and method IDs */
+ static jfieldID undecoratedID;
+
+ /* sun.awt.windows.WEmbeddedFrame fields and method IDs */
static jfieldID handleID;
- /* int state field for java.awt.Frame */
- static jfieldID stateID;
-
- /* boolean undecorated field for java.awt.Frame */
- static jfieldID undecoratedID;
+ static jmethodID setExtendedStateMID;
+ static jmethodID getExtendedStateMID;
/* method id for WEmbeddedFrame.requestActivate() method */
static jmethodID activateEmbeddingTopLevelMID;
@@ -108,7 +108,6 @@
MsgRouting WmNcMouseDown(WPARAM hitTest, int x, int y, int button);
MsgRouting WmNcMouseUp(WPARAM hitTest, int x, int y, int button);
MsgRouting WmGetIcon(WPARAM iconType, LRESULT& retVal);
- MsgRouting WmWindowPosChanged(LPARAM windowPos);
MsgRouting WmShowWindow(BOOL show, UINT status);
virtual MsgRouting WmSysCommand(UINT uCmdType, int xPos, int yPos);
@@ -133,11 +132,6 @@
// adjusts the IME candidate window position if needed
void AdjustCandidateWindowPos();
- void SynthesizeWmActivate(BOOL doActivate, HWND opposite);
-
- BOOL activateEmbeddedFrameOnSetFocus(HWND hWndLostFocus);
- BOOL deactivateEmbeddedFrameOnKillFocus(HWND hWndGotFocus);
-
// invoked on Toolkit thread
static jobject _GetBoundsPrivate(void *param);
@@ -153,6 +147,14 @@
virtual void Reshape(int x, int y, int width, int height);
+ virtual BOOL AwtSetActiveWindow(BOOL isMouseEventCause = FALSE, UINT hittest = HTCLIENT);
+
+ void CheckRetainActualFocusedWindow(HWND activatedOpositeHWnd);
+ BOOL CheckActivateActualFocusedWindow(HWND deactivatedOpositeHWnd);
+
+ INLINE HWND GetLastProxiedFocusOwner() { return m_lastProxiedFocusOwner; }
+ INLINE void SetLastProxiedFocusOwner(HWND hwnd) { m_lastProxiedFocusOwner = hwnd; }
+
protected:
/* The frame is undecorated. */
BOOL m_isUndecorated;
@@ -189,6 +191,10 @@
or an AwtDialog (or one of its children) has the logical input focus. */
HWND m_proxyFocusOwner;
+ /* Retains the last/current sm_focusOwner proxied. Actually, it should be
+ * a component of an owned window last/currently active. */
+ HWND m_lastProxiedFocusOwner;
+
/*
* Fix for 4823903.
* Retains a focus proxied window to set the focus correctly
--- a/jdk/src/windows/native/sun/windows/awt_InputMethod.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_InputMethod.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2009 Sun Microsystems, Inc. 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
@@ -176,7 +176,7 @@
java_awt_event_KeyEvent_CHAR_UNDEFINED,
unicodeChar,
modifiers,
- java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN,
+ java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, (jlong)0,
&msg);
} else {
MSG* pCopiedMsg = new MSG;
--- a/jdk/src/windows/native/sun/windows/awt_KeyEvent.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_KeyEvent.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1998-2009 Sun Microsystems, Inc. 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,10 @@
jfieldID AwtKeyEvent::keyCodeID;
jfieldID AwtKeyEvent::keyCharID;
+jfieldID AwtKeyEvent::rawCodeID;
+jfieldID AwtKeyEvent::primaryLevelUnicodeID;
+jfieldID AwtKeyEvent::scancodeID;
+jfieldID AwtKeyEvent::extendedKeyCodeID;
/************************************************************************
* AwtKeyEvent native methods
@@ -45,9 +49,18 @@
AwtKeyEvent::keyCodeID = env->GetFieldID(cls, "keyCode", "I");
AwtKeyEvent::keyCharID = env->GetFieldID(cls, "keyChar", "C");
+ AwtKeyEvent::rawCodeID = env->GetFieldID(cls, "rawCode", "J");
+ AwtKeyEvent::primaryLevelUnicodeID = env->GetFieldID(cls, "primaryLevelUnicode", "J");
+ AwtKeyEvent::scancodeID = env->GetFieldID(cls, "scancode", "J");
+ AwtKeyEvent::extendedKeyCodeID = env->GetFieldID(cls, "extendedKeyCode", "J");
+
DASSERT(AwtKeyEvent::keyCodeID != NULL);
DASSERT(AwtKeyEvent::keyCharID != NULL);
+ DASSERT(AwtKeyEvent::rawCodeID != NULL);
+ DASSERT(AwtKeyEvent::primaryLevelUnicodeID != NULL);
+ DASSERT(AwtKeyEvent::scancodeID != NULL);
+ DASSERT(AwtKeyEvent::extendedKeyCodeID != NULL);
CATCH_BAD_ALLOC;
}
--- a/jdk/src/windows/native/sun/windows/awt_KeyEvent.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_KeyEvent.h Mon Apr 27 12:33:57 2009 -0700
@@ -39,7 +39,10 @@
/* java.awt.KeyEvent field ids */
static jfieldID keyCodeID;
static jfieldID keyCharID;
-
+ static jfieldID rawCodeID;
+ static jfieldID primaryLevelUnicodeID;
+ static jfieldID scancodeID;
+ static jfieldID extendedKeyCodeID;
};
#endif // AWT_KEYEVENT_H
--- a/jdk/src/windows/native/sun/windows/awt_KeyboardFocusManager.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_KeyboardFocusManager.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2004 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2000-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,30 +24,20 @@
*/
#include "awt.h"
-#include "awt_KeyboardFocusManager.h"
#include "awt_Component.h"
#include "awt_Toolkit.h"
#include <java_awt_KeyboardFocusManager.h>
-
-jclass AwtKeyboardFocusManager::keyboardFocusManagerCls;
-jmethodID AwtKeyboardFocusManager::shouldNativelyFocusHeavyweightMID;
-jmethodID AwtKeyboardFocusManager::heavyweightButtonDownMID;
-jmethodID AwtKeyboardFocusManager::markClearGlobalFocusOwnerMID;
-jmethodID AwtKeyboardFocusManager::removeLastFocusRequestMID;
-jfieldID AwtKeyboardFocusManager::isProxyActive;
-jmethodID AwtKeyboardFocusManager::processSynchronousTransfer;
+#include <jni.h>
static jobject getNativeFocusState(JNIEnv *env, void*(*ftn)()) {
- jobject lFocusState = NULL;
+ jobject gFocusState = (jobject)AwtToolkit::GetInstance().SyncCall(ftn);
- jobject gFocusState = reinterpret_cast<jobject>(AwtToolkit::GetInstance().
- InvokeFunction(ftn));
if (gFocusState != NULL) {
- lFocusState = env->NewLocalRef(gFocusState);
+ jobject lFocusState = env->NewLocalRef(gFocusState);
env->DeleteGlobalRef(gFocusState);
+ return lFocusState;
}
-
- return lFocusState;
+ return NULL;
}
extern "C" {
@@ -61,53 +51,35 @@
Java_java_awt_KeyboardFocusManager_initIDs
(JNIEnv *env, jclass cls)
{
+}
+
+/*
+ * Class: sun_awt_windows_WKeyboardFocusManagerPeer
+ * Method: setNativeFocusOwner
+ * Signature: (Lsun/awt/windows/WComponentPeer)
+ */
+JNIEXPORT void JNICALL
+Java_sun_awt_windows_WKeyboardFocusManagerPeer_setNativeFocusOwner
+ (JNIEnv *env, jclass cls, jobject compPeer)
+{
TRY;
- AwtKeyboardFocusManager::keyboardFocusManagerCls = (jclass)
- env->NewGlobalRef(cls);
- AwtKeyboardFocusManager::shouldNativelyFocusHeavyweightMID =
- env->GetStaticMethodID(cls, "shouldNativelyFocusHeavyweight",
- "(Ljava/awt/Component;Ljava/awt/Component;ZZJLsun/awt/CausedFocusEvent$Cause;)I");
- AwtKeyboardFocusManager::heavyweightButtonDownMID =
- env->GetStaticMethodID(cls, "heavyweightButtonDown",
- "(Ljava/awt/Component;J)V");
- AwtKeyboardFocusManager::markClearGlobalFocusOwnerMID =
- env->GetStaticMethodID(cls, "markClearGlobalFocusOwner",
- "()Ljava/awt/Window;");
- AwtKeyboardFocusManager::removeLastFocusRequestMID =
- env->GetStaticMethodID(cls, "removeLastFocusRequest",
- "(Ljava/awt/Component;)V");
+ jobject peerGlobalRef = env->NewGlobalRef(compPeer);
- AwtKeyboardFocusManager::processSynchronousTransfer =
- env->GetStaticMethodID(cls, "processSynchronousLightweightTransfer",
- "(Ljava/awt/Component;Ljava/awt/Component;ZZJ)Z");
-
- jclass keyclass = env->FindClass("java/awt/event/KeyEvent");
- DASSERT (keyclass != NULL);
-
- AwtKeyboardFocusManager::isProxyActive =
- env->GetFieldID(keyclass, "isProxyActive", "Z");
+ AwtToolkit::GetInstance().SyncCall(AwtComponent::SetNativeFocusOwner,
+ (void*)peerGlobalRef);
+ // peerGlobalRef is deleted in SetNativeFocusOwner
- env->DeleteLocalRef(keyclass);
-
- DASSERT(AwtKeyboardFocusManager::keyboardFocusManagerCls != NULL);
- DASSERT(AwtKeyboardFocusManager::shouldNativelyFocusHeavyweightMID !=
- NULL);
- DASSERT(AwtKeyboardFocusManager::heavyweightButtonDownMID != NULL);
- DASSERT(AwtKeyboardFocusManager::markClearGlobalFocusOwnerMID != NULL);
- DASSERT(AwtKeyboardFocusManager::removeLastFocusRequestMID != NULL);
- DASSERT(AwtKeyboardFocusManager::processSynchronousTransfer != NULL);
CATCH_BAD_ALLOC;
}
-
/*
- * Class: sun_awt_KeyboardFocusManagerPeerImpl
+ * Class: sun_awt_windows_WKeyboardFocusManagerPeer
* Method: getNativeFocusOwner
- * Signature: ()Ljava/awt/Component;
+ * Signature: (Lsun/awt/windows/WComponentPeer)
*/
JNIEXPORT jobject JNICALL
-Java_sun_awt_KeyboardFocusManagerPeerImpl_getNativeFocusOwner
+Java_sun_awt_windows_WKeyboardFocusManagerPeer_getNativeFocusOwner
(JNIEnv *env, jclass cls)
{
TRY;
@@ -118,12 +90,12 @@
}
/*
- * Class: sun_awt_KeyboardFocusManagerPeerImpl
+ * Class: sun_awt_windows_WKeyboardFocusManagerPeer
* Method: getNativeFocusedWindow
* Signature: ()Ljava/awt/Window;
*/
JNIEXPORT jobject JNICALL
-Java_sun_awt_KeyboardFocusManagerPeerImpl_getNativeFocusedWindow
+Java_sun_awt_windows_WKeyboardFocusManagerPeer_getNativeFocusedWindow
(JNIEnv *env, jclass cls)
{
TRY;
@@ -132,21 +104,4 @@
CATCH_BAD_ALLOC_RET(NULL);
}
-
-/*
- * Class: sun_awt_KeyboardFocusManagerPeerImpl
- * Method: clearNativeGlobalFocusOwner
- * Signature: (Ljava/awt/Window;)V
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_KeyboardFocusManagerPeerImpl_clearNativeGlobalFocusOwner
- (JNIEnv *env, jobject self, jobject activeWindow)
-{
- TRY;
-
- AwtToolkit::GetInstance().InvokeFunction
- ((void*(*)(void))AwtComponent::ClearGlobalFocusOwner);
-
- CATCH_BAD_ALLOC;
}
-}
--- a/jdk/src/windows/native/sun/windows/awt_KeyboardFocusManager.h Thu Apr 23 16:58:16 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-/*
- * Copyright 2001-2002 Sun Microsystems, Inc. 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. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-#ifndef AWT_KEYBOARDFOCUSMANAGER_H
-#define AWT_KEYBOARDFOCUSMANAGER_H
-
-#include <jni.h>
-
-class AwtKeyboardFocusManager {
-public:
-
- static jclass keyboardFocusManagerCls;
- static jmethodID shouldNativelyFocusHeavyweightMID;
- static jmethodID heavyweightButtonDownMID;
- static jmethodID markClearGlobalFocusOwnerMID;
- static jmethodID removeLastFocusRequestMID;
- static jfieldID isProxyActive;
- static jmethodID processSynchronousTransfer;
-};
-
-#endif // AWT_KEYBOARDFOCUSMANAGER_H
--- a/jdk/src/windows/native/sun/windows/awt_List.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_List.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,7 +24,6 @@
*/
#include "awt_List.h"
-#include "awt_KeyboardFocusManager.h"
#include "awt_Canvas.h"
#include "awt_Dimension.h"
#include "awt_Toolkit.h"
@@ -154,28 +153,6 @@
return c;
}
-BOOL AwtList::ActMouseMessage(MSG * pMsg) {
- if (!IsFocusingMessage(pMsg->message)) {
- return FALSE;
- }
-
- if (pMsg->message == WM_LBUTTONDOWN) {
- LONG item = static_cast<LONG>(SendListMessage(LB_ITEMFROMPOINT, 0, pMsg->lParam));
- if (item != LB_ERR) {
- if (isMultiSelect) {
- if (IsItemSelected(item)) {
- Deselect(item);
- } else {
- Select(item);
- }
- } else {
- Select(item);
- }
- }
- }
- return TRUE;
-}
-
void AwtList::SetDragCapture(UINT flags)
{
// don't want to interfere with other controls
@@ -473,17 +450,11 @@
}
/*
- * Fix for 6240202. List being inside a non-focusable Window (or non-focusable List
- * being a single component inside a focusable Window) won't trigger ActionEvent by
- * double click. All focus events will be filtered (in the AWT focus hook) for such
- * a Window containing the List. In such a case OS Windows won't generate WM_COMMAND
- * (and no WmNotify() will be called for the List). Here we call WmCommand()
- * synthetically.
+ * As we consume WM_LBUTONDOWN the list won't trigger ActionEvent by double click.
+ * We trigger it ourselves. (see also 6240202)
*/
int clickCount = GetClickCount();
- if (button == LEFT_BUTTON && clickCount >= 2 && clickCount % 2 == 0 &&
- !GetContainer()->IsFocusableWindow())
- {
+ if (button == LEFT_BUTTON && clickCount >= 2 && clickCount % 2 == 0) {
WmCommand(0, GetListHandle(), LBN_DBLCLK);
}
return mrResult;
@@ -500,67 +471,32 @@
return mrConsume;
}
-// Override WmSetFocus and WmKillFocus so that they operate on the List handle
-// instead of the wrapper handle. Otherwise, the methods are the same as their
-// AwtComponent counterparts.
-
-MsgRouting AwtList::WmSetFocus(HWND hWndLostFocus) {
- if (sm_focusOwner == GetListHandle()) {
- sm_realFocusOpposite = NULL;
- return mrConsume;
- }
-
- sm_focusOwner = GetListHandle();
-
- if (sm_realFocusOpposite != NULL) {
- hWndLostFocus = sm_realFocusOpposite;
- sm_realFocusOpposite = NULL;
- }
-
- SendFocusEvent(java_awt_event_FocusEvent_FOCUS_GAINED, hWndLostFocus);
-
- return mrDoDefault;
-}
-
-MsgRouting AwtList::WmKillFocus(HWND hWndGotFocus) {
- if (sm_focusOwner != NULL && sm_focusOwner == hWndGotFocus) {
- return mrConsume;
- }
-
- if (sm_focusOwner != GetListHandle()) {
- if (sm_focusOwner != NULL) {
- if (hWndGotFocus != NULL &&
- AwtComponent::GetComponent(hWndGotFocus) != NULL)
- {
- sm_realFocusOpposite = sm_focusOwner;
- }
- ::SendMessage(sm_focusOwner, WM_KILLFOCUS, (WPARAM)hWndGotFocus,
- 0);
- }
- return mrConsume;
- }
-
- sm_focusOwner = NULL;
-
- SendFocusEvent(java_awt_event_FocusEvent_FOCUS_LOST, hWndGotFocus);
-
- return mrDoDefault;
+BOOL AwtList::IsFocusingMouseMessage(MSG *pMsg)
+{
+ return pMsg->message == WM_LBUTTONDOWN || pMsg->message == WM_LBUTTONDBLCLK;
}
MsgRouting AwtList::HandleEvent(MSG *msg, BOOL synthetic)
{
- if (AwtComponent::sm_focusOwner != GetListHandle() &&
- (msg->message == WM_LBUTTONDOWN || msg->message == WM_LBUTTONDBLCLK))
- {
- JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
- jobject target = GetTarget(env);
- env->CallStaticVoidMethod
- (AwtKeyboardFocusManager::keyboardFocusManagerCls,
- AwtKeyboardFocusManager::heavyweightButtonDownMID,
- target, ((jlong)msg->time) & 0xFFFFFFFF);
- env->DeleteLocalRef(target);
+ if (IsFocusingMouseMessage(msg)) {
+ LONG item = static_cast<LONG>(SendListMessage(LB_ITEMFROMPOINT, 0, msg->lParam));
+ if (item != LB_ERR) {
+ if (isMultiSelect) {
+ if (IsItemSelected(item)) {
+ Deselect(item);
+ } else {
+ Select(item);
+ }
+ } else {
+ Select(item);
+ }
+ }
+ delete msg;
+ return mrConsume;
}
-
+ if (msg->message == WM_KEYDOWN && msg->wParam == VK_RETURN) {
+ WmNotify(LBN_DBLCLK);
+ }
return AwtComponent::HandleEvent(msg, synthetic);
}
@@ -607,15 +543,6 @@
return mrDoDefault;
}
-MsgRouting
-AwtList::WmKeyDown(UINT wkey, UINT repCnt, UINT flags, BOOL system)
-{
- if (wkey == VK_RETURN) {
- WmNotify(LBN_DBLCLK);
- }
- return AwtComponent::WmKeyDown(wkey, repCnt, flags, system);
-}
-
BOOL AwtList::InheritsNativeMouseWheelBehavior() {return true;}
jint AwtList::_GetMaxWidth(void *param)
--- a/jdk/src/windows/native/sun/windows/awt_List.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_List.h Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -97,8 +97,6 @@
}
}
- BOOL ActMouseMessage(MSG* pMsg);
-
// Netscape : Change the font on the list and redraw the
// items nicely.
virtual void SetFont(AwtFont *pFont);
@@ -116,7 +114,6 @@
MsgRouting WmMouseDown(UINT flags, int x, int y, int button);
MsgRouting WmMouseUp(UINT flags, int x, int y, int button);
MsgRouting WmNotify(UINT notifyCode);
- MsgRouting WmKeyDown(UINT vkey, UINT repCnt, UINT flags, BOOL system);
/* for multifont list */
MsgRouting OwnerDrawItem(UINT ctrlId, DRAWITEMSTRUCT& drawInfo);
@@ -127,8 +124,6 @@
MsgRouting WmCtlColor(HDC hDC, HWND hCtrl, UINT ctlColor,
HBRUSH& retBrush);
- MsgRouting WmSetFocus(HWND hWndLostFocus);
- MsgRouting WmKillFocus(HWND hWndGotFocus);
MsgRouting HandleEvent(MSG *msg, BOOL synthetic);
@@ -170,6 +165,8 @@
virtual BOOL InheritsNativeMouseWheelBehavior();
+ virtual BOOL IsFocusingMouseMessage(MSG *pMsg);
+
// some methods called on Toolkit thread
static jint _GetMaxWidth(void *param);
static void _UpdateMaxItemWidth(void *param);
--- a/jdk/src/windows/native/sun/windows/awt_Panel.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_Panel.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -34,70 +34,6 @@
jfieldID AwtPanel::insets_ID;
-static char* AWTPANEL_RESTACK_MSG_1 = "Peers array is null";
-static char* AWTPANEL_RESTACK_MSG_2 = "Peer null in JNI";
-static char* AWTPANEL_RESTACK_MSG_3 = "Native resources unavailable";
-static char* AWTPANEL_RESTACK_MSG_4 = "Child peer is null";
-
-void* AwtPanel::Restack(void * param) {
- TRY;
-
- JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
- jobjectArray peers = (jobjectArray)param;
-
- int peerCount = env->GetArrayLength(peers);
- if (peerCount < 1) {
- env->DeleteGlobalRef(peers);
- return AWTPANEL_RESTACK_MSG_1;
- }
-
- jobject self = env->GetObjectArrayElement(peers, 0);
- // It's entirely possible that our native resources have been destroyed
- // before our java peer - if we're dispose()d, for instance.
- // Alert caller w/ IllegalComponentStateException.
- if (self == NULL) {
- env->DeleteGlobalRef(peers);
- return AWTPANEL_RESTACK_MSG_2;
- }
- PDATA pData = JNI_GET_PDATA(self);
- if (pData == NULL) {
- env->DeleteGlobalRef(peers);
- env->DeleteLocalRef(self);
- return AWTPANEL_RESTACK_MSG_3;
- }
-
- AwtPanel* panel = (AwtPanel*)pData;
-
- HWND prevWindow = 0;
-
- for (int i = 1; i < peerCount; i++) {
- jobject peer = env->GetObjectArrayElement(peers, i);
- if (peer == NULL) {
- // Nonsense
- env->DeleteGlobalRef(peers);
- env->DeleteLocalRef(self);
- return AWTPANEL_RESTACK_MSG_4;
- }
- PDATA child_pData = JNI_GET_PDATA(peer);
- if (child_pData == NULL) {
- env->DeleteLocalRef(peer);
- env->DeleteGlobalRef(peers);
- env->DeleteLocalRef(self);
- return AWTPANEL_RESTACK_MSG_3;
- }
- AwtComponent* child_comp = (AwtComponent*)child_pData;
- ::SetWindowPos(child_comp->GetHWnd(), prevWindow, 0, 0, 0, 0,
- SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_DEFERERASE | SWP_ASYNCWINDOWPOS);
- prevWindow = child_comp->GetHWnd();
- env->DeleteLocalRef(peer);
- }
- env->DeleteGlobalRef(peers);
- env->DeleteLocalRef(self);
-
- CATCH_BAD_ALLOC_RET("Allocation error");
- return NULL;
-}
-
/************************************************************************
* AwtPanel native methods
*/
@@ -116,18 +52,4 @@
CATCH_BAD_ALLOC;
}
-JNIEXPORT void JNICALL
-Java_sun_awt_windows_WPanelPeer_pRestack(JNIEnv *env, jobject self, jobjectArray peers) {
-
- TRY;
-
- const char * error = (const char*)AwtToolkit::GetInstance().InvokeFunction(AwtPanel::Restack, env->NewGlobalRef(peers));
- if (error != NULL) {
- JNU_ThrowByName(env, "java/awt/IllegalComponentStateException", error);
- }
-
- CATCH_BAD_ALLOC;
-}
-
-
} /* extern "C" */
--- a/jdk/src/windows/native/sun/windows/awt_Panel.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_Panel.h Mon Apr 27 12:33:57 2009 -0700
@@ -35,11 +35,8 @@
class AwtPanel {
public:
- static void* Restack(void * param);
-
/* java.awt.Panel field ids */
static jfieldID insets_ID;
-
};
#endif // AWT_PANEL_H
--- a/jdk/src/windows/native/sun/windows/awt_PrintDialog.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_PrintDialog.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -65,7 +65,8 @@
}
}
- return ComCtl32Util::GetInstance().DefWindowProc(NULL, hWnd, message, wParam, lParam);
+ WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(hWnd, NativeDialogWndProcProp));
+ return ComCtl32Util::GetInstance().DefWindowProc(lpfnWndProc, hWnd, message, wParam, lParam);
}
static UINT_PTR CALLBACK
@@ -87,7 +88,7 @@
DWORD style = ::GetClassLong(hdlg, GCL_STYLE);
::SetClassLong(hdlg,GCL_STYLE, style & ~CS_SAVEBITS);
- ::SetFocus(hdlg);
+ ::SetFocus(hdlg); // will not break synthetic focus as hdlg is a native toplevel
// set appropriate icon for parentless dialogs
jobject awtParent = env->GetObjectField(peer, AwtPrintDialog::parentID);
@@ -99,16 +100,19 @@
}
// subclass dialog's parent to receive additional messages
- ComCtl32Util::GetInstance().SubclassHWND(hdlg,
- PrintDialogWndProc);
+ WNDPROC lpfnWndProc = ComCtl32Util::GetInstance().SubclassHWND(hdlg,
+ PrintDialogWndProc);
+ ::SetProp(hdlg, NativeDialogWndProcProp, reinterpret_cast<HANDLE>(lpfnWndProc));
break;
}
case WM_DESTROY: {
+ WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(hdlg, NativeDialogWndProcProp));
ComCtl32Util::GetInstance().UnsubclassHWND(hdlg,
PrintDialogWndProc,
- NULL);
+ lpfnWndProc);
::RemoveProp(hdlg, ModalDialogPeerProp);
+ ::RemoveProp(hdlg, NativeDialogWndProcProp);
break;
}
}
--- a/jdk/src/windows/native/sun/windows/awt_PrintJob.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_PrintJob.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -2885,7 +2885,8 @@
}
}
- return ComCtl32Util::GetInstance().DefWindowProc(NULL, hWnd, message, wParam, lParam);
+ WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(hWnd, NativeDialogWndProcProp));
+ return ComCtl32Util::GetInstance().DefWindowProc(lpfnWndProc, hWnd, message, wParam, lParam);
}
/**
@@ -2919,16 +2920,19 @@
}
// subclass dialog's parent to receive additional messages
- ComCtl32Util::GetInstance().SubclassHWND(hDlg,
- PageDialogWndProc);
+ WNDPROC lpfnWndProc = ComCtl32Util::GetInstance().SubclassHWND(hDlg,
+ PageDialogWndProc);
+ ::SetProp(hDlg, NativeDialogWndProcProp, reinterpret_cast<HANDLE>(lpfnWndProc));
break;
}
case WM_DESTROY: {
+ WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(hDlg, NativeDialogWndProcProp));
ComCtl32Util::GetInstance().UnsubclassHWND(hDlg,
PageDialogWndProc,
- NULL);
+ lpfnWndProc);
::RemoveProp(hDlg, ModalDialogPeerProp);
+ ::RemoveProp(hDlg, NativeDialogWndProcProp);
break;
}
}
--- a/jdk/src/windows/native/sun/windows/awt_ScrollPane.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_ScrollPane.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -361,13 +361,6 @@
DASSERT(!safe_ExceptionOccurred(env));
}
-BOOL AwtScrollPane::ActMouseMessage(MSG* pMsg) {
- if (!IsFocusingMessage(pMsg->message)) {
- return FALSE;
- }
- return TRUE;
-}
-
MsgRouting
AwtScrollPane::WmNcHitTest(UINT x, UINT y, LRESULT& retVal)
{
@@ -412,13 +405,10 @@
return mrConsume;
}
-/*
- * Fix for BugTraq ID 4041703: keyDown not being invoked.
- * This method overrides AwtCanvas::HandleEvent() since we
- * don't want ScrollPanel to receive focus on mouse press.
- */
MsgRouting AwtScrollPane::HandleEvent(MSG *msg, BOOL synthetic)
{
+ // SunAwtScrollPane control doesn't cause activation on mouse/key events,
+ // so we can safely (for synthetic focus) pass them to the system proc.
return AwtComponent::HandleEvent(msg, synthetic);
}
--- a/jdk/src/windows/native/sun/windows/awt_ScrollPane.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_ScrollPane.h Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -65,7 +65,6 @@
virtual void Reshape(int x, int y, int w, int h);
virtual void BeginValidate() {}
virtual void EndValidate() {}
- BOOL ActMouseMessage(MSG* pMsg);
/*
* Fix for bug 4046446
--- a/jdk/src/windows/native/sun/windows/awt_Scrollbar.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_Scrollbar.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,7 +27,6 @@
#include "awt_Scrollbar.h"
#include "awt_Canvas.h"
#include "awt_Window.h"
-#include "awt_KeyboardFocusManager.h"
/* IMPORTANT! Read the README.JNI file for notes on JNI converted AWT code.
*/
@@ -61,7 +60,6 @@
m_orientation = SB_HORZ;
m_lineIncr = 0;
m_pageIncr = 0;
- m_ignoreFocusEvents = FALSE;
m_prevCallback = NULL;
m_prevCallbackPos = 0;
ms_instanceCounter++;
@@ -221,7 +219,6 @@
return retValue;
}
-
MsgRouting
AwtScrollbar::WmNcHitTest(UINT x, UINT y, LRESULT& retVal)
{
@@ -265,17 +262,10 @@
MsgRouting
AwtScrollbar::HandleEvent(MSG *msg, BOOL synthetic)
{
- if (msg->message == WM_LBUTTONDOWN || msg->message == WM_LBUTTONDBLCLK) {
- if (IsFocusable() && AwtComponent::sm_focusOwner != GetHWnd()) {
- JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
- jobject target = GetTarget(env);
- env->CallStaticVoidMethod
- (AwtKeyboardFocusManager::keyboardFocusManagerCls,
- AwtKeyboardFocusManager::heavyweightButtonDownMID,
- target, ((jlong)msg->time) & 0xFFFFFFFF);
- env->DeleteLocalRef(target);
- AwtSetFocus();
- }
+ // SCROLLBAR control doesn't cause activation on mouse/key events,
+ // so we can safely (for synthetic focus) pass them to the system proc.
+
+ if (IsFocusingMouseMessage(msg)) {
// Left button press was already routed to default window
// procedure in the WmMouseDown above. Propagating synthetic
// press seems like a bad idea as internal message loop
@@ -283,54 +273,19 @@
delete msg;
return mrConsume;
}
- else {
- return AwtComponent::HandleEvent(msg, synthetic);
- }
+ return AwtComponent::HandleEvent(msg, synthetic);
}
-
// Work around a windows bug descrbed in KB article Q73839. Reset
// focus on scrollbars to update focus indicator. The article advises
-// to disable/enable the scrollbar, but simply resetting the focus is
-// sufficient.
+// to disable/enable the scrollbar.
void
AwtScrollbar::UpdateFocusIndicator()
{
if (IsFocusable()) {
- m_ignoreFocusEvents = TRUE;
- ::SetFocus(NULL);
- AwtSetFocus();
- m_ignoreFocusEvents = FALSE;
- }
-}
-
-MsgRouting
-AwtScrollbar::WmKillFocus(HWND hWndGot)
-{
- if (m_ignoreFocusEvents) {
- // We are voluntary giving up focus and will get it back
- // immediately. This is necessary to force windows to update
- // the focus indicator.
- sm_focusOwner = NULL;
- return mrDoDefault;
- }
- else {
- return AwtComponent::WmKillFocus(hWndGot);
- }
-}
-
-MsgRouting
-AwtScrollbar::WmSetFocus(HWND hWndLost)
-{
- if (m_ignoreFocusEvents) {
- // We have voluntary gave up focus and are getting it back
- // now. This is necessary to force windows to update the
- // focus indicator.
- sm_focusOwner = GetHWnd();
- return mrDoDefault;
- }
- else {
- return AwtComponent::WmSetFocus(hWndLost);
+ // todo: doesn't work
+ SendMessage((WPARAM)ESB_DISABLE_BOTH);
+ SendMessage((WPARAM)ESB_ENABLE_BOTH);
}
}
--- a/jdk/src/windows/native/sun/windows/awt_Scrollbar.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_Scrollbar.h Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -69,10 +69,6 @@
virtual MsgRouting WmHScroll(UINT scrollCode, UINT pos, HWND hScrollBar);
virtual MsgRouting WmVScroll(UINT scrollCode, UINT pos, HWND hScrollBar);
- // Work around KB Q73839 bug.
- virtual MsgRouting WmSetFocus(HWND hWndLost);
- virtual MsgRouting WmKillFocus(HWND hWndGot);
-
// Prevent KB Q102552 race.
virtual MsgRouting WmMouseDown(UINT flags, int x, int y, int button);
virtual MsgRouting WmNcHitTest(UINT x, UINT y, LRESULT& retVal);
@@ -91,7 +87,6 @@
int m_pageIncr;
// Work around KB Q73839 bug.
- BOOL m_ignoreFocusEvents;
void UpdateFocusIndicator();
// Don't do redundant callbacks.
--- a/jdk/src/windows/native/sun/windows/awt_TextArea.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_TextArea.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -26,9 +26,9 @@
#include "awt_Toolkit.h"
#include "awt_TextArea.h"
#include "awt_TextComponent.h"
-#include "awt_KeyboardFocusManager.h"
#include "awt_Canvas.h"
#include "awt_Window.h"
+#include "awt_Frame.h"
/* IMPORTANT! Read the README.JNI file for notes on JNI converted AWT code.
*/
@@ -362,13 +362,6 @@
DASSERT(::IsWindow(::GetParent(hWnd)));
switch (message) {
- case WM_SETFOCUS:
- ::SendMessage(::GetParent(hWnd), EM_HIDESELECTION, FALSE, 0);
- break;
- case WM_KILLFOCUS:
- ::SendMessage(::GetParent(hWnd), EM_HIDESELECTION, TRUE, 0);
- break;
-
case WM_UNDO:
case WM_CUT:
case WM_COPY:
@@ -400,7 +393,6 @@
MsgRouting
AwtTextArea::WmContextMenu(HWND hCtrl, UINT xPos, UINT yPos) {
-
/* Use the system provided edit control class to generate context menu. */
if (m_hEditCtrl == NULL) {
DWORD dwStyle = WS_CHILD;
@@ -494,22 +486,11 @@
VERIFY(::ClientToScreen(GetHWnd(), &p));
}
- ::SendMessage(m_hEditCtrl, WM_CONTEXTMENU, (WPARAM)m_hEditCtrl,
- MAKELPARAM(p.x, p.y));
- /*
- * After the context menu is dismissed focus is owned by the edit contol.
- * Return focus to parent.
- */
- if (IsFocusable() && AwtComponent::sm_focusOwner != GetHWnd()) {
- JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
- jobject target = GetTarget(env);
- env->CallStaticVoidMethod
- (AwtKeyboardFocusManager::keyboardFocusManagerCls,
- AwtKeyboardFocusManager::heavyweightButtonDownMID,
- target, TimeHelper::getMessageTimeUTC());
- env->DeleteLocalRef(target);
- AwtSetFocus();
- }
+ // The context menu steals focus from the proxy.
+ // So, set the focus-restore flag up.
+ SetRestoreFocus(TRUE);
+ ::SendMessage(m_hEditCtrl, WM_CONTEXTMENU, (WPARAM)m_hEditCtrl, MAKELPARAM(p.x, p.y));
+ SetRestoreFocus(FALSE);
return mrConsume;
}
@@ -558,20 +539,11 @@
* By consuming WM_MOUSEMOVE messages we also don't give
* the RichEdit control a chance to recognize a drag gesture
* and initiate its own drag-n-drop operation.
+ *
+ * The workaround also allows us to implement synthetic focus mechanism.
+ *
*/
- if (msg->message == WM_LBUTTONDOWN || msg->message == WM_LBUTTONDBLCLK) {
-
- if (IsFocusable() && AwtComponent::sm_focusOwner != GetHWnd()) {
- JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
- jobject target = GetTarget(env);
- env->CallStaticVoidMethod
- (AwtKeyboardFocusManager::keyboardFocusManagerCls,
- AwtKeyboardFocusManager::heavyweightButtonDownMID,
- target, ((jlong)msg->time) & 0xFFFFFFFF);
- env->DeleteLocalRef(target);
- AwtSetFocus();
- }
-
+ if (IsFocusingMouseMessage(msg)) {
CHARRANGE cr;
LONG lCurPos = EditGetCharFromPos(msg->pt);
@@ -717,6 +689,7 @@
p.x = -1;
p.y = -1;
}
+
if (!::PostMessage(GetHWnd(), WM_CONTEXTMENU, (WPARAM)GetHWnd(),
MAKELPARAM(p.x, p.y))) {
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
@@ -724,6 +697,8 @@
env->ExceptionDescribe();
env->ExceptionClear();
}
+ delete msg;
+ return mrConsume;
} else if (msg->message == WM_MOUSEWHEEL) {
// 4417236: If there is an old version of RichEd32.dll which
// does not provide the mouse wheel scrolling we have to
--- a/jdk/src/windows/native/sun/windows/awt_TextComponent.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_TextComponent.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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,6 @@
#include "awt_Toolkit.h"
#include "awt_TextComponent.h"
-#include "awt_KeyboardFocusManager.h"
#include "awt_Canvas.h"
#include "jni.h"
@@ -62,9 +61,9 @@
AwtTextComponent::AwtTextComponent() {
m_synthetic = FALSE;
- m_lStartPos = -1;
- m_lEndPos = -1;
- m_lLastPos = -1;
+ m_lStartPos = -1;
+ m_lEndPos = -1;
+ m_lLastPos = -1;
m_isLFonly = FALSE;
m_EOLchecked = FALSE;
// javaEventsMask = 0; // accessibility support
@@ -74,10 +73,6 @@
return TEXT("EDIT"); /* System provided edit control class */
}
-BOOL AwtTextComponent::ActMouseMessage(MSG* pMsg) {
- return FALSE;
-}
-
/* Set a suitable font to IME against the component font. */
void AwtTextComponent::SetFont(AwtFont* font)
{
@@ -143,23 +138,16 @@
return mrDoDefault;
}
+BOOL AwtTextComponent::IsFocusingMouseMessage(MSG *pMsg)
+{
+ return pMsg->message == WM_LBUTTONDOWN || pMsg->message == WM_LBUTTONDBLCLK;
+}
+
MsgRouting
AwtTextComponent::HandleEvent(MSG *msg, BOOL synthetic)
{
MsgRouting returnVal;
- if (AwtComponent::sm_focusOwner != GetHWnd() && IsFocusable() &&
- (msg->message == WM_LBUTTONDOWN || msg->message == WM_LBUTTONDBLCLK))
- {
- JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
- jobject target = GetTarget(env);
- env->CallStaticVoidMethod
- (AwtKeyboardFocusManager::keyboardFocusManagerCls,
- AwtKeyboardFocusManager::heavyweightButtonDownMID,
- target, ((jlong)msg->time) & 0xFFFFFFFF);
- env->DeleteLocalRef(target);
- }
-
/*
* Store the 'synthetic' parameter so that the WM_PASTE security check
* happens only for synthetic events.
--- a/jdk/src/windows/native/sun/windows/awt_TextComponent.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_TextComponent.h Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -69,8 +69,6 @@
// called on Toolkit thread from JNI
static jstring _GetText(void *param);
- BOOL ActMouseMessage(MSG* pMsg);
-
void SetFont(AwtFont* font);
/*
@@ -80,6 +78,8 @@
MsgRouting HandleEvent(MSG *msg, BOOL synthetic);
MsgRouting WmPaste();
+ virtual BOOL IsFocusingMouseMessage(MSG *pMsg);
+
/* To be fully implemented in a future release
MsgRouting WmKeyDown(UINT wkey, UINT repCnt,
@@ -125,7 +125,6 @@
LONG m_lEndPos;
LONG m_lLastPos;
-
HFONT m_hFont;
//im --- end
--- a/jdk/src/windows/native/sun/windows/awt_TextField.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_TextField.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -26,7 +26,6 @@
#include "awt_Toolkit.h"
#include "awt_TextField.h"
#include "awt_TextComponent.h"
-#include "awt_KeyboardFocusManager.h"
#include "awt_Canvas.h"
/* IMPORTANT! Read the README.JNI file for notes on JNI converted AWT code.
@@ -150,135 +149,130 @@
* By consuming WM_MOUSEMOVE messages we also don't give
* the RichEdit control a chance to recognize a drag gesture
* and initiate its own drag-n-drop operation.
+ *
+ * The workaround also allows us to implement synthetic focus mechanism.
*/
- /**
- * In non-focusable mode we don't pass mouse messages to native window thus making user unable
- * to select the text. Below is the code from awt_TextArea.cpp which implements selection
- * functionality. For safety this code is only being executed in non-focusable mode.
- */
- if (!IsFocusable()) {
- if (msg->message == WM_LBUTTONDOWN || msg->message == WM_LBUTTONDBLCLK) {
+ if (IsFocusingMouseMessage(msg)) {
+ CHARRANGE cr;
+
+ LONG lCurPos = EditGetCharFromPos(msg->pt);
+
+ EditGetSel(cr);
+ /*
+ * NOTE: Plain EDIT control always clears selection on mouse
+ * button press. We are clearing the current selection only if
+ * the mouse pointer is not over the selected region.
+ * In this case we sacrifice backward compatibility
+ * to allow dnd of the current selection.
+ */
+ if (msg->message == WM_LBUTTONDBLCLK) {
+ SetStartSelectionPos(static_cast<LONG>(SendMessage(
+ EM_FINDWORDBREAK, WB_MOVEWORDLEFT, lCurPos)));
+ SetEndSelectionPos(static_cast<LONG>(SendMessage(
+ EM_FINDWORDBREAK, WB_MOVEWORDRIGHT, lCurPos)));
+ } else {
+ SetStartSelectionPos(lCurPos);
+ SetEndSelectionPos(lCurPos);
+ }
+ cr.cpMin = GetStartSelectionPos();
+ cr.cpMax = GetEndSelectionPos();
+ EditSetSel(cr);
+
+ delete msg;
+ return mrConsume;
+ } else if (msg->message == WM_LBUTTONUP) {
+
+ /*
+ * If the left mouse button is pressed on the selected region
+ * we don't clear the current selection. We clear it on button
+ * release instead. This is to allow dnd of the current selection.
+ */
+ if (GetStartSelectionPos() == -1 && GetEndSelectionPos() == -1) {
CHARRANGE cr;
LONG lCurPos = EditGetCharFromPos(msg->pt);
- EditGetSel(cr);
- /*
- * NOTE: Plain EDIT control always clears selection on mouse
- * button press. We are clearing the current selection only if
- * the mouse pointer is not over the selected region.
- * In this case we sacrifice backward compatibility
- * to allow dnd of the current selection.
- */
- if (msg->message == WM_LBUTTONDBLCLK) {
- SetStartSelectionPos(static_cast<LONG>(SendMessage(
- EM_FINDWORDBREAK, WB_MOVEWORDLEFT, lCurPos)));
- SetEndSelectionPos(static_cast<LONG>(SendMessage(
- EM_FINDWORDBREAK, WB_MOVEWORDRIGHT, lCurPos)));
- } else {
- SetStartSelectionPos(lCurPos);
- SetEndSelectionPos(lCurPos);
+ cr.cpMin = lCurPos;
+ cr.cpMax = lCurPos;
+ EditSetSel(cr);
+ }
+
+ /*
+ * Cleanup the state variables when left mouse button is released.
+ * These state variables are designed to reflect the selection state
+ * while the left mouse button is pressed and be set to -1 otherwise.
+ */
+ SetStartSelectionPos(-1);
+ SetEndSelectionPos(-1);
+ SetLastSelectionPos(-1);
+
+ delete msg;
+ return mrConsume;
+ } else if (msg->message == WM_MOUSEMOVE && (msg->wParam & MK_LBUTTON)) {
+
+ /*
+ * We consume WM_MOUSEMOVE while the left mouse button is pressed,
+ * so we have to simulate autoscrolling when mouse is moved outside
+ * of the client area.
+ */
+ POINT p;
+ RECT r;
+ BOOL bScrollLeft = FALSE;
+ BOOL bScrollRight = FALSE;
+ BOOL bScrollUp = FALSE;
+ BOOL bScrollDown = FALSE;
+
+ p.x = msg->pt.x;
+ p.y = msg->pt.y;
+ VERIFY(::GetClientRect(GetHWnd(), &r));
+
+ if (p.x < 0) {
+ bScrollLeft = TRUE;
+ p.x = 0;
+ } else if (p.x > r.right) {
+ bScrollRight = TRUE;
+ p.x = r.right - 1;
+ }
+ LONG lCurPos = EditGetCharFromPos(p);
+
+ if (GetStartSelectionPos() != -1 &&
+ GetEndSelectionPos() != -1 &&
+ lCurPos != GetLastSelectionPos()) {
+
+ CHARRANGE cr;
+
+ SetLastSelectionPos(lCurPos);
+
+ cr.cpMin = GetStartSelectionPos();
+ cr.cpMax = GetLastSelectionPos();
+
+ EditSetSel(cr);
+ }
+
+ if (bScrollLeft == TRUE || bScrollRight == TRUE) {
+ SCROLLINFO si;
+ memset(&si, 0, sizeof(si));
+ si.cbSize = sizeof(si);
+ si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
+
+ VERIFY(::GetScrollInfo(GetHWnd(), SB_HORZ, &si));
+ if (bScrollLeft == TRUE) {
+ si.nPos = si.nPos - si.nPage / 2;
+ si.nPos = max(si.nMin, si.nPos);
+ } else if (bScrollRight == TRUE) {
+ si.nPos = si.nPos + si.nPage / 2;
+ si.nPos = min(si.nPos, si.nMax);
}
- cr.cpMin = GetStartSelectionPos();
- cr.cpMax = GetEndSelectionPos();
- EditSetSel(cr);
-
- delete msg;
- return mrConsume;
- } else if (msg->message == WM_LBUTTONUP) {
-
/*
- * If the left mouse button is pressed on the selected region
- * we don't clear the current selection. We clear it on button
- * release instead. This is to allow dnd of the current selection.
- */
- if (GetStartSelectionPos() == -1 && GetEndSelectionPos() == -1) {
- CHARRANGE cr;
-
- LONG lCurPos = EditGetCharFromPos(msg->pt);
-
- cr.cpMin = lCurPos;
- cr.cpMax = lCurPos;
- EditSetSel(cr);
- }
-
- /*
- * Cleanup the state variables when left mouse button is released.
- * These state variables are designed to reflect the selection state
- * while the left mouse button is pressed and be set to -1 otherwise.
- */
- SetStartSelectionPos(-1);
- SetEndSelectionPos(-1);
- SetLastSelectionPos(-1);
-
- delete msg;
- return mrConsume;
- } else if (msg->message == WM_MOUSEMOVE && (msg->wParam & MK_LBUTTON)) {
-
- /*
- * We consume WM_MOUSEMOVE while the left mouse button is pressed,
- * so we have to simulate autoscrolling when mouse is moved outside
- * of the client area.
+ * Okay to use 16-bit position since RichEdit control adjusts
+ * its scrollbars so that their range is always 16-bit.
*/
- POINT p;
- RECT r;
- BOOL bScrollLeft = FALSE;
- BOOL bScrollRight = FALSE;
- BOOL bScrollUp = FALSE;
- BOOL bScrollDown = FALSE;
-
- p.x = msg->pt.x;
- p.y = msg->pt.y;
- VERIFY(::GetClientRect(GetHWnd(), &r));
-
- if (p.x < 0) {
- bScrollLeft = TRUE;
- p.x = 0;
- } else if (p.x > r.right) {
- bScrollRight = TRUE;
- p.x = r.right - 1;
- }
- LONG lCurPos = EditGetCharFromPos(p);
-
- if (GetStartSelectionPos() != -1 &&
- GetEndSelectionPos() != -1 &&
- lCurPos != GetLastSelectionPos()) {
-
- CHARRANGE cr;
-
- SetLastSelectionPos(lCurPos);
-
- cr.cpMin = GetStartSelectionPos();
- cr.cpMax = GetLastSelectionPos();
-
- EditSetSel(cr);
- }
-
- if (bScrollLeft == TRUE || bScrollRight == TRUE) {
- SCROLLINFO si;
- memset(&si, 0, sizeof(si));
- si.cbSize = sizeof(si);
- si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
-
- VERIFY(::GetScrollInfo(GetHWnd(), SB_HORZ, &si));
- if (bScrollLeft == TRUE) {
- si.nPos = si.nPos - si.nPage / 2;
- si.nPos = max(si.nMin, si.nPos);
- } else if (bScrollRight == TRUE) {
- si.nPos = si.nPos + si.nPage / 2;
- si.nPos = min(si.nPos, si.nMax);
- }
- /*
- * Okay to use 16-bit position since RichEdit control adjusts
- * its scrollbars so that their range is always 16-bit.
- */
- DASSERT(abs(si.nPos) < 0x8000);
- SendMessage(WM_HSCROLL,
- MAKEWPARAM(SB_THUMBPOSITION, LOWORD(si.nPos)));
- }
- delete msg;
- return mrConsume;
+ DASSERT(abs(si.nPos) < 0x8000);
+ SendMessage(WM_HSCROLL,
+ MAKEWPARAM(SB_THUMBPOSITION, LOWORD(si.nPos)));
}
+ delete msg;
+ return mrConsume;
}
/*
* Store the 'synthetic' parameter so that the WM_PASTE security check
--- a/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -56,6 +56,7 @@
#include "debug_mem.h"
#include "ComCtl32Util.h"
+#include "DllUtil.h"
#include "D3DPipelineManager.h"
@@ -334,6 +335,8 @@
m_mouseDown = FALSE;
m_hGetMessageHook = 0;
+ m_hMouseLLHook = 0;
+ m_lastWindowUnderMouse = NULL;
m_timer = 0;
m_cmdIDs = new AwtCmdIDList();
@@ -483,6 +486,7 @@
tk.UnregisterClass();
::UnhookWindowsHookEx(tk.m_hGetMessageHook);
+ UninstallMouseLowLevelHook();
tk.m_mainThreadId = 0;
@@ -960,6 +964,79 @@
CATCH_BAD_ALLOC_RET(0);
}
+void AwtToolkit::InstallMouseLowLevelHook()
+{
+ // We need the low-level hook since we need to process mouse move
+ // messages outside of our windows.
+ m_hMouseLLHook = ::SetWindowsHookEx(WH_MOUSE_LL,
+ (HOOKPROC)MouseLowLevelHook,
+ GetModuleHandle(), NULL);
+
+ // Reset the old value
+ m_lastWindowUnderMouse = NULL;
+}
+
+void AwtToolkit::UninstallMouseLowLevelHook()
+{
+ if (m_hMouseLLHook != 0) {
+ ::UnhookWindowsHookEx(m_hMouseLLHook);
+ m_hMouseLLHook = 0;
+ }
+}
+
+LRESULT CALLBACK AwtToolkit::MouseLowLevelHook(int code,
+ WPARAM wParam, LPARAM lParam)
+{
+ TRY;
+
+ if (code >= 0 && wParam == WM_MOUSEMOVE) {
+ POINT pt = ((MSLLHOOKSTRUCT*)lParam)->pt;
+
+ // We can't use GA_ROOTOWNER since in this case we'll go up to
+ // the root Java toplevel, not the actual owned toplevel.
+ HWND hwnd = ::GetAncestor(::WindowFromPoint(pt), GA_ROOT);
+
+ AwtToolkit& tk = AwtToolkit::GetInstance();
+
+ if (tk.m_lastWindowUnderMouse != hwnd) {
+ AwtWindow *fw = NULL, *tw = NULL;
+
+ if (tk.m_lastWindowUnderMouse) {
+ fw = (AwtWindow*)
+ AwtComponent::GetComponent(tk.m_lastWindowUnderMouse);
+ }
+ if (hwnd) {
+ tw = (AwtWindow*)AwtComponent::GetComponent(hwnd);
+ }
+
+ tk.m_lastWindowUnderMouse = hwnd;
+
+ if (fw) {
+ fw->UpdateSecurityWarningVisibility();
+ }
+ // ... however, because we use GA_ROOT, we may find the warningIcon
+ // which is not a Java windows.
+ if (AwtWindow::IsWarningWindow(hwnd)) {
+ hwnd = ::GetParent(hwnd);
+ if (hwnd) {
+ tw = (AwtWindow*)AwtComponent::GetComponent(hwnd);
+ }
+ tk.m_lastWindowUnderMouse = hwnd;
+ }
+ if (tw) {
+ tw->UpdateSecurityWarningVisibility();
+ }
+
+
+ }
+ }
+
+ return ::CallNextHookEx(AwtToolkit::GetInstance().m_hMouseLLHook, code,
+ wParam, lParam);
+
+ CATCH_BAD_ALLOC_RET(0);
+}
+
/*
* The main message loop
*/
@@ -1376,6 +1453,47 @@
return defaultIconSm;
}
+HICON AwtToolkit::GetSecurityWarningIcon(UINT index, UINT w, UINT h)
+{
+ //Note: should not exceed 10 because of the current implementation.
+ static const int securityWarningIconCounter = 3;
+
+ static HICON securityWarningIcon[securityWarningIconCounter] = {NULL, NULL, NULL};;
+ static UINT securityWarningIconWidth[securityWarningIconCounter] = {0, 0, 0};
+ static UINT securityWarningIconHeight[securityWarningIconCounter] = {0, 0, 0};
+
+ index = AwtToolkit::CalculateWave(index, securityWarningIconCounter);
+
+ if (securityWarningIcon[index] == NULL ||
+ w != securityWarningIconWidth[index] ||
+ h != securityWarningIconHeight[index])
+ {
+ if (securityWarningIcon[index] != NULL)
+ {
+ ::DestroyIcon(securityWarningIcon[index]);
+ }
+
+ static const wchar_t securityWarningIconName[] = L"SECURITY_WARNING_";
+ wchar_t iconResourceName[sizeof(securityWarningIconName) + 2];
+ ::ZeroMemory(iconResourceName, sizeof(iconResourceName));
+ wcscpy(iconResourceName, securityWarningIconName);
+
+ wchar_t strIndex[2];
+ ::ZeroMemory(strIndex, sizeof(strIndex));
+ strIndex[0] = L'0' + index;
+
+ wcscat(iconResourceName, strIndex);
+
+ securityWarningIcon[index] = (HICON)::LoadImage(GetModuleHandle(),
+ iconResourceName,
+ IMAGE_ICON, w, h, LR_DEFAULTCOLOR);
+ securityWarningIconWidth[index] = w;
+ securityWarningIconHeight[index] = h;
+ }
+
+ return securityWarningIcon[index];
+}
+
void AwtToolkit::SetHeapCheck(long flag) {
if (flag) {
printf("heap checking not supported with this build\n");
@@ -1428,6 +1546,49 @@
(JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_2) : m_env;
}
+BOOL AwtToolkit::GetScreenInsets(int screenNum, RECT * rect)
+{
+ /* if primary display */
+ if (screenNum == 0) {
+ RECT rRW;
+ if (::SystemParametersInfo(SPI_GETWORKAREA,0,(void *) &rRW,0) == TRUE) {
+ rect->top = rRW.top;
+ rect->left = rRW.left;
+ rect->bottom = ::GetSystemMetrics(SM_CYSCREEN) - rRW.bottom;
+ rect->right = ::GetSystemMetrics(SM_CXSCREEN) - rRW.right;
+ return TRUE;
+ }
+ }
+ /* if additional display */
+ else {
+ MONITORINFO *miInfo;
+ miInfo = AwtWin32GraphicsDevice::GetMonitorInfo(screenNum);
+ if (miInfo) {
+ rect->top = miInfo->rcWork.top - miInfo->rcMonitor.top;
+ rect->left = miInfo->rcWork.left - miInfo->rcMonitor.left;
+ rect->bottom = miInfo->rcMonitor.bottom - miInfo->rcWork.bottom;
+ rect->right = miInfo->rcMonitor.right - miInfo->rcWork.right;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+
+void AwtToolkit::GetWindowRect(HWND hWnd, LPRECT lpRect)
+{
+ try {
+ if (S_OK == DwmAPI::DwmGetWindowAttribute(hWnd,
+ DwmAPI::DWMWA_EXTENDED_FRAME_BOUNDS,
+ lpRect, sizeof(*lpRect)))
+ {
+ return;
+ }
+ } catch (const DllUtil::Exception &) {}
+
+ ::GetWindowRect(hWnd, lpRect);
+}
+
/************************************************************************
* Toolkit native methods
*/
@@ -1756,7 +1917,6 @@
CATCH_BAD_ALLOC_RET(0);
}
-
/*
* Class: sun_awt_windows_WToolkit
* Method: getSreenInsets
@@ -1768,34 +1928,17 @@
jint screen)
{
jobject insets = NULL;
- RECT rRW;
- LPMONITORINFO miInfo;
+ RECT rect;
TRY;
-/* if primary display */
- if (screen == 0) {
- if (::SystemParametersInfo(SPI_GETWORKAREA,0,(void *) &rRW,0) == TRUE) {
- insets = env->NewObject(env->FindClass("java/awt/Insets"),
- AwtToolkit::insetsMID,
- rRW.top,
- rRW.left,
- ::GetSystemMetrics(SM_CYSCREEN) - rRW.bottom,
- ::GetSystemMetrics(SM_CXSCREEN) - rRW.right);
- }
- }
-
-/* if additional display */
- else {
- miInfo = AwtWin32GraphicsDevice::GetMonitorInfo(screen);
- if (miInfo) {
- insets = env->NewObject(env->FindClass("java/awt/Insets"),
+ if (AwtToolkit::GetScreenInsets(screen, &rect)) {
+ insets = env->NewObject(env->FindClass("java/awt/Insets"),
AwtToolkit::insetsMID,
- miInfo->rcWork.top - miInfo->rcMonitor.top,
- miInfo->rcWork.left - miInfo->rcMonitor.left,
- miInfo->rcMonitor.bottom - miInfo->rcWork.bottom,
- miInfo->rcMonitor.right - miInfo->rcWork.right);
- }
+ rect.top,
+ rect.left,
+ rect.bottom,
+ rect.right);
}
if (safe_ExceptionOccurred(env)) {
--- a/jdk/src/windows/native/sun/windows/awt_Toolkit.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_Toolkit.h Mon Apr 27 12:33:57 2009 -0700
@@ -210,6 +210,8 @@
LPARAM lParam);
static LRESULT CALLBACK ForegroundIdleFilter(int code, WPARAM wParam,
LPARAM lParam);
+ static LRESULT CALLBACK MouseLowLevelHook(int code, WPARAM wParam,
+ LPARAM lParam);
INLINE static AwtToolkit& GetInstance() { return theInstance; }
INLINE void SetPeer(JNIEnv *env, jobject wToolkit) {
@@ -311,6 +313,30 @@
HICON GetAwtIcon();
HICON GetAwtIconSm();
+ // Calculate a wave-like value out of the integer 'value' and
+ // the specified period.
+ // The argument 'value' is an integer 0, 1, 2, ... *infinity*.
+ //
+ // Examples:
+ // Period == 3
+ // Generated sequence: 0 1 2 1 0 .....
+ //
+ // Period == 4
+ // Generated sequence: 0 1 2 3 2 1 0 .....
+ static inline UINT CalculateWave(UINT value, const UINT period) {
+ if (period < 2) {
+ return 0;
+ }
+ // -2 is necessary to avoid repeating extreme values (0 and period-1)
+ value %= period * 2 -2;
+ if (value >= period) {
+ value = period * 2 -2 - value;
+ }
+ return value;
+ }
+
+ HICON GetSecurityWarningIcon(UINT index, UINT w, UINT h);
+
/* Turns on/off dialog modality for the system. */
INLINE AwtDialog* SetModal(AwtDialog* frame) {
AwtDialog* previousDialog = m_pModalDialog;
@@ -368,6 +394,7 @@
BOOL m_mouseDown;
HHOOK m_hGetMessageHook;
+ HHOOK m_hMouseLLHook;
UINT_PTR m_timer;
class AwtCmdIDList* m_cmdIDs;
@@ -411,6 +438,24 @@
public:
static void SetEnv(JNIEnv *env);
static JNIEnv* GetEnv();
+
+ static BOOL GetScreenInsets(int screenNum, RECT * rect);
+
+ // If the DWM is active, this function uses
+ // DwmGetWindowAttribute()/DWMWA_EXTENDED_FRAME_BOUNDS.
+ // Otherwise, fall back to regular ::GetWindowRect().
+ // See 6711576 for more details.
+ static void GetWindowRect(HWND hWnd, LPRECT lpRect);
+
+ private:
+ // The window handle of a toplevel window last seen under the mouse cursor.
+ // See MouseLowLevelHook() for details.
+ HWND m_lastWindowUnderMouse;
+ public:
+ HWND GetWindowUnderMouse() { return m_lastWindowUnderMouse; }
+
+ void InstallMouseLowLevelHook();
+ void UninstallMouseLowLevelHook();
};
/*
--- a/jdk/src/windows/native/sun/windows/awt_Win32GraphicsEnv.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_Win32GraphicsEnv.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -29,6 +29,7 @@
#include "awt_Win32GraphicsDevice.h"
#include "Devices.h"
#include "WindowsFlags.h"
+#include "DllUtil.h"
BOOL DWMIsCompositionEnabled();
@@ -89,13 +90,8 @@
/**
* Returns true if dwm composition is enabled, false if it is not applicable
* (if the OS is not Vista) or dwm composition is disabled.
- *
- * Note: since DWM composition state changes are very rare we load/unload the
- * dll on every change.
*/
BOOL DWMIsCompositionEnabled() {
- typedef HRESULT (WINAPI DwmIsCompositionEnabledFunc)(BOOL*);
-
// cheaper to check than whether it's vista or not
if (dwmIsCompositionEnabled != DWM_COMP_UNDEFINED) {
return (BOOL)dwmIsCompositionEnabled;
@@ -107,32 +103,22 @@
}
BOOL bRes = FALSE;
- HMODULE hDwmApiDll = ::LoadLibrary(TEXT("dwmapi.dll"));
- if (hDwmApiDll != NULL) {
- DwmIsCompositionEnabledFunc *lpDwmIsCompEnabled =
- (DwmIsCompositionEnabledFunc*)
- GetProcAddress(hDwmApiDll, "DwmIsCompositionEnabled");
- if (lpDwmIsCompEnabled != NULL) {
- BOOL bEnabled;
- HRESULT res = lpDwmIsCompEnabled(&bEnabled);
- if (SUCCEEDED(res)) {
- bRes = bEnabled;
- J2dTraceLn1(J2D_TRACE_VERBOSE, " composition enabled: %d",bRes);
- } else {
- J2dTraceLn1(J2D_TRACE_ERROR,
- "IsDWMCompositionEnabled: error %x when detecting"\
- "if composition is enabled", res);
- }
+ try {
+ BOOL bEnabled;
+ HRESULT res = DwmAPI::DwmIsCompositionEnabled(&bEnabled);
+ if (SUCCEEDED(res)) {
+ bRes = bEnabled;
+ J2dTraceLn1(J2D_TRACE_VERBOSE, " composition enabled: %d",bRes);
} else {
- J2dTraceLn(J2D_TRACE_ERROR,
- "IsDWMCompositionEnabled: no DwmIsCompositionEnabled() "\
- "in dwmapi.dll");
+ J2dTraceLn1(J2D_TRACE_ERROR,
+ "IsDWMCompositionEnabled: error %x when detecting"\
+ "if composition is enabled", res);
}
- ::FreeLibrary(hDwmApiDll);
- } else {
+ } catch (const DllUtil::Exception &) {
J2dTraceLn(J2D_TRACE_ERROR,
- "IsDWMCompositionEnabled: error opening dwmapi.dll");
+ "IsDWMCompositionEnabled: no DwmIsCompositionEnabled() "\
+ "in dwmapi.dll or dwmapi.dll cannot be loaded");
}
dwmIsCompositionEnabled = bRes;
--- a/jdk/src/windows/native/sun/windows/awt_Window.cpp Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_Window.cpp Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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,9 +25,12 @@
#include "awt.h"
+#include <jlong.h>
+
#include "awt_Component.h"
#include "awt_Container.h"
#include "awt_Frame.h"
+#include "awt_Dialog.h"
#include "awt_Insets.h"
#include "awt_Panel.h"
#include "awt_Toolkit.h"
@@ -35,6 +38,7 @@
#include "awt_Win32GraphicsDevice.h"
#include "awt_BitmapUtil.h"
#include "awt_IconCursor.h"
+#include "ComCtl32Util.h"
#include "java_awt_Insets.h"
#include <java_awt_Container.h>
@@ -88,7 +92,6 @@
jint x, y;
jint w, h;
};
-
// struct for _SetIconImagesData
struct SetIconImagesDataStruct {
jobject window;
@@ -97,7 +100,6 @@
jintArray smallIconRaster;
jint smw, smh;
};
-
// struct for _SetMinSize() method
// and other methods setting sizes
struct SizeStruct {
@@ -114,6 +116,34 @@
jobject window;
jlong blockerHWnd;
};
+// struct for _SetOpacity() method
+struct OpacityStruct {
+ jobject window;
+ jint iOpacity;
+};
+// struct for _SetOpaque() method
+struct OpaqueStruct {
+ jobject window;
+ jboolean isOpaque;
+};
+// struct for _UpdateWindow() method
+struct UpdateWindowStruct {
+ jobject window;
+ jintArray data;
+ HBITMAP hBitmap;
+ jint width, height;
+};
+// Struct for _RequestWindowFocus() method
+struct RequestWindowFocusStruct {
+ jobject component;
+ jboolean isMouseEventCause;
+};
+// struct for _RepositionSecurityWarning() method
+struct RepositionSecurityWarningStruct {
+ jobject window;
+};
+
+
/************************************************************************
* AwtWindow fields
*/
@@ -121,17 +151,23 @@
jfieldID AwtWindow::warningStringID;
jfieldID AwtWindow::locationByPlatformID;
jfieldID AwtWindow::autoRequestFocusID;
+jfieldID AwtWindow::securityWarningWidthID;
+jfieldID AwtWindow::securityWarningHeightID;
jfieldID AwtWindow::sysXID;
jfieldID AwtWindow::sysYID;
jfieldID AwtWindow::sysWID;
jfieldID AwtWindow::sysHID;
+jmethodID AwtWindow::getWarningStringMID;
+jmethodID AwtWindow::calculateSecurityWarningPositionMID;
+
int AwtWindow::ms_instanceCounter = 0;
HHOOK AwtWindow::ms_hCBTFilter;
AwtWindow * AwtWindow::m_grabbedWindow = NULL;
HWND AwtWindow::sm_retainingHierarchyZOrderInShow = NULL;
BOOL AwtWindow::sm_resizing = FALSE;
+UINT AwtWindow::untrustedWindowsCounter = 0;
/************************************************************************
* AwtWindow class methods
@@ -162,10 +198,34 @@
::SetWindowsHookEx(WH_CBT, (HOOKPROC)AwtWindow::CBTFilter,
0, AwtToolkit::MainThread());
}
+
+ m_opaque = TRUE;
+ m_opacity = 0xff;
+
+
+ warningString = NULL;
+ warningWindow = NULL;
+ securityTooltipWindow = NULL;
+ securityWarningAnimationStage = 0;
+ currentWmSizeState = SIZE_RESTORED;
+
+ hContentBitmap = NULL;
+
+ ::InitializeCriticalSection(&contentBitmapCS);
}
AwtWindow::~AwtWindow()
{
+ if (warningString != NULL) {
+ delete [] warningString;
+ }
+ ::EnterCriticalSection(&contentBitmapCS);
+ if (hContentBitmap != NULL) {
+ ::DeleteObject(hContentBitmap);
+ hContentBitmap = NULL;
+ }
+ ::LeaveCriticalSection(&contentBitmapCS);
+ ::DeleteCriticalSection(&contentBitmapCS);
}
void AwtWindow::Dispose()
@@ -204,10 +264,10 @@
}
m_grabbed = TRUE;
m_grabbedWindow = this;
- if (sm_focusedWindow == NULL && IsFocusableWindow()) {
+ if (AwtComponent::GetFocusedWindow() == NULL && IsFocusableWindow()) {
// we shouldn't perform grab in this case (see 4841881 & 6539458)
Ungrab();
- } else if (GetHWnd() != sm_focusedWindow) {
+ } else if (GetHWnd() != AwtComponent::GetFocusedWindow()) {
_ToFront(env->NewGlobalRef(GetPeer(env)));
// Global ref was deleted in _ToFront
}
@@ -301,12 +361,40 @@
return mrDoDefault;
}
+void AwtWindow::RepositionSecurityWarning(JNIEnv *env)
+{
+ RECT rect;
+ CalculateWarningWindowBounds(env, &rect);
+
+ ::SetWindowPos(warningWindow, HWND_NOTOPMOST,
+ rect.left, rect.top,
+ rect.right - rect.left, rect.bottom - rect.top,
+ SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE | SWP_NOZORDER
+ );
+}
+
MsgRouting AwtWindow::WmWindowPosChanged(LPARAM windowPos) {
- if (IsRetainingHierarchyZOrder() && ((WINDOWPOS *)windowPos)->flags & SWP_SHOWWINDOW) {
+ WINDOWPOS * wp = (WINDOWPOS *)windowPos;
+
+ if (IsRetainingHierarchyZOrder() && wp->flags & SWP_SHOWWINDOW) {
// By this time all the windows from the hierarchy are already notified about z-order change.
// Thus we may and we should reset the trigger in order not to affect other changes.
sm_retainingHierarchyZOrderInShow = NULL;
}
+
+ // Reposition the warning window
+ if (IsUntrusted() && warningWindow != NULL) {
+ if (wp->flags & SWP_HIDEWINDOW) {
+ UpdateSecurityWarningVisibility();
+ }
+
+ RepositionSecurityWarning((JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2));
+
+ if (wp->flags & SWP_SHOWWINDOW) {
+ UpdateSecurityWarningVisibility();
+ }
+ }
+
return mrDoDefault;
}
@@ -326,21 +414,597 @@
lpwc->cbWndExtra = DLGWINDOWEXTRA;
}
+bool AwtWindow::IsWarningWindow(HWND hWnd)
+{
+ const UINT len = 128;
+ TCHAR windowClassName[len];
+
+ ::RealGetWindowClass(hWnd, windowClassName, len);
+ return 0 == _tcsncmp(windowClassName,
+ AwtWindow::GetWarningWindowClassName(), len);
+}
+
LRESULT CALLBACK AwtWindow::CBTFilter(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HCBT_ACTIVATE || nCode == HCBT_SETFOCUS) {
- AwtComponent *comp = AwtComponent::GetComponent((HWND)wParam);
-
- if (comp != NULL && comp->IsTopLevel()) {
- AwtWindow* win = (AwtWindow*)comp;
- if (!win->IsFocusableWindow() || win->m_filterFocusAndActivation) {
- return 1; // Don't change focus/activation.
+ HWND hWnd = (HWND)wParam;
+ AwtComponent *comp = AwtComponent::GetComponent(hWnd);
+
+ if (comp == NULL) {
+ // Check if it's a security warning icon
+ // See: 5091224, 6181725, 6732583
+ if (AwtWindow::IsWarningWindow(hWnd)) {
+ return 1;
+ }
+ } else {
+ if (comp->IsTopLevel()) {
+ AwtWindow* win = (AwtWindow*)comp;
+
+ if (!win->IsFocusableWindow() ||
+ win->m_filterFocusAndActivation)
+ {
+ return 1; // Don't change focus/activation.
+ }
}
}
}
return ::CallNextHookEx(AwtWindow::ms_hCBTFilter, nCode, wParam, lParam);
}
+void AwtWindow::InitSecurityWarningSize(JNIEnv *env)
+{
+ warningWindowWidth = ::GetSystemMetrics(SM_CXSMICON);
+ warningWindowHeight = ::GetSystemMetrics(SM_CYSMICON);
+
+ jobject target = GetTarget(env);
+
+ env->SetIntField(target, AwtWindow::securityWarningWidthID,
+ warningWindowWidth);
+ env->SetIntField(target, AwtWindow::securityWarningHeightID,
+ warningWindowHeight);
+
+ env->DeleteLocalRef(target);
+}
+
+void AwtWindow::CreateHWnd(JNIEnv *env, LPCWSTR title,
+ DWORD windowStyle,
+ DWORD windowExStyle,
+ int x, int y, int w, int h,
+ HWND hWndParent, HMENU hMenu,
+ COLORREF colorForeground,
+ COLORREF colorBackground,
+ jobject peer)
+{
+ // Retrieve the warning string
+ // Note: we need to get it before CreateHWnd() happens because
+ // the isUntrusted() method may be invoked while the HWND
+ // is being created in response to some window messages.
+ jobject target = env->GetObjectField(peer, AwtObject::targetID);
+ jstring javaWarningString =
+ (jstring)env->CallObjectMethod(target, AwtWindow::getWarningStringMID);
+
+ if (javaWarningString != NULL) {
+ size_t length = env->GetStringLength(javaWarningString) + 1;
+ warningString = new WCHAR[length];
+ env->GetStringRegion(javaWarningString, 0,
+ static_cast<jsize>(length - 1), warningString);
+ warningString[length-1] = L'\0';
+
+ env->DeleteLocalRef(javaWarningString);
+ }
+ env->DeleteLocalRef(target);
+
+ AwtCanvas::CreateHWnd(env, title,
+ windowStyle,
+ windowExStyle,
+ x, y, w, h,
+ hWndParent, hMenu,
+ colorForeground,
+ colorBackground,
+ peer);
+
+ // Now we need to create the warning window.
+ CreateWarningWindow(env);
+}
+
+void AwtWindow::CreateWarningWindow(JNIEnv *env)
+{
+ if (!IsUntrusted()) {
+ return;
+ }
+
+ if (++AwtWindow::untrustedWindowsCounter == 1) {
+ AwtToolkit::GetInstance().InstallMouseLowLevelHook();
+ }
+
+ InitSecurityWarningSize(env);
+
+ RECT rect;
+ CalculateWarningWindowBounds(env, &rect);
+
+ RegisterWarningWindowClass();
+ warningWindow = ::CreateWindowEx(
+ WS_EX_NOACTIVATE | WS_EX_LAYERED,
+ GetWarningWindowClassName(),
+ warningString,
+ WS_POPUP,
+ rect.left, rect.top,
+ rect.right - rect.left, rect.bottom - rect.top,
+ GetHWnd(), // owner
+ NULL, // menu
+ AwtToolkit::GetInstance().GetModuleHandle(),
+ NULL // lParam
+ );
+ if (warningWindow == NULL) {
+ //XXX: actually this is bad... We didn't manage to create the widow.
+ return;
+ }
+
+ HICON hIcon = GetSecurityWarningIcon();
+
+ ICONINFO ii;
+ ::GetIconInfo(hIcon, &ii);
+
+ //Note: we assume that every security icon has exactly the same shape.
+ HRGN rgn = BitmapUtil::BitmapToRgn(ii.hbmColor);
+ if (rgn) {
+ ::SetWindowRgn(warningWindow, rgn, TRUE);
+ }
+
+ // Now we need to create the tooltip control for this window.
+ if (!ComCtl32Util::GetInstance().IsToolTipControlInitialized()) {
+ return;
+ }
+
+ securityTooltipWindow = ::CreateWindowEx(
+ WS_EX_TOPMOST,
+ TOOLTIPS_CLASS,
+ NULL,
+ WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
+ CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
+ warningWindow,
+ NULL,
+ AwtToolkit::GetInstance().GetModuleHandle(),
+ NULL
+ );
+
+ ::SetWindowPos(securityTooltipWindow,
+ HWND_TOPMOST, 0, 0, 0, 0,
+ SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+
+
+ // We currently don't expect changing the size of the window,
+ // hence we may not care of updating the TOOL position/size.
+ ::GetClientRect(warningWindow, &rect);
+
+ TOOLINFO ti;
+
+ ti.cbSize = sizeof(ti);
+ ti.uFlags = TTF_SUBCLASS;
+ ti.hwnd = warningWindow;
+ ti.hinst = AwtToolkit::GetInstance().GetModuleHandle();
+ ti.uId = 0;
+ ti.lpszText = warningString;
+ ti.rect.left = rect.left;
+ ti.rect.top = rect.top;
+ ti.rect.right = rect.right;
+ ti.rect.bottom = rect.bottom;
+
+ ::SendMessage(securityTooltipWindow, TTM_ADDTOOL,
+ 0, (LPARAM) (LPTOOLINFO) &ti);
+}
+
+void AwtWindow::DestroyWarningWindow()
+{
+ if (!IsUntrusted()) {
+ return;
+ }
+ if (--AwtWindow::untrustedWindowsCounter == 0) {
+ AwtToolkit::GetInstance().UninstallMouseLowLevelHook();
+ }
+ if (warningWindow != NULL) {
+ // Note that the warningWindow is an owned window, and hence
+ // it would be destroyed automatically. However, the window
+ // class may only be unregistered if there's no any single
+ // window left using this class. Thus, we're destroying the
+ // warning window manually. Note that the tooltip window
+ // will be destroyed automatically because it's an owned
+ // window as well.
+ ::DestroyWindow(warningWindow);
+ warningWindow = NULL;
+ securityTooltipWindow = NULL;
+ UnregisterWarningWindowClass();
+ }
+}
+
+void AwtWindow::DestroyHWnd()
+{
+ DestroyWarningWindow();
+ AwtCanvas::DestroyHWnd();
+}
+
+LPCTSTR AwtWindow::GetWarningWindowClassName()
+{
+ return TEXT("SunAwtWarningWindow");
+}
+
+void AwtWindow::FillWarningWindowClassInfo(WNDCLASS *lpwc)
+{
+ lpwc->style = 0L;
+ lpwc->lpfnWndProc = (WNDPROC)WarningWindowProc;
+ lpwc->cbClsExtra = 0;
+ lpwc->cbWndExtra = 0;
+ lpwc->hInstance = AwtToolkit::GetInstance().GetModuleHandle(),
+ lpwc->hIcon = AwtToolkit::GetInstance().GetAwtIcon();
+ lpwc->hCursor = ::LoadCursor(NULL, IDC_ARROW);
+ lpwc->hbrBackground = NULL;
+ lpwc->lpszMenuName = NULL;
+ lpwc->lpszClassName = AwtWindow::GetWarningWindowClassName();
+}
+
+void AwtWindow::RegisterWarningWindowClass()
+{
+ WNDCLASS wc;
+
+ ::ZeroMemory(&wc, sizeof(wc));
+
+ if (!::GetClassInfo(AwtToolkit::GetInstance().GetModuleHandle(),
+ AwtWindow::GetWarningWindowClassName(), &wc))
+ {
+ AwtWindow::FillWarningWindowClassInfo(&wc);
+ ATOM atom = ::RegisterClass(&wc);
+ DASSERT(atom != 0);
+ }
+}
+
+void AwtWindow::UnregisterWarningWindowClass()
+{
+ ::UnregisterClass(AwtWindow::GetWarningWindowClassName(), AwtToolkit::GetInstance().GetModuleHandle());
+}
+
+HICON AwtWindow::GetSecurityWarningIcon()
+{
+ HICON ico = AwtToolkit::GetInstance().GetSecurityWarningIcon(securityWarningAnimationStage,
+ warningWindowWidth, warningWindowHeight);
+ return ico;
+}
+
+// This function calculates the bounds of the warning window and stores them
+// into the RECT structure pointed by the argument rect.
+void AwtWindow::CalculateWarningWindowBounds(JNIEnv *env, LPRECT rect)
+{
+ RECT windowBounds;
+ AwtToolkit::GetWindowRect(GetHWnd(), &windowBounds);
+
+ jobject target = GetTarget(env);
+ jobject point2D = env->CallObjectMethod(target,
+ calculateSecurityWarningPositionMID,
+ (jdouble)windowBounds.left, (jdouble)windowBounds.top,
+ (jdouble)(windowBounds.right - windowBounds.left),
+ (jdouble)(windowBounds.bottom - windowBounds.top));
+ env->DeleteLocalRef(target);
+
+ static jclass point2DClassID = NULL;
+ static jmethodID point2DGetXMID = NULL;
+ static jmethodID point2DGetYMID = NULL;
+
+ if (point2DClassID == NULL) {
+ jclass point2DClassIDLocal = env->FindClass("java/awt/geom/Point2D");
+ point2DClassID = (jclass)env->NewGlobalRef(point2DClassIDLocal);
+ env->DeleteLocalRef(point2DClassIDLocal);
+ }
+
+ if (point2DGetXMID == NULL) {
+ point2DGetXMID = env->GetMethodID(point2DClassID, "getX", "()D");
+ }
+ if (point2DGetYMID == NULL) {
+ point2DGetYMID = env->GetMethodID(point2DClassID, "getY", "()D");
+ }
+
+
+ int x = (int)env->CallDoubleMethod(point2D, point2DGetXMID);
+ int y = (int)env->CallDoubleMethod(point2D, point2DGetYMID);
+
+ env->DeleteLocalRef(point2D);
+
+ //Make sure the warning is not far from the window bounds
+ x = max(x, windowBounds.left - (int)warningWindowWidth - 2);
+ x = min(x, windowBounds.right + (int)warningWindowWidth + 2);
+
+ y = max(y, windowBounds.top - (int)warningWindowHeight - 2);
+ y = min(y, windowBounds.bottom + (int)warningWindowHeight + 2);
+
+ // Now make sure the warning window is visible on the screen
+ HMONITOR hmon = MonitorFromWindow(GetHWnd(), MONITOR_DEFAULTTOPRIMARY);
+ DASSERT(hmon != NULL);
+
+ RECT monitorBounds;
+ RECT monitorInsets;
+
+ MonitorBounds(hmon, &monitorBounds);
+ if (!AwtToolkit::GetScreenInsets(m_screenNum, &monitorInsets)) {
+ ::ZeroMemory(&monitorInsets, sizeof(monitorInsets));
+ }
+
+ x = max(x, monitorBounds.left + monitorInsets.left);
+ x = min(x, monitorBounds.right - monitorInsets.right - (int)warningWindowWidth);
+
+ y = max(y, monitorBounds.top + monitorInsets.top);
+ y = min(y, monitorBounds.bottom - monitorInsets.bottom - (int)warningWindowHeight);
+
+ rect->left = x;
+ rect->top = y;
+ rect->right = rect->left + warningWindowWidth;
+ rect->bottom = rect->top + warningWindowHeight;
+}
+
+LRESULT CALLBACK AwtWindow::WarningWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ switch (uMsg) {
+ case WM_PAINT:
+ PaintWarningWindow(hwnd);
+ return 0;
+
+ case WM_MOUSEACTIVATE:
+ {
+ // Retrive the owner of the warning window.
+ HWND javaWindow = ::GetParent(hwnd);
+ if (javaWindow) {
+ // If the window is blocked by a modal dialog, substitute
+ // its handle with the topmost blocker.
+ HWND topmostBlocker = GetTopmostModalBlocker(javaWindow);
+ if (::IsWindow(topmostBlocker)) {
+ javaWindow = topmostBlocker;
+ }
+
+ ::BringWindowToTop(javaWindow);
+
+ AwtWindow * window =
+ (AwtWindow*)AwtComponent::GetComponent(javaWindow);
+ if (window == NULL) {
+ // Quite unlikely to go into here, but it's way better
+ // than getting a crash.
+ ::SetForegroundWindow(javaWindow);
+ } else {
+ // Activate the window if it is focusable and inactive
+ if (window->IsFocusableWindow() &&
+ javaWindow != ::GetActiveWindow()) {
+ ::SetForegroundWindow(javaWindow);
+ } else {
+ // ...otherwise just start the animation.
+ window->StartSecurityAnimation(akShow);
+ }
+ }
+
+ // In every case if there's a top-most blocker, we need to
+ // enable modal animation.
+ if (::IsWindow(topmostBlocker)) {
+ AwtDialog::AnimateModalBlocker(topmostBlocker);
+ }
+ }
+ return MA_NOACTIVATEANDEAT;
+ }
+ }
+ return ::DefWindowProc(hwnd, uMsg, wParam, lParam);
+}
+
+void AwtWindow::PaintWarningWindow(HWND warningWindow)
+{
+ RECT updateRect;
+
+ if (!::GetUpdateRect(warningWindow, &updateRect, FALSE)) {
+ // got nothing to update
+ return;
+ }
+
+ PAINTSTRUCT ps;
+ HDC hdc = ::BeginPaint(warningWindow, &ps);
+ if (hdc == NULL) {
+ // indicates an error
+ return;
+ }
+
+ PaintWarningWindow(warningWindow, hdc);
+
+ ::EndPaint(warningWindow, &ps);
+}
+
+void AwtWindow::PaintWarningWindow(HWND warningWindow, HDC hdc)
+{
+ HWND javaWindow = ::GetParent(warningWindow);
+
+ AwtWindow * window = (AwtWindow*)AwtComponent::GetComponent(javaWindow);
+ if (window == NULL) {
+ return;
+ }
+
+ ::DrawIconEx(hdc, 0, 0, window->GetSecurityWarningIcon(),
+ window->warningWindowWidth, window->warningWindowHeight,
+ 0, NULL, DI_NORMAL);
+}
+
+static const UINT_PTR IDT_AWT_SECURITYANIMATION = 0x102;
+
+// Approximately 6 times a second. 0.75 seconds total.
+static const UINT securityAnimationTimerElapse = 150;
+static const UINT securityAnimationMaxIterations = 5;
+
+void AwtWindow::RepaintWarningWindow()
+{
+ HDC hdc = ::GetDC(warningWindow);
+ PaintWarningWindow(warningWindow, hdc);
+ ::ReleaseDC(warningWindow, hdc);
+}
+
+void AwtWindow::StartSecurityAnimation(AnimationKind kind)
+{
+ if (!IsUntrusted()) {
+ return;
+ }
+ if (warningWindow == NULL) {
+ return;
+ }
+
+ securityAnimationKind = kind;
+
+ securityWarningAnimationStage = 1;
+ ::SetTimer(GetHWnd(), IDT_AWT_SECURITYANIMATION,
+ securityAnimationTimerElapse, NULL);
+
+ if (securityAnimationKind == akShow) {
+ ::SetWindowPos(warningWindow, HWND_NOTOPMOST, 0, 0, 0, 0,
+ SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE |
+ SWP_SHOWWINDOW);
+
+ ::SetLayeredWindowAttributes(warningWindow, RGB(0, 0, 0),
+ 0xFF, LWA_ALPHA);
+ ::RedrawWindow(warningWindow, NULL, NULL,
+ RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);
+ }
+}
+
+void AwtWindow::StopSecurityAnimation()
+{
+ if (!IsUntrusted()) {
+ return;
+ }
+ if (warningWindow == NULL) {
+ return;
+ }
+
+ securityWarningAnimationStage = 0;
+ ::KillTimer(GetHWnd(), IDT_AWT_SECURITYANIMATION);
+
+ switch (securityAnimationKind) {
+ case akHide:
+ case akPreHide:
+ ::SetWindowPos(warningWindow, HWND_NOTOPMOST, 0, 0, 0, 0,
+ SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE |
+ SWP_HIDEWINDOW);
+ break;
+ case akShow:
+ RepaintWarningWindow();
+ break;
+ }
+
+ securityAnimationKind = akNone;
+}
+
+MsgRouting AwtWindow::WmTimer(UINT_PTR timerID)
+{
+ if (timerID != IDT_AWT_SECURITYANIMATION) {
+ return mrPassAlong;
+ }
+
+ if (securityWarningAnimationStage == 0) {
+ return mrConsume;
+ }
+
+ securityWarningAnimationStage++;
+ if (securityWarningAnimationStage >= securityAnimationMaxIterations) {
+ if (securityAnimationKind == akPreHide) {
+ // chain real hiding
+ StartSecurityAnimation(akHide);
+ } else {
+ StopSecurityAnimation();
+ }
+ } else {
+ switch (securityAnimationKind) {
+ case akHide:
+ {
+ BYTE opacity = ((int)0xFF *
+ (securityAnimationMaxIterations -
+ securityWarningAnimationStage)) /
+ securityAnimationMaxIterations;
+ ::SetLayeredWindowAttributes(warningWindow,
+ RGB(0, 0, 0), opacity, LWA_ALPHA);
+ }
+ break;
+ case akShow:
+ case akNone: // quite unlikely, but quite safe
+ RepaintWarningWindow();
+ break;
+ }
+ }
+
+ return mrConsume;
+}
+
+// The security warning is visible if:
+// 1. The window has the keyboard window focus, OR
+// 2. The mouse pointer is located within the window bounds,
+// or within the security warning icon.
+void AwtWindow::UpdateSecurityWarningVisibility()
+{
+ if (!IsUntrusted()) {
+ return;
+ }
+ if (warningWindow == NULL) {
+ return;
+ }
+
+ bool show = false;
+
+ if (IsVisible() && currentWmSizeState != SIZE_MINIMIZED) {
+ if (AwtComponent::GetFocusedWindow() == GetHWnd()) {
+ show = true;
+ }
+
+ HWND hwnd = AwtToolkit::GetInstance().GetWindowUnderMouse();
+ if (hwnd == GetHWnd()) {
+ show = true;
+ }
+ if (hwnd == warningWindow) {
+ show = true;
+ }
+ }
+
+ if (show && (!::IsWindowVisible(warningWindow) ||
+ securityAnimationKind == akHide ||
+ securityAnimationKind == akPreHide)) {
+ StartSecurityAnimation(akShow);
+ }
+ if (!show && ::IsWindowVisible(warningWindow)) {
+ StartSecurityAnimation(akPreHide);
+ }
+}
+
+void AwtWindow::FocusedWindowChanged(HWND from, HWND to)
+{
+ AwtWindow * fw = (AwtWindow *)AwtComponent::GetComponent(from);
+ AwtWindow * tw = (AwtWindow *)AwtComponent::GetComponent(to);
+
+ if (fw != NULL) {
+ fw->UpdateSecurityWarningVisibility();
+ }
+ if (tw != NULL) {
+ tw->UpdateSecurityWarningVisibility();
+
+ // Flash on receiving the keyboard focus even if the warning
+ // has already been shown (e.g. by hovering with the mouse)
+ tw->StartSecurityAnimation(akShow);
+ }
+}
+
+void AwtWindow::_RepositionSecurityWarning(void* param)
+{
+ JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+
+ RepositionSecurityWarningStruct *rsws =
+ (RepositionSecurityWarningStruct *)param;
+ jobject self = rsws->window;
+
+ PDATA pData;
+ JNI_CHECK_PEER_GOTO(self, ret);
+ AwtWindow *window = (AwtWindow *)pData;
+
+ window->RepositionSecurityWarning(env);
+
+ ret:
+ env->DeleteGlobalRef(self);
+ delete rsws;
+}
+
/* Create a new AwtWindow object and window. */
AwtWindow* AwtWindow::Create(jobject self, jobject parent)
{
@@ -372,7 +1036,7 @@
window->m_isRetainingHierarchyZOrder = TRUE;
}
DWORD style = WS_CLIPCHILDREN | WS_POPUP;
- DWORD exStyle = 0;
+ DWORD exStyle = WS_EX_NOACTIVATE;
if (GetRTL()) {
exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR;
if (GetRTLReadingOrder())
@@ -620,23 +1284,6 @@
::GetClientRect(GetHWnd(), &inside);
::GetWindowRect(GetHWnd(), &outside);
- jobject target = GetTarget(env);
- jstring warningString =
- (jstring)(env)->GetObjectField(target, AwtWindow::warningStringID);
- if (warningString != NULL) {
- ::CopyRect(&inside, &outside);
- DefWindowProc(WM_NCCALCSIZE, FALSE, (LPARAM)&inside);
- /*
- * Fix for BugTraq ID 4304024.
- * Calculate client rectangle in client coordinates.
- */
- VERIFY(::OffsetRect(&inside, -inside.left, -inside.top));
- extraBottomInsets = ::GetSystemMetrics(SM_CYCAPTION) +
- ((GetStyle() & WS_THICKFRAME) ? 2 : -2);
- }
- env->DeleteLocalRef(target);
- env->DeleteLocalRef(warningString);
-
/* Update our inset member */
if (outside.right - outside.left > 0 && outside.bottom - outside.top > 0) {
::MapWindowPoints(GetHWnd(), 0, (LPPOINT)&inside, 2);
@@ -863,45 +1510,93 @@
env->DeleteLocalRef(event);
}
+BOOL AwtWindow::AwtSetActiveWindow(BOOL isMouseEventCause, UINT hittest)
+{
+ // Fix for 6458497.
+ // Retreat if current foreground window is out of both our and embedder process.
+ // The exception is when activation is requested due to a mouse event.
+ if (!isMouseEventCause) {
+ HWND fgWindow = ::GetForegroundWindow();
+ if (NULL != fgWindow) {
+ DWORD fgProcessID;
+ ::GetWindowThreadProcessId(fgWindow, &fgProcessID);
+ if (fgProcessID != ::GetCurrentProcessId()
+ && !AwtToolkit::GetInstance().IsEmbedderProcessId(fgProcessID))
+ {
+ return FALSE;
+ }
+ }
+ }
+
+ HWND proxyContainerHWnd = GetProxyToplevelContainer();
+ HWND proxyHWnd = GetProxyFocusOwner();
+
+ if (proxyContainerHWnd == NULL || proxyHWnd == NULL) {
+ return FALSE;
+ }
+
+ // Activate the proxy toplevel container
+ if (::GetActiveWindow() != proxyContainerHWnd) {
+ sm_suppressFocusAndActivation = TRUE;
+ ::BringWindowToTop(proxyContainerHWnd);
+ ::SetForegroundWindow(proxyContainerHWnd);
+ sm_suppressFocusAndActivation = FALSE;
+
+ if (::GetActiveWindow() != proxyContainerHWnd) {
+ return FALSE; // activation has been rejected
+ }
+ }
+
+ // Focus the proxy itself
+ if (::GetFocus() != proxyHWnd) {
+ sm_suppressFocusAndActivation = TRUE;
+ ::SetFocus(proxyHWnd);
+ sm_suppressFocusAndActivation = FALSE;
+
+ if (::GetFocus() != proxyHWnd) {
+ return FALSE; // focus has been rejected (that is unlikely)
+ }
+ }
+
+ const HWND focusedWindow = AwtComponent::GetFocusedWindow();
+ if (focusedWindow != GetHWnd()) {
+ if (focusedWindow != NULL) {
+ // Deactivate the old focused window
+ AwtWindow::SynthesizeWmActivate(FALSE, focusedWindow, GetHWnd());
+ }
+ // Activate the new focused window.
+ AwtWindow::SynthesizeWmActivate(TRUE, GetHWnd(), focusedWindow);
+ }
+ return TRUE;
+}
+
MsgRouting AwtWindow::WmActivate(UINT nState, BOOL fMinimized, HWND opposite)
{
jint type;
if (nState != WA_INACTIVE) {
- ::SetFocus((sm_focusOwner == NULL ||
- AwtComponent::GetTopLevelParentForWindow(sm_focusOwner) !=
- GetHWnd()) ? NULL : sm_focusOwner);
type = java_awt_event_WindowEvent_WINDOW_GAINED_FOCUS;
- AwtToolkit::GetInstance().
- InvokeFunctionLater(BounceActivation, this);
- sm_focusedWindow = GetHWnd();
+ AwtComponent::SetFocusedWindow(GetHWnd());
} else {
+ // The owner is not necassarily getting WM_ACTIVATE(WA_INACTIVE).
+ // So, initiate retaining the actualFocusedWindow.
+ AwtFrame *owner = GetOwningFrameOrDialog();
+ if (owner) {
+ owner->CheckRetainActualFocusedWindow(opposite);
+ }
+
if (m_grabbedWindow != NULL && !m_grabbedWindow->IsOneOfOwnersOf(this)) {
m_grabbedWindow->Ungrab();
}
type = java_awt_event_WindowEvent_WINDOW_LOST_FOCUS;
- sm_focusedWindow = NULL;
+ AwtComponent::SetFocusedWindow(NULL);
+ sm_focusOwner = NULL;
}
SendWindowEvent(type, opposite);
return mrConsume;
}
-void AwtWindow::BounceActivation(void *self) {
- AwtWindow *wSelf = (AwtWindow *)self;
-
- if (::GetActiveWindow() == wSelf->GetHWnd()) {
- AwtFrame *owner = wSelf->GetOwningFrameOrDialog();
-
- if (owner != NULL) {
- sm_suppressFocusAndActivation = TRUE;
- ::SetActiveWindow(owner->GetHWnd());
- ::SetFocus(owner->GetProxyFocusOwner());
- sm_suppressFocusAndActivation = FALSE;
- }
- }
-}
-
MsgRouting AwtWindow::WmCreate()
{
return mrDoDefault;
@@ -925,17 +1620,20 @@
{
/*
* Original fix for 4810575. Modified for 6386592.
- * If an owned window (not frame/dialog) gets disposed we should synthesize
+ * If a simple window gets disposed we should synthesize
* WM_ACTIVATE for its nearest owner. This is not performed by default because
* the owner frame/dialog is natively active.
*/
HWND hwndSelf = GetHWnd();
- HWND hwndParent = ::GetParent(hwndSelf);
-
- if (!show && IsSimpleWindow() && hwndSelf == sm_focusedWindow &&
- hwndParent != NULL && ::IsWindowVisible(hwndParent))
+ HWND hwndOwner = ::GetParent(hwndSelf);
+
+ if (!show && IsSimpleWindow() && hwndSelf == AwtComponent::GetFocusedWindow() &&
+ hwndOwner != NULL && ::IsWindowVisible(hwndOwner))
{
- ::PostMessage(hwndParent, WM_ACTIVATE, (WPARAM)WA_ACTIVE, (LPARAM)hwndSelf);
+ AwtFrame *owner = (AwtFrame*)AwtComponent::GetComponent(hwndOwner);
+ if (owner != NULL) {
+ owner->AwtSetActiveWindow();
+ }
}
//Fixed 4842599: REGRESSION: JPopupMenu not Hidden Properly After Iconified and Deiconified
@@ -1034,7 +1732,10 @@
*/
MsgRouting AwtWindow::WmSize(UINT type, int w, int h)
{
+ currentWmSizeState = type;
+
if (type == SIZE_MINIMIZED) {
+ UpdateSecurityWarningVisibility();
return mrDoDefault;
}
@@ -1098,103 +1799,18 @@
if (env->EnsureLocalCapacity(2) < 0) {
return mrConsume;
}
- jobject target = GetTarget(env);
- jstring warningString =
- (jstring)(env)->GetObjectField(target, AwtWindow::warningStringID);
- if (warningString != NULL) {
- RECT r;
- ::CopyRect(&r, &lpncsp->rgrc[0]);
- retVal = static_cast<UINT>(DefWindowProc(WM_NCCALCSIZE, fCalcValidRects,
- reinterpret_cast<LPARAM>(lpncsp)));
-
- /* Adjust non-client area for warning banner space. */
- m_warningRect.left = lpncsp->rgrc[0].left;
- m_warningRect.right = lpncsp->rgrc[0].right;
- m_warningRect.bottom = lpncsp->rgrc[0].bottom;
- m_warningRect.top =
- m_warningRect.bottom - ::GetSystemMetrics(SM_CYCAPTION);
- if (GetStyle() & WS_THICKFRAME) {
- m_warningRect.top -= 2;
- } else {
- m_warningRect.top += 2;
- }
-
- lpncsp->rgrc[0].bottom = (m_warningRect.top >= lpncsp->rgrc[0].top)
- ? m_warningRect.top
- : lpncsp->rgrc[0].top;
-
- /* Convert to window-relative coordinates. */
- ::OffsetRect(&m_warningRect, -r.left, -r.top);
-
- /* Notify target of Insets change. */
- if (HasValidRect()) {
- UpdateInsets(NULL);
- }
-
- mrRetVal = mrConsume;
- } else {
- // WM_NCCALCSIZE is usually in response to a resize, but
- // also can be triggered by SetWindowPos(SWP_FRAMECHANGED),
- // which means the insets will have changed - rnk 4/7/1998
- retVal = static_cast<UINT>(DefWindowProc(
- WM_NCCALCSIZE, fCalcValidRects, reinterpret_cast<LPARAM>(lpncsp)));
- if (HasValidRect()) {
- UpdateInsets(NULL);
- }
- mrRetVal = mrConsume;
+ // WM_NCCALCSIZE is usually in response to a resize, but
+ // also can be triggered by SetWindowPos(SWP_FRAMECHANGED),
+ // which means the insets will have changed - rnk 4/7/1998
+ retVal = static_cast<UINT>(DefWindowProc(
+ WM_NCCALCSIZE, fCalcValidRects, reinterpret_cast<LPARAM>(lpncsp)));
+ if (HasValidRect()) {
+ UpdateInsets(NULL);
}
- env->DeleteLocalRef(target);
- env->DeleteLocalRef(warningString);
+ mrRetVal = mrConsume;
return mrRetVal;
}
-MsgRouting AwtWindow::WmNcPaint(HRGN hrgn)
-{
- DefWindowProc(WM_NCPAINT, (WPARAM)hrgn, 0);
-
- JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
- if (env->EnsureLocalCapacity(2) < 0) {
- return mrConsume;
- }
- jobject target = GetTarget(env);
- jstring warningString =
- (jstring)(env)->GetObjectField(target, AwtWindow::warningStringID);
- if (warningString != NULL) {
- RECT r;
- ::CopyRect(&r, &m_warningRect);
- HDC hDC = ::GetWindowDC(GetHWnd());
- DASSERT(hDC);
- int iSaveDC = ::SaveDC(hDC);
- VERIFY(::SelectClipRgn(hDC, NULL) != NULL);
- VERIFY(::FillRect(hDC, &m_warningRect, (HBRUSH)::GetStockObject(BLACK_BRUSH)));
-
- if (GetStyle() & WS_THICKFRAME) {
- /* draw edge */
- VERIFY(::DrawEdge(hDC, &r, EDGE_RAISED, BF_TOP));
- r.top += 2;
- VERIFY(::DrawEdge(hDC, &r, EDGE_SUNKEN, BF_RECT));
- ::InflateRect(&r, -2, -2);
- }
-
- /* draw warning text */
- LPCWSTR text = JNU_GetStringPlatformChars(env, warningString, NULL);
- VERIFY(::SetBkColor(hDC, ::GetSysColor(COLOR_BTNFACE)) != CLR_INVALID);
- VERIFY(::SetTextColor(hDC, ::GetSysColor(COLOR_BTNTEXT)) != CLR_INVALID);
- VERIFY(::SelectObject(hDC, ::GetStockObject(DEFAULT_GUI_FONT)) != NULL);
- VERIFY(::SetTextAlign(hDC, TA_LEFT | TA_BOTTOM) != GDI_ERROR);
- VERIFY(::ExtTextOut(hDC, r.left+2, r.bottom-1,
- ETO_CLIPPED | ETO_OPAQUE,
- &r, text, static_cast<UINT>(wcslen(text)), NULL));
- VERIFY(::RestoreDC(hDC, iSaveDC));
- ::ReleaseDC(GetHWnd(), hDC);
- JNU_ReleaseStringPlatformChars(env, warningString, text);
- }
-
- env->DeleteLocalRef(target);
- env->DeleteLocalRef(warningString);
- return mrConsume;
-}
-
MsgRouting AwtWindow::WmNcHitTest(UINT x, UINT y, LRESULT& retVal)
{
// If this window is blocked by modal dialog, return HTCLIENT for any point of it.
@@ -1420,6 +2036,19 @@
}
}
+HWND AwtWindow::GetTopmostModalBlocker(HWND window)
+{
+ HWND ret, blocker = NULL;
+
+ do {
+ ret = blocker;
+ blocker = AwtWindow::GetModalBlocker(window);
+ window = blocker;
+ } while (::IsWindow(blocker));
+
+ return ret;
+}
+
void AwtWindow::FlashWindowEx(HWND hWnd, UINT count, DWORD timeout, DWORD flags) {
FLASHWINFO fi;
fi.cbSize = sizeof(fi);
@@ -1430,6 +2059,38 @@
::FlashWindowEx(&fi);
}
+jboolean
+AwtWindow::_RequestWindowFocus(void *param)
+{
+ JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+
+ RequestWindowFocusStruct *rfs = (RequestWindowFocusStruct *)param;
+ jobject self = rfs->component;
+ jboolean isMouseEventCause = rfs->isMouseEventCause;
+
+ jboolean result = JNI_FALSE;
+ AwtWindow *window = NULL;
+
+ PDATA pData;
+ JNI_CHECK_NULL_GOTO(self, "peer", ret);
+ pData = JNI_GET_PDATA(self);
+ if (pData == NULL) {
+ // do nothing just return false
+ goto ret;
+ }
+
+ window = (AwtWindow *)pData;
+ if (::IsWindow(window->GetHWnd())) {
+ result = (jboolean)window->SendMessage(WM_AWT_WINDOW_SETACTIVE, (WPARAM)isMouseEventCause, 0);
+ }
+ret:
+ env->DeleteGlobalRef(self);
+
+ delete rfs;
+
+ return result;
+}
+
void AwtWindow::_ToFront(void *param)
{
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
@@ -1839,6 +2500,216 @@
//Does nothing for windows, is overriden for frames and dialogs
}
+void AwtWindow::RedrawWindow()
+{
+ if (isOpaque()) {
+ ::RedrawWindow(GetHWnd(), NULL, NULL,
+ RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);
+ } else {
+ ::EnterCriticalSection(&contentBitmapCS);
+ if (hContentBitmap != NULL) {
+ UpdateWindowImpl(contentWidth, contentHeight, hContentBitmap);
+ }
+ ::LeaveCriticalSection(&contentBitmapCS);
+ }
+}
+
+void AwtWindow::SetTranslucency(BYTE opacity, BOOL opaque)
+{
+ BYTE old_opacity = getOpacity();
+ BOOL old_opaque = isOpaque();
+
+ if (opacity == old_opacity && opaque == old_opaque) {
+ return;
+ }
+
+ setOpacity(opacity);
+ setOpaque(opaque);
+
+ HWND hwnd = GetHWnd();
+
+ LONG ex_style = ::GetWindowLong(hwnd, GWL_EXSTYLE);
+
+ if (opaque != old_opaque) {
+ ::EnterCriticalSection(&contentBitmapCS);
+ if (hContentBitmap != NULL) {
+ ::DeleteObject(hContentBitmap);
+ hContentBitmap = NULL;
+ }
+ ::LeaveCriticalSection(&contentBitmapCS);
+ }
+
+ if (opaque && opacity == 0xff) {
+ // Turn off all the effects
+ ::SetWindowLong(hwnd, GWL_EXSTYLE, ex_style & ~WS_EX_LAYERED);
+ // Ask the window to repaint itself and all the children
+ RedrawWindow();
+ } else {
+ // We're going to enable some effects
+ if (!(ex_style & WS_EX_LAYERED)) {
+ ::SetWindowLong(hwnd, GWL_EXSTYLE, ex_style | WS_EX_LAYERED);
+ } else {
+ if ((opaque && opacity < 0xff) ^ (old_opaque && old_opacity < 0xff)) {
+ // _One_ of the modes uses the SetLayeredWindowAttributes.
+ // Need to reset the style in this case.
+ // If both modes are simple (i.e. just changing the opacity level),
+ // no need to reset the style.
+ ::SetWindowLong(hwnd, GWL_EXSTYLE, ex_style & ~WS_EX_LAYERED);
+ ::SetWindowLong(hwnd, GWL_EXSTYLE, ex_style | WS_EX_LAYERED);
+ }
+ }
+
+ if (opaque) {
+ // Simple opacity mode
+ ::SetLayeredWindowAttributes(hwnd, RGB(0, 0, 0), opacity, LWA_ALPHA);
+ }
+ }
+}
+
+static HBITMAP CreateBitmapFromRaster(JNIEnv* env, jintArray raster, jint w, jint h)
+{
+ HBITMAP image = NULL;
+ if (raster != NULL) {
+ int* rasterBuffer = NULL;
+ try {
+ rasterBuffer = (int *)env->GetPrimitiveArrayCritical(raster, 0);
+ JNI_CHECK_NULL_GOTO(rasterBuffer, "raster data", done);
+ image = BitmapUtil::CreateBitmapFromARGBPre(w, h, w*4, rasterBuffer);
+ } catch (...) {
+ if (rasterBuffer != NULL) {
+ env->ReleasePrimitiveArrayCritical(raster, rasterBuffer, 0);
+ }
+ throw;
+ }
+ if (rasterBuffer != NULL) {
+ env->ReleasePrimitiveArrayCritical(raster, rasterBuffer, 0);
+ }
+ }
+done:
+ return image;
+}
+
+void AwtWindow::UpdateWindowImpl(int width, int height, HBITMAP hBitmap)
+{
+ if (isOpaque()) {
+ return;
+ }
+
+ HWND hWnd = GetHWnd();
+ HDC hdcDst = ::GetDC(NULL);
+ HDC hdcSrc = ::CreateCompatibleDC(NULL);
+ HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hdcSrc, hBitmap);
+
+ //XXX: this code doesn't paint the children (say, the java.awt.Button)!
+ //So, if we ever want to support HWs here, we need to repaint them
+ //in some other way...
+ //::SendMessage(hWnd, WM_PRINT, (WPARAM)hdcSrc, /*PRF_CHECKVISIBLE |*/
+ // PRF_CHILDREN /*| PRF_CLIENT | PRF_NONCLIENT*/);
+
+ POINT ptSrc;
+ ptSrc.x = ptSrc.y = 0;
+
+ RECT rect;
+ POINT ptDst;
+ SIZE size;
+
+ ::GetWindowRect(hWnd, &rect);
+ ptDst.x = rect.left;
+ ptDst.y = rect.top;
+ size.cx = width;
+ size.cy = height;
+
+ BLENDFUNCTION bf;
+
+ bf.SourceConstantAlpha = getOpacity();
+ bf.AlphaFormat = AC_SRC_ALPHA;
+ bf.BlendOp = AC_SRC_OVER;
+ bf.BlendFlags = 0;
+
+ ::UpdateLayeredWindow(hWnd, hdcDst, &ptDst, &size, hdcSrc, &ptSrc,
+ RGB(0, 0, 0), &bf, ULW_ALPHA);
+
+ ::ReleaseDC(NULL, hdcDst);
+ ::SelectObject(hdcSrc, hOldBitmap);
+ ::DeleteDC(hdcSrc);
+}
+
+void AwtWindow::UpdateWindow(JNIEnv* env, jintArray data, int width, int height,
+ HBITMAP hNewBitmap)
+{
+ if (isOpaque()) {
+ return;
+ }
+
+ HBITMAP hBitmap;
+ if (hNewBitmap == NULL) {
+ if (data == NULL) {
+ return;
+ }
+ hBitmap = CreateBitmapFromRaster(env, data, width, height);
+ if (hBitmap == NULL) {
+ return;
+ }
+ } else {
+ hBitmap = hNewBitmap;
+ }
+
+ ::EnterCriticalSection(&contentBitmapCS);
+ if (hContentBitmap != NULL) {
+ ::DeleteObject(hContentBitmap);
+ }
+ hContentBitmap = hBitmap;
+ contentWidth = width;
+ contentHeight = height;
+ UpdateWindowImpl(width, height, hBitmap);
+ ::LeaveCriticalSection(&contentBitmapCS);
+}
+
+void AwtWindow::FillBackground(HDC hMemoryDC, SIZE &size)
+{
+ if (isOpaque()) {
+ AwtCanvas::FillBackground(hMemoryDC, size);
+ }
+}
+
+void AwtWindow::FillAlpha(void *bitmapBits, SIZE &size, BYTE alpha)
+{
+ if (isOpaque()) {
+ AwtCanvas::FillAlpha(bitmapBits, size, alpha);
+ }
+}
+
+/*
+ * Fixed 6353381: it's improved fix for 4792958
+ * which was backed-out to avoid 5059656
+ */
+BOOL AwtWindow::HasValidRect()
+{
+ RECT inside;
+ RECT outside;
+
+ if (::IsIconic(GetHWnd())) {
+ return FALSE;
+ }
+
+ ::GetClientRect(GetHWnd(), &inside);
+ ::GetWindowRect(GetHWnd(), &outside);
+
+ BOOL isZeroClientArea = (inside.right == 0 && inside.bottom == 0);
+ BOOL isInvalidLocation = ((outside.left == -32000 && outside.top == -32000) || // Win2k && WinXP
+ (outside.left == 32000 && outside.top == 32000) || // Win95 && Win98
+ (outside.left == 3000 && outside.top == 3000)); // Win95 && Win98
+
+ // the bounds correspond to iconic state
+ if (isZeroClientArea && isInvalidLocation)
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
void AwtWindow::_SetIconImagesData(void * param)
{
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
@@ -1940,11 +2811,14 @@
window->m_isFocusableWindow = isFocusableWindow;
- if (!window->m_isFocusableWindow) {
- LONG isPopup = window->GetStyle() & WS_POPUP;
- window->SetStyleEx(window->GetStyleEx() | (isPopup ? 0 : WS_EX_APPWINDOW) | AWT_WS_EX_NOACTIVATE);
- } else {
- window->SetStyleEx(window->GetStyleEx() & ~WS_EX_APPWINDOW & ~AWT_WS_EX_NOACTIVATE);
+ // A simple window is permanently set to WS_EX_NOACTIVATE
+ if (!window->IsSimpleWindow()) {
+ if (!window->m_isFocusableWindow) {
+ LONG isPopup = window->GetStyle() & WS_POPUP;
+ window->SetStyleEx(window->GetStyleEx() | (isPopup ? 0 : WS_EX_APPWINDOW) | WS_EX_NOACTIVATE);
+ } else {
+ window->SetStyleEx(window->GetStyleEx() & ~WS_EX_APPWINDOW & ~WS_EX_NOACTIVATE);
+ }
}
ret:
@@ -2009,36 +2883,68 @@
env->DeleteGlobalRef(self);
}
-/*
- * Fixed 6353381: it's improved fix for 4792958
- * which was backed-out to avoid 5059656
- */
-BOOL AwtWindow::HasValidRect()
+void AwtWindow::_SetOpacity(void* param)
+{
+ JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+
+ OpacityStruct *os = (OpacityStruct *)param;
+ jobject self = os->window;
+ BYTE iOpacity = (BYTE)os->iOpacity;
+
+ PDATA pData;
+ JNI_CHECK_PEER_GOTO(self, ret);
+ AwtWindow *window = (AwtWindow *)pData;
+
+ window->SetTranslucency(iOpacity, window->isOpaque());
+
+ ret:
+ env->DeleteGlobalRef(self);
+ delete os;
+}
+
+void AwtWindow::_SetOpaque(void* param)
{
- RECT inside;
- RECT outside;
-
- if (::IsIconic(GetHWnd())) {
- return FALSE;
+ JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+
+ OpaqueStruct *os = (OpaqueStruct *)param;
+ jobject self = os->window;
+ BOOL isOpaque = (BOOL)os->isOpaque;
+
+ PDATA pData;
+ JNI_CHECK_PEER_GOTO(self, ret);
+ AwtWindow *window = (AwtWindow *)pData;
+
+ window->SetTranslucency(window->getOpacity(), isOpaque);
+
+ ret:
+ env->DeleteGlobalRef(self);
+ delete os;
+}
+
+void AwtWindow::_UpdateWindow(void* param)
+{
+ JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+
+ UpdateWindowStruct *uws = (UpdateWindowStruct *)param;
+ jobject self = uws->window;
+ jintArray data = uws->data;
+
+ PDATA pData;
+ JNI_CHECK_PEER_GOTO(self, ret);
+ AwtWindow *window = (AwtWindow *)pData;
+
+ window->UpdateWindow(env, data, (int)uws->width, (int)uws->height,
+ uws->hBitmap);
+
+ ret:
+ env->DeleteGlobalRef(self);
+ if (data != NULL) {
+ env->DeleteGlobalRef(data);
}
-
- ::GetClientRect(GetHWnd(), &inside);
- ::GetWindowRect(GetHWnd(), &outside);
-
- BOOL isZeroClientArea = (inside.right == 0 && inside.bottom == 0);
- BOOL isInvalidLocation = ((outside.left == -32000 && outside.top == -32000) || // Win2k && WinXP
- (outside.left == 32000 && outside.top == 32000) || // Win95 && Win98
- (outside.left == 3000 && outside.top == 3000)); // Win95 && Win98
-
- // the bounds correspond to iconic state
- if (isZeroClientArea && isInvalidLocation)
- {
- return FALSE;
- }
-
- return TRUE;
+ delete uws;
}
+
extern "C" {
/*
@@ -2055,8 +2961,16 @@
env->GetFieldID(cls, "warningString", "Ljava/lang/String;");
AwtWindow::locationByPlatformID =
env->GetFieldID(cls, "locationByPlatform", "Z");
+ AwtWindow::securityWarningWidthID =
+ env->GetFieldID(cls, "securityWarningWidth", "I");
+ AwtWindow::securityWarningHeightID =
+ env->GetFieldID(cls, "securityWarningHeight", "I");
+ AwtWindow::getWarningStringMID =
+ env->GetMethodID(cls, "getWarningString", "()Ljava/lang/String;");
AwtWindow::autoRequestFocusID =
env->GetFieldID(cls, "autoRequestFocus", "Z");
+ AwtWindow::calculateSecurityWarningPositionMID =
+ env->GetMethodID(cls, "calculateSecurityWarningPosition", "(DDDD)Ljava/awt/geom/Point2D;");
CATCH_BAD_ALLOC;
}
@@ -2489,4 +3403,138 @@
CATCH_BAD_ALLOC;
}
+/*
+ * Class: sun_awt_windows_WWindowPeer
+ * Method: setOpacity
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_sun_awt_windows_WWindowPeer_setOpacity(JNIEnv *env, jobject self,
+ jint iOpacity)
+{
+ TRY;
+
+ OpacityStruct *os = new OpacityStruct;
+ os->window = env->NewGlobalRef(self);
+ os->iOpacity = iOpacity;
+
+ AwtToolkit::GetInstance().SyncCall(AwtWindow::_SetOpacity, os);
+ // global refs and mds are deleted in _SetMinSize
+
+ CATCH_BAD_ALLOC;
+}
+
+/*
+ * Class: sun_awt_windows_WWindowPeer
+ * Method: setOpaqueImpl
+ * Signature: (Z)V
+ */
+JNIEXPORT void JNICALL
+Java_sun_awt_windows_WWindowPeer_setOpaqueImpl(JNIEnv *env, jobject self,
+ jboolean isOpaque)
+{
+ TRY;
+
+ OpaqueStruct *os = new OpaqueStruct;
+ os->window = env->NewGlobalRef(self);
+ os->isOpaque = isOpaque;
+
+ AwtToolkit::GetInstance().SyncCall(AwtWindow::_SetOpaque, os);
+ // global refs and mds are deleted in _SetMinSize
+
+ CATCH_BAD_ALLOC;
+}
+
+/*
+ * Class: sun_awt_windows_WWindowPeer
+ * Method: updateWindowImpl
+ * Signature: ([III)V
+ */
+JNIEXPORT void JNICALL
+Java_sun_awt_windows_WWindowPeer_updateWindowImpl(JNIEnv *env, jobject self,
+ jintArray data,
+ jint width, jint height)
+{
+ TRY;
+
+ UpdateWindowStruct *uws = new UpdateWindowStruct;
+ uws->window = env->NewGlobalRef(self);
+ uws->data = (jintArray)env->NewGlobalRef(data);
+ uws->hBitmap = NULL;
+ uws->width = width;
+ uws->height = height;
+
+ AwtToolkit::GetInstance().InvokeFunction(AwtWindow::_UpdateWindow, uws);
+ // global refs and mds are deleted in _UpdateWindow
+
+ CATCH_BAD_ALLOC;
+}
+
+/**
+ * This method is called from the WGL pipeline when it needs to update
+ * the layered window WindowPeer's C++ level object.
+ */
+void AwtWindow_UpdateWindow(JNIEnv *env, jobject peer,
+ jint width, jint height, HBITMAP hBitmap)
+{
+ TRY;
+
+ UpdateWindowStruct *uws = new UpdateWindowStruct;
+ uws->window = env->NewGlobalRef(peer);
+ uws->data = NULL;
+ uws->hBitmap = hBitmap;
+ uws->width = width;
+ uws->height = height;
+
+ AwtToolkit::GetInstance().InvokeFunction(AwtWindow::_UpdateWindow, uws);
+ // global refs and mds are deleted in _UpdateWindow
+
+ CATCH_BAD_ALLOC;
+}
+
+/*
+ * Class: sun_awt_windows_WComponentPeer
+ * Method: requestFocus
+ * Signature: (Z)Z
+ */
+JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WWindowPeer_requestWindowFocus
+ (JNIEnv *env, jobject self, jboolean isMouseEventCause)
+{
+ TRY;
+
+ jobject selfGlobalRef = env->NewGlobalRef(self);
+
+ RequestWindowFocusStruct *rfs = new RequestWindowFocusStruct;
+ rfs->component = selfGlobalRef;
+ rfs->isMouseEventCause = isMouseEventCause;
+
+ return (jboolean)AwtToolkit::GetInstance().SyncCall(
+ (void*(*)(void*))AwtWindow::_RequestWindowFocus, rfs);
+ // global refs and rfs are deleted in _RequestWindowFocus
+
+ CATCH_BAD_ALLOC_RET(JNI_FALSE);
+}
+
+/*
+ * Class: sun_awt_windows_WWindowPeer
+ * Method: repositionSecurityWarning
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL
+Java_sun_awt_windows_WWindowPeer_repositionSecurityWarning(JNIEnv *env,
+ jobject self)
+{
+ TRY;
+
+ RepositionSecurityWarningStruct *rsws =
+ new RepositionSecurityWarningStruct;
+ rsws->window = env->NewGlobalRef(self);
+
+ AwtToolkit::GetInstance().InvokeFunction(
+ AwtWindow::_RepositionSecurityWarning, rsws);
+ // global refs and mds are deleted in _RepositionSecurityWarning
+
+ CATCH_BAD_ALLOC;
+}
+
} /* extern "C" */
--- a/jdk/src/windows/native/sun/windows/awt_Window.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awt_Window.h Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -34,14 +34,12 @@
// property name tagging windows disabled by modality
static LPCTSTR ModalBlockerProp = TEXT("SunAwtModalBlockerProp");
static LPCTSTR ModalDialogPeerProp = TEXT("SunAwtModalDialogPeerProp");
+static LPCTSTR NativeDialogWndProcProp = TEXT("SunAwtNativeDialogWndProcProp");
#ifndef WH_MOUSE_LL
#define WH_MOUSE_LL 14
#endif
-// WS_EX_NOACTIVATE is not defined in the headers we build with
-#define AWT_WS_EX_NOACTIVATE 0x08000000L
-
class AwtFrame;
/************************************************************************
@@ -56,6 +54,8 @@
static jfieldID locationByPlatformID;
static jfieldID screenID; /* screen number passed over from WindowPeer */
static jfieldID autoRequestFocusID;
+ static jfieldID securityWarningWidthID;
+ static jfieldID securityWarningHeightID;
// The coordinates at the peer.
static jfieldID sysXID;
@@ -63,6 +63,9 @@
static jfieldID sysWID;
static jfieldID sysHID;
+ static jmethodID getWarningStringMID;
+ static jmethodID calculateSecurityWarningPositionMID;
+
AwtWindow();
virtual ~AwtWindow();
@@ -152,11 +155,12 @@
static void SetModalBlocker(HWND window, HWND blocker);
static void SetAndActivateModalBlocker(HWND window, HWND blocker);
+ static HWND GetTopmostModalBlocker(HWND window);
+
/*
* Windows message handler functions
*/
virtual MsgRouting WmActivate(UINT nState, BOOL fMinimized, HWND opposite);
- static void BounceActivation(void *self); // used by WmActivate
virtual MsgRouting WmCreate();
virtual MsgRouting WmClose();
virtual MsgRouting WmDestroy();
@@ -169,19 +173,36 @@
virtual MsgRouting WmSettingChange(UINT wFlag, LPCTSTR pszSection);
virtual MsgRouting WmNcCalcSize(BOOL fCalcValidRects,
LPNCCALCSIZE_PARAMS lpncsp, LRESULT& retVal);
- virtual MsgRouting WmNcPaint(HRGN hrgn);
virtual MsgRouting WmNcHitTest(UINT x, UINT y, LRESULT& retVal);
virtual MsgRouting WmNcMouseDown(WPARAM hitTest, int x, int y, int button);
virtual MsgRouting WmGetIcon(WPARAM iconType, LRESULT& retVal);
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
virtual MsgRouting WmWindowPosChanging(LPARAM windowPos);
virtual MsgRouting WmWindowPosChanged(LPARAM windowPos);
+ virtual MsgRouting WmTimer(UINT_PTR timerID);
virtual MsgRouting HandleEvent(MSG *msg, BOOL synthetic);
virtual void WindowResized();
+ static jboolean _RequestWindowFocus(void *param);
+
+ virtual BOOL AwtSetActiveWindow(BOOL isMouseEventCause = FALSE, UINT hittest = HTCLIENT);
+
+ // Execute on Toolkit only.
+ INLINE static LRESULT SynthesizeWmActivate(BOOL doActivate, HWND targetHWnd, HWND oppositeHWnd) {
+ if (::IsWindowVisible(targetHWnd)) {
+ return ::SendMessage(targetHWnd, WM_ACTIVATE,
+ MAKEWPARAM(doActivate ? WA_ACTIVE : WA_INACTIVE, FALSE),
+ (LPARAM) oppositeHWnd);
+ }
+ return 1; // if not processed
+ }
+
void moveToDefaultLocation(); /* moves Window to X,Y specified by Window Manger */
+ void UpdateWindow(JNIEnv* env, jintArray data, int width, int height,
+ HBITMAP hNewBitmap = NULL);
+
INLINE virtual BOOL IsTopLevel() { return TRUE; }
static AwtWindow * GetGrabbedWindow() { return m_grabbedWindow; }
@@ -204,11 +225,25 @@
static void _SetModalExcludedNativeProp(void *param);
static void _ModalDisable(void *param);
static void _ModalEnable(void *param);
+ static void _SetOpacity(void* param);
+ static void _SetOpaque(void* param);
+ static void _UpdateWindow(void* param);
+ static void _RepositionSecurityWarning(void* param);
inline static BOOL IsResizing() {
return sm_resizing;
}
+ virtual void CreateHWnd(JNIEnv *env, LPCWSTR title,
+ DWORD windowStyle, DWORD windowExStyle,
+ int x, int y, int w, int h,
+ HWND hWndParent, HMENU hMenu,
+ COLORREF colorForeground, COLORREF colorBackground,
+ jobject peer);
+ virtual void DestroyHWnd();
+
+ static void FocusedWindowChanged(HWND from, HWND to);
+
private:
static int ms_instanceCounter;
static HHOOK ms_hCBTFilter;
@@ -228,6 +263,79 @@
// from its hierarchy when shown. Currently applied to instances of
// javax/swing/Popup$HeavyWeightWindow class.
+ BYTE m_opacity; // The opacity level. == 0xff by default (when opacity mode is disabled)
+ BOOL m_opaque; // Whether the window uses the perpixel translucency (false), or not (true).
+
+ inline BYTE getOpacity() {
+ return m_opacity;
+ }
+ inline void setOpacity(BYTE opacity) {
+ m_opacity = opacity;
+ }
+
+ inline BOOL isOpaque() {
+ return m_opaque;
+ }
+ inline void setOpaque(BOOL opaque) {
+ m_opaque = opaque;
+ }
+
+ CRITICAL_SECTION contentBitmapCS;
+ HBITMAP hContentBitmap;
+ UINT contentWidth;
+ UINT contentHeight;
+
+ void SetTranslucency(BYTE opacity, BOOL opaque);
+ void UpdateWindow(int width, int height, HBITMAP hBitmap);
+ void UpdateWindowImpl(int width, int height, HBITMAP hBitmap);
+ void RedrawWindow();
+
+ static UINT untrustedWindowsCounter;
+
+ WCHAR * warningString;
+
+ // The warning icon
+ HWND warningWindow;
+ // The tooltip that appears when hovering the icon
+ HWND securityTooltipWindow;
+
+ UINT warningWindowWidth;
+ UINT warningWindowHeight;
+ void InitSecurityWarningSize(JNIEnv *env);
+ HICON GetSecurityWarningIcon();
+
+ void CreateWarningWindow(JNIEnv *env);
+ void DestroyWarningWindow();
+ static LPCTSTR GetWarningWindowClassName();
+ void FillWarningWindowClassInfo(WNDCLASS *lpwc);
+ void RegisterWarningWindowClass();
+ void UnregisterWarningWindowClass();
+ static LRESULT CALLBACK WarningWindowProc(
+ HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+ static void PaintWarningWindow(HWND warningWindow);
+ static void PaintWarningWindow(HWND warningWindow, HDC hdc);
+ void RepaintWarningWindow();
+ void CalculateWarningWindowBounds(JNIEnv *env, LPRECT rect);
+
+ void AnimateSecurityWarning(bool enable);
+ UINT securityWarningAnimationStage;
+
+ enum AnimationKind {
+ akNone, akShow, akPreHide, akHide
+ };
+
+ AnimationKind securityAnimationKind;
+
+ void StartSecurityAnimation(AnimationKind kind);
+ void StopSecurityAnimation();
+
+ void RepositionSecurityWarning(JNIEnv *env);
+
+public:
+ void UpdateSecurityWarningVisibility();
+ static bool IsWarningWindow(HWND hWnd);
+
protected:
BOOL m_isResizable;
static AwtWindow* m_grabbedWindow; // Current grabbing window
@@ -236,6 +344,16 @@
BOOL m_iconInherited; /* TRUE if icon is inherited from the owner */
BOOL m_filterFocusAndActivation; /* Used in the WH_CBT hook */
+ //These are used in AwtComponent::CreatePrintedPixels. They are overridden
+ //here to handle non-opaque windows.
+ virtual void FillBackground(HDC hMemoryDC, SIZE &size);
+ virtual void FillAlpha(void *bitmapBits, SIZE &size, BYTE alpha);
+
+ inline BOOL IsUntrusted() {
+ return warningString != NULL;
+ }
+
+ UINT currentWmSizeState;
private:
int m_screenNum;
--- a/jdk/src/windows/native/sun/windows/awtmsg.h Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/src/windows/native/sun/windows/awtmsg.h Mon Apr 27 12:33:57 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -194,6 +194,7 @@
WM_AWT_COMPONENT_SHOW,
WM_AWT_COMPONENT_HIDE,
WM_AWT_COMPONENT_SETFOCUS,
+ WM_AWT_WINDOW_SETACTIVE,
WM_AWT_LIST_SETMULTISELECT,
WM_AWT_HANDLE_EVENT,
WM_AWT_PRINT_COMPONENT,
Binary file jdk/src/windows/native/sun/windows/security_warning.ico has changed
Binary file jdk/src/windows/native/sun/windows/security_warning_bw.ico has changed
Binary file jdk/src/windows/native/sun/windows/security_warning_int.ico has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/awt/SecurityWarning/GetSizeShouldNotReturnZero.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,392 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ @test %W% %E%
+ @bug 6818312
+ @summary The size returned by SecurityWarning.getSize() should not be zero
+ @author anthony.petrov@sun.com: area=awt.toplevel
+ @library ../../../../java/awt/regtesthelpers
+ @build Util
+ @run main GetSizeShouldNotReturnZero
+*/
+
+/**
+ * GetSizeShouldNotReturnZero.java
+ *
+ * summary: The size returned by SecurityWarning.getSize() should not be zero
+ */
+
+import java.awt.*;
+import java.awt.event.*;
+import java.security.Permission;
+import test.java.awt.regtesthelpers.Util;
+import com.sun.awt.SecurityWarning;
+
+public class GetSizeShouldNotReturnZero
+{
+ private static void init()
+ {
+ String[] instructions =
+ {
+ "This is an AUTOMATIC test, simply wait until it is done.",
+ "The result (passed or failed) will be shown in the",
+ "message window below."
+ };
+ Sysout.createDialog( );
+ Sysout.printInstructions( instructions );
+
+
+ // Install the security manager so that all subsequently created
+ // windows display the security warning.
+ System.setSecurityManager(new SecurityManager() {
+
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public boolean checkTopLevelWindow(Object window) {
+ return false;
+ }
+ });
+
+ Frame f = new Frame();
+ f.setSize(100, 100);
+ f.setVisible(true);
+
+ Robot robot = Util.createRobot();
+ Util.waitForIdle(robot);
+
+ Dimension size = SecurityWarning.getSize(f);
+ if (size.width == 0 || size.height == 0) {
+ fail("Reported security warning size: " + size);
+ return;
+ }
+ pass();
+ }//End init()
+
+
+
+ /*****************************************************
+ * Standard Test Machinery Section
+ * DO NOT modify anything in this section -- it's a
+ * standard chunk of code which has all of the
+ * synchronisation necessary for the test harness.
+ * By keeping it the same in all tests, it is easier
+ * to read and understand someone else's test, as
+ * well as insuring that all tests behave correctly
+ * with the test harness.
+ * There is a section following this for test-
+ * classes
+ ******************************************************/
+ private static boolean theTestPassed = false;
+ private static boolean testGeneratedInterrupt = false;
+ private static String failureMessage = "";
+
+ private static Thread mainThread = null;
+
+ private static int sleepTime = 300000;
+
+ // Not sure about what happens if multiple of this test are
+ // instantiated in the same VM. Being static (and using
+ // static vars), it aint gonna work. Not worrying about
+ // it for now.
+ public static void main( String args[] ) throws InterruptedException
+ {
+ mainThread = Thread.currentThread();
+ try
+ {
+ init();
+ }
+ catch( TestPassedException e )
+ {
+ //The test passed, so just return from main and harness will
+ // interepret this return as a pass
+ return;
+ }
+ //At this point, neither test pass nor test fail has been
+ // called -- either would have thrown an exception and ended the
+ // test, so we know we have multiple threads.
+
+ //Test involves other threads, so sleep and wait for them to
+ // called pass() or fail()
+ try
+ {
+ Thread.sleep( sleepTime );
+ //Timed out, so fail the test
+ throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" );
+ }
+ catch (InterruptedException e)
+ {
+ //The test harness may have interrupted the test. If so, rethrow the exception
+ // so that the harness gets it and deals with it.
+ if( ! testGeneratedInterrupt ) throw e;
+
+ //reset flag in case hit this code more than once for some reason (just safety)
+ testGeneratedInterrupt = false;
+
+ if ( theTestPassed == false )
+ {
+ throw new RuntimeException( failureMessage );
+ }
+ }
+
+ }//main
+
+ public static synchronized void setTimeoutTo( int seconds )
+ {
+ sleepTime = seconds * 1000;
+ }
+
+ public static synchronized void pass()
+ {
+ Sysout.println( "The test passed." );
+ Sysout.println( "The test is over, hit Ctl-C to stop Java VM" );
+ //first check if this is executing in main thread
+ if ( mainThread == Thread.currentThread() )
+ {
+ //Still in the main thread, so set the flag just for kicks,
+ // and throw a test passed exception which will be caught
+ // and end the test.
+ theTestPassed = true;
+ throw new TestPassedException();
+ }
+ theTestPassed = true;
+ testGeneratedInterrupt = true;
+ mainThread.interrupt();
+ }//pass()
+
+ public static synchronized void fail()
+ {
+ //test writer didn't specify why test failed, so give generic
+ fail( "it just plain failed! :-)" );
+ }
+
+ public static synchronized void fail( String whyFailed )
+ {
+ Sysout.println( "The test failed: " + whyFailed );
+ Sysout.println( "The test is over, hit Ctl-C to stop Java VM" );
+ //check if this called from main thread
+ if ( mainThread == Thread.currentThread() )
+ {
+ //If main thread, fail now 'cause not sleeping
+ throw new RuntimeException( whyFailed );
+ }
+ theTestPassed = false;
+ testGeneratedInterrupt = true;
+ failureMessage = whyFailed;
+ mainThread.interrupt();
+ }//fail()
+
+}// class GetSizeShouldNotReturnZero
+
+//This exception is used to exit from any level of call nesting
+// when it's determined that the test has passed, and immediately
+// end the test.
+class TestPassedException extends RuntimeException
+{
+}
+
+//*********** End Standard Test Machinery Section **********
+
+
+//************ Begin classes defined for the test ****************
+
+// if want to make listeners, here is the recommended place for them, then instantiate
+// them in init()
+
+/* Example of a class which may be written as part of a test
+class NewClass implements anInterface
+ {
+ static int newVar = 0;
+
+ public void eventDispatched(AWTEvent e)
+ {
+ //Counting events to see if we get enough
+ eventCount++;
+
+ if( eventCount == 20 )
+ {
+ //got enough events, so pass
+
+ GetSizeShouldNotReturnZero.pass();
+ }
+ else if( tries == 20 )
+ {
+ //tried too many times without getting enough events so fail
+
+ GetSizeShouldNotReturnZero.fail();
+ }
+
+ }// eventDispatched()
+
+ }// NewClass class
+
+*/
+
+
+//************** End classes defined for the test *******************
+
+
+
+
+/****************************************************
+ Standard Test Machinery
+ DO NOT modify anything below -- it's a standard
+ chunk of code whose purpose is to make user
+ interaction uniform, and thereby make it simpler
+ to read and understand someone else's test.
+ ****************************************************/
+
+/**
+ This is part of the standard test machinery.
+ It creates a dialog (with the instructions), and is the interface
+ for sending text messages to the user.
+ To print the instructions, send an array of strings to Sysout.createDialog
+ WithInstructions method. Put one line of instructions per array entry.
+ To display a message for the tester to see, simply call Sysout.println
+ with the string to be displayed.
+ This mimics System.out.println but works within the test harness as well
+ as standalone.
+ */
+
+class Sysout
+{
+ private static TestDialog dialog;
+
+ public static void createDialogWithInstructions( String[] instructions )
+ {
+ dialog = new TestDialog( new Frame(), "Instructions" );
+ dialog.printInstructions( instructions );
+ dialog.setVisible(true);
+ println( "Any messages for the tester will display here." );
+ }
+
+ public static void createDialog( )
+ {
+ dialog = new TestDialog( new Frame(), "Instructions" );
+ String[] defInstr = { "Instructions will appear here. ", "" } ;
+ dialog.printInstructions( defInstr );
+ dialog.setVisible(true);
+ println( "Any messages for the tester will display here." );
+ }
+
+
+ public static void printInstructions( String[] instructions )
+ {
+ dialog.printInstructions( instructions );
+ }
+
+
+ public static void println( String messageIn )
+ {
+ dialog.displayMessage( messageIn );
+ System.out.println(messageIn);
+ }
+
+}// Sysout class
+
+/**
+ This is part of the standard test machinery. It provides a place for the
+ test instructions to be displayed, and a place for interactive messages
+ to the user to be displayed.
+ To have the test instructions displayed, see Sysout.
+ To have a message to the user be displayed, see Sysout.
+ Do not call anything in this dialog directly.
+ */
+class TestDialog extends Dialog
+{
+
+ TextArea instructionsText;
+ TextArea messageText;
+ int maxStringLength = 80;
+
+ //DO NOT call this directly, go through Sysout
+ public TestDialog( Frame frame, String name )
+ {
+ super( frame, name );
+ int scrollBoth = TextArea.SCROLLBARS_BOTH;
+ instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
+ add( "North", instructionsText );
+
+ messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
+ add("Center", messageText);
+
+ pack();
+
+ setVisible(true);
+ }// TestDialog()
+
+ //DO NOT call this directly, go through Sysout
+ public void printInstructions( String[] instructions )
+ {
+ //Clear out any current instructions
+ instructionsText.setText( "" );
+
+ //Go down array of instruction strings
+
+ String printStr, remainingStr;
+ for( int i=0; i < instructions.length; i++ )
+ {
+ //chop up each into pieces maxSringLength long
+ remainingStr = instructions[ i ];
+ while( remainingStr.length() > 0 )
+ {
+ //if longer than max then chop off first max chars to print
+ if( remainingStr.length() >= maxStringLength )
+ {
+ //Try to chop on a word boundary
+ int posOfSpace = remainingStr.
+ lastIndexOf( ' ', maxStringLength - 1 );
+
+ if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
+
+ printStr = remainingStr.substring( 0, posOfSpace + 1 );
+ remainingStr = remainingStr.substring( posOfSpace + 1 );
+ }
+ //else just print
+ else
+ {
+ printStr = remainingStr;
+ remainingStr = "";
+ }
+
+ instructionsText.append( printStr + "\n" );
+
+ }// while
+
+ }// for
+
+ }//printInstructions()
+
+ //DO NOT call this directly, go through Sysout
+ public void displayMessage( String messageIn )
+ {
+ messageText.append( messageIn + "\n" );
+ System.out.println(messageIn);
+ }
+
+}// TestDialog class
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/awt/Translucency/TranslucentJAppletTest/TranslucentJAppletTest.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2008-2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test %I% %E%
+ * @bug 6683728
+ * @summary Tests that a JApplet in a translucent JFrame works properly
+ * @author Kenneth.Russell@sun.com: area=Graphics
+ * @compile -XDignore.symbol.file=true TranslucentJAppletTest.java
+ * @run main/manual/othervm TranslucentJAppletTest
+ */
+
+import java.awt.*;
+import java.awt.image.*;
+
+import javax.swing.*;
+
+public class TranslucentJAppletTest {
+
+ private static JFrame frame;
+ private static volatile boolean paintComponentCalled = false;
+
+ private static void initAndShowGUI() {
+ frame = new JFrame();
+ JApplet applet = new JApplet();
+ JPanel panel = new JPanel() {
+ protected void paintComponent(Graphics g) {
+ paintComponentCalled = true;
+ g.setColor(Color.RED);
+ g.fillOval(0, 0, getWidth(), getHeight());
+ }
+ };
+ panel.setDoubleBuffered(false);
+ panel.setOpaque(false);
+ applet.add(panel);
+ frame.add(applet);
+ frame.setBounds(100, 100, 200, 200);
+ frame.setUndecorated(true);
+ com.sun.awt.AWTUtilities.setWindowOpaque(frame, false);
+ frame.setVisible(true);
+ }
+
+ public static void main(String[] args)
+ throws Exception
+ {
+ sun.awt.SunToolkit tk = (sun.awt.SunToolkit)Toolkit.getDefaultToolkit();
+
+ Robot r = new Robot();
+ Color color1 = r.getPixelColor(100, 100); // (0, 0) in frame coordinates
+
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ initAndShowGUI();
+ }
+ });
+ tk.realSync();
+
+ if (!paintComponentCalled) {
+ throw new RuntimeException("Test FAILED: panel's paintComponent() method is not called");
+ }
+
+ Color newColor1 = r.getPixelColor(100, 100);
+ // unfortunately, robot.getPixelColor() doesn't work for some unknown reason
+ // Color newColor2 = r.getPixelColor(200, 200);
+ BufferedImage bim = r.createScreenCapture(new Rectangle(200, 200, 1, 1));
+ Color newColor2 = new Color(bim.getRGB(0, 0));
+
+ // Frame must be transparent at (100, 100) in screen coords
+ if (!color1.equals(newColor1)) {
+ System.err.println("color1 = " + color1);
+ System.err.println("newColor1 = " + newColor1);
+ throw new RuntimeException("Test FAILED: frame pixel at (0, 0) is not transparent");
+ }
+
+ // Frame must be RED at (200, 200) in screen coords
+ if (!newColor2.equals(Color.RED)) {
+ System.err.println("newColor2 = " + newColor2);
+ throw new RuntimeException("Test FAILED: frame pixel at (100, 100) is not red (transparent?)");
+ }
+
+ System.out.println("Test PASSED");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/awt/Translucency/TranslucentShapedFrameTest/TSFrame.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,306 @@
+/*
+ * Copyright 2008-2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import com.sun.awt.AWTUtilities;
+import static com.sun.awt.AWTUtilities.Translucency.*;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Frame;
+import java.awt.Graphics;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsEnvironment;
+import java.awt.RenderingHints;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.awt.Canvas;
+import java.awt.Component;
+import java.awt.GradientPaint;
+import java.awt.Graphics2D;
+import java.awt.Paint;
+import java.util.Random;
+import java.awt.geom.Ellipse2D;
+import javax.swing.JApplet;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
+
+public class TSFrame {
+
+ static volatile boolean done = false;
+
+ static final boolean useSwing = System.getProperty("useswing") != null;
+ static final boolean useShape = System.getProperty("useshape") != null;
+ static final boolean useTransl = System.getProperty("usetransl") != null;
+ static final boolean useNonOpaque = System.getProperty("usenonop") != null;
+
+ static final Random rnd = new Random();
+ private static void render(Graphics g, int w, int h, boolean useNonOpaque) {
+ if (useNonOpaque) {
+ Graphics2D g2d = (Graphics2D)g;
+ GradientPaint p =
+ new GradientPaint(0.0f, 0.0f,
+ new Color(rnd.nextInt(0xffffff)),
+ w, h,
+ new Color(rnd.nextInt(0xff),
+ rnd.nextInt(0xff),
+ rnd.nextInt(0xff), 0),
+ true);
+ g2d.setPaint(p);
+ g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+ RenderingHints.VALUE_ANTIALIAS_ON);
+ g2d.fillOval(0, 0, w, h);
+ } else {
+ g.setColor(new Color(rnd.nextInt(0xffffff)));
+ g.fillRect(0, 0, w, h);
+ }
+ }
+
+ private static class MyCanvas extends Canvas {
+ @Override
+ public void paint(Graphics g) {
+ render(g, getWidth(), getHeight(), false);
+ }
+ @Override
+ public Dimension getPreferredSize() {
+ return new Dimension(200, 100);
+ }
+ }
+ private static class NonOpaqueJFrame extends JFrame {
+ NonOpaqueJFrame(GraphicsConfiguration gc) {
+ super("NonOpaque Swing JFrame", gc);
+ JPanel p = new JPanel() {
+ public void paintComponent(Graphics g) {
+ super.paintComponent(g);
+ render(g, getWidth(), getHeight(), true);
+ g.setColor(Color.red);
+ g.drawString("Non-Opaque Swing JFrame", 10, 15);
+ }
+ };
+ p.setDoubleBuffered(false);
+ p.setOpaque(false);
+ add(p);
+ setUndecorated(true);
+ }
+ }
+ private static class NonOpaqueJAppletFrame extends JFrame {
+ JPanel p;
+ NonOpaqueJAppletFrame(GraphicsConfiguration gc) {
+ super("NonOpaque Swing JAppletFrame", gc);
+ JApplet ja = new JApplet() {
+ public void paint(Graphics g) {
+ super.paint(g);
+ System.err.println("JAppletFrame paint called");
+ }
+ };
+ p = new JPanel() {
+ public void paintComponent(Graphics g) {
+ super.paintComponent(g);
+ render(g, getWidth(), getHeight(), true);
+ g.setColor(Color.red);
+ g.drawString("Non-Opaque Swing JFrame", 10, 15);
+ }
+ };
+ p.setDoubleBuffered(false);
+ p.setOpaque(false);
+ ja.add(p);
+ add(ja);
+ setUndecorated(true);
+ }
+ }
+ private static class NonOpaqueFrame extends Frame {
+ NonOpaqueFrame(GraphicsConfiguration gc) {
+ super("NonOpaque AWT Frame", gc);
+ // uncomment to test with hw child
+// setLayout(null);
+// Component c = new Panel() {
+// public void paint(Graphics g) {
+// g.setColor(new Color(1.0f, 1.0f, 1.0f, 0.5f));
+// g.fillRect(0, 0, getWidth(), getHeight());
+// }
+// };
+// c.setSize(100, 100);
+// c.setBackground(Color.red);
+// c.setForeground(Color.red);
+// add(c);
+// c.setLocation(130, 130);
+ }
+ @Override
+ public void paint(Graphics g) {
+ render(g, getWidth(), getHeight(), true);
+ g.setColor(Color.red);
+ g.drawString("Non-Opaque AWT Frame", 10, 15);
+ }
+ }
+
+ private static class MyJPanel extends JPanel {
+ @Override
+ public void paintComponent(Graphics g) {
+ render(g, getWidth(), getHeight(), false);
+ }
+ }
+
+ public static Frame createGui(GraphicsConfiguration gc,
+ final boolean useSwing,
+ final boolean useShape,
+ final boolean useTransl,
+ final boolean useNonOpaque,
+ final float factor)
+ {
+ Frame frame;
+ done = false;
+
+ if (gc == null) {
+ gc = GraphicsEnvironment.getLocalGraphicsEnvironment().
+ getDefaultScreenDevice().getDefaultConfiguration();
+ }
+
+ if (useNonOpaque) {
+ if (useSwing) {
+ frame = new NonOpaqueJFrame(gc);
+// frame = new NonOpaqueJAppletFrame(gc);
+ } else {
+ frame = new NonOpaqueFrame(gc);
+ }
+ animateComponent(frame);
+ } else if (useSwing) {
+ frame = new JFrame("Swing Frame", gc);
+ JComponent p = new JButton("Swing!");
+ p.setPreferredSize(new Dimension(200, 100));
+ frame.add("North", p);
+ p = new MyJPanel();
+ animateComponent(p);
+ frame.add("Center", p);
+ } else {
+ frame = new Frame("AWT Frame", gc) {
+ public void paint(Graphics g) {
+ g.setColor(Color.red);
+ g.fillRect(0, 0, 100, 100);
+ }
+ };
+ frame.setLayout(new BorderLayout());
+ Canvas c = new MyCanvas();
+ frame.add("North", c);
+ animateComponent(c);
+ c = new MyCanvas();
+ frame.add("Center", c);
+ animateComponent(c);
+ c = new MyCanvas();
+ frame.add("South", c);
+ animateComponent(c);
+ }
+ final Frame finalFrame = frame;
+ frame.addWindowListener(new WindowAdapter() {
+ @Override
+ public void windowClosing(WindowEvent e) {
+ finalFrame.dispose();
+ done = true;
+ }
+ });
+ frame.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ finalFrame.dispose();
+ done = true;
+ }
+ });
+ frame.setPreferredSize(new Dimension(800, 600));
+
+ if (useShape) {
+ frame.setUndecorated(true);
+ }
+
+ frame.setLocation(450, 10);
+ frame.pack();
+
+ if (useShape) {
+ if (AWTUtilities.isTranslucencySupported(PERPIXEL_TRANSPARENT)) {
+ System.out.println("applying PERPIXEL_TRANSPARENT");
+ AWTUtilities.setWindowShape(frame,
+ new Ellipse2D.Double(0, 0, frame.getWidth(),
+ frame.getHeight()/3));
+ frame.setTitle("PERPIXEL_TRANSPARENT");
+ } else {
+ System.out.println("Passed: PERPIXEL_TRANSPARENT unsupported");
+ }
+ }
+ if (useTransl) {
+ if (AWTUtilities.isTranslucencySupported(TRANSLUCENT)) {
+ System.out.println("applying TRANSLUCENT");
+ AWTUtilities.setWindowOpacity(frame, factor);
+ frame.setTitle("TRANSLUCENT");
+ } else {
+ System.out.println("Passed: TRANSLUCENT unsupported");
+ }
+ }
+ if (useNonOpaque) {
+ if (AWTUtilities.isTranslucencySupported(PERPIXEL_TRANSLUCENT) &&
+ AWTUtilities.isTranslucencyCapable(gc))
+ {
+ System.out.println("applying PERPIXEL_TRANSLUCENT");
+ AWTUtilities.setWindowOpaque(frame, false);
+ frame.setTitle("PERPIXEL_TRANSLUCENT");
+ } else {
+ System.out.println("Passed: PERPIXEL_TRANSLUCENT unsupported");
+ }
+ }
+ frame.setVisible(true);
+ return frame;
+ }
+
+ public static void stopThreads() {
+ done = true;
+ }
+
+ private static void animateComponent(final Component comp) {
+ Thread t = new Thread(new Runnable() {
+ public void run() {
+ do {
+ try {
+ Thread.sleep(50);
+ } catch (InterruptedException ex) {}
+ comp.repaint();
+ } while (!done);
+ }
+ });
+ t.start();
+ }
+
+ public static void main(String[] args) throws Exception {
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ TSFrame.createGui(null, useSwing,
+ useShape,
+ useTransl,
+ useNonOpaque,
+ 0.7f);
+ }
+ });
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/awt/Translucency/TranslucentShapedFrameTest/TranslucentShapedFrameTest.form Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,230 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <NonVisualComponents>
+ <Component class="javax.swing.ButtonGroup" name="createDisposeGrp">
+ </Component>
+ </NonVisualComponents>
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ <Property name="title" type="java.lang.String" value="TranslucentShapedFrameTest"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ </AuxValues>
+
+ <Layout>
+ <DimensionLayout dim="0">
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Group type="102" attributes="0">
+ <EmptySpace max="-2" attributes="0"/>
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Group type="102" alignment="0" attributes="0">
+ <Component id="transparencySld" pref="375" max="32767" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
+ </Group>
+ <Component id="jLabel1" alignment="0" min="-2" max="-2" attributes="0"/>
+ <Group type="102" alignment="0" attributes="0">
+ <Component id="shapedCb" min="-2" max="-2" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
+ <Component id="nonOpaqueChb" min="-2" max="-2" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
+ <Component id="useSwingCb" min="-2" max="-2" attributes="0"/>
+ <EmptySpace pref="102" max="32767" attributes="0"/>
+ </Group>
+ <Group type="102" alignment="0" attributes="0">
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Group type="102" alignment="0" attributes="0">
+ <Component id="jLabel2" min="-2" max="-2" attributes="0"/>
+ <EmptySpace pref="314" max="-2" attributes="0"/>
+ </Group>
+ <Group type="102" alignment="0" attributes="0">
+ <Component id="passedBtn" min="-2" max="-2" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
+ <Component id="failedBtn" min="-2" max="-2" attributes="0"/>
+ <EmptySpace pref="241" max="-2" attributes="0"/>
+ </Group>
+ <Component id="jScrollPane1" alignment="1" pref="375" max="32767" attributes="0"/>
+ <Group type="102" alignment="0" attributes="0">
+ <Component id="createFrameBtn" min="-2" pref="187" max="-2" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
+ <Component id="disposeFrameBtn" min="-2" pref="182" max="-2" attributes="0"/>
+ </Group>
+ </Group>
+ <EmptySpace max="-2" attributes="0"/>
+ </Group>
+ </Group>
+ </Group>
+ </Group>
+ </DimensionLayout>
+ <DimensionLayout dim="1">
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Group type="102" alignment="0" attributes="0">
+ <EmptySpace max="-2" attributes="0"/>
+ <Component id="jLabel1" min="-2" max="-2" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
+ <Component id="transparencySld" min="-2" max="-2" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
+ <Group type="103" groupAlignment="3" attributes="0">
+ <Component id="shapedCb" alignment="3" min="-2" max="-2" attributes="0"/>
+ <Component id="nonOpaqueChb" alignment="3" min="-2" max="-2" attributes="0"/>
+ <Component id="useSwingCb" alignment="3" min="-2" max="-2" attributes="0"/>
+ </Group>
+ <EmptySpace max="-2" attributes="0"/>
+ <Group type="103" groupAlignment="3" attributes="0">
+ <Component id="disposeFrameBtn" alignment="3" min="-2" max="-2" attributes="0"/>
+ <Component id="createFrameBtn" alignment="3" min="-2" max="-2" attributes="0"/>
+ </Group>
+ <EmptySpace min="-2" pref="17" max="-2" attributes="0"/>
+ <Component id="jLabel2" min="-2" max="-2" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
+ <Component id="jScrollPane1" min="-2" pref="148" max="-2" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
+ <Group type="103" groupAlignment="3" attributes="0">
+ <Component id="passedBtn" alignment="3" min="-2" max="-2" attributes="0"/>
+ <Component id="failedBtn" alignment="3" min="-2" max="-2" attributes="0"/>
+ </Group>
+ <EmptySpace max="32767" attributes="0"/>
+ </Group>
+ </Group>
+ </DimensionLayout>
+ </Layout>
+ <SubComponents>
+ <Component class="javax.swing.JLabel" name="jLabel1">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Frame Opacity:"/>
+ </Properties>
+ </Component>
+ <Component class="javax.swing.JSlider" name="transparencySld">
+ <Properties>
+ <Property name="majorTickSpacing" type="int" value="10"/>
+ <Property name="minorTickSpacing" type="int" value="5"/>
+ <Property name="paintLabels" type="boolean" value="true"/>
+ <Property name="paintTicks" type="boolean" value="true"/>
+ <Property name="value" type="int" value="100"/>
+ </Properties>
+ <Events>
+ <EventHandler event="stateChanged" listener="javax.swing.event.ChangeListener" parameters="javax.swing.event.ChangeEvent" handler="transparencySldStateChanged"/>
+ </Events>
+ </Component>
+ <Component class="javax.swing.JCheckBox" name="shapedCb">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Shaped Frame"/>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+ <EmptyBorder bottom="0" left="0" right="0" top="0"/>
+ </Border>
+ </Property>
+ <Property name="margin" type="java.awt.Insets" editor="org.netbeans.beaninfo.editors.InsetsEditor">
+ <Insets value="[0, 0, 0, 0]"/>
+ </Property>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="shapedCbActionPerformed"/>
+ </Events>
+ </Component>
+ <Component class="javax.swing.JCheckBox" name="nonOpaqueChb">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Non Opaque Frame"/>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+ <EmptyBorder bottom="0" left="0" right="0" top="0"/>
+ </Border>
+ </Property>
+ <Property name="margin" type="java.awt.Insets" editor="org.netbeans.beaninfo.editors.InsetsEditor">
+ <Insets value="[0, 0, 0, 0]"/>
+ </Property>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="nonOpaqueChbActionPerformed"/>
+ </Events>
+ </Component>
+ <Container class="javax.swing.JScrollPane" name="jScrollPane1">
+ <AuxValues>
+ <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JTextArea" name="jTextArea1">
+ <Properties>
+ <Property name="columns" type="int" value="20"/>
+ <Property name="rows" type="int" value="5"/>
+ <Property name="text" type="java.lang.String" value="Create translucent and/or shaped, or
non-opaque frame. Make sure it behaves
correctly (no artifacts left on the screen
when dragging - if dragging is possible).
Click "Passed" if the test behaves correctly,
"Falied" otherwise."/>
+ </Properties>
+ </Component>
+ </SubComponents>
+ </Container>
+ <Component class="javax.swing.JLabel" name="jLabel2">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Instructions:"/>
+ </Properties>
+ </Component>
+ <Component class="javax.swing.JButton" name="passedBtn">
+ <Properties>
+ <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+ <Color blue="64" green="ff" red="81" type="rgb"/>
+ </Property>
+ <Property name="text" type="java.lang.String" value="Passed"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="passedBtnActionPerformed"/>
+ </Events>
+ </Component>
+ <Component class="javax.swing.JButton" name="failedBtn">
+ <Properties>
+ <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+ <Color blue="0" green="0" id="red" palette="1" red="ff" type="palette"/>
+ </Property>
+ <Property name="text" type="java.lang.String" value="Failed"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="failedBtnActionPerformed"/>
+ </Events>
+ </Component>
+ <Component class="javax.swing.JToggleButton" name="createFrameBtn">
+ <Properties>
+ <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
+ <ComponentRef name="createDisposeGrp"/>
+ </Property>
+ <Property name="text" type="java.lang.String" value="Create Frame"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="createFrameBtnActionPerformed"/>
+ </Events>
+ </Component>
+ <Component class="javax.swing.JToggleButton" name="disposeFrameBtn">
+ <Properties>
+ <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
+ <ComponentRef name="createDisposeGrp"/>
+ </Property>
+ <Property name="selected" type="boolean" value="true"/>
+ <Property name="text" type="java.lang.String" value="Dispose Frame"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="disposeFrameBtnActionPerformed"/>
+ </Events>
+ </Component>
+ <Component class="javax.swing.JCheckBox" name="useSwingCb">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Use JFrame"/>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+ <EmptyBorder bottom="0" left="0" right="0" top="0"/>
+ </Border>
+ </Property>
+ <Property name="margin" type="java.awt.Insets" editor="org.netbeans.beaninfo.editors.InsetsEditor">
+ <Insets value="[0, 0, 0, 0]"/>
+ </Property>
+ </Properties>
+ </Component>
+ </SubComponents>
+</Form>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/awt/Translucency/TranslucentShapedFrameTest/TranslucentShapedFrameTest.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,359 @@
+/*
+ * Copyright 2008-2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test %I% %E%
+ * @bug 6655001 6670649 6687141
+ * @summary Tests that hw acceleration doesn't affect translucent/shaped windows
+ * @author Dmitri.Trembovetski@sun.com: area=Graphics
+ * @compile -XDignore.symbol.file=true TranslucentShapedFrameTest.java
+ * @compile -XDignore.symbol.file=true TSFrame.java
+ * @run main/manual/othervm TranslucentShapedFrameTest
+ * @run main/manual/othervm -Dsun.java2d.noddraw=true TranslucentShapedFrameTest
+ * @run main/manual/othervm -Dsun.java2d.opengl=True TranslucentShapedFrameTest
+ */
+import com.sun.awt.AWTUtilities;
+import static com.sun.awt.AWTUtilities.Translucency.*;
+import java.awt.Frame;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+import java.awt.Shape;
+import java.awt.geom.Ellipse2D;
+import java.util.concurrent.CountDownLatch;
+import javax.swing.JSlider;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
+
+public class TranslucentShapedFrameTest extends javax.swing.JFrame {
+ Frame testFrame;
+ static CountDownLatch done;
+ static volatile boolean failed = false;
+ GraphicsConfiguration gcToUse = null;
+
+ /**
+ * Creates new form TranslucentShapedFrameTest
+ */
+ public TranslucentShapedFrameTest() {
+ // not necessary, but we just look nicer
+ try {
+ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+ } catch (Exception ex) {}
+
+ initComponents();
+ checkEffects();
+
+ SwingUtilities.updateComponentTreeUI(this);
+ }
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ createDisposeGrp = new javax.swing.ButtonGroup();
+ jLabel1 = new javax.swing.JLabel();
+ transparencySld = new javax.swing.JSlider();
+ shapedCb = new javax.swing.JCheckBox();
+ nonOpaqueChb = new javax.swing.JCheckBox();
+ jScrollPane1 = new javax.swing.JScrollPane();
+ jTextArea1 = new javax.swing.JTextArea();
+ jLabel2 = new javax.swing.JLabel();
+ passedBtn = new javax.swing.JButton();
+ failedBtn = new javax.swing.JButton();
+ createFrameBtn = new javax.swing.JToggleButton();
+ disposeFrameBtn = new javax.swing.JToggleButton();
+ useSwingCb = new javax.swing.JCheckBox();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ setTitle("TranslucentShapedFrameTest");
+ jLabel1.setText("Frame Opacity:");
+
+ transparencySld.setMajorTickSpacing(10);
+ transparencySld.setMinorTickSpacing(5);
+ transparencySld.setPaintLabels(true);
+ transparencySld.setPaintTicks(true);
+ transparencySld.setValue(100);
+ transparencySld.addChangeListener(new javax.swing.event.ChangeListener() {
+ public void stateChanged(javax.swing.event.ChangeEvent evt) {
+ transparencySldStateChanged(evt);
+ }
+ });
+
+ shapedCb.setText("Shaped Frame");
+ shapedCb.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
+ shapedCb.setMargin(new java.awt.Insets(0, 0, 0, 0));
+ shapedCb.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ shapedCbActionPerformed(evt);
+ }
+ });
+
+ nonOpaqueChb.setText("Non Opaque Frame");
+ nonOpaqueChb.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
+ nonOpaqueChb.setMargin(new java.awt.Insets(0, 0, 0, 0));
+ nonOpaqueChb.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ nonOpaqueChbActionPerformed(evt);
+ }
+ });
+
+ jTextArea1.setColumns(20);
+ jTextArea1.setRows(5);
+ jTextArea1.setText("Create translucent and/or shaped, or\nnon-opaque frame. Make sure it behaves\ncorrectly (no artifacts left on the screen\nwhen dragging - if dragging is possible).\nClick \"Passed\" if the test behaves correctly,\n\"Falied\" otherwise.");
+ jScrollPane1.setViewportView(jTextArea1);
+
+ jLabel2.setText("Instructions:");
+
+ passedBtn.setBackground(new java.awt.Color(129, 255, 100));
+ passedBtn.setText("Passed");
+ passedBtn.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ passedBtnActionPerformed(evt);
+ }
+ });
+
+ failedBtn.setBackground(java.awt.Color.red);
+ failedBtn.setText("Failed");
+ failedBtn.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ failedBtnActionPerformed(evt);
+ }
+ });
+
+ createDisposeGrp.add(createFrameBtn);
+ createFrameBtn.setText("Create Frame");
+ createFrameBtn.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ createFrameBtnActionPerformed(evt);
+ }
+ });
+
+ createDisposeGrp.add(disposeFrameBtn);
+ disposeFrameBtn.setSelected(true);
+ disposeFrameBtn.setText("Dispose Frame");
+ disposeFrameBtn.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ disposeFrameBtnActionPerformed(evt);
+ }
+ });
+
+ useSwingCb.setText("Use JFrame");
+ useSwingCb.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
+ useSwingCb.setMargin(new java.awt.Insets(0, 0, 0, 0));
+
+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
+ getContentPane().setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addComponent(transparencySld, javax.swing.GroupLayout.DEFAULT_SIZE, 375, Short.MAX_VALUE)
+ .addContainerGap())
+ .addComponent(jLabel1)
+ .addGroup(layout.createSequentialGroup()
+ .addComponent(shapedCb)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(nonOpaqueChb)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(useSwingCb)
+ .addContainerGap(102, Short.MAX_VALUE))
+ .addGroup(layout.createSequentialGroup()
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addComponent(jLabel2)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 314, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGroup(layout.createSequentialGroup()
+ .addComponent(passedBtn)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(failedBtn)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 241, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 375, Short.MAX_VALUE)
+ .addGroup(layout.createSequentialGroup()
+ .addComponent(createFrameBtn, javax.swing.GroupLayout.PREFERRED_SIZE, 187, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(disposeFrameBtn, javax.swing.GroupLayout.PREFERRED_SIZE, 182, javax.swing.GroupLayout.PREFERRED_SIZE)))
+ .addContainerGap())))
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(jLabel1)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(transparencySld, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(shapedCb)
+ .addComponent(nonOpaqueChb)
+ .addComponent(useSwingCb))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(disposeFrameBtn)
+ .addComponent(createFrameBtn))
+ .addGap(17, 17, 17)
+ .addComponent(jLabel2)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 148, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(passedBtn)
+ .addComponent(failedBtn))
+ .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ );
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ private void nonOpaqueChbActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nonOpaqueChbActionPerformed
+ if (testFrame != null) {
+ // REMIND: this path in the test doesn't work well (test bug)
+// AWTUtilities.setWindowOpaque(testFrame, !nonOpaqueChb.isSelected());
+ }
+ }//GEN-LAST:event_nonOpaqueChbActionPerformed
+
+ private void shapedCbActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_shapedCbActionPerformed
+ if (testFrame != null) {
+ Shape s = null;
+ if (shapedCb.isSelected()) {
+ s = new Ellipse2D.Double(0, 0,
+ testFrame.getWidth(),
+ testFrame.getHeight());
+ }
+ AWTUtilities.setWindowShape(testFrame, s);
+ }
+ }//GEN-LAST:event_shapedCbActionPerformed
+
+ private void transparencySldStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_transparencySldStateChanged
+ JSlider source = (JSlider)evt.getSource();
+ int transl = transparencySld.getValue();
+ if (testFrame != null) {
+ AWTUtilities.setWindowOpacity(testFrame, (float)transl/100f);
+ }
+ }//GEN-LAST:event_transparencySldStateChanged
+
+ private void failedBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_failedBtnActionPerformed
+ disposeFrameBtnActionPerformed(evt);
+ dispose();
+ failed = true;
+ done.countDown();
+ }//GEN-LAST:event_failedBtnActionPerformed
+
+ private void disposeFrameBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_disposeFrameBtnActionPerformed
+ TSFrame.stopThreads();
+ if (testFrame != null) {
+ testFrame.dispose();
+ testFrame = null;
+ }
+ }//GEN-LAST:event_disposeFrameBtnActionPerformed
+
+ private void createFrameBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createFrameBtnActionPerformed
+ disposeFrameBtnActionPerformed(evt);
+ int transl = transparencySld.getValue();
+ testFrame = TSFrame.createGui(gcToUse,
+ useSwingCb.isSelected(), shapedCb.isSelected(),
+ (transl < 100), nonOpaqueChb.isSelected(),
+ (float)transl/100f);
+ }//GEN-LAST:event_createFrameBtnActionPerformed
+
+ private void passedBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_passedBtnActionPerformed
+ disposeFrameBtnActionPerformed(evt);
+ dispose();
+ done.countDown();
+ }//GEN-LAST:event_passedBtnActionPerformed
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {
+ done = new CountDownLatch(1);
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ new TranslucentShapedFrameTest().setVisible(true);
+ }
+ });
+ try {
+ done.await();
+ } catch (InterruptedException ex) {}
+ if (failed) {
+ throw new RuntimeException("Test FAILED");
+ }
+ System.out.println("Test PASSED");
+ }
+
+ private void checkEffects() {
+ if (!AWTUtilities.isTranslucencySupported(PERPIXEL_TRANSPARENT)) {
+ shapedCb.setEnabled(false);
+ }
+
+ if (!AWTUtilities.isTranslucencySupported(TRANSLUCENT)) {
+ transparencySld.setEnabled(false);
+ }
+
+ GraphicsConfiguration gc = null;
+ if (AWTUtilities.isTranslucencySupported(PERPIXEL_TRANSLUCENT)) {
+ gc = findGraphicsConfig();
+ if (gc == null) {
+ nonOpaqueChb.setEnabled(false);
+ }
+ }
+
+ gcToUse = gc;
+ }
+
+ private GraphicsConfiguration findGraphicsConfig() {
+ GraphicsDevice gd =
+ GraphicsEnvironment.getLocalGraphicsEnvironment().
+ getDefaultScreenDevice();
+ GraphicsConfiguration gcs[] = gd.getConfigurations();
+ for (GraphicsConfiguration gc : gcs) {
+ if (AWTUtilities.isTranslucencyCapable(gc)) {
+ return gc;
+ }
+ }
+ return null;
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.ButtonGroup createDisposeGrp;
+ private javax.swing.JToggleButton createFrameBtn;
+ private javax.swing.JToggleButton disposeFrameBtn;
+ private javax.swing.JButton failedBtn;
+ private javax.swing.JLabel jLabel1;
+ private javax.swing.JLabel jLabel2;
+ private javax.swing.JScrollPane jScrollPane1;
+ private javax.swing.JTextArea jTextArea1;
+ private javax.swing.JCheckBox nonOpaqueChb;
+ private javax.swing.JButton passedBtn;
+ private javax.swing.JCheckBox shapedCb;
+ private javax.swing.JSlider transparencySld;
+ private javax.swing.JCheckBox useSwingCb;
+ // End of variables declaration//GEN-END:variables
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/awt/Translucency/WindowOpacity.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,461 @@
+/*
+ * Copyright 2008-2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ @test %W% %E%
+ @bug 6594131
+ @summary Tests the AWTUtilities.get/setWindowOpacity() methods
+ @author anthony.petrov@...: area=awt.toplevel
+ @run main WindowOpacity
+*/
+
+import java.awt.*;
+import java.awt.event.*;
+
+import com.sun.awt.AWTUtilities;
+import sun.awt.SunToolkit;
+
+public class WindowOpacity
+{
+ //*** test-writer defined static variables go here ***
+
+ private static void realSync() {
+ ((SunToolkit)Toolkit.getDefaultToolkit()).realSync();
+ }
+
+
+ private static void init()
+ {
+ //*** Create instructions for the user here ***
+ String[] instructions =
+ {
+ "This is an AUTOMATIC test, simply wait until it is done.",
+ "The result (passed or failed) will be shown in the",
+ "message window below."
+ };
+ Sysout.createDialog( );
+ Sysout.printInstructions( instructions );
+
+ if (!AWTUtilities.isTranslucencySupported(AWTUtilities.Translucency.TRANSLUCENT)) {
+ System.out.println("Either the Toolkit or the native system does not support controlling the window opacity level.");
+ pass();
+ }
+
+ boolean passed;
+
+ Frame f = new Frame("Opacity test");
+
+ passed = false;
+ try {
+ AWTUtilities.getWindowOpacity(null);
+ } catch (NullPointerException e) {
+ passed = true;
+ }
+ if (!passed) {
+ fail("getWindowOpacity() allows passing null.");
+ }
+
+
+ passed = false;
+ try {
+ AWTUtilities.setWindowOpacity(null, 0.5f);
+ } catch (NullPointerException e) {
+ passed = true;
+ }
+ if (!passed) {
+ fail("setWindowOpacity() allows passing null.");
+ }
+
+
+ float curOpacity = AWTUtilities.getWindowOpacity(f);
+ if (curOpacity < 1.0f || curOpacity > 1.0f) {
+ fail("getWindowOpacity() reports the initial opacity level other than 1.0: " + curOpacity);
+ }
+
+
+
+ passed = false;
+ try {
+ AWTUtilities.setWindowOpacity(f, -0.5f);
+ } catch (IllegalArgumentException e) {
+ passed = true;
+ }
+ if (!passed) {
+ fail("setWindowOpacity() allows passing negative opacity level.");
+ }
+
+
+
+ passed = false;
+ try {
+ AWTUtilities.setWindowOpacity(f, 1.5f);
+ } catch (IllegalArgumentException e) {
+ passed = true;
+ }
+ if (!passed) {
+ fail("setWindowOpacity() allows passing opacity level greater than 1.0.");
+ }
+
+
+ AWTUtilities.setWindowOpacity(f, 0.5f);
+
+ curOpacity = AWTUtilities.getWindowOpacity(f);
+ if (curOpacity < 0.5f || curOpacity > 0.5f) {
+ fail("getWindowOpacity() reports the opacity level that differs from the value set with setWindowOpacity: " + curOpacity);
+ }
+
+
+ AWTUtilities.setWindowOpacity(f, 0.75f);
+
+ curOpacity = AWTUtilities.getWindowOpacity(f);
+ if (curOpacity < 0.75f || curOpacity > 0.75f) {
+ fail("getWindowOpacity() reports the opacity level that differs from the value set with setWindowOpacity the second time: " + curOpacity);
+ }
+
+
+ f.setBounds(100, 100, 300, 200);
+ f.setVisible(true);
+
+ realSync();
+
+ curOpacity = AWTUtilities.getWindowOpacity(f);
+ if (curOpacity < 0.75f || curOpacity > 0.75f) {
+ fail("getWindowOpacity() reports the opacity level that differs from the value set with setWindowOpacity before showing the frame: " + curOpacity);
+ }
+
+
+
+ AWTUtilities.setWindowOpacity(f, 0.5f);
+ realSync();
+
+ curOpacity = AWTUtilities.getWindowOpacity(f);
+ if (curOpacity < 0.5f || curOpacity > 0.5f) {
+ fail("getWindowOpacity() reports the opacity level that differs from the value set with setWindowOpacity after showing the frame: " + curOpacity);
+ }
+
+ WindowOpacity.pass();
+
+ }//End init()
+
+
+
+ /*****************************************************
+ * Standard Test Machinery Section
+ * DO NOT modify anything in this section -- it's a
+ * standard chunk of code which has all of the
+ * synchronisation necessary for the test harness.
+ * By keeping it the same in all tests, it is easier
+ * to read and understand someone else's test, as
+ * well as insuring that all tests behave correctly
+ * with the test harness.
+ * There is a section following this for test-
+ * classes
+ ******************************************************/
+ private static boolean theTestPassed = false;
+ private static boolean testGeneratedInterrupt = false;
+ private static String failureMessage = "";
+
+ private static Thread mainThread = null;
+
+ private static int sleepTime = 300000;
+
+ // Not sure about what happens if multiple of this test are
+ // instantiated in the same VM. Being static (and using
+ // static vars), it aint gonna work. Not worrying about
+ // it for now.
+ public static void main( String args[] ) throws InterruptedException
+ {
+ mainThread = Thread.currentThread();
+ try
+ {
+ init();
+ }
+ catch( TestPassedException e )
+ {
+ //The test passed, so just return from main and harness will
+ // interepret this return as a pass
+ return;
+ }
+ //At this point, neither test pass nor test fail has been
+ // called -- either would have thrown an exception and ended the
+ // test, so we know we have multiple threads.
+
+ //Test involves other threads, so sleep and wait for them to
+ // called pass() or fail()
+ try
+ {
+ Thread.sleep( sleepTime );
+ //Timed out, so fail the test
+ throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" );
+ }
+ catch (InterruptedException e)
+ {
+ //The test harness may have interrupted the test. If so, rethrow the exception
+ // so that the harness gets it and deals with it.
+ if( ! testGeneratedInterrupt ) throw e;
+
+ //reset flag in case hit this code more than once for some reason (just safety)
+ testGeneratedInterrupt = false;
+
+ if ( theTestPassed == false )
+ {
+ throw new RuntimeException( failureMessage );
+ }
+ }
+
+ }//main
+
+ public static synchronized void setTimeoutTo( int seconds )
+ {
+ sleepTime = seconds * 1000;
+ }
+
+ public static synchronized void pass()
+ {
+ Sysout.println( "The test passed." );
+ Sysout.println( "The test is over, hit Ctl-C to stop Java VM" );
+ //first check if this is executing in main thread
+ if ( mainThread == Thread.currentThread() )
+ {
+ //Still in the main thread, so set the flag just for kicks,
+ // and throw a test passed exception which will be caught
+ // and end the test.
+ theTestPassed = true;
+ throw new TestPassedException();
+ }
+ theTestPassed = true;
+ testGeneratedInterrupt = true;
+ mainThread.interrupt();
+ }//pass()
+
+ public static synchronized void fail()
+ {
+ //test writer didn't specify why test failed, so give generic
+ fail( "it just plain failed! :-)" );
+ }
+
+ public static synchronized void fail( String whyFailed )
+ {
+ Sysout.println( "The test failed: " + whyFailed );
+ Sysout.println( "The test is over, hit Ctl-C to stop Java VM" );
+ //check if this called from main thread
+ if ( mainThread == Thread.currentThread() )
+ {
+ //If main thread, fail now 'cause not sleeping
+ throw new RuntimeException( whyFailed );
+ }
+ theTestPassed = false;
+ testGeneratedInterrupt = true;
+ failureMessage = whyFailed;
+ mainThread.interrupt();
+ }//fail()
+
+}// class WindowOpacity
+
+//This exception is used to exit from any level of call nesting
+// when it's determined that the test has passed, and immediately
+// end the test.
+class TestPassedException extends RuntimeException
+{
+}
+
+//*********** End Standard Test Machinery Section **********
+
+
+//************ Begin classes defined for the test ****************
+
+// if want to make listeners, here is the recommended place for them, then instantiate
+// them in init()
+
+/* Example of a class which may be written as part of a test
+class NewClass implements anInterface
+ {
+ static int newVar = 0;
+
+ public void eventDispatched(AWTEvent e)
+ {
+ //Counting events to see if we get enough
+ eventCount++;
+
+ if( eventCount == 20 )
+ {
+ //got enough events, so pass
+
+ WindowOpacity.pass();
+ }
+ else if( tries == 20 )
+ {
+ //tried too many times without getting enough events so fail
+
+ WindowOpacity.fail();
+ }
+
+ }// eventDispatched()
+
+ }// NewClass class
+
+*/
+
+
+//************** End classes defined for the test *******************
+
+
+
+
+/****************************************************
+ Standard Test Machinery
+ DO NOT modify anything below -- it's a standard
+ chunk of code whose purpose is to make user
+ interaction uniform, and thereby make it simpler
+ to read and understand someone else's test.
+ ****************************************************/
+
+/**
+ This is part of the standard test machinery.
+ It creates a dialog (with the instructions), and is the interface
+ for sending text messages to the user.
+ To print the instructions, send an array of strings to Sysout.createDialog
+ WithInstructions method. Put one line of instructions per array entry.
+ To display a message for the tester to see, simply call Sysout.println
+ with the string to be displayed.
+ This mimics System.out.println but works within the test harness as well
+ as standalone.
+ */
+
+class Sysout
+{
+ private static TestDialog dialog;
+
+ public static void createDialogWithInstructions( String[] instructions )
+ {
+ dialog = new TestDialog( new Frame(), "Instructions" );
+ dialog.printInstructions( instructions );
+ dialog.setVisible(true);
+ println( "Any messages for the tester will display here." );
+ }
+
+ public static void createDialog( )
+ {
+ dialog = new TestDialog( new Frame(), "Instructions" );
+ String[] defInstr = { "Instructions will appear here. ", "" } ;
+ dialog.printInstructions( defInstr );
+ dialog.setVisible(true);
+ println( "Any messages for the tester will display here." );
+ }
+
+
+ public static void printInstructions( String[] instructions )
+ {
+ dialog.printInstructions( instructions );
+ }
+
+
+ public static void println( String messageIn )
+ {
+ dialog.displayMessage( messageIn );
+ System.out.println(messageIn);
+ }
+
+}// Sysout class
+
+/**
+ This is part of the standard test machinery. It provides a place for the
+ test instructions to be displayed, and a place for interactive messages
+ to the user to be displayed.
+ To have the test instructions displayed, see Sysout.
+ To have a message to the user be displayed, see Sysout.
+ Do not call anything in this dialog directly.
+ */
+class TestDialog extends Dialog
+{
+
+ TextArea instructionsText;
+ TextArea messageText;
+ int maxStringLength = 80;
+
+ //DO NOT call this directly, go through Sysout
+ public TestDialog( Frame frame, String name )
+ {
+ super( frame, name );
+ int scrollBoth = TextArea.SCROLLBARS_BOTH;
+ instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
+ add( "North", instructionsText );
+
+ messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
+ add("Center", messageText);
+
+ pack();
+
+ setVisible(true);
+ }// TestDialog()
+
+ //DO NOT call this directly, go through Sysout
+ public void printInstructions( String[] instructions )
+ {
+ //Clear out any current instructions
+ instructionsText.setText( "" );
+
+ //Go down array of instruction strings
+
+ String printStr, remainingStr;
+ for( int i=0; i < instructions.length; i++ )
+ {
+ //chop up each into pieces maxSringLength long
+ remainingStr = instructions[ i ];
+ while( remainingStr.length() > 0 )
+ {
+ //if longer than max then chop off first max chars to print
+ if( remainingStr.length() >= maxStringLength )
+ {
+ //Try to chop on a word boundary
+ int posOfSpace = remainingStr.
+ lastIndexOf( ' ', maxStringLength - 1 );
+
+ if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
+
+ printStr = remainingStr.substring( 0, posOfSpace + 1 );
+ remainingStr = remainingStr.substring( posOfSpace + 1 );
+ }
+ //else just print
+ else
+ {
+ printStr = remainingStr;
+ remainingStr = "";
+ }
+
+ instructionsText.append( printStr + "\n" );
+
+ }// while
+
+ }// for
+
+ }//printInstructions()
+
+ //DO NOT call this directly, go through Sysout
+ public void displayMessage( String messageIn )
+ {
+ messageText.append( messageIn + "\n" );
+ System.out.println(messageIn);
+ }
+
+}// TestDialog class
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/java/swing/plaf/gtk/Test6635110.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ @bug 6635110
+ @summary GTK icons should not throw NPE when called by non-GTK UI
+ @author Peter Zhelezniakov
+ @run main Test6635110
+*/
+
+import com.sun.java.swing.plaf.gtk.GTKLookAndFeel;
+import javax.swing.*;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import javax.swing.plaf.basic.*;
+
+
+public class Test6635110 implements Runnable {
+
+ static final int WIDTH = 160;
+ static final int HEIGHT = 80;
+ final BufferedImage IMAGE =
+ new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB);
+
+ @Override public void run() {
+ JMenu menu = new JMenu("menu");
+ menu.setUI(new BasicMenuUI());
+ paint(menu);
+
+ JToolBar tb = new JToolBar();
+ tb.setFloatable(true);
+ tb.setUI(new BasicToolBarUI());
+ paint(tb);
+ }
+
+ void paint(Component c) {
+ c.setSize(WIDTH, HEIGHT);
+ c.paint(IMAGE.getGraphics());
+ }
+
+ public static void main(String[] args) throws Exception {
+ UIManager.setLookAndFeel(new GTKLookAndFeel());
+ SwingUtilities.invokeAndWait(new Test6635110());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/nio/sctp/MessageInfoTests.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 4927640
+ * @summary Tests the SCTP protocol implementation
+ * @author chegar
+ */
+
+import java.net.SocketAddress;
+import com.sun.nio.sctp.Association;
+import com.sun.nio.sctp.MessageInfo;
+
+public class MessageInfoTests {
+ static final int DEFAULT_STREAM_NUMBER = 14;
+ static final int TEST_STREAM_NUMBER = 15;
+ static final int TEST_PPID = 8;
+ static final long TEST_TTL = 10000L;
+ static final SocketAddress addr = new TestSocketAddress();
+ static final Association assoc = new TestAssociation(1, 1, 1);
+
+ void test(String[] args) {
+ /* TEST 1 : createOutGoing(SocketAddress,int) */
+ MessageInfo info = MessageInfo.createOutgoing(addr,
+ DEFAULT_STREAM_NUMBER);
+ checkDefaults(info);
+ checkGetterSetters(info);
+
+ /* TEST 2 : createOutGoing(Association,SocketAddress,int) */
+ info = MessageInfo.createOutgoing(assoc, addr, DEFAULT_STREAM_NUMBER);
+ checkDefaults(info);
+ check(info.association().equals(assoc), "incorrect association");
+ checkGetterSetters(info);
+
+ /* TEST 3: null values */
+ info = MessageInfo.createOutgoing(null, 0);
+ check(info.address() == null, "address should be null");
+ check(info.association() == null, "association should be null");
+ info = MessageInfo.createOutgoing(assoc, null, 0);
+ check(info.address() == null, "address should be null");
+
+ /* Test 4: IllegalArgumentException */
+ testIAE(new Runnable() {
+ public void run() { MessageInfo.createOutgoing(addr, -1); } });
+ testIAE(new Runnable() {
+ public void run() { MessageInfo.createOutgoing(addr, 65537); } });
+ testIAE(new Runnable() {
+ public void run() { MessageInfo.createOutgoing(null, addr, 0); } });
+ testIAE(new Runnable() {
+ public void run() { MessageInfo.createOutgoing(assoc, addr, -1); } });
+ testIAE(new Runnable() {
+ public void run() { MessageInfo.createOutgoing(assoc, addr, 65537);}});
+
+ final MessageInfo iaeInfo = MessageInfo.createOutgoing(assoc, addr, 0);
+ testIAE(new Runnable() {
+ public void run() { iaeInfo.streamNumber(-1); } });
+ testIAE(new Runnable() {
+ public void run() { iaeInfo.streamNumber(65537); } });
+ }
+
+ /* TEST : unordered = false, timeToLive = 0, complete = true,
+ * payloadProtocolID = 0. */
+ void checkDefaults(MessageInfo info) {
+ check(info.isUnordered() == false, "default unordered value not false");
+ check(info.timeToLive() == 0L, "timeToLive should be 0L");
+ check(info.isComplete() == true, "default complete value not true");
+ check(info.payloadProtocolID() == 0, "default PPID not 0");
+ check(info.bytes() == 0, "default bytes value not 0");
+ check(info.streamNumber() == DEFAULT_STREAM_NUMBER,
+ "incorrect default stream number");
+ check(info.address().equals(addr), "incorrect address");
+ }
+
+ void checkGetterSetters(MessageInfo info) {
+ check(info.streamNumber(TEST_STREAM_NUMBER).streamNumber() ==
+ TEST_STREAM_NUMBER, "stream number not being set correctly");
+
+ check(info.complete(false).isComplete() == false,
+ "complete not being set correctly");
+
+ check(info.unordered(true).isUnordered() == true,
+ "unordered not being set correctly");
+
+ check(info.payloadProtocolID(TEST_PPID).payloadProtocolID() ==
+ TEST_PPID, "PPID not being set correctly");
+
+ check(info.timeToLive(TEST_TTL).timeToLive() == TEST_TTL,
+ "TTL not being set correctly");
+ }
+
+ void testIAE(Runnable runnable) {
+ try {
+ runnable.run();
+ fail("IllegalArgumentException should have been thrown");
+ } catch(IllegalArgumentException iae) {
+ pass();
+ }
+ }
+
+ static class TestSocketAddress extends SocketAddress {}
+
+ static class TestAssociation extends Association {
+ TestAssociation(int assocID, int maxInStreams, int maxOutStreams) {
+ super(assocID, maxInStreams, maxOutStreams);
+ }
+ }
+
+ //--------------------- Infrastructure ---------------------------
+ boolean debug = true;
+ volatile int passed = 0, failed = 0;
+ void pass() {passed++;}
+ void fail() {failed++; Thread.dumpStack();}
+ void fail(String msg) {System.err.println(msg); fail();}
+ void unexpected(Throwable t) {failed++; t.printStackTrace();}
+ void check(boolean cond) {if (cond) pass(); else fail();}
+ void check(boolean cond, String failMessage) {if (cond) pass();
+ else fail(failMessage);}
+ void debug(String message) {if(debug) { System.out.println(message); } }
+ public static void main(String[] args) throws Throwable {
+ Class<?> k = new Object(){}.getClass().getEnclosingClass();
+ try {k.getMethod("instanceMain",String[].class)
+ .invoke( k.newInstance(), (Object) args);}
+ catch (Throwable e) {throw e.getCause();}}
+ public void instanceMain(String[] args) throws Throwable {
+ try {test(args);} catch (Throwable t) {unexpected(t);}
+ System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
+ if (failed > 0) throw new AssertionError("Some tests failed");}
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/nio/sctp/SctpChannel/Bind.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,350 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 4927640
+ * @summary Tests the SCTP protocol implementation
+ * @author chegar
+ */
+
+import java.net.*;
+import java.io.*;
+import java.util.List;
+import java.util.Set;
+import java.util.Iterator;
+import java.nio.ByteBuffer;
+import java.nio.channels.AlreadyBoundException;
+import java.nio.channels.AlreadyConnectedException;
+import java.nio.channels.ClosedChannelException;
+import java.nio.channels.UnsupportedAddressTypeException;
+import com.sun.nio.sctp.AssociationChangeNotification;
+import com.sun.nio.sctp.AbstractNotificationHandler;
+import com.sun.nio.sctp.HandlerResult;
+import com.sun.nio.sctp.IllegalUnbindException;
+import com.sun.nio.sctp.MessageInfo;
+import com.sun.nio.sctp.PeerAddressChangeNotification;
+import com.sun.nio.sctp.SctpChannel;
+import com.sun.nio.sctp.SctpServerChannel;
+import com.sun.nio.sctp.ShutdownNotification;
+import static java.lang.System.out;
+
+/**
+ * Tests bind, bindAddress, unbindAddress, getLocalAddress, and
+ * getAllLocalAddresses.
+ */
+public class Bind {
+ void test(String[] args) {
+ if (!Util.isSCTPSupported()) {
+ out.println("SCTP protocol is not supported");
+ out.println("Test cannot be run");
+ return;
+ }
+
+ /* Simply bind tests */
+ testBind();
+
+ /* Test unconnected */
+ testBindUnbind(false);
+
+ /* Test connected */
+ /* Adding/Removing addresses from a connected association is optional.
+ * This test can be run on systems that support dynamic address
+ * reconfiguration */
+ //testBindUnbind(true);
+ }
+
+ void testBind() {
+ SctpChannel channel = null;
+ try {
+ channel = SctpChannel.open();
+
+ /* TEST 1: empty set if channel is not bound */
+ check(channel.getAllLocalAddresses().isEmpty(),
+ "getAllLocalAddresses returned non empty set for unbound channel");
+
+ /* TEST 2: null to bind the channel to an automatically assigned
+ * socket address */
+ channel.bind(null);
+
+ /* TEST 3: non empty set if the channel is bound */
+ check(!channel.getAllLocalAddresses().isEmpty(),
+ "getAllLocalAddresses returned empty set for bound channel");
+ debug("getAllLocalAddresses on channel bound to the wildcard:\n"
+ + channel.getAllLocalAddresses());
+
+ /* TEST 4: AlreadyBoundException if this channel is already bound */
+ try { channel.bind(null); }
+ catch (AlreadyBoundException unused) { pass(); }
+ catch (IOException ioe) { unexpected(ioe); }
+
+ /* TEST 5: UnsupportedAddressTypeException */
+ try {
+ channel.close(); /* open a new unbound channel for test */
+ channel = SctpChannel.open();
+ channel.bind(new UnsupportedSocketAddress());
+ fail("UnsupportedSocketAddress expected");
+ } catch (UnsupportedAddressTypeException unused) { pass();
+ } catch (IOException ioe) { unexpected(ioe); }
+
+ /* TEST 6: AlreadyConnectedException */
+ try {
+ channel.close(); /* open a new unbound channel for test */
+ channel = SctpChannel.open();
+ connectChannel(channel);
+ channel.bind(null);
+ fail("AlreadyConnectedException expected");
+ } catch (AlreadyConnectedException unused) { pass();
+ } catch (IOException ioe) { unexpected(ioe); }
+
+ /* TEST 7: ClosedChannelException - If this channel is closed */
+ try {
+ channel.close(); /* open a new unbound channel for test */
+ channel = SctpChannel.open();
+ channel.close();
+ channel.bind(null);
+ fail("ClosedChannelException expected");
+ } catch (ClosedChannelException unused) { pass();
+ } catch (IOException ioe) { unexpected(ioe); }
+
+ /* TEST 8: ClosedChannelException if channel is closed */
+ try {
+ channel.getAllLocalAddresses();
+ fail("should have thrown ClosedChannelException");
+ } catch (ClosedChannelException cce) {
+ pass();
+ } catch (Exception ioe) {
+ unexpected(ioe);
+ }
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ } finally {
+ try { channel.close(); }
+ catch (IOException ioe) { unexpected(ioe); }
+ }
+ }
+
+ void testBindUnbind(boolean connected) {
+ SctpChannel channel = null;
+ SctpChannel peerChannel = null;
+
+ debug("testBindUnbind, connected: " + connected);
+ try {
+ channel = SctpChannel.open();
+
+ List<InetAddress> addresses = Util.getAddresses(true, false);
+ Iterator iterator = addresses.iterator();
+ InetSocketAddress a = new InetSocketAddress((InetAddress)iterator.next(), 0);
+ debug("channel.bind( " + a + ")");
+ channel.bind(a);
+ while (iterator.hasNext()) {
+ InetAddress ia = (InetAddress)iterator.next();
+ debug("channel.bindAddress(" + ia + ")");
+ channel.bindAddress(ia);
+ }
+ if (debug) {Util.dumpAddresses(channel, out);}
+
+ if (connected) {
+ /* Test with connected channel */
+ peerChannel = connectChannel(channel);
+ }
+
+ /* TEST 1: bind/unbindAddresses on the system addresses */
+ debug("bind/unbindAddresses on the system addresses");
+ List<InetAddress> addrs = Util.getAddresses(true, false);
+ for (InetAddress addr : addrs) {
+ try {
+ debug("unbindAddress: " + addr);
+ check(boundAddress(channel, addr), "trying to remove address that is not bound");
+ channel.unbindAddress(addr);
+ if (debug) {Util.dumpAddresses(channel, out);}
+ check(!boundAddress(channel, addr), "address was not removed");
+
+ debug("bindAddress: " + addr);
+ channel.bindAddress(addr);
+ if (debug) {Util.dumpAddresses(channel, out);}
+ check(boundAddress(channel, addr), "address is not bound");
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ }
+ }
+
+ /* TEST 2: bindAddress - already bound address. */
+ InetAddress againAddress = addrs.get(0);
+ try {
+ debug("bind already bound address " + againAddress);
+ channel.bindAddress(againAddress);
+ } catch (AlreadyBoundException unused) {
+ debug("Caught AlreadyBoundException - OK");
+ pass();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ }
+
+ /* TEST 3: bind non local address */
+ try {
+ InetAddress nla = InetAddress.getByName("123.123.123.123");
+ debug("bind non local address " + nla);
+ channel.bindAddress(nla);
+ } catch (IOException ioe) {
+ debug("Informative only " + ioe);
+ }
+
+ /* TEST 4: unbind address that is not bound */
+ try {
+ debug("unbind address that is not bound " + againAddress);
+ /* remove address first then again */
+ channel.unbindAddress(againAddress);
+ channel.unbindAddress(againAddress);
+ } catch (IllegalUnbindException unused) {
+ debug("Caught IllegalUnbindException - OK");
+ pass();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ }
+
+ /* TEST 5: unbind address that is not bound */
+ try {
+ InetAddress nla = InetAddress.getByName("123.123.123.123");
+ debug("unbind address that is not bound " + nla);
+ channel.unbindAddress(nla);
+
+ } catch (IllegalUnbindException unused) {
+ debug("Caught IllegalUnbindException - OK");
+ pass();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ }
+
+ if (connected) {
+ channel.shutdown();
+
+ BindNotificationHandler handler = new BindNotificationHandler();
+ ByteBuffer buffer = ByteBuffer.allocate(10);
+ MessageInfo info;
+ while((info = peerChannel.receive(buffer, null, handler)) != null) {
+ if (info != null) {
+ if (info.bytes() == -1) {
+ debug("peerChannel Reached EOF");
+ break;
+ }
+ }
+ }
+
+ while((info = channel.receive(buffer, null, handler)) != null) {
+ if (info != null) {
+ if (info.bytes() == -1) {
+ debug("channel Reached EOF");
+ break;
+ }
+ }
+ }
+ }
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ } finally {
+ try { if (channel != null) channel.close(); }
+ catch (IOException ioe) { unexpected(ioe); }
+ }
+ }
+
+ boolean boundAddress(SctpChannel channel, InetAddress addr)
+ throws IOException {
+ for (SocketAddress boundAddr : channel.getAllLocalAddresses()) {
+ if (((InetSocketAddress) boundAddr).getAddress().equals(addr))
+ return true;
+ }
+ return false;
+ }
+
+ SctpChannel connectChannel(SctpChannel channel)
+ throws IOException {
+ debug("connecting channel...");
+ try {
+ SctpServerChannel ssc = SctpServerChannel.open();
+ ssc.bind(null);
+ Set<SocketAddress> addrs = ssc.getAllLocalAddresses();
+ Iterator<SocketAddress> iterator = addrs.iterator();
+ SocketAddress addr = iterator.next();
+ debug("using " + addr + "...");
+ channel.connect(addr);
+ SctpChannel peerChannel = ssc.accept();
+ ssc.close();
+ debug("connected");
+ return peerChannel;
+ } catch (IOException ioe) {
+ debug("Cannot connect channel");
+ unexpected(ioe);
+ throw ioe;
+ }
+ }
+
+ class BindNotificationHandler extends AbstractNotificationHandler<Object>
+ {
+ @Override
+ public HandlerResult handleNotification(
+ AssociationChangeNotification acn, Object unused)
+ {
+ debug("AssociationChangeNotification: " + acn);
+ return HandlerResult.CONTINUE;
+ }
+
+ @Override
+ public HandlerResult handleNotification(
+ PeerAddressChangeNotification pacn, Object unused)
+ {
+ debug("PeerAddressChangeNotification: " + pacn);
+ return HandlerResult.CONTINUE;
+ }
+
+ @Override
+ public HandlerResult handleNotification(
+ ShutdownNotification sn, Object unused)
+ {
+ debug("ShutdownNotification: " + sn);
+ return HandlerResult.CONTINUE;
+ }
+ }
+
+ class UnsupportedSocketAddress extends SocketAddress { }
+
+ //--------------------- Infrastructure ---------------------------
+ boolean debug = true;
+ volatile int passed = 0, failed = 0;
+ void pass() {passed++;}
+ void fail() {failed++; Thread.dumpStack();}
+ void fail(String msg) {System.err.println(msg); fail();}
+ void unexpected(Throwable t) {failed++; t.printStackTrace();}
+ void check(boolean cond) {if (cond) pass(); else fail();}
+ void check(boolean cond, String failMessage) {if (cond) pass(); else fail(failMessage);}
+ void debug(String message) {if(debug) { System.out.println(message); } }
+ public static void main(String[] args) throws Throwable {
+ Class<?> k = new Object(){}.getClass().getEnclosingClass();
+ try {k.getMethod("instanceMain",String[].class)
+ .invoke( k.newInstance(), (Object) args);}
+ catch (Throwable e) {throw e.getCause();}}
+ public void instanceMain(String[] args) throws Throwable {
+ try {test(args);} catch (Throwable t) {unexpected(t);}
+ System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
+ if (failed > 0) throw new AssertionError("Some tests failed");}
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/nio/sctp/SctpChannel/Connect.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,283 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 4927640
+ * @summary Tests the SCTP protocol implementation
+ * @author chegar
+ */
+
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.io.IOException;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CountDownLatch;
+import java.nio.channels.AlreadyConnectedException;
+import java.nio.channels.ClosedChannelException;
+import java.nio.channels.ConnectionPendingException;
+import java.nio.channels.NoConnectionPendingException;
+import java.nio.channels.UnresolvedAddressException;
+import java.nio.channels.UnsupportedAddressTypeException;
+import com.sun.nio.sctp.SctpChannel;
+import com.sun.nio.sctp.SctpServerChannel;
+import static java.lang.System.out;
+import static java.lang.System.err;
+
+/**
+ * Tests connect, finishConnect, isConnectionPending,
+ * getRemoteAddresses and association.
+ */
+public class Connect {
+ final CountDownLatch finishedLatch = new CountDownLatch(1);
+
+ void test(String[] args) {
+ SocketAddress address = null;
+ Server server = null;
+
+ if (!Util.isSCTPSupported()) {
+ out.println("SCTP protocol is not supported");
+ out.println("Test cannot be run");
+ return;
+ }
+
+ if (args.length == 2) {
+ /* requested to connect to a specific address */
+ try {
+ int port = Integer.valueOf(args[1]);
+ address = new InetSocketAddress(args[0], port);
+ } catch (NumberFormatException nfe) {
+ err.println(nfe);
+ }
+ } else {
+ /* start server on local machine, default */
+ try {
+ server = new Server();
+ server.start();
+ address = server.address();
+ debug("Server started and listening on " + address);
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return;
+ }
+ }
+
+ doTest(address);
+ }
+
+ void doTest(SocketAddress addr) {
+ SctpChannel channel = null;
+ final SocketAddress peerAddress = addr;
+
+ try {
+ channel = SctpChannel.open();
+
+ /* TEST 0.5 Verify default values for new/unconnected channel */
+ check(channel.getRemoteAddresses().isEmpty(),
+ "non empty set for unconnected channel");
+ check(channel.association() == null,
+ "non-null association for unconnected channel");
+ check(!channel.isConnectionPending(),
+ "should not have a connection pending");
+
+ /* TEST 1: non-blocking connect */
+ channel.configureBlocking(false);
+ if (channel.connect(peerAddress) != true) {
+ debug("non-blocking connect did not immediately succeed");
+ check(channel.isConnectionPending(),
+ "should return true for isConnectionPending");
+ try {
+ channel.connect(peerAddress);
+ fail("should have thrown ConnectionPendingException");
+ } catch (ConnectionPendingException cpe) {
+ pass();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ }
+ channel.configureBlocking(true);
+ check(channel.finishConnect(),
+ "finishConnect should have returned true");
+ }
+
+ /* TEST 1.5 Verify after connect */
+ check(!channel.getRemoteAddresses().isEmpty(),
+ "empty set for connected channel");
+ check(channel.association() != null,
+ "null association for connected channel");
+ check(!channel.isConnectionPending(),
+ "pending connection for connected channel");
+
+ /* TEST 2: Verify AlreadyConnectedException thrown */
+ try {
+ channel.connect(peerAddress);
+ fail("should have thrown AlreadyConnectedException");
+ } catch (AlreadyConnectedException unused) {
+ pass();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ }
+
+ /* TEST 3: UnresolvedAddressException */
+ channel.close();
+ channel = SctpChannel.open();
+ InetSocketAddress unresolved =
+ InetSocketAddress.createUnresolved("xxyyzzabc", 4567);
+ try {
+ channel.connect(unresolved);
+ fail("should have thrown UnresolvedAddressException");
+ } catch (UnresolvedAddressException unused) {
+ pass();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ }
+
+ /* TEST 4: UnsupportedAddressTypeException */
+ SocketAddress unsupported = new UnsupportedSocketAddress();
+ try {
+ channel.connect(unsupported);
+ fail("should have thrown UnsupportedAddressTypeException");
+ } catch (UnsupportedAddressTypeException unused) {
+ pass();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ }
+
+ /* TEST 5: ClosedChannelException */
+ channel.close();
+ final SctpChannel closedChannel = channel;
+ testCCE(new Callable<Void>() {
+ public Void call() throws IOException {
+ closedChannel.connect(peerAddress); return null; } });
+
+ /* TEST 5.5 getRemoteAddresses */
+ testCCE(new Callable<Void>() {
+ public Void call() throws IOException {
+ closedChannel.getRemoteAddresses(); return null; } });
+ testCCE(new Callable<Void>() {
+ public Void call() throws IOException {
+ closedChannel.association(); return null; } });
+ check(!channel.isConnectionPending(),
+ "pending connection for closed channel");
+
+ /* Run some more finishConnect tests */
+
+ /* TEST 6: NoConnectionPendingException */
+ channel = SctpChannel.open();
+ try {
+ channel.finishConnect();
+ fail("should have thrown NoConnectionPendingException");
+ } catch (NoConnectionPendingException unused) {
+ pass();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ }
+
+ /* TEST 7: ClosedChannelException */
+ channel.close();
+ final SctpChannel cceChannel = channel;
+ testCCE(new Callable<Void>() {
+ public Void call() throws IOException {
+ cceChannel.finishConnect(); return null; } });
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ } finally {
+ finishedLatch.countDown();
+ try { if (channel != null) channel.close(); }
+ catch (IOException e) { unexpected(e);}
+ }
+ }
+
+ class UnsupportedSocketAddress extends SocketAddress { }
+
+ void testCCE(Callable callable) {
+ try {
+ callable.call();
+ fail("should have thrown ClosedChannelException");
+ } catch (ClosedChannelException cce) {
+ pass();
+ } catch (Exception ioe) {
+ unexpected(ioe);
+ }
+ }
+
+ class Server implements Runnable
+ {
+ final InetSocketAddress serverAddr;
+ private SctpServerChannel ssc;
+
+ public Server() throws IOException {
+ ssc = SctpServerChannel.open().bind(null);
+ java.util.Set<SocketAddress> addrs = ssc.getAllLocalAddresses();
+ if (addrs.isEmpty())
+ debug("addrs should not be empty");
+
+ serverAddr = (InetSocketAddress) addrs.iterator().next();
+ }
+
+ public void start() {
+ (new Thread(this, "Server-" + serverAddr.getPort())).start();
+ }
+
+ public InetSocketAddress address() {
+ return serverAddr;
+ }
+
+ @Override
+ public void run() {
+ SctpChannel sc = null;
+ try {
+ sc = ssc.accept();
+ finishedLatch.await();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ } catch (InterruptedException ie) {
+ unexpected(ie);
+ } finally {
+ try { if (ssc != null) ssc.close(); }
+ catch (IOException ioe) { unexpected(ioe); }
+ try { if (sc != null) sc.close(); }
+ catch (IOException ioe) { unexpected(ioe); }
+ }
+ }
+ }
+
+ //--------------------- Infrastructure ---------------------------
+ boolean debug = true;
+ volatile int passed = 0, failed = 0;
+ void pass() {passed++;}
+ void fail() {failed++; Thread.dumpStack();}
+ void fail(String msg) {System.err.println(msg); fail();}
+ void unexpected(Throwable t) {failed++; t.printStackTrace();}
+ void check(boolean cond) {if (cond) pass(); else fail();}
+ void check(boolean cond, String failMessage) {if (cond) pass(); else fail(failMessage);}
+ void debug(String message) {if(debug) { System.out.println(message); } }
+ public static void main(String[] args) throws Throwable {
+ Class<?> k = new Object(){}.getClass().getEnclosingClass();
+ try {k.getMethod("instanceMain",String[].class)
+ .invoke( k.newInstance(), (Object) args);}
+ catch (Throwable e) {throw e.getCause();}}
+ public void instanceMain(String[] args) throws Throwable {
+ try {test(args);} catch (Throwable t) {unexpected(t);}
+ System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
+ if (failed > 0) throw new AssertionError("Some tests failed");}
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/nio/sctp/SctpChannel/Receive.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,361 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 4927640
+ * @summary Tests the SCTP protocol implementation
+ * @author chegar
+ */
+
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.io.IOException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.nio.ByteBuffer;
+import java.nio.channels.NotYetConnectedException;
+import java.nio.channels.ClosedChannelException;
+import com.sun.nio.sctp.AbstractNotificationHandler;
+import com.sun.nio.sctp.AssociationChangeNotification;
+import com.sun.nio.sctp.AssociationChangeNotification.AssocChangeEvent;
+import com.sun.nio.sctp.HandlerResult;
+import com.sun.nio.sctp.IllegalReceiveException;
+import com.sun.nio.sctp.MessageInfo;
+import com.sun.nio.sctp.Notification;
+import com.sun.nio.sctp.SctpChannel;
+import com.sun.nio.sctp.SctpServerChannel;
+import com.sun.nio.sctp.ShutdownNotification;
+import static java.lang.System.out;
+import static java.lang.System.err;
+
+public class Receive {
+ /* Latches used to synchronize between the client and server so that
+ * connections without any IO may not be closed without being accepted */
+ final CountDownLatch clientFinishedLatch = new CountDownLatch(1);
+ final CountDownLatch serverFinishedLatch = new CountDownLatch(1);
+
+ /* Used to verify that the ppid is being sent and received correctly */
+ static final int PPID = 5;
+
+ void test(String[] args) {
+ SocketAddress address = null;
+ Server server;
+
+
+ if (!Util.isSCTPSupported()) {
+ out.println("SCTP protocol is not supported");
+ out.println("Test cannot be run");
+ return;
+ }
+
+ if (args.length == 2) {
+ /* requested to connecct to a specific address */
+ try {
+ int port = Integer.valueOf(args[1]);
+ address = new InetSocketAddress(args[0], port);
+ } catch (NumberFormatException nfe) {
+ err.println(nfe);
+ }
+ } else {
+ /* start server on local machine, default */
+ try {
+ server = new Server();
+ server.start();
+ address = server.address();
+ debug("Server started and listening on " + address);
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return;
+ }
+ }
+
+ doTest(address);
+ }
+
+ void doTest(SocketAddress peerAddress) {
+ SctpChannel channel = null;
+ ByteBuffer buffer = ByteBuffer.allocate(Util.LARGE_BUFFER);
+ MessageInfo info;
+
+ try {
+ channel = SctpChannel.open();
+ ReceiveNotificationHandler handler =
+ new ReceiveNotificationHandler(channel);
+
+ /* TEST 1: Verify NotYetConnectedException thrown */
+ try {
+ channel.receive(buffer, null, handler);
+ fail("should have thrown NotYetConnectedException");
+ } catch (NotYetConnectedException unused) {
+ pass();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ }
+
+ channel.connect(peerAddress);
+
+ /* TEST 2: receive small message */
+ do {
+ debug("Test 2: invoking receive");
+ info = channel.receive(buffer, null, handler);
+ if (info == null) {
+ fail("unexpected null from receive");
+ return;
+ }
+ } while (!info.isComplete());
+
+ buffer.flip();
+ check(handler.receivedCommUp(), "SCTP_COMM_UP not received");
+ check(info != null, "info is null");
+ check(info.address() != null, "address is null");
+ check(info.association() != null, "association is null");
+ check(info.isComplete(), "message is not complete");
+ check(info.isUnordered() != true,
+ "message should not be unordered");
+ check(info.streamNumber() >= 0, "invalid stream number");
+ check(info.payloadProtocolID() == PPID, "PPID incorrect");
+ check(info.bytes() == Util.SMALL_MESSAGE.getBytes("ISO-8859-1").
+ length, "bytes received not equal to message length");
+ check(info.bytes() == buffer.remaining(), "bytes != remaining");
+ check(Util.compare(buffer, Util.SMALL_MESSAGE),
+ "received message not the same as sent message");
+
+ buffer.clear();
+
+ /* TEST 3: receive large message */
+ do {
+ debug("Test 3: invoking receive");
+ info = channel.receive(buffer, null, handler);
+ if (info == null) {
+ fail("unexpected null from receive");
+ return;
+ }
+ } while (!info.isComplete());
+
+ buffer.flip();
+ check(info != null, "info is null");
+ check(info.address() != null, "address is null");
+ check(info.association() != null, "association is null");
+ check(info.isComplete(), "message is not complete");
+ check(info.isUnordered() != true,
+ "message should not be unordered");
+ check(info.streamNumber() >= 0, "invalid stream number");
+ check(info.bytes() == Util.LARGE_MESSAGE.getBytes("ISO-8859-1").
+ length, "bytes received not equal to message length");
+ check(info.bytes() == buffer.remaining(), "bytes != remaining");
+ check(Util.compare(buffer, Util.LARGE_MESSAGE),
+ "received message not the same as sent message");
+
+ buffer.clear();
+
+ /* TEST 4: EOF */
+ buffer.clear(); // buffer position 0
+ info = channel.receive(buffer,null, handler);
+ check(info != null, "info is null");
+ check(info.bytes() == -1, "should have received EOF");
+ check(buffer.position() == 0, "buffer position should be unchanged");
+
+ /* TEST 5: ClosedChannelException */
+ channel.close();
+ try {
+ channel.receive(buffer, null, null);
+ fail("should have thrown ClosedChannelException");
+ } catch (ClosedChannelException cce) {
+ pass();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ }
+ handler = null;
+
+ /* TEST 6: handler returns RETURN after handling a notification */
+ ReceiveNotificationHandler handler2 =
+ new ReceiveNotificationHandler(null); /* HandlerResult.RETURN */
+ channel = SctpChannel.open(peerAddress, 0, 0);
+ info = channel.receive(buffer, null, handler2);
+ check(info == null, "channel should return null");
+ check(handler2.receivedCommUp(), "SCTP_COMM_UP not received");
+ check(buffer.position() == 0, "buffer position should be unchanged");
+
+ /* TEST 7: Non blocking channel return null if no data */
+ channel.configureBlocking(false);
+ info = channel.receive(buffer, null, null);
+ check(info == null, "non-blocking channel should return null");
+ check(buffer.position() == 0, "buffer position should be unchanged");
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ } finally {
+ clientFinishedLatch.countDown();
+ try { serverFinishedLatch.await(10L, TimeUnit.SECONDS); }
+ catch (InterruptedException ie) { unexpected(ie); }
+ if (channel != null) {
+ try { channel.close(); }
+ catch (IOException e) { unexpected (e);}
+ }
+ }
+ }
+
+ class Server implements Runnable
+ {
+ final InetSocketAddress serverAddr;
+ private SctpServerChannel ssc;
+
+ public Server() throws IOException {
+ ssc = SctpServerChannel.open().bind(null);
+ java.util.Set<SocketAddress> addrs = ssc.getAllLocalAddresses();
+ if (addrs.isEmpty())
+ debug("addrs should not be empty");
+
+ serverAddr = (InetSocketAddress) addrs.iterator().next();
+ }
+
+ public void start() {
+ (new Thread(this, "Server-" + serverAddr.getPort())).start();
+ }
+
+ public InetSocketAddress address() {
+ return serverAddr;
+ }
+
+ @Override
+ public void run() {
+ try {
+ SctpChannel sc = ssc.accept();
+
+ /* send a small message */
+ MessageInfo info = MessageInfo.createOutgoing(null, 0)
+ .payloadProtocolID(PPID);
+ ByteBuffer buf = ByteBuffer.allocateDirect(Util.SMALL_BUFFER);
+ buf.put(Util.SMALL_MESSAGE.getBytes("ISO-8859-1"));
+ buf.flip();
+
+ debug("sending small message: " + buf);
+ sc.send(buf, info);
+
+ /* send a large message */
+ buf = ByteBuffer.allocateDirect(Util.LARGE_BUFFER);
+ buf.put(Util.LARGE_MESSAGE.getBytes("ISO-8859-1"));
+ buf.flip();
+
+ debug("sending large message: " + buf);
+ sc.send(buf, info);
+ sc.shutdown();
+ debug("shutdown");
+ ReceiveNotificationHandler handler =
+ new ReceiveNotificationHandler(sc);
+ sc.receive(buf, null, handler);
+ sc.close();
+
+ /* accept another socket for the TEST 6 */
+ sc = ssc.accept();
+ ssc.close();
+
+ clientFinishedLatch.await(10L, TimeUnit.SECONDS);
+ serverFinishedLatch.countDown();
+ sc.close();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ } catch (InterruptedException ie) {
+ unexpected(ie);
+ }
+ }
+ }
+
+ class ReceiveNotificationHandler extends AbstractNotificationHandler<Object>
+ {
+ SctpChannel channel;
+ boolean receivedCommUp; // false
+
+ public ReceiveNotificationHandler(SctpChannel channel) {
+ this.channel = channel;
+ }
+
+ public boolean receivedCommUp() {
+ return receivedCommUp;
+ }
+
+ @Override
+ public HandlerResult handleNotification(
+ Notification notification, Object attachment) {
+ fail("Unknown notification type");
+ return HandlerResult.CONTINUE;
+ }
+
+ @Override
+ public HandlerResult handleNotification(
+ AssociationChangeNotification notification, Object attachment) {
+ AssocChangeEvent event = notification.event();
+ debug("AssociationChangeNotification");
+ debug(" Association: " + notification.association());
+ debug(" Event: " + event);
+
+ if (event.equals(AssocChangeEvent.COMM_UP))
+ receivedCommUp = true;
+
+ if (channel == null)
+ return HandlerResult.RETURN;
+
+ /* TEST 4: IllegalReceiveException - If the given handler invokes
+ * the receive method of this channel*/
+ ByteBuffer buffer = ByteBuffer.allocate(10);
+ try {
+ channel.receive(buffer, null, this);
+ fail("IllegalReceiveException expected");
+ } catch (IllegalReceiveException unused) {
+ pass();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ }
+
+ return HandlerResult.CONTINUE;
+ }
+
+ @Override
+ public HandlerResult handleNotification(
+ ShutdownNotification notification, Object attachment) {
+ debug("ShutdownNotification");
+ debug(" Association: " + notification.association());
+ return HandlerResult.CONTINUE;
+ }
+ }
+ //--------------------- Infrastructure ---------------------------
+ boolean debug = true;
+ volatile int passed = 0, failed = 0;
+ void pass() {passed++;}
+ void fail() {failed++; Thread.dumpStack();}
+ void fail(String msg) {System.err.println(msg); fail();}
+ void unexpected(Throwable t) {failed++; t.printStackTrace();}
+ void check(boolean cond) {if (cond) pass(); else fail();}
+ void check(boolean cond, String failMessage) {if (cond) pass(); else fail(failMessage);}
+ void debug(String message) {if(debug) {
+ System.out.println(Thread.currentThread() + " " + message); } }
+ public static void main(String[] args) throws Throwable {
+ Class<?> k = new Object(){}.getClass().getEnclosingClass();
+ try {k.getMethod("instanceMain",String[].class)
+ .invoke( k.newInstance(), (Object) args);}
+ catch (Throwable e) {throw e.getCause();}}
+ public void instanceMain(String[] args) throws Throwable {
+ try {test(args);} catch (Throwable t) {unexpected(t);}
+ System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
+ if (failed > 0) throw new AssertionError("Some tests failed");}
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/nio/sctp/SctpChannel/Send.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,419 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 4927640
+ * @summary Tests the SCTP protocol implementation
+ * @author chegar
+ */
+
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.io.IOException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.nio.ByteBuffer;
+import java.nio.channels.NotYetConnectedException;
+import java.nio.channels.ClosedChannelException;
+import com.sun.nio.sctp.AbstractNotificationHandler;
+import com.sun.nio.sctp.Association;
+import com.sun.nio.sctp.AssociationChangeNotification;
+import com.sun.nio.sctp.AssociationChangeNotification.AssocChangeEvent;
+import com.sun.nio.sctp.HandlerResult;
+import com.sun.nio.sctp.InvalidStreamException;
+import com.sun.nio.sctp.MessageInfo;
+import com.sun.nio.sctp.Notification;
+import com.sun.nio.sctp.SctpChannel;
+import com.sun.nio.sctp.SctpServerChannel;
+import static java.lang.System.out;
+import static java.lang.System.err;
+
+public class Send {
+ /* Latches used to synchronize between the client and server so that
+ * connections without any IO may not be closed without being accepted */
+ final CountDownLatch clientFinishedLatch = new CountDownLatch(1);
+ final CountDownLatch serverFinishedLatch = new CountDownLatch(1);
+
+ SendNotificationHandler handler = new SendNotificationHandler();
+
+ void test(String[] args) {
+ SocketAddress address = null;
+ Server server = null;
+
+ if (!Util.isSCTPSupported()) {
+ out.println("SCTP protocol is not supported");
+ out.println("Test cannot be run");
+ return;
+ }
+
+ if (args.length == 2) {
+ /* requested to connecct to a specific address */
+ try {
+ int port = Integer.valueOf(args[1]);
+ address = new InetSocketAddress(args[0], port);
+ } catch (NumberFormatException nfe) {
+ err.println(nfe);
+ }
+ } else {
+ /* start server on local machine, default */
+ try {
+ server = new Server();
+ server.start();
+ address = server.address();
+ debug("Server started and listening on " + address);
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return;
+ }
+ }
+
+ doTest(address);
+ }
+
+ void doTest(SocketAddress peerAddress) {
+ SctpChannel channel = null;
+ ByteBuffer buffer = ByteBuffer.allocate(Util.LARGE_BUFFER);
+ MessageInfo info = MessageInfo.createOutgoing(null, 0);
+
+ try {
+ channel = SctpChannel.open();
+
+ /* TEST 1: Verify NotYetConnectedException thrown */
+ try {
+ channel.send(buffer, info);
+ fail("should have thrown NotYetConnectedException");
+ } catch (NotYetConnectedException unused) {
+ pass();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ }
+
+ channel.connect(peerAddress);
+ /* Receive CommUp */
+ channel.receive(buffer, null, handler);
+
+ /* save for TEST 8 */
+ Association association = channel.association();
+
+ /* TEST 2: send small message */
+ int streamNumber = 0;
+ debug("sending on stream number: " + streamNumber);
+ info = MessageInfo.createOutgoing(null, streamNumber);
+ buffer.put(Util.SMALL_MESSAGE.getBytes("ISO-8859-1"));
+ buffer.flip();
+ int position = buffer.position();
+ int remaining = buffer.remaining();
+
+ debug("sending small message: " + buffer);
+ int sent = channel.send(buffer, info);
+
+ check(sent == remaining, "sent should be equal to remaining");
+ check(buffer.position() == (position + sent),
+ "buffers position should have been incremented by sent");
+
+ buffer.clear();
+
+ /* TEST 3: send large message */
+ streamNumber = handler.maxOutStreams() - 1;
+ debug("sending on stream number: " + streamNumber);
+ info = MessageInfo.createOutgoing(null, streamNumber);
+ buffer.put(Util.LARGE_MESSAGE.getBytes("ISO-8859-1"));
+ buffer.flip();
+ position = buffer.position();
+ remaining = buffer.remaining();
+
+ debug("sending large message: " + buffer);
+ sent = channel.send(buffer, info);
+
+ check(sent == remaining, "sent should be equal to remaining");
+ check(buffer.position() == (position + sent),
+ "buffers position should have been incremented by sent");
+
+ /* TEST 4: InvalidStreamExcepton */
+ streamNumber = handler.maxInStreams;
+ info = MessageInfo.createOutgoing(null, streamNumber);
+ buffer.clear();
+ buffer.put(Util.SMALL_MESSAGE.getBytes("ISO-8859-1"));
+ buffer.flip();
+ position = buffer.position();
+ remaining = buffer.remaining();
+
+ debug("sending on stream number: " + streamNumber);
+ debug("sending small message: " + buffer);
+ try {
+ sent = channel.send(buffer, info);
+ fail("should have thrown InvalidStreamExcepton");
+ } catch (InvalidStreamException ise){
+ pass();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ }
+ check(buffer.remaining() == remaining,
+ "remaining should not be changed");
+ check(buffer.position() == position,
+ "buffers position should not be changed");
+
+ /* TEST 5: Non blocking send should return zero if there is
+ insufficient room in the underlying output buffer */
+ buffer.clear();
+ channel.configureBlocking(false);
+ info = MessageInfo.createOutgoing(null, 1);
+ buffer.put(Util.LARGE_MESSAGE.getBytes("ISO-8859-1"));
+ buffer.flip();
+
+ int count = 0; // do not loop forever
+ do {
+ position = buffer.position();
+ remaining = buffer.remaining();
+ debug("sending large message: " + buffer);
+ sent = channel.send(buffer, info);
+ if (sent == 0) {
+ check(buffer.remaining() == remaining,
+ "remaining should not be changed");
+ check(buffer.position() == position,
+ "buffers position should not be changed");
+ }
+ buffer.rewind();
+ } while (sent != 0 && count++ < 100);
+
+ /* TEST 6: ClosedChannelException */
+ channel.close();
+ try {
+ channel.send(buffer, info);
+ fail("should have thrown ClosedChannelException");
+ } catch (ClosedChannelException cce) {
+ pass();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ }
+
+ /* TEST 7: send without previous receive.
+ * Verify that send can still throw InvalidStreamExcepton */
+ debug("Opening new channel.");
+ channel = SctpChannel.open(peerAddress, 0, 0);
+ streamNumber = Short.MAX_VALUE - 1;
+ info = MessageInfo.createOutgoing(null, streamNumber);
+ buffer.clear();
+ buffer.put(Util.SMALL_MESSAGE.getBytes("ISO-8859-1"));
+ buffer.flip();
+ position = buffer.position();
+ remaining = buffer.remaining();
+
+ debug("sending on stream number: " + streamNumber);
+ debug("sending small message: " + buffer);
+ try {
+ sent = channel.send(buffer, info);
+ fail("should have thrown InvalidStreamExcepton");
+ } catch (InvalidStreamException ise){
+ pass();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ }
+ check(buffer.remaining() == remaining,
+ "remaining should not be changed");
+ check(buffer.position() == position,
+ "buffers position should not be changed");
+
+ /* Receive CommUp */
+ channel.receive(buffer, null, handler);
+ check(handler.receivedCommUp(), "should have received COMM_UP");
+
+ /* TEST 8: Send to an invalid preferred SocketAddress */
+ SocketAddress addr = new InetSocketAddress("123.123.123.123", 3456);
+ info = MessageInfo.createOutgoing(addr, 0);
+ debug("sending to " + addr);
+ debug("sending small message: " + buffer);
+ try {
+ sent = channel.send(buffer, info);
+ fail("Invalid address should have thrown an Exception.");
+ } catch (Exception e){
+ pass();
+ debug("OK, caught " + e);
+ }
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ } finally {
+ clientFinishedLatch.countDown();
+ try { serverFinishedLatch.await(10L, TimeUnit.SECONDS); }
+ catch (InterruptedException ie) { unexpected(ie); }
+ if (channel != null) {
+ try { channel.close(); }
+ catch (IOException e) { unexpected (e);}
+ }
+ }
+ }
+
+ class Server implements Runnable
+ {
+ final InetSocketAddress serverAddr;
+ private SctpServerChannel ssc;
+
+ public Server() throws IOException {
+ ssc = SctpServerChannel.open().bind(null);
+ java.util.Set<SocketAddress> addrs = ssc.getAllLocalAddresses();
+ if (addrs.isEmpty())
+ debug("addrs should not be empty");
+
+ serverAddr = (InetSocketAddress) addrs.iterator().next();
+ }
+
+ public void start() {
+ (new Thread(this, "Server-" + serverAddr.getPort())).start();
+ }
+
+ public InetSocketAddress address() {
+ return serverAddr;
+ }
+
+ @Override
+ public void run() {
+ ByteBuffer buffer = ByteBuffer.allocateDirect(Util.LARGE_BUFFER);
+ SctpChannel sc1 = null, sc2 = null;
+ try {
+ sc1 = ssc.accept();
+
+ /* receive a small message */
+ MessageInfo info;
+ do {
+ info = sc1.receive(buffer, null, null);
+ if (info == null) {
+ fail("Server: unexpected null from receive");
+ return;
+ }
+ } while (!info.isComplete());
+
+ buffer.flip();
+ check(info != null, "info is null");
+ check(info.streamNumber() == 0,
+ "message not sent on the correct stream");
+ check(info.bytes() == Util.SMALL_MESSAGE.getBytes("ISO-8859-1").
+ length, "bytes received not equal to message length");
+ check(info.bytes() == buffer.remaining(), "bytes != remaining");
+ check(Util.compare(buffer, Util.SMALL_MESSAGE),
+ "received message not the same as sent message");
+
+ /* receive a large message */
+ buffer.clear();
+ do {
+ info = sc1.receive(buffer, null, null);
+ if (info == null) {
+ fail("Server: unexpected null from receive");
+ return;
+ }
+ } while (!info.isComplete());
+
+ buffer.flip();
+ check(info != null, "info is null");
+ check(info.streamNumber() == handler.maxOutStreams() - 1,
+ "message not sent on the correct stream");
+ check(info.bytes() == Util.LARGE_MESSAGE.getBytes("ISO-8859-1").
+ length, "bytes received not equal to message length");
+ check(info.bytes() == buffer.remaining(), "bytes != remaining");
+ check(Util.compare(buffer, Util.LARGE_MESSAGE),
+ "received message not the same as sent message");
+
+ /* TEST 7 ++ */
+ sc2 = ssc.accept();
+
+ clientFinishedLatch.await(10L, TimeUnit.SECONDS);
+ serverFinishedLatch.countDown();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ } catch (InterruptedException ie) {
+ unexpected(ie);
+ } finally {
+ try { if (ssc != null) ssc.close(); }
+ catch (IOException unused) {}
+ try { if (sc1 != null) sc1.close(); }
+ catch (IOException unused) {}
+ try { if (sc2 != null) sc2.close(); }
+ catch (IOException unused) {}
+ }
+ }
+ }
+
+ class SendNotificationHandler extends AbstractNotificationHandler<Void>
+ {
+ boolean receivedCommUp; // false
+ int maxInStreams;
+ int maxOutStreams;
+
+ public boolean receivedCommUp() {
+ return receivedCommUp;
+ }
+
+ public int maxInStreams() {
+ return maxInStreams;
+ }
+
+ public int maxOutStreams(){
+ return maxOutStreams;
+ }
+
+ @Override
+ public HandlerResult handleNotification(
+ Notification notification, Void attachment) {
+ fail("Unknown notification type");
+ return HandlerResult.CONTINUE;
+ }
+
+ @Override
+ public HandlerResult handleNotification(
+ AssociationChangeNotification notification, Void attachment) {
+ AssocChangeEvent event = notification.event();
+ Association association = notification.association();
+ debug("AssociationChangeNotification");
+ debug(" Association: " + notification.association());
+ debug(" Event: " + event);
+
+ if (event.equals(AssocChangeEvent.COMM_UP))
+ receivedCommUp = true;
+
+ this.maxInStreams = association.maxInboundStreams();
+ this.maxOutStreams = association.maxOutboundStreams();
+
+ return HandlerResult.RETURN;
+ }
+ }
+
+ //--------------------- Infrastructure ---------------------------
+ boolean debug = true;
+ volatile int passed = 0, failed = 0;
+ void pass() {passed++;}
+ void fail() {failed++; Thread.dumpStack();}
+ void fail(String msg) {System.err.println(msg); fail();}
+ void unexpected(Throwable t) {failed++; t.printStackTrace();}
+ void check(boolean cond) {if (cond) pass(); else fail();}
+ void check(boolean cond, String failMessage) {if (cond) pass(); else fail(failMessage);}
+ void debug(String message) {if(debug) { System.out.println(message); } }
+ public static void main(String[] args) throws Throwable {
+ Class<?> k = new Object(){}.getClass().getEnclosingClass();
+ try {k.getMethod("instanceMain",String[].class)
+ .invoke( k.newInstance(), (Object) args);}
+ catch (Throwable e) {throw e.getCause();}}
+ public void instanceMain(String[] args) throws Throwable {
+ try {test(args);} catch (Throwable t) {unexpected(t);}
+ System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
+ if (failed > 0) throw new AssertionError("Some tests failed");}
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/nio/sctp/SctpChannel/Shutdown.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,274 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 4927640
+ * @summary Tests the SCTP protocol implementation
+ * @author chegar
+ */
+
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.io.IOException;
+import java.util.concurrent.CountDownLatch;
+import java.nio.ByteBuffer;
+import java.nio.channels.ClosedChannelException;
+import java.nio.channels.NotYetConnectedException;
+import com.sun.nio.sctp.AbstractNotificationHandler;
+import com.sun.nio.sctp.HandlerResult;
+import com.sun.nio.sctp.MessageInfo;
+import com.sun.nio.sctp.SctpChannel;
+import com.sun.nio.sctp.SctpServerChannel;
+import com.sun.nio.sctp.ShutdownNotification;
+import static java.lang.System.out;
+import static java.lang.System.err;
+
+public class Shutdown {
+ static CountDownLatch finishedLatch = new CountDownLatch(1);
+ static CountDownLatch sentLatch = new CountDownLatch(1);
+
+ void test(String[] args) {
+ SocketAddress address = null;
+ ShutdownServer server = null;
+
+ if (!Util.isSCTPSupported()) {
+ out.println("SCTP protocol is not supported");
+ out.println("Test cannot be run");
+ return;
+ }
+
+ if (args.length == 2) {
+ /* requested to connecct to a specific address */
+ try {
+ int port = Integer.valueOf(args[1]);
+ address = new InetSocketAddress(args[0], port);
+ } catch (NumberFormatException nfe) {
+ err.println(nfe);
+ }
+ } else {
+ /* start server on local machine, default */
+ try {
+ server = new ShutdownServer();
+ server.start();
+ address = server.address();
+ debug("Server started and listening on " + address);
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return;
+ }
+ }
+
+ doTest(address);
+ }
+
+ void doTest(SocketAddress peerAddress) {
+ SctpChannel channel = null;
+ ByteBuffer buffer = ByteBuffer.allocate(Util.SMALL_BUFFER);
+ MessageInfo info;
+
+ try {
+ channel = SctpChannel.open();
+
+ /* TEST 1: Verify NotYetConnectedException thrown */
+ debug("Test 1: NotYetConnectedException");
+ try {
+ channel.shutdown();
+ fail("shutdown not throwing expected NotYetConnectedException");
+ } catch (NotYetConnectedException unused) {
+ pass();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ }
+
+ channel.connect(peerAddress);
+ sentLatch.await();
+ channel.shutdown();
+
+ /* TEST 2: receive data sent before shutdown */
+ do {
+ debug("Test 2: invoking receive");
+ info = channel.receive(buffer, null, null);
+ if (info == null) {
+ fail("unexpected null from receive");
+ return;
+ }
+ } while (!info.isComplete());
+
+ buffer.flip();
+ check(info != null, "info is null");
+ check(info.bytes() == Util.SMALL_MESSAGE.getBytes("ISO-8859-1").
+ length, "bytes received not equal to message length");
+ check(info.bytes() == buffer.remaining(), "bytes != remaining");
+ check(Util.compare(buffer, Util.SMALL_MESSAGE),
+ "received message not the same as sent message");
+
+ buffer.clear();
+
+ /* TEST 3: receive notifications on the SCTP stack */
+ debug("Test 3: receive notifications");
+ while ((info = channel.receive(buffer, null, null )) != null &&
+ info.bytes() != -1 );
+
+
+ /* TEST 4: If the channel is already shutdown then invoking this
+ * method has no effect. */
+ debug("Test 4: no-op");
+ try {
+ channel.shutdown();
+ pass();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ }
+
+ /* TEST 5: Further sends will throw ClosedChannelException */
+ debug("Test 5: ClosedChannelException");
+ info = MessageInfo.createOutgoing(null, 1);
+ try {
+ channel.send(buffer, info);
+ fail("shutdown not throwing expected ClosedChannelException");
+ } catch (ClosedChannelException unused) {
+ pass();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ }
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ } catch (InterruptedException ie) {
+ unexpected(ie);
+ }finally {
+ finishedLatch.countDown();
+ try { if (channel != null) channel.close(); }
+ catch (IOException e) { unexpected(e);}
+ }
+ }
+
+ class ShutdownServer implements Runnable
+ {
+ final InetSocketAddress serverAddr;
+ private SctpServerChannel ssc;
+
+ public ShutdownServer() throws IOException {
+ ssc = SctpServerChannel.open().bind(null);
+ //serverAddr = (InetSocketAddress)(ssc.getAllLocalAddresses().iterator().next());
+
+ java.util.Set<SocketAddress> addrs = ssc.getAllLocalAddresses();
+ if (addrs.isEmpty())
+ debug("addrs should not be empty");
+
+ serverAddr = (InetSocketAddress) addrs.iterator().next();
+
+ }
+
+ public void start() {
+ (new Thread(this, "ShutdownServer-" + serverAddr.getPort())).start();
+ }
+
+ public InetSocketAddress address() {
+ return serverAddr;
+ }
+
+ @Override
+ public void run() {
+ SctpChannel sc = null;
+ try {
+ sc = ssc.accept();
+
+ /* send a message */
+ MessageInfo info = MessageInfo.createOutgoing(null, 1);
+ ByteBuffer buf = ByteBuffer.allocateDirect(Util.SMALL_BUFFER);
+ buf.put(Util.SMALL_MESSAGE.getBytes("ISO-8859-1"));
+ buf.flip();
+ sc.send(buf, info);
+
+ /* notify client that the data has been sent */
+ sentLatch.countDown();
+
+ /* wait until after the client has finished its tests */
+ finishedLatch.await();
+
+ buf.clear();
+ ShutdownNotificationHandler handler =
+ new ShutdownNotificationHandler();
+ BooleanWrapper bool = new BooleanWrapper();
+ sc.configureBlocking(false);
+ sc.receive(buf, bool, handler);
+ check(bool.booleanValue(), "SHUTDOWN not received on Server");
+
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ } catch (InterruptedException ie) {
+ ie.printStackTrace();
+ } finally {
+ try { if (ssc != null) ssc.close(); }
+ catch (IOException ioe) { unexpected(ioe); }
+ try { if (sc != null) sc.close(); }
+ catch (IOException ioe) { unexpected(ioe); }
+ }
+ }
+ }
+
+ class BooleanWrapper {
+ boolean bool;
+
+ boolean booleanValue() {
+ return bool;
+ }
+
+ void booleanValue(boolean value) {
+ bool = value;
+ }
+ }
+
+ class ShutdownNotificationHandler extends AbstractNotificationHandler<BooleanWrapper>
+ {
+ @Override
+ public HandlerResult handleNotification(
+ ShutdownNotification sn, BooleanWrapper bool)
+ {
+ bool.booleanValue(true);
+ debug(sn.toString());
+ return HandlerResult.RETURN;
+ }
+ }
+
+ //--------------------- Infrastructure ---------------------------
+ boolean debug = true;
+ volatile int passed = 0, failed = 0;
+ void pass() {passed++;}
+ void fail() {failed++; Thread.dumpStack();}
+ void fail(String msg) {System.err.println(msg); fail();}
+ void unexpected(Throwable t) {failed++; t.printStackTrace();}
+ void check(boolean cond) {if (cond) pass(); else fail();}
+ void check(boolean cond, String failMessage) {if (cond) pass(); else fail(failMessage);}
+ void debug(String message) {if(debug) { System.out.println(message); } }
+ public static void main(String[] args) throws Throwable {
+ Class<?> k = new Object(){}.getClass().getEnclosingClass();
+ try {k.getMethod("instanceMain",String[].class)
+ .invoke( k.newInstance(), (Object) args);}
+ catch (Throwable e) {throw e.getCause();}}
+ public void instanceMain(String[] args) throws Throwable {
+ try {test(args);} catch (Throwable t) {unexpected(t);}
+ System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
+ if (failed > 0) throw new AssertionError("Some tests failed");}
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/nio/sctp/SctpChannel/SocketOptionTests.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,157 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 4927640
+ * @summary Tests the SCTP protocol implementation
+ * @author chegar
+ */
+
+import java.io.IOException;
+import java.util.Set;
+import java.util.List;
+import java.util.Arrays;
+import java.nio.channels.ClosedChannelException;
+import com.sun.nio.sctp.SctpChannel;
+import com.sun.nio.sctp.SctpSocketOption;
+import static com.sun.nio.sctp.SctpStandardSocketOption.*;
+import static java.lang.System.out;
+
+public class SocketOptionTests {
+ <T> void checkOption(SctpChannel sc, SctpSocketOption<T> name,
+ T expectedValue) throws IOException {
+ T value = sc.getOption(name);
+ check(value.equals(expectedValue), name + ": value (" + value +
+ ") not as expected (" + expectedValue + ")");
+ }
+
+ <T> void optionalSupport(SctpChannel sc, SctpSocketOption<T> name,
+ T value) {
+ try {
+ sc.setOption(name, value);
+ checkOption(sc, name, value);
+ } catch (IOException e) {
+ /* Informational only, not all options have native support */
+ out.println(name + " not supported. " + e);
+ }
+ }
+
+ void test(String[] args) {
+ if (!Util.isSCTPSupported()) {
+ out.println("SCTP protocol is not supported");
+ out.println("Test cannot be run");
+ return;
+ }
+
+ try {
+ SctpChannel sc = SctpChannel.open();
+
+ /* check supported options */
+ Set<SctpSocketOption<?>> options = sc.supportedOptions();
+ List<? extends SctpSocketOption<?>> expected = Arrays.<SctpSocketOption<?>>asList(
+ SCTP_DISABLE_FRAGMENTS, SCTP_EXPLICIT_COMPLETE,
+ SCTP_FRAGMENT_INTERLEAVE, SCTP_INIT_MAXSTREAMS,
+ SCTP_NODELAY, SCTP_PRIMARY_ADDR, SCTP_SET_PEER_PRIMARY_ADDR,
+ SO_SNDBUF, SO_RCVBUF, SO_LINGER);
+
+ for (SctpSocketOption opt: expected) {
+ if (!options.contains(opt))
+ fail(opt.name() + " should be supported");
+ }
+
+ InitMaxStreams streams = InitMaxStreams.create(1024, 1024);
+ sc.setOption(SCTP_INIT_MAXSTREAMS, streams);
+ checkOption(sc, SCTP_INIT_MAXSTREAMS, streams);
+ streams = sc.getOption(SCTP_INIT_MAXSTREAMS);
+ check(streams.maxInStreams() == 1024, "Max in streams: value: "
+ + streams.maxInStreams() + ", expected 1024 ");
+ check(streams.maxOutStreams() == 1024, "Max out streams: value: "
+ + streams.maxOutStreams() + ", expected 1024 ");
+
+ optionalSupport(sc, SCTP_DISABLE_FRAGMENTS, true);
+ optionalSupport(sc, SCTP_EXPLICIT_COMPLETE, true);
+ optionalSupport(sc, SCTP_FRAGMENT_INTERLEAVE, 1);
+
+
+ //TODO: SCTP_PRIMARY_ADDR
+ //sc.bind(null);
+ //connect
+ //InetSocketAddress addr = new InetSocketAddress(0);
+ //sc.setOption(SCTP_PRIMARY_ADDR, addr);
+
+ sc.setOption(SCTP_NODELAY, true);
+ checkOption(sc, SCTP_NODELAY, true);
+ sc.setOption(SO_SNDBUF, 16*1024);
+ sc.setOption(SO_RCVBUF, 16*1024);
+ checkOption(sc, SO_LINGER, -1); /* default should be negative */
+ sc.setOption(SO_LINGER, 2000);
+ checkOption(sc, SO_LINGER, 2000);
+
+
+ /* NullPointerException */
+ try {
+ sc.setOption(null, "value");
+ fail("NullPointerException not thrown for setOption");
+ } catch (NullPointerException unused) {
+ pass();
+ }
+ try {
+ sc.getOption(null);
+ fail("NullPointerException not thrown for getOption");
+ } catch (NullPointerException unused) {
+ pass();
+ }
+
+ /* ClosedChannelException */
+ sc.close();
+ try {
+ sc.setOption(SCTP_INIT_MAXSTREAMS, streams);
+ fail("ClosedChannelException not thrown");
+ } catch (ClosedChannelException unused) {
+ pass();
+ }
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ }
+ }
+
+ //--------------------- Infrastructure ---------------------------
+ boolean debug = true;
+ volatile int passed = 0, failed = 0;
+ void pass() {passed++;}
+ void fail() {failed++; Thread.dumpStack();}
+ void fail(String msg) {System.err.println(msg); fail();}
+ void unexpected(Throwable t) {failed++; t.printStackTrace();}
+ void check(boolean cond) {if (cond) pass(); else fail();}
+ void check(boolean cond, String failMessage) {if (cond) pass(); else fail(failMessage);}
+ void debug(String message) {if(debug) { System.out.println(message); } }
+ public static void main(String[] args) throws Throwable {
+ Class<?> k = new Object(){}.getClass().getEnclosingClass();
+ try {k.getMethod("instanceMain",String[].class)
+ .invoke( k.newInstance(), (Object) args);}
+ catch (Throwable e) {throw e.getCause();}}
+ public void instanceMain(String[] args) throws Throwable {
+ try {test(args);} catch (Throwable t) {unexpected(t);}
+ System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
+ if (failed > 0) throw new AssertionError("Some tests failed");}
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/nio/sctp/SctpChannel/Util.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,138 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.net.NetworkInterface;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.net.InetAddress;
+import java.net.Inet4Address;
+import java.net.SocketException;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.io.UnsupportedEncodingException;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Set;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.nio.ByteBuffer;
+import com.sun.nio.sctp.SctpChannel;
+import static java.lang.System.out;
+
+public class Util {
+ static final int SMALL_BUFFER = 128;
+ static final String SMALL_MESSAGE =
+ "Under the bridge and over the dam, looking for berries, berries for jam";
+
+ static final int LARGE_BUFFER = 32768;
+ static final String LARGE_MESSAGE;
+
+ static {
+ StringBuffer sb = new StringBuffer(LARGE_BUFFER);
+ for (int i=0; i<460; i++)
+ sb.append(SMALL_MESSAGE);
+
+ LARGE_MESSAGE = sb.toString();
+ }
+
+ static boolean isSCTPSupported() {
+ try {
+ SctpChannel c = SctpChannel.open();
+ c.close();
+ return true;
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ } catch (UnsupportedOperationException e) {
+ out.println(e);
+ }
+
+ return false;
+ }
+ /**
+ * Returns a list of all the addresses on the system.
+ * @param inclLoopback
+ * if {@code true}, include the loopback addresses
+ * @param ipv4Only
+ * it {@code true}, only IPv4 addresses will be included
+ */
+ static List<InetAddress> getAddresses(boolean inclLoopback,
+ boolean ipv4Only)
+ throws SocketException {
+ ArrayList<InetAddress> list = new ArrayList<InetAddress>();
+ Enumeration<NetworkInterface> nets =
+ NetworkInterface.getNetworkInterfaces();
+ for (NetworkInterface netInf : Collections.list(nets)) {
+ Enumeration<InetAddress> addrs = netInf.getInetAddresses();
+ for (InetAddress addr : Collections.list(addrs)) {
+ if (!list.contains(addr) &&
+ (inclLoopback ? true : !addr.isLoopbackAddress()) &&
+ (ipv4Only ? (addr instanceof Inet4Address) : true)) {
+ list.add(addr);
+ }
+ }
+ }
+
+ return list;
+ }
+
+ static void dumpAddresses(SctpChannel channel,
+ PrintStream printStream)
+ throws IOException {
+ Set<SocketAddress> addrs = channel.getAllLocalAddresses();
+ printStream.println("Local Addresses: ");
+ for (Iterator<SocketAddress> it = addrs.iterator(); it.hasNext(); ) {
+ InetSocketAddress addr = (InetSocketAddress)it.next();
+ printStream.println("\t" + addr);
+ }
+ }
+
+ /**
+ * Compare the contents of the given ByteBuffer with the contens of the
+ * given byte array. true if, and only if, the contents are the same.
+ */
+ static boolean compare(ByteBuffer bb, byte[] message) {
+ if (message.length != bb.remaining()) {
+ out.println("Compare failed, byte array length != to buffer remaining");
+ return false;
+ }
+
+ for (int i=0; i<message.length; i++) {
+ byte b = bb.get();
+ if (message[i] != b) {
+ out.println("Position " + i + ": " + message[i] + " != " + b);
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ static boolean compare(ByteBuffer bb, String str) {
+ try{
+ return Util.compare(bb, str.getBytes("ISO-8859-1"));
+ } catch (UnsupportedEncodingException unsupported) {
+ throw new AssertionError(unsupported);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/nio/sctp/SctpMultiChannel/Send.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,320 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 4927640
+ * @summary Tests the SCTP protocol implementation
+ * @author chegar
+ */
+
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.io.IOException;
+import java.util.Set;
+import java.util.Iterator;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.nio.ByteBuffer;
+import com.sun.nio.sctp.Association;
+import com.sun.nio.sctp.InvalidStreamException;
+import com.sun.nio.sctp.MessageInfo;
+import com.sun.nio.sctp.SctpMultiChannel;
+import static java.lang.System.out;
+import static java.lang.System.err;
+
+public class Send {
+ /* Latches used to synchronize between the client and server so that
+ * connections without any IO may not be closed without being accepted */
+ final CountDownLatch clientFinishedLatch = new CountDownLatch(1);
+ final CountDownLatch serverFinishedLatch = new CountDownLatch(1);
+
+ void test(String[] args) {
+ SocketAddress address = null;
+ Server server = null;
+
+ if (!Util.isSCTPSupported()) {
+ out.println("SCTP protocol is not supported");
+ out.println("Test cannot be run");
+ return;
+ }
+
+ if (args.length == 2) {
+ /* requested to connecct to a specific address */
+ try {
+ int port = Integer.valueOf(args[1]);
+ address = new InetSocketAddress(args[0], port);
+ } catch (NumberFormatException nfe) {
+ err.println(nfe);
+ }
+ } else {
+ /* start server on local machine, default */
+ try {
+ server = new Server();
+ server.start();
+ address = server.address();
+ debug("Server started and listening on " + address);
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return;
+ }
+ }
+
+ doTest(address);
+ }
+
+ void doTest(SocketAddress peerAddress) {
+ SctpMultiChannel channel = null;
+ ByteBuffer buffer = ByteBuffer.allocate(Util.LARGE_BUFFER);
+ MessageInfo info = MessageInfo.createOutgoing(null, 0);
+
+ try {
+ channel = SctpMultiChannel.open();
+
+ /* TEST 1: send small message */
+ int streamNumber = 0;
+ debug("sending to " + peerAddress + " on stream number: " + streamNumber);
+ info = MessageInfo.createOutgoing(peerAddress, streamNumber);
+ buffer.put(Util.SMALL_MESSAGE.getBytes("ISO-8859-1"));
+ buffer.flip();
+ int position = buffer.position();
+ int remaining = buffer.remaining();
+
+ debug("sending small message: " + buffer);
+ int sent = channel.send(buffer, info);
+
+ check(sent == remaining, "sent should be equal to remaining");
+ check(buffer.position() == (position + sent),
+ "buffers position should have been incremented by sent");
+
+ /* TEST 2: receive the echoed message */
+ buffer.clear();
+ info = channel.receive(buffer, null, null);
+ buffer.flip();
+ check(info != null, "info is null");
+ check(info.streamNumber() == streamNumber,
+ "message not sent on the correct stream");
+ check(info.bytes() == Util.SMALL_MESSAGE.getBytes("ISO-8859-1").
+ length, "bytes received not equal to message length");
+ check(info.bytes() == buffer.remaining(), "bytes != remaining");
+ check(Util.compare(buffer, Util.SMALL_MESSAGE),
+ "received message not the same as sent message");
+
+
+ /* TEST 3: send large message */
+ Set<Association> assocs = channel.associations();
+ check(assocs.size() == 1, "there should be only one association");
+ Iterator<Association> it = assocs.iterator();
+ check(it.hasNext());
+ Association assoc = it.next();
+ streamNumber = assoc.maxOutboundStreams() - 1;
+
+ debug("sending on stream number: " + streamNumber);
+ info = MessageInfo.createOutgoing(assoc, null, streamNumber);
+ buffer.clear();
+ buffer.put(Util.LARGE_MESSAGE.getBytes("ISO-8859-1"));
+ buffer.flip();
+ position = buffer.position();
+ remaining = buffer.remaining();
+
+ debug("sending large message: " + buffer);
+ sent = channel.send(buffer, info);
+
+ check(sent == remaining, "sent should be equal to remaining");
+ check(buffer.position() == (position + sent),
+ "buffers position should have been incremented by sent");
+
+ /* TEST 4: receive the echoed message */
+ buffer.clear();
+ info = channel.receive(buffer, null, null);
+ buffer.flip();
+ check(info != null, "info is null");
+ check(info.streamNumber() == streamNumber,
+ "message not sent on the correct stream");
+ check(info.bytes() == Util.LARGE_MESSAGE.getBytes("ISO-8859-1").
+ length, "bytes received not equal to message length");
+ check(info.bytes() == buffer.remaining(), "bytes != remaining");
+ check(Util.compare(buffer, Util.LARGE_MESSAGE),
+ "received message not the same as sent message");
+
+
+ /* TEST 5: InvalidStreamExcepton */
+ streamNumber = assoc.maxOutboundStreams() + 1;
+ info = MessageInfo.createOutgoing(assoc, null, streamNumber);
+ buffer.clear();
+ buffer.put(Util.SMALL_MESSAGE.getBytes("ISO-8859-1"));
+ buffer.flip();
+ position = buffer.position();
+ remaining = buffer.remaining();
+
+ debug("sending on stream number: " + streamNumber);
+ debug("sending small message: " + buffer);
+ try {
+ sent = channel.send(buffer, info);
+ fail("should have thrown InvalidStreamExcepton");
+ } catch (InvalidStreamException ise){
+ pass();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ }
+ check(buffer.remaining() == remaining,
+ "remaining should not be changed");
+ check(buffer.position() == position,
+ "buffers position should not be changed");
+
+
+ /* TEST 5: getRemoteAddresses(Association) */
+ channel.getRemoteAddresses(assoc);
+
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ } finally {
+ clientFinishedLatch.countDown();
+ try { serverFinishedLatch.await(10L, TimeUnit.SECONDS); }
+ catch (InterruptedException ie) { unexpected(ie); }
+ if (channel != null) {
+ try { channel.close(); }
+ catch (IOException e) { unexpected (e);}
+ }
+ }
+ }
+
+ class Server implements Runnable
+ {
+ final InetSocketAddress serverAddr;
+ private SctpMultiChannel serverChannel;
+
+ public Server() throws IOException {
+ serverChannel = SctpMultiChannel.open().bind(null);
+ java.util.Set<SocketAddress> addrs = serverChannel.getAllLocalAddresses();
+ if (addrs.isEmpty())
+ debug("addrs should not be empty");
+
+ serverAddr = (InetSocketAddress) addrs.iterator().next();
+ }
+
+ public void start() {
+ (new Thread(this, "Server-" + serverAddr.getPort())).start();
+ }
+
+ public InetSocketAddress address() {
+ return serverAddr;
+ }
+
+ @Override
+ public void run() {
+ ByteBuffer buffer = ByteBuffer.allocateDirect(Util.LARGE_BUFFER);
+ try {
+ MessageInfo info;
+
+ /* receive a small message */
+ do {
+ info = serverChannel.receive(buffer, null, null);
+ if (info == null) {
+ fail("Server: unexpected null from receive");
+ return;
+ }
+ } while (!info.isComplete());
+
+ buffer.flip();
+ check(info != null, "info is null");
+ check(info.streamNumber() == 0,
+ "message not sent on the correct stream");
+ check(info.bytes() == Util.SMALL_MESSAGE.getBytes("ISO-8859-1").
+ length, "bytes received not equal to message length");
+ check(info.bytes() == buffer.remaining(), "bytes != remaining");
+ check(Util.compare(buffer, Util.SMALL_MESSAGE),
+ "received message not the same as sent message");
+
+ check(info != null, "info is null");
+ Set<Association> assocs = serverChannel.associations();
+ check(assocs.size() == 1, "there should be only one association");
+ Iterator<Association> it = assocs.iterator();
+ check(it.hasNext());
+ Association assoc = it.next();
+
+ /* echo the message */
+ debug("Server: echoing first message");
+ buffer.flip();
+ int bytes = serverChannel.send(buffer, info);
+ debug("Server: sent " + bytes + "bytes");
+
+ /* receive a large message */
+ buffer.clear();
+ do {
+ info = serverChannel.receive(buffer, null, null);
+ if (info == null) {
+ fail("Server: unexpected null from receive");
+ return;
+ }
+ } while (!info.isComplete());
+
+ buffer.flip();
+
+ check(info.streamNumber() == assoc.maxInboundStreams() - 1,
+ "message not sent on the correct stream");
+ check(info.bytes() == Util.LARGE_MESSAGE.getBytes("ISO-8859-1").
+ length, "bytes received not equal to message length");
+ check(info.bytes() == buffer.remaining(), "bytes != remaining");
+ check(Util.compare(buffer, Util.LARGE_MESSAGE),
+ "received message not the same as sent message");
+
+ /* echo the message */
+ debug("Server: echoing second message");
+ buffer.flip();
+ bytes = serverChannel.send(buffer, info);
+ debug("Server: sent " + bytes + "bytes");
+
+ clientFinishedLatch.await(10L, TimeUnit.SECONDS);
+ serverFinishedLatch.countDown();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ } catch (InterruptedException ie) {
+ unexpected(ie);
+ } finally {
+ try { if (serverChannel != null) serverChannel.close(); }
+ catch (IOException unused) {}
+ }
+ }
+ }
+
+ //--------------------- Infrastructure ---------------------------
+ boolean debug = true;
+ volatile int passed = 0, failed = 0;
+ void pass() {passed++;}
+ void fail() {failed++; Thread.dumpStack();}
+ void fail(String msg) {System.err.println(msg); fail();}
+ void unexpected(Throwable t) {failed++; t.printStackTrace();}
+ void check(boolean cond) {if (cond) pass(); else fail();}
+ void check(boolean cond, String failMessage) {if (cond) pass(); else fail(failMessage);}
+ void debug(String message) {if(debug) { System.out.println(message); } }
+ public static void main(String[] args) throws Throwable {
+ Class<?> k = new Object(){}.getClass().getEnclosingClass();
+ try {k.getMethod("instanceMain",String[].class)
+ .invoke( k.newInstance(), (Object) args);}
+ catch (Throwable e) {throw e.getCause();}}
+ public void instanceMain(String[] args) throws Throwable {
+ try {test(args);} catch (Throwable t) {unexpected(t);}
+ System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
+ if (failed > 0) throw new AssertionError("Some tests failed");}
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/nio/sctp/SctpMultiChannel/Util.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,138 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.net.NetworkInterface;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.net.InetAddress;
+import java.net.Inet4Address;
+import java.net.SocketException;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.io.UnsupportedEncodingException;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Set;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.nio.ByteBuffer;
+import com.sun.nio.sctp.SctpChannel;
+import static java.lang.System.out;
+
+public class Util {
+ static final int SMALL_BUFFER = 128;
+ static final String SMALL_MESSAGE =
+ "Under the bridge and over the dam, looking for berries, berries for jam";
+
+ static final int LARGE_BUFFER = 32768;
+ static final String LARGE_MESSAGE;
+
+ static {
+ StringBuffer sb = new StringBuffer(LARGE_BUFFER);
+ for (int i=0; i<460; i++)
+ sb.append(SMALL_MESSAGE);
+
+ LARGE_MESSAGE = sb.toString();
+ }
+
+ static boolean isSCTPSupported() {
+ try {
+ SctpChannel c = SctpChannel.open();
+ c.close();
+ return true;
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ } catch (UnsupportedOperationException e) {
+ out.println(e);
+ }
+
+ return false;
+ }
+ /**
+ * Returns a list of all the addresses on the system.
+ * @param inclLoopback
+ * if {@code true}, include the loopback addresses
+ * @param ipv4Only
+ * it {@code true}, only IPv4 addresses will be included
+ */
+ static List<InetAddress> getAddresses(boolean inclLoopback,
+ boolean ipv4Only)
+ throws SocketException {
+ ArrayList<InetAddress> list = new ArrayList<InetAddress>();
+ Enumeration<NetworkInterface> nets =
+ NetworkInterface.getNetworkInterfaces();
+ for (NetworkInterface netInf : Collections.list(nets)) {
+ Enumeration<InetAddress> addrs = netInf.getInetAddresses();
+ for (InetAddress addr : Collections.list(addrs)) {
+ if (!list.contains(addr) &&
+ (inclLoopback ? true : !addr.isLoopbackAddress()) &&
+ (ipv4Only ? (addr instanceof Inet4Address) : true)) {
+ list.add(addr);
+ }
+ }
+ }
+
+ return list;
+ }
+
+ static void dumpAddresses(SctpChannel channel,
+ PrintStream printStream)
+ throws IOException {
+ Set<SocketAddress> addrs = channel.getAllLocalAddresses();
+ printStream.println("Local Addresses: ");
+ for (Iterator<SocketAddress> it = addrs.iterator(); it.hasNext(); ) {
+ InetSocketAddress addr = (InetSocketAddress)it.next();
+ printStream.println("\t" + addr);
+ }
+ }
+
+ /**
+ * Compare the contents of the given ByteBuffer with the contens of the
+ * given byte array. true if, and only if, the contents are the same.
+ */
+ static boolean compare(ByteBuffer bb, byte[] message) {
+ if (message.length != bb.remaining()) {
+ out.println("Compare failed, byte array length != to buffer remaining");
+ return false;
+ }
+
+ for (int i=0; i<message.length; i++) {
+ byte b = bb.get();
+ if (message[i] != b) {
+ out.println("Position " + i + ": " + message[i] + " != " + b);
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ static boolean compare(ByteBuffer bb, String str) {
+ try{
+ return Util.compare(bb, str.getBytes("ISO-8859-1"));
+ } catch (UnsupportedEncodingException unsupported) {
+ throw new AssertionError(unsupported);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/nio/sctp/SctpServerChannel/Accept.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,274 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 4927640
+ * @summary Tests the SCTP protocol implementation
+ * @author chegar
+ */
+
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.io.IOException;
+import java.util.concurrent.CountDownLatch;
+import java.nio.channels.AlreadyConnectedException;
+import java.nio.channels.AsynchronousCloseException;
+import java.nio.channels.NotYetBoundException;
+import java.nio.channels.ClosedByInterruptException;
+import java.nio.channels.ClosedChannelException;
+import com.sun.nio.sctp.SctpChannel;
+import com.sun.nio.sctp.SctpServerChannel;
+import static java.lang.System.out;
+import static java.lang.System.err;
+
+public class Accept {
+ static CountDownLatch acceptLatch = new CountDownLatch(1);
+ static CountDownLatch closeByIntLatch = new CountDownLatch(1);
+ static CountDownLatch asyncCloseLatch = new CountDownLatch(1);
+ AcceptServer server = null;
+
+ void test(String[] args) {
+ SocketAddress address = null;
+
+ if (!Util.isSCTPSupported()) {
+ out.println("SCTP protocol is not supported");
+ out.println("Test cannot be run");
+ return;
+ }
+
+ if (args.length == 2) {
+ /* requested to connecct to a specific address */
+ try {
+ int port = Integer.valueOf(args[1]);
+ address = new InetSocketAddress(args[0], port);
+ } catch (NumberFormatException nfe) {
+ err.println(nfe);
+ }
+ } else {
+ /* start server on local machine, default */
+ try {
+ server = new AcceptServer();
+ server.start();
+ address = server.address();
+ debug("Server started and listening on " + address);
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return;
+ }
+ }
+
+ doClient(address);
+ }
+
+ void doClient(SocketAddress peerAddress) {
+ SctpChannel channel = null;
+
+ try {
+ channel = SctpChannel.open(peerAddress, 0, 0);
+ acceptLatch.await();
+
+ /* for test 4 */
+ closeByIntLatch.await();
+ sleep(500);
+ server.thread().interrupt();
+
+ /* for test 5 */
+ asyncCloseLatch.await();
+ sleep(500);
+ server.channel().close();
+
+ /* wait for the server thread to finish */
+ join(server.thread(), 10000);
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ } catch (InterruptedException ie) {
+ unexpected(ie);
+ } finally {
+ try { if (channel != null) channel.close(); }
+ catch (IOException e) { unexpected(e);}
+ }
+ }
+
+ class AcceptServer implements Runnable
+ {
+ final InetSocketAddress serverAddr;
+ private SctpServerChannel ssc;
+ private Thread serverThread;
+
+ public AcceptServer() throws IOException {
+ ssc = SctpServerChannel.open();
+
+ /* TEST 1: NotYetBoundException */
+ debug("TEST 1: NotYetBoundException");
+ try {
+ ssc.accept();
+ fail();
+ } catch (NotYetBoundException nybe) {
+ debug(" caught NotYetBoundException");
+ pass();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ }
+
+ ssc.bind(null);
+ java.util.Set<SocketAddress> addrs = ssc.getAllLocalAddresses();
+ if (addrs.isEmpty())
+ debug("addrs should not be empty");
+
+ serverAddr = (InetSocketAddress) addrs.iterator().next();
+
+ /* TEST 2: null if this channel is in non-blocking mode and no
+ * association is available to be accepted */
+ ssc.configureBlocking(false);
+ debug("TEST 2: non-blocking mode null");
+ try {
+ SctpChannel sc = ssc.accept();
+ check(sc == null, "non-blocking mode should return null");
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ } finally {
+ ssc.configureBlocking(true);
+ }
+ }
+
+ void start() {
+ serverThread = new Thread(this, "AcceptServer-" +
+ serverAddr.getPort());
+ serverThread.start();
+ }
+
+ InetSocketAddress address() {
+ return serverAddr;
+ }
+
+ SctpServerChannel channel() {
+ return ssc;
+ }
+
+ Thread thread() {
+ return serverThread;
+ }
+
+ @Override
+ public void run() {
+ SctpChannel sc = null;
+ try {
+ /* TEST 3: accepted channel */
+ debug("TEST 3: accepted channel");
+ sc = ssc.accept();
+
+ checkAcceptedChannel(sc);
+ acceptLatch.countDown();
+
+ /* TEST 4: ClosedByInterruptException */
+ debug("TEST 4: ClosedByInterruptException");
+ try {
+ closeByIntLatch.countDown();
+ ssc.accept();
+ fail();
+ } catch (ClosedByInterruptException unused) {
+ debug(" caught ClosedByInterruptException");
+ pass();
+ }
+
+ /* TEST 5: AsynchronousCloseException */
+ debug("TEST 5: AsynchronousCloseException");
+ /* reset thread interrupt status */
+ Thread.currentThread().interrupted();
+
+ ssc = SctpServerChannel.open().bind(null);
+ try {
+ asyncCloseLatch.countDown();
+ ssc.accept();
+ fail();
+ } catch (AsynchronousCloseException unused) {
+ debug(" caught AsynchronousCloseException");
+ pass();
+ }
+
+ /* TEST 6: ClosedChannelException */
+ debug("TEST 6: ClosedChannelException");
+ try {
+ ssc.accept();
+ fail();
+ } catch (ClosedChannelException unused) {
+ debug(" caught ClosedChannelException");
+ pass();
+ }
+ ssc = null;
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ } finally {
+ try { if (ssc != null) ssc.close(); }
+ catch (IOException ioe) { unexpected(ioe); }
+ try { if (sc != null) sc.close(); }
+ catch (IOException ioe) { unexpected(ioe); }
+ }
+ }
+ }
+
+ void checkAcceptedChannel(SctpChannel sc) {
+ try {
+ debug("Checking accepted SctpChannel");
+ check(sc.association() != null,
+ "accepted channel should have an association");
+ check(!(sc.getRemoteAddresses().isEmpty()),
+ "accepted channel should be connected");
+ check(!(sc.isConnectionPending()),
+ "accepted channel should not have a connection pending");
+ check(sc.isBlocking(),
+ "accepted channel should be blocking");
+ try { sc.connect(new TestSocketAddress()); fail(); }
+ catch (AlreadyConnectedException unused) { pass(); }
+ try { sc.bind(new TestSocketAddress()); fail(); }
+ catch (AlreadyConnectedException unused) { pass(); }
+ } catch (IOException unused) { fail(); }
+ }
+
+ static class TestSocketAddress extends SocketAddress {}
+
+ //--------------------- Infrastructure ---------------------------
+ boolean debug = true;
+ volatile int passed = 0, failed = 0;
+ void pass() {passed++;}
+ void fail() {failed++; Thread.dumpStack();}
+ void fail(String msg) {err.println(msg); fail();}
+ void unexpected(Throwable t) {failed++; t.printStackTrace();}
+ void check(boolean cond) {if (cond) pass(); else fail();}
+ void check(boolean cond, String failMessage) {if (cond) pass(); else fail(failMessage);}
+ void debug(String message) {if(debug) { out.println(message); } }
+ void sleep(long millis) { try { Thread.currentThread().sleep(millis); }
+ catch(InterruptedException ie) { unexpected(ie); }}
+ void join(Thread thread, long millis) { try { thread.join(millis); }
+ catch(InterruptedException ie) { unexpected(ie); }}
+ public static void main(String[] args) throws Throwable {
+ Class<?> k = new Object(){}.getClass().getEnclosingClass();
+ try {k.getMethod("instanceMain",String[].class)
+ .invoke( k.newInstance(), (Object) args);}
+ catch (Throwable e) {throw e.getCause();}}
+ public void instanceMain(String[] args) throws Throwable {
+ try {test(args);} catch (Throwable t) {unexpected(t);}
+ out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
+ if (failed > 0) throw new AssertionError("Some tests failed");}
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/nio/sctp/SctpServerChannel/NonBlockingAccept.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,230 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 4927640
+ * @summary Tests the SCTP protocol implementation
+ * @author chegar
+ */
+
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.nio.channels.AlreadyConnectedException;
+import java.nio.channels.Selector;
+import java.nio.channels.SelectionKey;
+import com.sun.nio.sctp.SctpChannel;
+import com.sun.nio.sctp.SctpServerChannel;
+import static java.lang.System.out;
+import static java.lang.System.err;
+
+public class NonBlockingAccept {
+ static CountDownLatch acceptLatch = new CountDownLatch(1);
+ static final int SEL_TIMEOUT = 10000;
+ static final int NUM_TEST_CONNECTIONS = 10;
+
+ void test(String[] args) {
+ SocketAddress address = null;
+ NonblockingServer server;
+
+ if (!Util.isSCTPSupported()) {
+ out.println("SCTP protocol is not supported");
+ out.println("Test cannot be run");
+ return;
+ }
+
+ if (args.length == 2) {
+ /* requested to connecct to a specific address */
+ try {
+ int port = Integer.valueOf(args[1]);
+ address = new InetSocketAddress(args[0], port);
+ } catch (NumberFormatException nfe) {
+ err.println(nfe);
+ }
+ } else {
+ /* start server on local machine, default */
+ try {
+ server = new NonblockingServer();
+ server.start();
+ address = server.address();
+ debug("Server started and listening on " + address);
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return;
+ }
+ }
+
+ doClient(address);
+ }
+
+ void doClient(SocketAddress peerAddress) {
+ Set<SctpChannel> channels = new HashSet<SctpChannel>(NUM_TEST_CONNECTIONS);
+
+ try {
+ for (int i=0; i<NUM_TEST_CONNECTIONS;) {
+ debug("connecting " + ++i);
+ channels.add(SctpChannel.open(peerAddress, 0, 0));
+ sleep(100);
+ }
+
+ /* don't close the channels until they have been accepted */
+ acceptLatch.await();
+
+ for(SctpChannel sc: channels)
+ sc.close();
+ } catch (IOException ioe) {
+ unexpected(ioe);
+ } catch (InterruptedException ie) {
+ unexpected(ie);
+ }
+ }
+
+ class NonblockingServer implements Runnable
+ {
+ final InetSocketAddress serverAddr;
+ private SctpServerChannel ssc;
+ private Thread serverThread;
+
+ public NonblockingServer() throws IOException {
+ ssc = SctpServerChannel.open().bind(null);
+ java.util.Set<SocketAddress> addrs = ssc.getAllLocalAddresses();
+ if (addrs.isEmpty())
+ debug("addrs should not be empty");
+
+ serverAddr = (InetSocketAddress) addrs.iterator().next();
+ }
+
+ void start() {
+ serverThread = new Thread(this, "NonblockingServer-" +
+ serverAddr.getPort());
+ serverThread.start();
+ }
+
+ InetSocketAddress address () {
+ return serverAddr;
+ }
+
+ @Override
+ public void run() {
+ Selector acceptSelector = null;
+ SelectionKey acceptKey = null;
+
+ try {
+ acceptSelector = Selector.open();
+ ssc.configureBlocking(false);
+ check(ssc.isBlocking() == false, "Should be in non-blocking mode");
+ acceptKey = ssc.register(acceptSelector, SelectionKey.OP_ACCEPT);
+
+ int connectionsAccepted = 0;
+ while (connectionsAccepted < NUM_TEST_CONNECTIONS) {
+ int keysAdded = acceptSelector.select(SEL_TIMEOUT);
+ if (keysAdded > 0) {
+ Set<SelectionKey> keys = acceptSelector.selectedKeys();
+ Iterator<SelectionKey> i = keys.iterator();
+ while(i.hasNext()) {
+ SelectionKey sk = i.next();
+ i.remove();
+ SctpServerChannel nextReady =
+ (SctpServerChannel)sk.channel();
+ check(nextReady.equals(ssc),
+ "channels should be equal");
+ check(sk.isAcceptable(),
+ "key should be acceptable");
+ check(!sk.isReadable(),
+ "key should not be readable");
+ check(!sk.isWritable(),
+ "key should not be writable");
+ check(!sk.isConnectable(),
+ "key should not be connectable");
+ SctpChannel acceptsc = nextReady.accept();
+ connectionsAccepted++;
+ debug("Accepted " + connectionsAccepted + " connections");
+ check(acceptsc != null,
+ "Accepted channel should not be null");
+ if (acceptsc != null) {
+ checkAcceptedChannel(acceptsc);
+ acceptsc.close();
+ }
+ } /* while */
+ } /* if */
+ } /* while */
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ } finally {
+ acceptLatch.countDown();
+ if (acceptKey != null) acceptKey.cancel();
+ try { if (acceptSelector != null) acceptSelector.close(); }
+ catch (IOException ioe) { unexpected(ioe); }
+ try { if (ssc != null) ssc.close(); }
+ catch (IOException ioe) { unexpected(ioe); }
+ }
+ }
+ }
+
+ void checkAcceptedChannel(SctpChannel sc) {
+ try {
+ debug("Checking accepted SctpChannel");
+ check(sc.association() != null,
+ "accepted channel should have an association");
+ check(!(sc.getRemoteAddresses().isEmpty()),
+ "accepted channel should be connected");
+ check(!(sc.isConnectionPending()),
+ "accepted channel should not have a connection pending");
+ check(sc.isBlocking(),
+ "accepted channel should be blocking");
+ try { sc.connect(new TestSocketAddress()); fail(); }
+ catch (AlreadyConnectedException unused) { pass(); }
+ try { sc.bind(new TestSocketAddress()); fail(); }
+ catch (AlreadyConnectedException unused) { pass(); }
+ } catch (IOException unused) { fail(); }
+ }
+
+ static class TestSocketAddress extends SocketAddress {}
+
+ //--------------------- Infrastructure ---------------------------
+ boolean debug = true;
+ volatile int passed = 0, failed = 0;
+ void pass() {passed++;}
+ void fail() {failed++; Thread.dumpStack();}
+ void fail(String msg) {err.println(msg); fail();}
+ void unexpected(Throwable t) {failed++; t.printStackTrace();}
+ void check(boolean cond) {if (cond) pass(); else fail();}
+ void check(boolean cond, String failMessage) {if (cond) pass(); else fail(failMessage);}
+ void debug(String message) {if(debug) { out.println(message); } }
+ void sleep(long millis) { try { Thread.currentThread().sleep(millis); }
+ catch(InterruptedException ie) { unexpected(ie); }}
+ public static void main(String[] args) throws Throwable {
+ Class<?> k = new Object(){}.getClass().getEnclosingClass();
+ try {k.getMethod("instanceMain",String[].class)
+ .invoke( k.newInstance(), (Object) args);}
+ catch (Throwable e) {throw e.getCause();}}
+ public void instanceMain(String[] args) throws Throwable {
+ try {test(args);} catch (Throwable t) {unexpected(t);}
+ out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
+ if (failed > 0) throw new AssertionError("Some tests failed");}
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/nio/sctp/SctpServerChannel/Util.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,138 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.net.NetworkInterface;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.net.InetAddress;
+import java.net.Inet4Address;
+import java.net.SocketException;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.io.UnsupportedEncodingException;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Set;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.nio.ByteBuffer;
+import com.sun.nio.sctp.SctpChannel;
+import static java.lang.System.out;
+
+public class Util {
+ static final int SMALL_BUFFER = 128;
+ static final String SMALL_MESSAGE =
+ "Under the bridge and over the dam, looking for berries, berries for jam";
+
+ static final int LARGE_BUFFER = 32768;
+ static final String LARGE_MESSAGE;
+
+ static {
+ StringBuffer sb = new StringBuffer(LARGE_BUFFER);
+ for (int i=0; i<460; i++)
+ sb.append(SMALL_MESSAGE);
+
+ LARGE_MESSAGE = sb.toString();
+ }
+
+ static boolean isSCTPSupported() {
+ try {
+ SctpChannel c = SctpChannel.open();
+ c.close();
+ return true;
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ } catch (UnsupportedOperationException e) {
+ out.println(e);
+ }
+
+ return false;
+ }
+ /**
+ * Returns a list of all the addresses on the system.
+ * @param inclLoopback
+ * if {@code true}, include the loopback addresses
+ * @param ipv4Only
+ * it {@code true}, only IPv4 addresses will be included
+ */
+ static List<InetAddress> getAddresses(boolean inclLoopback,
+ boolean ipv4Only)
+ throws SocketException {
+ ArrayList<InetAddress> list = new ArrayList<InetAddress>();
+ Enumeration<NetworkInterface> nets =
+ NetworkInterface.getNetworkInterfaces();
+ for (NetworkInterface netInf : Collections.list(nets)) {
+ Enumeration<InetAddress> addrs = netInf.getInetAddresses();
+ for (InetAddress addr : Collections.list(addrs)) {
+ if (!list.contains(addr) &&
+ (inclLoopback ? true : !addr.isLoopbackAddress()) &&
+ (ipv4Only ? (addr instanceof Inet4Address) : true)) {
+ list.add(addr);
+ }
+ }
+ }
+
+ return list;
+ }
+
+ static void dumpAddresses(SctpChannel channel,
+ PrintStream printStream)
+ throws IOException {
+ Set<SocketAddress> addrs = channel.getAllLocalAddresses();
+ printStream.println("Local Addresses: ");
+ for (Iterator<SocketAddress> it = addrs.iterator(); it.hasNext(); ) {
+ InetSocketAddress addr = (InetSocketAddress)it.next();
+ printStream.println("\t" + addr);
+ }
+ }
+
+ /**
+ * Compare the contents of the given ByteBuffer with the contens of the
+ * given byte array. true if, and only if, the contents are the same.
+ */
+ static boolean compare(ByteBuffer bb, byte[] message) {
+ if (message.length != bb.remaining()) {
+ out.println("Compare failed, byte array length != to buffer remaining");
+ return false;
+ }
+
+ for (int i=0; i<message.length; i++) {
+ byte b = bb.get();
+ if (message[i] != b) {
+ out.println("Position " + i + ": " + message[i] + " != " + b);
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ static boolean compare(ByteBuffer bb, String str) {
+ try{
+ return Util.compare(bb, str.getBytes("ISO-8859-1"));
+ } catch (UnsupportedEncodingException unsupported) {
+ throw new AssertionError(unsupported);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Component/NoUpdateUponShow/NoUpdateUponShow.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,381 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ @test
+ @bug 6774258
+ @summary api/java_awt/Component/index.html#PaintUpdate fails randomly
+ @author dmitry.cherepanov@...: area=awt.painting
+ @run main NoUpdateUponShow
+*/
+
+/**
+ * NoUpdateUponShow.java
+ *
+ * summary: System-level painting operations shouldn't make call to update()
+ */
+
+import java.awt.*;
+import sun.awt.SunToolkit;
+
+public class NoUpdateUponShow
+{
+
+ static volatile boolean wasUpdate = false;
+
+ private static void init()
+ {
+ //*** Create instructions for the user here ***
+
+ String[] instructions =
+ {
+ "This is an AUTOMATIC test, simply wait until it is done.",
+ "The result (passed or failed) will be shown in the",
+ "message window below."
+ };
+ Sysout.createDialog( );
+ Sysout.printInstructions( instructions );
+
+
+ // Create the frame and the button
+ Frame f = new Frame();
+ f.setBounds(100, 100, 200, 200);
+ f.setLayout(new FlowLayout());
+ f.add(new Button() {
+ @Override
+ public void update(Graphics g) {
+ wasUpdate = true;
+ super.update(g);
+ }
+ });
+ f.setVisible(true);
+
+ ((SunToolkit)Toolkit.getDefaultToolkit()).realSync();
+
+ if (wasUpdate) {
+ fail(" Unexpected update. ");
+ } else {
+ pass();
+ }
+ }//End init()
+
+ /*****************************************************
+ * Standard Test Machinery Section
+ * DO NOT modify anything in this section -- it's a
+ * standard chunk of code which has all of the
+ * synchronisation necessary for the test harness.
+ * By keeping it the same in all tests, it is easier
+ * to read and understand someone else's test, as
+ * well as insuring that all tests behave correctly
+ * with the test harness.
+ * There is a section following this for test-
+ * classes
+ ******************************************************/
+ private static boolean theTestPassed = false;
+ private static boolean testGeneratedInterrupt = false;
+ private static String failureMessage = "";
+
+ private static Thread mainThread = null;
+
+ private static int sleepTime = 300000;
+
+ // Not sure about what happens if multiple of this test are
+ // instantiated in the same VM. Being static (and using
+ // static vars), it aint gonna work. Not worrying about
+ // it for now.
+ public static void main( String args[] ) throws InterruptedException
+ {
+ mainThread = Thread.currentThread();
+ try
+ {
+ init();
+ }
+ catch( TestPassedException e )
+ {
+ //The test passed, so just return from main and harness will
+ // interepret this return as a pass
+ return;
+ }
+ //At this point, neither test pass nor test fail has been
+ // called -- either would have thrown an exception and ended the
+ // test, so we know we have multiple threads.
+
+ //Test involves other threads, so sleep and wait for them to
+ // called pass() or fail()
+ try
+ {
+ Thread.sleep( sleepTime );
+ //Timed out, so fail the test
+ throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" );
+ }
+ catch (InterruptedException e)
+ {
+ //The test harness may have interrupted the test. If so, rethrow the exception
+ // so that the harness gets it and deals with it.
+ if( ! testGeneratedInterrupt ) throw e;
+
+ //reset flag in case hit this code more than once for some reason (just safety)
+ testGeneratedInterrupt = false;
+
+ if ( theTestPassed == false )
+ {
+ throw new RuntimeException( failureMessage );
+ }
+ }
+
+ }//main
+
+ public static synchronized void setTimeoutTo( int seconds )
+ {
+ sleepTime = seconds * 1000;
+ }
+
+ public static synchronized void pass()
+ {
+ Sysout.println( "The test passed." );
+ Sysout.println( "The test is over, hit Ctl-C to stop Java VM" );
+ //first check if this is executing in main thread
+ if ( mainThread == Thread.currentThread() )
+ {
+ //Still in the main thread, so set the flag just for kicks,
+ // and throw a test passed exception which will be caught
+ // and end the test.
+ theTestPassed = true;
+ throw new TestPassedException();
+ }
+ theTestPassed = true;
+ testGeneratedInterrupt = true;
+ mainThread.interrupt();
+ }//pass()
+
+ public static synchronized void fail()
+ {
+ //test writer didn't specify why test failed, so give generic
+ fail( "it just plain failed! :-)" );
+ }
+
+ public static synchronized void fail( String whyFailed )
+ {
+ Sysout.println( "The test failed: " + whyFailed );
+ Sysout.println( "The test is over, hit Ctl-C to stop Java VM" );
+ //check if this called from main thread
+ if ( mainThread == Thread.currentThread() )
+ {
+ //If main thread, fail now 'cause not sleeping
+ throw new RuntimeException( whyFailed );
+ }
+ theTestPassed = false;
+ testGeneratedInterrupt = true;
+ failureMessage = whyFailed;
+ mainThread.interrupt();
+ }//fail()
+
+}// class ValidBounds
+
+//This exception is used to exit from any level of call nesting
+// when it's determined that the test has passed, and immediately
+// end the test.
+class TestPassedException extends RuntimeException
+{
+}
+
+//*********** End Standard Test Machinery Section **********
+
+
+//************ Begin classes defined for the test ****************
+
+// if want to make listeners, here is the recommended place for them, then instantiate
+// them in init()
+
+/* Example of a class which may be written as part of a test
+class NewClass implements anInterface
+ {
+ static int newVar = 0;
+
+ public void eventDispatched(AWTEvent e)
+ {
+ //Counting events to see if we get enough
+ eventCount++;
+
+ if( eventCount == 20 )
+ {
+ //got enough events, so pass
+
+ ValidBounds.pass();
+ }
+ else if( tries == 20 )
+ {
+ //tried too many times without getting enough events so fail
+
+ ValidBounds.fail();
+ }
+
+ }// eventDispatched()
+
+ }// NewClass class
+
+*/
+
+
+//************** End classes defined for the test *******************
+
+
+
+
+/****************************************************
+ Standard Test Machinery
+ DO NOT modify anything below -- it's a standard
+ chunk of code whose purpose is to make user
+ interaction uniform, and thereby make it simpler
+ to read and understand someone else's test.
+ ****************************************************/
+
+/**
+ This is part of the standard test machinery.
+ It creates a dialog (with the instructions), and is the interface
+ for sending text messages to the user.
+ To print the instructions, send an array of strings to Sysout.createDialog
+ WithInstructions method. Put one line of instructions per array entry.
+ To display a message for the tester to see, simply call Sysout.println
+ with the string to be displayed.
+ This mimics System.out.println but works within the test harness as well
+ as standalone.
+ */
+
+class Sysout
+{
+ private static TestDialog dialog;
+
+ public static void createDialogWithInstructions( String[] instructions )
+ {
+ dialog = new TestDialog( new Frame(), "Instructions" );
+ dialog.printInstructions( instructions );
+ dialog.setVisible(true);
+ println( "Any messages for the tester will display here." );
+ }
+
+ public static void createDialog( )
+ {
+ dialog = new TestDialog( new Frame(), "Instructions" );
+ String[] defInstr = { "Instructions will appear here. ", "" } ;
+ dialog.printInstructions( defInstr );
+ dialog.setVisible(true);
+ println( "Any messages for the tester will display here." );
+ }
+
+
+ public static void printInstructions( String[] instructions )
+ {
+ dialog.printInstructions( instructions );
+ }
+
+
+ public static void println( String messageIn )
+ {
+ dialog.displayMessage( messageIn );
+ System.out.println(messageIn);
+ }
+
+}// Sysout class
+
+/**
+ This is part of the standard test machinery. It provides a place for the
+ test instructions to be displayed, and a place for interactive messages
+ to the user to be displayed.
+ To have the test instructions displayed, see Sysout.
+ To have a message to the user be displayed, see Sysout.
+ Do not call anything in this dialog directly.
+ */
+class TestDialog extends Dialog
+{
+
+ TextArea instructionsText;
+ TextArea messageText;
+ int maxStringLength = 80;
+
+ //DO NOT call this directly, go through Sysout
+ public TestDialog( Frame frame, String name )
+ {
+ super( frame, name );
+ int scrollBoth = TextArea.SCROLLBARS_BOTH;
+ instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
+ add( "North", instructionsText );
+
+ messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
+ add("Center", messageText);
+
+ pack();
+
+ setVisible(true);
+ }// TestDialog()
+
+ //DO NOT call this directly, go through Sysout
+ public void printInstructions( String[] instructions )
+ {
+ //Clear out any current instructions
+ instructionsText.setText( "" );
+
+ //Go down array of instruction strings
+
+ String printStr, remainingStr;
+ for( int i=0; i < instructions.length; i++ )
+ {
+ //chop up each into pieces maxSringLength long
+ remainingStr = instructions[ i ];
+ while( remainingStr.length() > 0 )
+ {
+ //if longer than max then chop off first max chars to print
+ if( remainingStr.length() >= maxStringLength )
+ {
+ //Try to chop on a word boundary
+ int posOfSpace = remainingStr.
+ lastIndexOf( ' ', maxStringLength - 1 );
+
+ if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
+
+ printStr = remainingStr.substring( 0, posOfSpace + 1 );
+ remainingStr = remainingStr.substring( posOfSpace + 1 );
+ }
+ //else just print
+ else
+ {
+ printStr = remainingStr;
+ remainingStr = "";
+ }
+
+ instructionsText.append( printStr + "\n" );
+
+ }// while
+
+ }// for
+
+ }//printInstructions()
+
+ //DO NOT call this directly, go through Sysout
+ public void displayMessage( String messageIn )
+ {
+ messageText.append( messageIn + "\n" );
+ System.out.println(messageIn);
+ }
+
+}// TestDialog class
--- a/jdk/test/java/awt/Component/isLightweightCrash/StubPeerCrash.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/test/java/awt/Component/isLightweightCrash/StubPeerCrash.java Mon Apr 27 12:33:57 2009 -0700
@@ -118,7 +118,7 @@
public boolean handlesWheelScrolling(){return true;};
public void createBuffers(int numBuffers, BufferCapabilities caps) throws AWTException{};
public Image getBackBuffer(){return null;};
- public void flip(BufferCapabilities.FlipContents flipAction){};
+ public void flip(int x1, int y1, int x2, int y2, BufferCapabilities.FlipContents flipAction){};
public void destroyBuffers(){};
/**
--- a/jdk/test/java/awt/EventQueue/6638195/bug6638195.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/test/java/awt/EventQueue/6638195/bug6638195.java Mon Apr 27 12:33:57 2009 -0700
@@ -76,8 +76,13 @@
Callable<Void> afterDispatchCallable =
new Callable<Void>() {
public Void call() {
- delegate.afterDispatch(afterDispatchEventArgument[0],
- afterDispatchHandleArgument[0]);
+ try {
+ delegate.afterDispatch(afterDispatchEventArgument[0],
+ afterDispatchHandleArgument[0]);
+ }
+ catch (InterruptedException e) {
+ throw new RuntimeException("afterDispatch interrupted", e);
+ }
return null;
}
};
@@ -91,8 +96,13 @@
Callable<Object> beforeDispatchCallable =
new Callable<Object>() {
public Object call() {
- return delegate.beforeDispatch(
- beforeDispatchEventArgument[0]);
+ try {
+ return delegate.beforeDispatch(
+ beforeDispatchEventArgument[0]);
+ }
+ catch (InterruptedException e) {
+ throw new RuntimeException("beforeDispatch interrupted", e);
+ }
}
};
methodMap = new HashMap<String, Object>();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Focus/ClearGlobalFocusOwnerTest/ClearGlobalFocusOwnerTest.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ @test
+ @bug 4390555
+ @summary Synopsis: clearGlobalFocusOwner() is not trigerring permanent FOCUS_LOST event
+ @author son@sparc.spb.su, anton.tarasov: area=awt.focus
+ @library ../../regtesthelpers
+ @build Util
+ @run main ClearGlobalFocusOwnerTest
+*/
+
+import java.awt.*;
+import java.awt.event.*;
+import test.java.awt.regtesthelpers.Util;
+
+public class ClearGlobalFocusOwnerTest {
+ static volatile boolean isFocusLost = false;
+ static Frame frame = new Frame("Test frame");
+ static Button button = new Button("Test button");
+
+ public static void main(String[] args) {
+ button.addFocusListener(new FocusAdapter() {
+ public void focusLost(FocusEvent fe) {
+ if (fe.isTemporary()) {
+ throw new TestFailedException("the FocusLost event is temporary: " + fe);
+ }
+ isFocusLost = true;
+ }
+ });
+
+ frame.add(button);
+ frame.pack();
+ frame.setVisible(true);
+
+ Util.waitForIdle(null);
+
+ if (!button.hasFocus()) {
+ button.requestFocus();
+ Util.waitForIdle(null);
+ if (!button.hasFocus()) {
+ throw new TestErrorException("couldn't focus " + button);
+ }
+ }
+
+ KeyboardFocusManager.getCurrentKeyboardFocusManager().clearGlobalFocusOwner();
+
+ Util.waitForIdle(null);
+
+ if (!isFocusLost) {
+ throw new TestFailedException("no FocusLost event happened on clearGlobalFocusOwner");
+ }
+
+ System.out.println("Test passed.");
+ }
+}
+
+/**
+ * Thrown when the behavior being verified is found wrong.
+ */
+class TestFailedException extends RuntimeException {
+ TestFailedException(String msg) {
+ super("Test failed: " + msg);
+ }
+}
+
+/**
+ * Thrown when an error not related to the behavior being verified is encountered.
+ */
+class TestErrorException extends RuntimeException {
+ TestErrorException(String msg) {
+ super("Unexpected error: " + msg);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Focus/CloseDialogActivateOwnerTest/CloseDialogActivateOwnerTest.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2008-2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ @test
+ @bug 6785058
+ @summary Tests that an owner is activated on closing its owned dialog with the warning icon.
+ @author Anton Tarasov: area=awt.focus
+ @library ../../regtesthelpers
+ @build Util
+ @run main/othervm/policy=java.policy -Djava.security.manager CloseDialogActivateOwnerTest
+*/
+
+import java.awt.*;
+import java.awt.event.*;
+import java.applet.Applet;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.lang.reflect.InvocationTargetException;
+import test.java.awt.regtesthelpers.Util;
+
+public class CloseDialogActivateOwnerTest extends Applet {
+ Robot robot;
+
+ public static void main(String[] args) {
+ CloseDialogActivateOwnerTest app = new CloseDialogActivateOwnerTest();
+ app.init();
+ app.start();
+ }
+
+ public void init() {
+ robot = Util.createRobot();
+ }
+
+ public void start() {
+ final Frame frame = new Frame("Owner Frame");
+ final Dialog dialog = new Dialog(frame, "Owned Dialog");
+
+ frame.setSize(100, 100);
+ dialog.setSize(100, 100);
+
+ // Show the owner. Check that it's focused.
+ if (!Util.trackWindowGainedFocus(frame, new Runnable() {
+ public void run() {
+ frame.setVisible(true);
+ }
+ }, 2000, false))
+ {
+ throw new TestErrorException("the owner frame hasn't been activated on show");
+ }
+
+ // Show the owned dialog. Check that it's focused.
+ if (!Util.trackWindowGainedFocus(dialog, new Runnable() {
+ public void run() {
+ dialog.setVisible(true);
+ }
+ }, 2000, true))
+ {
+ throw new TestErrorException("the owned dialog hasn't been activated on show");
+ }
+
+ robot.delay(2000); // wait for the warning icon is shown
+
+ // Close the dialog. Check that the owner is activated.
+ if (!Util.trackWindowGainedFocus(frame, new Runnable() {
+ public void run() {
+ dialog.dispose();
+ }
+ }, 2000, false))
+ {
+ throw new TestFailedException("the owner hasn't been activated on closing the owned dialog");
+ }
+
+ System.out.println("Test passed.");
+ }
+}
+
+/**
+ * Thrown when the behavior being verified is found wrong.
+ */
+class TestFailedException extends RuntimeException {
+ TestFailedException(String msg) {
+ super("Test failed: " + msg);
+ }
+}
+
+/**
+ * Thrown when an error not related to the behavior being verified is encountered.
+ */
+class TestErrorException extends Error {
+ TestErrorException(String msg) {
+ super("Unexpected error: " + msg);
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Focus/CloseDialogActivateOwnerTest/java.policy Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,3 @@
+grant {
+ permission java.awt.AWTPermission "createRobot";
+};
--- a/jdk/test/java/awt/Focus/IconifiedFrameFocusChangeTest/IconifiedFrameFocusChangeTest.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/test/java/awt/Focus/IconifiedFrameFocusChangeTest/IconifiedFrameFocusChangeTest.java Mon Apr 27 12:33:57 2009 -0700
@@ -71,8 +71,14 @@
testFrame.setVisible(true);
Util.waitForIdle(robot);
+ robot.delay(1000); // additional delay is required
+
if (!testButton.hasFocus()) {
- throw new TestErrorException("wrong initial focus");
+ testButton.requestFocus();
+ Util.waitForIdle(robot);
+ if (!testButton.hasFocus()) {
+ throw new TestErrorException("couldn't focus " + testButton);
+ }
}
/*
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Focus/OwnedWindowFocusIMECrashTest/OwnedWindowFocusIMECrashTest.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2008-2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ @test
+ @bug 6542975
+ @summary Tests that switching focus from an owned window doesn't crash.
+ @author anton.tarasov@sun.com: area=awt-focus
+ @library ../../regtesthelpers
+ @build Util
+ @run main OwnedWindowFocusIMECrashTest
+*/
+
+import java.awt.*;
+import javax.swing.*;
+import test.java.awt.regtesthelpers.Util;
+
+public class OwnedWindowFocusIMECrashTest {
+ Robot robot;
+ JFrame owner = new JFrame("Owner Frame");
+ JFrame frame = new JFrame("Other Frame");
+ JWindow window = new JWindow(owner);
+ JButton button = new JButton("Button");
+
+ public static void main(String[] args) {
+ OwnedWindowFocusIMECrashTest app = new OwnedWindowFocusIMECrashTest();
+ app.init();
+ app.start();
+ }
+
+ public void init() {
+ robot = Util.createRobot();
+ }
+
+ public void start() {
+ owner.setBounds(100, 100, 200, 100);
+ window.setBounds(100, 250, 200, 100);
+ frame.setBounds(350, 100, 200, 100);
+ window.add(button);
+
+ owner.setVisible(true);
+ frame.setVisible(true);
+ window.setVisible(true);
+
+ Util.waitForIdle(robot);
+
+ test();
+
+ System.out.println("Test passed");
+ }
+
+ void test() {
+ Util.clickOnComp(button, robot);
+ if (!button.hasFocus()) {
+ throw new TestErrorException("the button couldn't be focused by click");
+ }
+ Util.clickOnTitle(frame, robot); // here there was a crash
+ }
+}
+
+/**
+ * Thrown when an error not related to the behavior being verified is encountered.
+ */
+class TestErrorException extends RuntimeException {
+ TestErrorException(String msg) {
+ super("Unexpected error: " + msg);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Focus/RemoveAfterRequest/RemoveAfterRequest.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ @test
+ @bug 6411406
+ @summary Components automatically transfer focus on removal, even if developer requests focus elsewhere first
+ @author oleg.sukhodolsky, anton.tarasov: area=awt.focus
+ @library ../../regtesthelpers
+ @build Util
+ @run main RemoveAfterRequest
+*/
+
+/**
+ * RemoveAfterRequest.java
+ *
+ * summary: Components automatically transfer focus on removal, even if developer requests focus elsewhere first
+ */
+
+import java.awt.*;
+import java.awt.event.*;
+import test.java.awt.regtesthelpers.Util;
+
+public class RemoveAfterRequest {
+ final static Frame frame = new Frame("test frame");
+ final static Button btn1 = new Button("btn1");
+ final static Button btn2 = new Button("btn2");
+ final static Button btn3 = new Button("btn3");
+
+ public static void main(String[] args) {
+ frame.setLayout(new GridLayout(3, 1));
+ frame.add(btn1);
+ frame.add(btn2);
+ frame.add(btn3);
+ frame.pack();
+ frame.setVisible(true);
+
+ Util.waitForIdle(null);
+
+ if (!btn1.hasFocus()) {
+ btn1.requestFocus();
+ Util.waitForIdle(null);
+ if (!btn1.hasFocus()) {
+ throw new TestErrorException("couldn't focus " + btn1);
+ }
+ }
+
+ if (!Util.trackFocusGained(btn3, new Runnable() {
+ public void run() {
+ btn3.requestFocus();
+ frame.remove(btn1);
+ frame.invalidate();
+ frame.validate();
+ frame.repaint();
+ }
+ }, 2000, true))
+ {
+ throw new TestFailedException("focus request on removal failed");
+ }
+
+ System.out.println("Test passed.");
+ }
+}
+
+/**
+ * Thrown when the behavior being verified is found wrong.
+ */
+class TestFailedException extends RuntimeException {
+ TestFailedException(String msg) {
+ super("Test failed: " + msg);
+ }
+}
+
+/**
+ * Thrown when an error not related to the behavior being verified is encountered.
+ */
+class TestErrorException extends RuntimeException {
+ TestErrorException(String msg) {
+ super("Unexpected error: " + msg);
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/event/KeyEvent/AcceleratorTest/AcceleratorTest.html Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,20 @@
+<html>
+<!--
+ @test
+ @bug 6680988
+ @summary verify that various shortcuts and accelerators work
+ @author yuri.nesterenko : area=awt.keyboard
+ @run applet/manual=yesno AcceleratorTest.html
+ -->
+<head>
+<title> AcceleratorTest </title>
+</head>
+<body>
+
+<h1>AcceleratorTest<br>Bug ID: </h1>
+
+<p> See the dialog box (usually in upper left corner) for instructions</p>
+
+<APPLET CODE="AcceleratorTest.class" WIDTH=200 HEIGHT=200></APPLET>
+</body>
+</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/event/KeyEvent/AcceleratorTest/AcceleratorTest.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,305 @@
+/*
+ test
+ @bug 6680988
+ @summary verify that various shortcuts and accelerators work
+ @author yuri.nesterenko : area=awt.keyboard
+ @run applet/manual=yesno AcceleratorTest.html
+*/
+
+/**
+ * AcceleratorTest.java
+ *
+ * summary:
+ */
+
+//import java.applet.Applet;
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.util.Hashtable;
+
+
+public class AcceleratorTest extends JApplet
+{
+ //Declare things used in the test, like buttons and labels here
+ static int pressed = 0;
+ Hashtable<String, Integer> cmdHash = new Hashtable<String, Integer>();
+ String[] CMD = {
+ "\u042E, keep me in focus",
+ "Item Cyrl Be",
+ "Item English Period",
+ "Item English N",
+ "\u0436"
+ };
+
+ JFrame jfr;
+
+ public void init()
+ {
+ //Create instructions for the user here, as well as set up
+ // the environment -- set the layout manager, add buttons,
+ // etc.
+ this.setLayout (new BorderLayout ());
+
+ String[] instructions =
+ {
+ " Ensure you have Russian keyboard layout as a currently active.",
+ "(1) Press Ctrl+\u0411 (a key with \",<\" on it) ",
+ "(2) Find a . (period) in this layout (perhaps \"/?\" or \"7&\" key).",
+ "Press Ctrl+.",
+ "(3) Press Crtl+ regular English . (period) key (on \".>\" )",
+ "(4) Press Ctrl+ key with English N.",
+ "(5) Press Alt+\u042E (key with \".>\")",
+ "(6) Press Alt+\u0436 (key with \";:\")",
+ "If all expected commands will be fired, look for message",
+ "\"All tests passed\""
+ };
+ Sysout.createDialogWithInstructions( instructions );
+ for(int i = 0; i < CMD.length; i++) {
+ cmdHash.put(CMD[i], 0);
+ }
+
+ jfr = new JFrame();
+ JButton jbu;
+ jfr.add((jbu = new JButton(CMD[0])));
+ jbu.setMnemonic(java.awt.event.KeyEvent.getExtendedKeyCodeForChar('\u042E'));
+ jbu.addActionListener( new ALi(CMD[0]));
+
+
+ JMenuBar menuBar = new JMenuBar();
+ jfr.setJMenuBar(menuBar);
+ JMenu menu = new JMenu("Menu");
+ menuBar.add(menu);
+
+ JMenuItem menuItem = new JMenuItem(CMD[1]);
+ menuItem.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.getExtendedKeyCodeForChar('\u0431'),
+ InputEvent.CTRL_DOWN_MASK));
+
+ JMenuItem menuItemEnglish = new JMenuItem(CMD[2]);
+ menuItemEnglish.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_PERIOD,
+ InputEvent.CTRL_DOWN_MASK));
+ JMenuItem menuItemE1 = new JMenuItem(CMD[3]);
+ menuItemE1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,
+ InputEvent.CTRL_DOWN_MASK));
+ menuItem.addActionListener( new ALi(CMD[1]));
+ menuItemEnglish.addActionListener( new ALi(CMD[2]));
+ menuItemE1.addActionListener( new ALi(CMD[3]));
+ menu.add(menuItem);
+ menu.add(menuItemEnglish);
+ menu.add(menuItemE1);
+
+ KeyStroke ks;
+ InputMap im = new InputMap();
+ ks = KeyStroke.getKeyStroke(KeyEvent.getExtendedKeyCodeForChar('\u0436'), java.awt.event.InputEvent.ALT_DOWN_MASK);
+ im.put(ks, "pushAction");
+ im.setParent(jbu.getInputMap(JComponent.WHEN_FOCUSED));
+ jbu.setInputMap(JComponent.WHEN_FOCUSED, im);
+
+ jbu.getActionMap().put("pushAction",
+ new AbstractAction("pushAction") {
+ public void actionPerformed(ActionEvent evt) {
+ if( evt.getActionCommand().equals(CMD[4])) {
+ cmdHash.put(CMD[4], 1);
+ }
+ boolean notYet = false;
+ for(int i = 0; i < CMD.length; i++) {
+ if(cmdHash.get(CMD[i]) == 0 ) notYet = true;
+ }
+ Sysout.println("Fired");
+ if( !notYet ) {
+ Sysout.println("All tests passed.");
+ }
+ }
+ }
+ );
+
+
+ jfr.setBounds(650,0,200,200);
+ jfr.setVisible(true);
+
+ }//End init()
+
+ public void start ()
+ {
+ //Get things going. Request focus, set size, et cetera
+ setSize (200,200);
+ setVisible(true);
+ validate();
+
+ }// start()
+ public class ALi implements ActionListener {
+ String expectedCmd;
+ public ALi( String eCmd ) {
+ expectedCmd = eCmd;
+ }
+ public void actionPerformed(ActionEvent ae) {
+ if( cmdHash.containsKey(ae.getActionCommand()) ) {
+ cmdHash.put(expectedCmd, 1);
+ }
+ boolean notYet = false;
+ for(int i = 0; i < CMD.length; i++) {
+ if(cmdHash.get(CMD[i]) == 0 ) notYet = true;
+ //Sysout.println(CMD[i]+":"+cmdHash.get(CMD[i]));
+ }
+ Sysout.println("FIRED");
+ if( !notYet ) {
+ Sysout.println("All tests passed.");
+ }
+ }
+ }
+
+
+}// class AcceleratorTest
+
+/* Place other classes related to the test after this line */
+
+
+
+
+
+/****************************************************
+ Standard Test Machinery
+ DO NOT modify anything below -- it's a standard
+ chunk of code whose purpose is to make user
+ interaction uniform, and thereby make it simpler
+ to read and understand someone else's test.
+ ****************************************************/
+
+/**
+ This is part of the standard test machinery.
+ It creates a dialog (with the instructions), and is the interface
+ for sending text messages to the user.
+ To print the instructions, send an array of strings to Sysout.createDialog
+ WithInstructions method. Put one line of instructions per array entry.
+ To display a message for the tester to see, simply call Sysout.println
+ with the string to be displayed.
+ This mimics System.out.println but works within the test harness as well
+ as standalone.
+ */
+
+class Sysout
+{
+ private static TestDialog dialog;
+ private static boolean numbering = false;
+ private static int messageNumber = 0;
+
+ public static void createDialogWithInstructions( String[] instructions )
+ {
+ dialog = new TestDialog( new Frame(), "Instructions" );
+ dialog.printInstructions( instructions );
+ dialog.setVisible(true);
+ println( "Any messages for the tester will display here." );
+ }
+
+ public static void createDialog( )
+ {
+ dialog = new TestDialog( new Frame(), "Instructions" );
+ String[] defInstr = { "Instructions will appear here. ", "" } ;
+ dialog.printInstructions( defInstr );
+ dialog.setVisible(true);
+ println( "Any messages for the tester will display here." );
+ }
+
+ /* Enables message counting for the tester. */
+ public static void enableNumbering(boolean enable){
+ numbering = enable;
+ }
+
+ public static void printInstructions( String[] instructions )
+ {
+ dialog.printInstructions( instructions );
+ }
+
+
+ public static void println( String messageIn )
+ {
+ if (numbering) {
+ messageIn = "" + messageNumber + " " + messageIn;
+ messageNumber++;
+ }
+ dialog.displayMessage( messageIn );
+ }
+
+}// Sysout class
+
+/**
+ This is part of the standard test machinery. It provides a place for the
+ test instructions to be displayed, and a place for interactive messages
+ to the user to be displayed.
+ To have the test instructions displayed, see Sysout.
+ To have a message to the user be displayed, see Sysout.
+ Do not call anything in this dialog directly.
+ */
+class TestDialog extends Dialog
+{
+
+ TextArea instructionsText;
+ TextArea messageText;
+ int maxStringLength = 80;
+
+ //DO NOT call this directly, go through Sysout
+ public TestDialog( Frame frame, String name )
+ {
+ super( frame, name );
+ int scrollBoth = TextArea.SCROLLBARS_BOTH;
+ instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
+ add( "North", instructionsText );
+
+ messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
+ add("Center", messageText);
+
+ pack();
+
+ setVisible(true);
+ }// TestDialog()
+
+ //DO NOT call this directly, go through Sysout
+ public void printInstructions( String[] instructions )
+ {
+ //Clear out any current instructions
+ instructionsText.setText( "" );
+
+ //Go down array of instruction strings
+
+ String printStr, remainingStr;
+ for( int i=0; i < instructions.length; i++ )
+ {
+ //chop up each into pieces maxSringLength long
+ remainingStr = instructions[ i ];
+ while( remainingStr.length() > 0 )
+ {
+ //if longer than max then chop off first max chars to print
+ if( remainingStr.length() >= maxStringLength )
+ {
+ //Try to chop on a word boundary
+ int posOfSpace = remainingStr.
+ lastIndexOf( ' ', maxStringLength - 1 );
+
+ if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
+
+ printStr = remainingStr.substring( 0, posOfSpace + 1 );
+ remainingStr = remainingStr.substring( posOfSpace + 1 );
+ }
+ //else just print
+ else
+ {
+ printStr = remainingStr;
+ remainingStr = "";
+ }
+
+ instructionsText.append( printStr + "\n" );
+
+ }// while
+
+ }// for
+
+ }//printInstructions()
+
+ //DO NOT call this directly, go through Sysout
+ public void displayMessage( String messageIn )
+ {
+ messageText.append( messageIn + "\n" );
+ System.out.println(messageIn);
+ }
+
+}// TestDialog class
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/event/MouseEvent/AWTPanelSmoothWheel/AWTPanelSmoothWheel.html Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,20 @@
+<html>
+<!--
+ @test
+ @bug 6730447
+ @summary Support for high resolution mouse wheel is still incomplete. AWT panel needs to be supported
+ @author dmitry.cherepanov@...: area=awt.mouse
+ @run applet/manual=yesno AWTPanelSmoothWheel.html
+ -->
+<head>
+<title> AWTPanelSmoothWheel </title>
+</head>
+<body>
+
+<h1> AWTPanelSmoothWheel <br>Bug ID: 6730447</h1>
+
+<p> See the dialog box (usually in upper left corner) for instructions</p>
+
+<APPLET CODE="AWTPanelSmoothWheel.class" WIDTH=200 HEIGHT=200></APPLET>
+</body>
+</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/event/MouseEvent/AWTPanelSmoothWheel/AWTPanelSmoothWheel.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,251 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ test
+ @bug 6730447
+ @summary Support for high resolution mouse wheel is still incomplete. AWT panel needs to be supported
+ @author dmitry.cherepanov@...: area=awt.mouse
+ @run applet/manual=yesno AWTPanelSmoothWheel.html
+*/
+
+/**
+ * AWTPanelSmoothWheel.java
+ *
+ * summary:
+ */
+
+import java.applet.Applet;
+import java.awt.*;
+import java.awt.event.*;
+
+//Manual tests should run as applet tests if possible because they
+// get their environments cleaned up, including AWT threads, any
+// test created threads, and any system resources used by the test
+// such as file descriptors. (This is normally not a problem as
+// main tests usually run in a separate VM, however on some platforms
+// such as the Mac, separate VMs are not possible and non-applet
+// tests will cause problems). Also, you don't have to worry about
+// synchronisation stuff in Applet tests the way you do in main
+// tests...
+
+
+public class AWTPanelSmoothWheel extends Applet
+{
+ //Declare things used in the test, like buttons and labels here
+
+ public void init()
+ {
+ //Create instructions for the user here, as well as set up
+ // the environment -- set the layout manager, add buttons,
+ // etc.
+ this.setLayout (new BorderLayout ());
+
+ String[] instructions =
+ {
+ " the test is relevant for windows platforms and ",
+ " mouses with high-resolution wheel, please just press pass if it's not the case ",
+ " place the mouse cursor above the green panel and rotate the mouse wheel " ,
+ " the test will print all mouse wheel messages into the logging panel, ",
+ " please make sure that some of the messages have non-zero 'wheelRotation' value ",
+ " in this case the test passes, otherwise it fails, ",
+ " please make sure the test works OK if the mouse wheel is rotated very slow "
+ };
+ Sysout.createDialogWithInstructions( instructions );
+
+ }//End init()
+
+ public void start ()
+ {
+ Panel panel = new Panel();
+ panel.setBackground(Color.green);
+ panel.addMouseWheelListener(new MouseWheelListener() {
+ public void mouseWheelMoved(MouseWheelEvent e) {
+ Sysout.println(e.toString());
+ }
+ });
+
+ //Get things going. Request focus, set size, et cetera
+ setSize (200,200);
+ setLayout(new BorderLayout());
+ add(panel, BorderLayout.CENTER);
+ setVisible(true);
+ validate();
+
+ //What would normally go into main() will probably go here.
+ //Use System.out.println for diagnostic messages that you want
+ // to read after the test is done.
+ //Use Sysout.println for messages you want the tester to read.
+
+ }// start()
+
+ //The rest of this class is the actions which perform the test...
+
+ //Use Sysout.println to communicate with the user NOT System.out!!
+ //Sysout.println ("Something Happened!");
+
+}// class ManualYesNoTest
+
+/* Place other classes related to the test after this line */
+
+
+
+
+
+/****************************************************
+ Standard Test Machinery
+ DO NOT modify anything below -- it's a standard
+ chunk of code whose purpose is to make user
+ interaction uniform, and thereby make it simpler
+ to read and understand someone else's test.
+ ****************************************************/
+
+/**
+ This is part of the standard test machinery.
+ It creates a dialog (with the instructions), and is the interface
+ for sending text messages to the user.
+ To print the instructions, send an array of strings to Sysout.createDialog
+ WithInstructions method. Put one line of instructions per array entry.
+ To display a message for the tester to see, simply call Sysout.println
+ with the string to be displayed.
+ This mimics System.out.println but works within the test harness as well
+ as standalone.
+ */
+
+class Sysout
+{
+ private static TestDialog dialog;
+
+ public static void createDialogWithInstructions( String[] instructions )
+ {
+ dialog = new TestDialog( new Frame(), "Instructions" );
+ dialog.printInstructions( instructions );
+ dialog.setVisible(true);
+ println( "Any messages for the tester will display here." );
+ }
+
+ public static void createDialog( )
+ {
+ dialog = new TestDialog( new Frame(), "Instructions" );
+ String[] defInstr = { "Instructions will appear here. ", "" } ;
+ dialog.printInstructions( defInstr );
+ dialog.setVisible(true);
+ println( "Any messages for the tester will display here." );
+ }
+
+
+ public static void printInstructions( String[] instructions )
+ {
+ dialog.printInstructions( instructions );
+ }
+
+
+ public static void println( String messageIn )
+ {
+ dialog.displayMessage( messageIn );
+ }
+
+}// Sysout class
+
+/**
+ This is part of the standard test machinery. It provides a place for the
+ test instructions to be displayed, and a place for interactive messages
+ to the user to be displayed.
+ To have the test instructions displayed, see Sysout.
+ To have a message to the user be displayed, see Sysout.
+ Do not call anything in this dialog directly.
+ */
+class TestDialog extends Dialog
+{
+
+ TextArea instructionsText;
+ TextArea messageText;
+ int maxStringLength = 80;
+
+ //DO NOT call this directly, go through Sysout
+ public TestDialog( Frame frame, String name )
+ {
+ super( frame, name );
+ int scrollBoth = TextArea.SCROLLBARS_BOTH;
+ instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
+ add( "North", instructionsText );
+
+ messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
+ add("Center", messageText);
+
+ pack();
+
+ setVisible(true);
+ }// TestDialog()
+
+ //DO NOT call this directly, go through Sysout
+ public void printInstructions( String[] instructions )
+ {
+ //Clear out any current instructions
+ instructionsText.setText( "" );
+
+ //Go down array of instruction strings
+
+ String printStr, remainingStr;
+ for( int i=0; i < instructions.length; i++ )
+ {
+ //chop up each into pieces maxSringLength long
+ remainingStr = instructions[ i ];
+ while( remainingStr.length() > 0 )
+ {
+ //if longer than max then chop off first max chars to print
+ if( remainingStr.length() >= maxStringLength )
+ {
+ //Try to chop on a word boundary
+ int posOfSpace = remainingStr.
+ lastIndexOf( ' ', maxStringLength - 1 );
+
+ if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
+
+ printStr = remainingStr.substring( 0, posOfSpace + 1 );
+ remainingStr = remainingStr.substring( posOfSpace + 1 );
+ }
+ //else just print
+ else
+ {
+ printStr = remainingStr;
+ remainingStr = "";
+ }
+
+ instructionsText.append( printStr + "\n" );
+
+ }// while
+
+ }// for
+
+ }//printInstructions()
+
+ //DO NOT call this directly, go through Sysout
+ public void displayMessage( String messageIn )
+ {
+ messageText.append( messageIn + "\n" );
+ System.out.println(messageIn);
+ }
+
+}// TestDialog class
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/Beans/6669869/TestDesignTime.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6669869
+ * @summary Tests DesignTime property in different application contexts
+ * @author Sergey Malenkov
+ */
+
+import java.beans.Beans;
+import sun.awt.SunToolkit;
+
+public class TestDesignTime implements Runnable {
+ public static void main(String[] args) throws InterruptedException {
+ if (Beans.isDesignTime()) {
+ throw new Error("unexpected DesignTime property");
+ }
+ Beans.setDesignTime(!Beans.isDesignTime());
+ ThreadGroup group = new ThreadGroup("$$$");
+ Thread thread = new Thread(group, new TestDesignTime());
+ thread.start();
+ thread.join();
+ }
+
+ public void run() {
+ SunToolkit.createNewAppContext();
+ if (Beans.isDesignTime()) {
+ throw new Error("shared DesignTime property");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/Beans/6669869/TestGuiAvailable.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6669869
+ * @summary Tests GuiAvailable property in different application contexts
+ * @author Sergey Malenkov
+ */
+
+import java.awt.GraphicsEnvironment;
+import java.beans.Beans;
+import sun.awt.SunToolkit;
+
+public class TestGuiAvailable implements Runnable {
+ public static void main(String[] args) throws InterruptedException {
+ if (Beans.isGuiAvailable() == GraphicsEnvironment.isHeadless()) {
+ throw new Error("unexpected GuiAvailable property");
+ }
+ Beans.setGuiAvailable(!Beans.isGuiAvailable());
+ ThreadGroup group = new ThreadGroup("$$$");
+ Thread thread = new Thread(group, new TestGuiAvailable());
+ thread.start();
+ thread.join();
+ }
+
+ public void run() {
+ SunToolkit.createNewAppContext();
+ if (Beans.isGuiAvailable() == GraphicsEnvironment.isHeadless()) {
+ throw new Error("shared GuiAvailable property");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/ClassLoader/deadlock/Alice.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package comSA;
+
+public class Alice extends comSB.SupAlice {
+ static {
+ System.out.println("comSA.Alice loaded");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/ClassLoader/deadlock/Bob.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package comSB;
+
+public class Bob extends comSA.SupBob {
+ static {
+ System.out.println("comSB.Bob loaded");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/ClassLoader/deadlock/DelegatingLoader.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.*;
+import java.lang.reflect.*;
+
+public class DelegatingLoader extends URLClassLoader {
+
+ private DelegatingLoader delLoader;
+ private String[] delClasses;
+
+ static {
+ boolean supportParallel = false;
+ try {
+ Class c = Class.forName("java.lang.ClassLoader");
+ Method m = c.getDeclaredMethod("registerAsParallelCapable",
+ new Class[0]);
+ m.setAccessible(true);
+ Object result = (Boolean) m.invoke(null);
+ if (result instanceof Boolean) {
+ supportParallel = ((Boolean) result).booleanValue();
+ } else {
+ // Should never happen
+ System.out.println("Error: ClassLoader.registerAsParallelCapable() did not return a boolean!");
+ System.exit(1);
+ }
+ } catch (NoSuchMethodException nsme) {
+ System.out.println("No ClassLoader.registerAsParallelCapable() API");
+ } catch (NoSuchMethodError nsme2) {
+ System.out.println("No ClassLoader.registerAsParallelCapable() API");
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ // Exit immediately to indicate an error
+ System.exit(1);
+ }
+ System.out.println("Parallel ClassLoader registration: " +
+ supportParallel);
+ }
+
+ public DelegatingLoader(URL urls[]) {
+ super(urls);
+ System.out.println("DelegatingLoader using URL " + urls[0]);
+ }
+
+ public void setDelegate(String[] delClasses, DelegatingLoader delLoader) {
+ this.delClasses = delClasses;
+ this.delLoader = delLoader;
+ }
+
+ public Class loadClass(String className, boolean resolve)
+ throws ClassNotFoundException {
+ for (int i = 0; i < delClasses.length; i++) {
+ if (delClasses[i].equals(className)) {
+ Starter.log("Delegating class loading for " + className);
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException ie) {
+ return null;
+ }
+ return delLoader.loadClass(className, resolve);
+ }
+ }
+
+ Starter.log("Loading local class " + className);
+// synchronized (getClassLoadingLock(className)) {
+ return super.loadClass(className, resolve);
+// }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/ClassLoader/deadlock/Starter.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+public class Starter implements Runnable {
+
+ private String id;
+ private DelegatingLoader dl;
+ private String startClass;
+
+ private static DelegatingLoader saLoader, sbLoader;
+
+ public static void log(String line) {
+ System.out.println(line);
+ }
+
+ public static void main(String[] args) {
+ URL[] urlsa = new URL[1];
+ URL[] urlsb = new URL[1];
+ try {
+ String testDir = System.getProperty("test.classes", ".");
+ String sep = System.getProperty("file.separator");
+ urlsa[0] = new URL("file://" + testDir + sep + "SA" + sep);
+ urlsb[0] = new URL("file://" + testDir + sep + "SB" + sep);
+ } catch (MalformedURLException e) {
+ e.printStackTrace();
+ }
+ // Set up Classloader delegation hierarchy
+ saLoader = new DelegatingLoader(urlsa);
+ sbLoader = new DelegatingLoader(urlsb);
+
+ String[] saClasses = { "comSA.SupBob", "comSA.Alice" };
+ String[] sbClasses = { "comSB.SupAlice", "comSB.Bob" };
+
+ saLoader.setDelegate(sbClasses, sbLoader);
+ sbLoader.setDelegate(saClasses, saLoader);
+
+ // test one-way delegate
+ String testType = args[0];
+ if (testType.equals("one-way")) {
+ test("comSA.Alice", "comSA.SupBob");
+ } else if (testType.equals("cross")) {
+ // test cross delegate
+ test("comSA.Alice", "comSB.Bob");
+ } else {
+ System.out.println("ERROR: unsupported - " + testType);
+ }
+ }
+
+ private static void test(String clsForSA, String clsForSB) {
+ Starter ia = new Starter("SA", saLoader, clsForSA);
+ Starter ib = new Starter("SB", sbLoader, clsForSB);
+ new Thread(ia).start();
+ new Thread(ib).start();
+ }
+
+ public static void sleep() {
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ log("Thread interrupted");
+ }
+ }
+
+ private Starter(String id, DelegatingLoader dl, String startClass) {
+ this.id = id;
+ this.dl = dl;
+ this.startClass = startClass;
+ }
+
+ public void run() {
+ log("Spawned thread " + id + " running");
+ try {
+ // To mirror the WAS deadlock, need to ensure class load
+ // is routed via the VM.
+ Class.forName(startClass, true, dl);
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ log("Thread " + id + " terminating");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/ClassLoader/deadlock/SupAlice.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package comSB;
+
+public class SupAlice {
+ static {
+ System.out.println("comSB.SupAlice loaded");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/ClassLoader/deadlock/SupBob.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package comSA;
+
+public class SupBob {
+ static {
+ System.out.println("comSA.SupBob loaded");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/ClassLoader/deadlock/TestCrossDelegate.sh Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,105 @@
+#
+# Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+# @test
+# @bug 4735126
+# @summary (cl) ClassLoader.loadClass locks all instances in chain
+# when delegating
+#
+# @run shell/timeout=10 TestCrossDelegate.sh
+
+# if running by hand on windows, change TESTSRC and TESTCLASSES to "."
+if [ "${TESTSRC}" = "" ] ; then
+ TESTSRC=`pwd`
+fi
+if [ "${TESTCLASSES}" = "" ] ; then
+ TESTCLASSES=`pwd`
+fi
+
+# if running by hand on windows, change this to appropriate value
+if [ "${TESTJAVA}" = "" ] ; then
+ echo "TESTJAVA not set. Test cannot execute."
+ echo "FAILED!!!"
+ exit 1
+fi
+echo TESTSRC=${TESTSRC}
+echo TESTCLASSES=${TESTCLASSES}
+echo TESTJAVA=${TESTJAVA}
+echo ""
+
+# set platform-specific variables
+OS=`uname -s`
+case "$OS" in
+ SunOS )
+ FS="/"
+ ;;
+ Linux )
+ FS="/"
+ ;;
+ Windows* )
+ FS="\\"
+ ;;
+esac
+
+# compile test
+${TESTJAVA}${FS}bin${FS}javac \
+ -d ${TESTCLASSES} \
+ ${TESTSRC}${FS}Starter.java ${TESTSRC}${FS}DelegatingLoader.java
+
+STATUS=$?
+if [ ${STATUS} -ne 0 ]
+then
+ exit ${STATUS}
+fi
+
+# set up test
+${TESTJAVA}${FS}bin${FS}javac \
+ -d ${TESTCLASSES}${FS} \
+ ${TESTSRC}${FS}Alice.java ${TESTSRC}${FS}SupBob.java \
+ ${TESTSRC}${FS}Bob.java ${TESTSRC}${FS}SupAlice.java
+
+cd ${TESTCLASSES}
+DIRS="SA SB"
+for dir in $DIRS
+do
+ if [ -d ${dir} ]; then
+ rm -rf ${dir}
+ fi
+ mkdir ${dir}
+ mv com${dir} ${dir}
+done
+
+# run test
+${TESTJAVA}${FS}bin${FS}java \
+ -verbose:class -XX:+TraceClassLoading -cp . \
+ -Dtest.classes=${TESTCLASSES} \
+ Starter cross
+# -XX:+UnlockDiagnosticVMOptions -XX:+UnsyncloadClass \
+
+# save error status
+STATUS=$?
+
+# clean up
+rm -rf ${TESTCLASSES}${FS}SA ${TESTCLASSES}${FS}SB
+
+# return
+exit ${STATUS}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/ClassLoader/deadlock/TestOneWayDelegate.sh Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,105 @@
+#
+# Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+# @test
+# @bug 4735126
+# @summary (cl) ClassLoader.loadClass locks all instances in chain
+# when delegating
+#
+# @run shell/timeout=10 TestOneWayDelegate.sh
+
+# if running by hand on windows, change TESTSRC and TESTCLASSES to "."
+if [ "${TESTSRC}" = "" ] ; then
+ TESTSRC=`pwd`
+fi
+if [ "${TESTCLASSES}" = "" ] ; then
+ TESTCLASSES=`pwd`
+fi
+
+# if running by hand on windows, change this to appropriate value
+if [ "${TESTJAVA}" = "" ] ; then
+ echo "TESTJAVA not set. Test cannot execute."
+ echo "FAILED!!!"
+ exit 1
+fi
+echo TESTSRC=${TESTSRC}
+echo TESTCLASSES=${TESTCLASSES}
+echo TESTJAVA=${TESTJAVA}
+echo ""
+
+# set platform-specific variables
+OS=`uname -s`
+case "$OS" in
+ SunOS )
+ FS="/"
+ ;;
+ Linux )
+ FS="/"
+ ;;
+ Windows* )
+ FS="\\"
+ ;;
+esac
+
+# compile test
+${TESTJAVA}${FS}bin${FS}javac \
+ -d ${TESTCLASSES} \
+ ${TESTSRC}${FS}Starter.java ${TESTSRC}${FS}DelegatingLoader.java
+
+STATUS=$?
+if [ ${STATUS} -ne 0 ]
+then
+ exit ${STATUS}
+fi
+
+# set up test
+${TESTJAVA}${FS}bin${FS}javac \
+ -d ${TESTCLASSES}${FS} \
+ ${TESTSRC}${FS}Alice.java ${TESTSRC}${FS}SupBob.java \
+ ${TESTSRC}${FS}Bob.java ${TESTSRC}${FS}SupAlice.java
+
+cd ${TESTCLASSES}
+DIRS="SA SB"
+for dir in $DIRS
+do
+ if [ -d ${dir} ]; then
+ rm -rf ${dir}
+ fi
+ mkdir ${dir}
+ mv com${dir} ${dir}
+done
+
+# run test
+${TESTJAVA}${FS}bin${FS}java \
+ -verbose:class -XX:+TraceClassLoading -cp . \
+ -Dtest.classes=${TESTCLASSES} \
+ Starter one-way
+# -XX:+UnlockDiagnosticVMOptions -XX:+UnsyncloadClass \
+
+# save error status
+STATUS=$?
+
+# clean up
+rm -rf ${TESTCLASSES}${FS}SA ${TESTCLASSES}${FS}SB
+
+# return
+exit ${STATUS}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/Integer/ValueOf.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6807702
+ * @summary Basic test for Integer.valueOf
+ * @run main ValueOf
+ * @run main/othervm -esa -XX:+AggressiveOpts ValueOf
+ */
+
+public class ValueOf {
+
+ // test Integer.valueOf over this range (inclusive)
+ private static final int TEST_LOW = -1024;
+ private static final int TEST_HIGH = 24576;
+
+ public static void main(String[] args) {
+ int i = TEST_LOW;
+ while (i <= TEST_HIGH) {
+ // check that valueOf stores i
+ if (Integer.valueOf(i).intValue() != i)
+ throw new RuntimeException();
+
+ // check that the same object is returned for integral values
+ // in the range -128 to 127 (inclusive)
+ if (i >= -128 && i <= 127) {
+ if (Integer.valueOf(i) != Integer.valueOf(i))
+ throw new RuntimeException();
+ }
+
+ i++;
+ }
+ }
+}
--- a/jdk/test/java/lang/String/ToLowerCase.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/test/java/lang/String/ToLowerCase.java Mon Apr 27 12:33:57 2009 -0700
@@ -72,7 +72,7 @@
// I-dot tests (Turkish and Azeri)
test("\u0130", turkish, "i");
test("\u0130", az, "i");
- test("\u0130", Locale.US, "i");
+ test("\u0130", Locale.US, "i\u0307");
// Remove dot_above in the sequence I + dot_above (Turkish and Azeri)
test("I\u0307", turkish, "i");
--- a/jdk/test/java/nio/channels/AsyncCloseAndInterrupt.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/test/java/nio/channels/AsyncCloseAndInterrupt.java Mon Apr 27 12:33:57 2009 -0700
@@ -22,7 +22,7 @@
*/
/* @test
- * @bug 4460583 4470470 4840199 6419424 6710579 6596323
+ * @bug 4460583 4470470 4840199 6419424 6710579 6596323 6824135
* @summary Comprehensive test of asynchronous closing and interruption
* @author Mark Reinhold
*/
--- a/jdk/test/java/nio/channels/DatagramChannel/NotBound.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/test/java/nio/channels/DatagramChannel/NotBound.java Mon Apr 27 12:33:57 2009 -0700
@@ -22,27 +22,110 @@
*/
/* @test
- * @bug 4512723
- * @summary Unit test for datagram-socket-channel adaptors
+ * @bug 4512723 6621689
+ * @summary Test that connect/send/receive with unbound DatagramChannel causes
+ * the channel's socket to be bound to a local address
*/
import java.net.*;
-import java.nio.*;
-import java.nio.channels.*;
+import java.nio.ByteBuffer;
+import java.nio.channels.DatagramChannel;
+import java.io.IOException;
+
+public class NotBound {
+
+ static void checkBound(DatagramChannel dc) throws IOException {
+ if (dc.getLocalAddress() == null)
+ throw new RuntimeException("Not bound??");
+ }
-class NotBound {
- public static void main(String[] args) throws Exception {
- test1(false);
- test1(true);
+ // starts a thread to send a datagram to the given channel once the channel
+ // is bound to a local address
+ static void wakeupWhenBound(final DatagramChannel dc) {
+ Runnable wakeupTask = new Runnable() {
+ public void run() {
+ try {
+ // poll for local address
+ InetSocketAddress local;
+ do {
+ Thread.sleep(50);
+ local = (InetSocketAddress)dc.getLocalAddress();
+ } while (local == null);
+
+ // send message to channel to wakeup receiver
+ DatagramChannel sender = DatagramChannel.open();
+ try {
+ ByteBuffer bb = ByteBuffer.wrap("hello".getBytes());
+ InetAddress lh = InetAddress.getLocalHost();
+ SocketAddress target =
+ new InetSocketAddress(lh, local.getPort());
+ sender.send(bb, target);
+ } finally {
+ sender.close();
+ }
+
+ } catch (Exception x) {
+ x.printStackTrace();
+ }
+ }};
+ new Thread(wakeupTask).start();
}
- static void test1(boolean blocking) throws Exception {
- ByteBuffer bb = ByteBuffer.allocateDirect(256);
- DatagramChannel dc1 = DatagramChannel.open();
- dc1.configureBlocking(false);
- SocketAddress isa = dc1.receive(bb);
- if (isa != null)
- throw new Exception("Unbound dc returned non-null");
- dc1.close();
+ public static void main(String[] args) throws IOException {
+ DatagramChannel dc;
+
+ // connect
+ dc = DatagramChannel.open();
+ try {
+ DatagramChannel peer = DatagramChannel.open()
+ .bind(new InetSocketAddress(0));
+ int peerPort = ((InetSocketAddress)(peer.getLocalAddress())).getPort();
+ try {
+ dc.connect(new InetSocketAddress(InetAddress.getLocalHost(), peerPort));
+ checkBound(dc);
+ } finally {
+ peer.close();
+ }
+ } finally {
+ dc.close();
+ }
+
+ // send
+ dc = DatagramChannel.open();
+ try {
+ ByteBuffer bb = ByteBuffer.wrap("ignore this".getBytes());
+ SocketAddress target =
+ new InetSocketAddress(InetAddress.getLocalHost(), 5000);
+ dc.send(bb, target);
+ checkBound(dc);
+ } finally {
+ dc.close();
+ }
+
+ // receive (blocking)
+ dc = DatagramChannel.open();
+ try {
+ ByteBuffer bb = ByteBuffer.allocateDirect(128);
+ wakeupWhenBound(dc);
+ SocketAddress sender = dc.receive(bb);
+ if (sender == null)
+ throw new RuntimeException("Sender should not be null");
+ checkBound(dc);
+ } finally {
+ dc.close();
+ }
+
+ // receive (non-blocking)
+ dc = DatagramChannel.open();
+ try {
+ dc.configureBlocking(false);
+ ByteBuffer bb = ByteBuffer.allocateDirect(128);
+ SocketAddress sender = dc.receive(bb);
+ if (sender != null)
+ throw new RuntimeException("Sender should be null");
+ checkBound(dc);
+ } finally {
+ dc.close();
+ }
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/nio/channels/Selector/HelperSlowToDie.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6823609
+ * @summary Selector.select can hangs on Windows for cases where a helper thread
+ * becomes redudant but a new helper is immediately needed.
+ */
+
+import java.nio.channels.*;
+import java.io.IOException;
+
+public class HelperSlowToDie {
+ private static final int CHANNELS_PER_THREAD = 1023;
+ private static volatile boolean done;
+
+ public static void main(String[] args) throws IOException {
+ Selector sel = Selector.open();
+
+ // register channels
+ SocketChannel[] channels = new SocketChannel[CHANNELS_PER_THREAD];
+ for (int i=0; i<CHANNELS_PER_THREAD; i++) {
+ SocketChannel sc = SocketChannel.open();
+ sc.configureBlocking(false);
+ sc.register(sel, SelectionKey.OP_CONNECT);
+ channels[i] = sc;
+ }
+ sel.selectNow();
+
+ // Start threads to swamp all cores but one. This improves the chances
+ // of duplicating the bug.
+ Runnable busy = new Runnable() {
+ public void run() {
+ while (!done) ; // no nothing
+ }
+ };
+ int ncores = Runtime.getRuntime().availableProcessors();
+ for (int i=0; i<ncores-1; i++)
+ new Thread(busy).start();
+
+ // Loop changing the number of channels from 1023 to 1024 and back.
+ for (int i=0; i<1000; i++) {
+ SocketChannel sc = SocketChannel.open();
+ sc.configureBlocking(false);
+ sc.register(sel, SelectionKey.OP_CONNECT);
+ sel.selectNow(); // cause helper to spin up
+ sc.close();
+ sel.selectNow(); // cause helper to retire
+ }
+
+ // terminate busy threads
+ done = true;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/nio/channels/Selector/LotsOfUpdates.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.nio.channels.*;
+import java.io.IOException;
+
+public class LotsOfUpdates {
+ public static void main(String[] args) throws IOException {
+ Selector sel = Selector.open();
+ SocketChannel sc = SocketChannel.open();
+ sc.configureBlocking(false);
+ SelectionKey key = sc.register(sel, 0);
+ for (int i=0; i<50000; i++) {
+ key.interestOps(0);
+ }
+ sel.selectNow();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/nio/channels/Selector/RegAfterPreClose.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 6693490
+ * @summary Pre-close file descriptor may inadvertently get registered with
+ * epoll during close
+ */
+
+import java.net.*;
+import java.nio.channels.*;
+import java.util.concurrent.*;
+import java.util.*;
+import java.io.IOException;
+
+public class RegAfterPreClose {
+
+ static volatile boolean done;
+
+ /**
+ * A task that continuously connects to a given address and immediately
+ * closes the connection.
+ */
+ static class Connector implements Runnable {
+ private final SocketAddress sa;
+ Connector(int port) throws IOException {
+ InetAddress lh = InetAddress.getLocalHost();
+ this.sa = new InetSocketAddress(lh, port);
+ }
+ public void run() {
+ while (!done) {
+ try {
+ SocketChannel.open(sa).close();
+ } catch (IOException x) {
+ // back-off as probably resource related
+ try {
+ Thread.sleep(10);
+ } catch (InterruptedException ignore) { }
+ }
+ }
+ }
+ }
+
+ /**
+ * A task that closes a channel.
+ */
+ static class Closer implements Runnable {
+ private final Channel channel;
+ Closer(Channel sc) {
+ this.channel = sc;
+ }
+ public void run() {
+ try {
+ channel.close();
+ } catch (IOException ignore) { }
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ // create listener
+ InetSocketAddress isa = new InetSocketAddress(0);
+ ServerSocketChannel ssc = ServerSocketChannel.open();
+ ssc.socket().bind(isa);
+
+ // register with Selector
+ final Selector sel = Selector.open();
+ ssc.configureBlocking(false);
+ SelectionKey key = ssc.register(sel, SelectionKey.OP_ACCEPT);
+
+ ThreadFactory factory = new ThreadFactory() {
+ @Override
+ public Thread newThread(Runnable r) {
+ Thread t = new Thread(r);
+ t.setDaemon(true);
+ return t;
+ }
+ };
+
+ // schedule test to run for 1 minute
+ Executors.newScheduledThreadPool(1, factory).schedule(new Runnable() {
+ public void run() {
+ done = true;
+ sel.wakeup();
+ }}, 1, TimeUnit.MINUTES);
+
+ // create Executor that handles tasks that closes channels
+ // "asynchronously" - this creates the conditions to provoke the bug.
+ Executor executor = Executors.newFixedThreadPool(2, factory);
+
+ // submit task that connects to listener
+ executor.execute(new Connector(ssc.socket().getLocalPort()));
+
+ // loop accepting connections until done (or an IOException is thrown)
+ while (!done) {
+ sel.select();
+ if (key.isAcceptable()) {
+ SocketChannel sc = ssc.accept();
+ if (sc != null) {
+ sc.configureBlocking(false);
+ sc.register(sel, SelectionKey.OP_READ);
+ executor.execute(new Closer(sc));
+ }
+ }
+ sel.selectedKeys().clear();
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/nio/channels/Selector/lots_of_updates.sh Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,49 @@
+#
+# Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+# @test
+# @bug 6824477
+# @summary Selector.select can fail with IOException "Invalid argument" on
+# Solaris if maximum number of file descriptors is less than 10000
+# @build LotsOfUpdates
+# @run shell lots_of_updates.sh
+
+OS=`uname -s`
+case "$OS" in
+ Windows_* )
+ echo "ulimit not on Windows"
+ exit 0
+ ;;
+ * )
+ CLASSPATH=${TESTCLASSES}:${TESTSRC}
+ ;;
+esac
+export CLASSPATH
+
+# hard limit needs to be less than 10000 for this bug
+NOFILES=`ulimit -n -H`
+if [ "$NOFILES" = "unlimited" ] || [ $NOFILES -ge 10000 ]; then
+ ulimit -n 2048
+fi
+
+${TESTJAVA}/bin/java LotsOfUpdates
--- a/jdk/test/java/rmi/activation/rmidViaInheritedChannel/InheritedChannelNotServerSocket.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/test/java/rmi/activation/rmidViaInheritedChannel/InheritedChannelNotServerSocket.java Mon Apr 27 12:33:57 2009 -0700
@@ -22,7 +22,7 @@
*/
/* @test
- * @bug 6261402
+ * @bug 6261402 6824141
* @summary If rmid has an inherited channel that is not a server
* socket (such as it if was started using rsh/rcmd), then it should
* function normally.
@@ -37,6 +37,7 @@
import java.io.IOException;
import java.net.Socket;
+import java.net.ProtocolFamily;
import java.nio.channels.Channel;
import java.nio.channels.DatagramChannel;
import java.nio.channels.Pipe;
@@ -137,6 +138,12 @@
return provider.openDatagramChannel();
}
+ public DatagramChannel openDatagramChannel(ProtocolFamily family)
+ throws IOException
+ {
+ return provider.openDatagramChannel(family);
+ }
+
public Pipe openPipe() throws IOException {
return provider.openPipe();
}
--- a/jdk/test/java/rmi/activation/rmidViaInheritedChannel/RmidViaInheritedChannel.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/test/java/rmi/activation/rmidViaInheritedChannel/RmidViaInheritedChannel.java Mon Apr 27 12:33:57 2009 -0700
@@ -22,7 +22,7 @@
*/
/* @test
- * @bug 4295885
+ * @bug 4295885 6824141
* @summary rmid should be startable from inetd
* @author Ann Wollrath
*
@@ -36,6 +36,7 @@
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
+import java.net.ProtocolFamily;
import java.nio.channels.*;
import java.nio.channels.spi.*;
import java.rmi.Remote;
@@ -126,6 +127,12 @@
return provider.openDatagramChannel();
}
+ public DatagramChannel openDatagramChannel(ProtocolFamily family)
+ throws IOException
+ {
+ return provider.openDatagramChannel(family);
+ }
+
public Pipe openPipe()
throws IOException
{
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/Security/ClassLoaderDeadlock/CreateSerialized.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+import java.io.*;
+import sun.misc.*;
+
+public class CreateSerialized {
+ public static void main(String[] args) throws Exception {
+ Object o = new com.sun.crypto.provider.SunJCE();
+
+ FileOutputStream fos = new FileOutputStream("object.tmp");
+ ObjectOutputStream objectOutputStream = new ObjectOutputStream(fos);
+ objectOutputStream.writeObject(o);
+ fos.close();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+import java.io.*;
+import javax.xml.parsers.DocumentBuilderFactory;
+import java.security.*;
+
+public class Deadlock2 {
+ public static void main(String[] args) throws Exception {
+ File file = new File("object.tmp");
+ final byte[] bytes = new byte[(int) file.length()];
+ FileInputStream fileInputStream = new FileInputStream(file);
+ int read = fileInputStream.read(bytes);
+ if (read != file.length()) {
+ throw new Exception("Didn't read all");
+ }
+ Thread.sleep(1000);
+
+ Runnable xmlRunnable = new Runnable() {
+ public void run() {
+ try {
+ DocumentBuilderFactory.newInstance();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ };
+
+ Runnable readObjectRunnable = new Runnable() {
+ public void run() {
+ try {
+ ObjectInputStream objectInputStream =
+ new ObjectInputStream(new ByteArrayInputStream(bytes));
+ Object o = objectInputStream.readObject();
+ System.out.println(o.getClass());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ Thread thread1 = new Thread(readObjectRunnable, "Read Object");
+ Thread thread2 = new Thread(xmlRunnable, "XML");
+
+ thread1.start();
+ thread2.start();
+
+ thread1.join();
+ thread2.join();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.sh Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,99 @@
+#!/bin/sh
+
+#
+# Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+
+# @test
+# @bug 6440846
+# @summary make sure we do not deadlock between ExtClassLoader and AppClassLoader
+# @author Valerie Peng
+# @run shell/timeout=20 Deadlock2.sh
+
+# set a few environment variables so that the shell-script can run stand-alone
+# in the source directory
+
+if [ "${TESTSRC}" = "" ] ; then
+ TESTSRC="."
+fi
+
+if [ "${TESTCLASSES}" = "" ] ; then
+ TESTCLASSES="."
+fi
+
+if [ "${TESTJAVA}" = "" ] ; then
+ echo "TESTJAVA not set. Test cannot execute."
+ echo "FAILED!!!"
+ exit 1
+fi
+
+# set platform-dependent variables
+OS=`uname -s`
+case "$OS" in
+ SunOS )
+ PATHSEP=":"
+ FILESEP="/"
+ ;;
+ Linux )
+ PATHSEP=":"
+ FILESEP="/"
+ ;;
+ Windows* )
+ PATHSEP=";"
+ FILESEP="\\"
+ ;;
+ * )
+ echo "Unrecognized system!"
+ exit 1;
+ ;;
+esac
+
+# remove old class files
+cd ${TESTCLASSES}
+rm -f Deadlock2*.class
+if [ -d testlib ] ; then
+ rm -rf testlib
+fi
+cp -r ${TESTJAVA}${FILESEP}lib${FILESEP}ext testlib
+
+# compile and package the test program
+${TESTJAVA}${FILESEP}bin${FILESEP}javac \
+ -d ${TESTCLASSES} \
+ ${TESTSRC}${FILESEP}CreateSerialized.java \
+ ${TESTSRC}${FILESEP}Deadlock2.java
+
+${TESTJAVA}${FILESEP}bin${FILESEP}jar \
+ -cvf testlib${FILESEP}Deadlock2.jar \
+ Deadlock2*.class
+
+rm Deadlock2*.class
+
+# create serialized object and run the test
+${TESTJAVA}${FILESEP}bin${FILESEP}java CreateSerialized
+${TESTJAVA}${FILESEP}bin${FILESEP}java -Djava.ext.dirs=${TESTCLASSES}${FILESEP}testlib Deadlock2
+STATUS=$?
+
+# clean up
+rm object.tmp CreateSerialized.class
+rm -rf testlib
+exit ${STATUS}
--- a/jdk/test/java/util/Collection/MOAT.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/test/java/util/Collection/MOAT.java Mon Apr 27 12:33:57 2009 -0700
@@ -555,6 +555,7 @@
NavigableMap<Integer,Integer> nm =
(NavigableMap<Integer,Integer>) m;
+ testNavigableMapRemovers(nm);
testNavigableMap(nm);
testNavigableMap(nm.headMap(6, false));
testNavigableMap(nm.headMap(5, true));
@@ -742,6 +743,97 @@
equal(it.next(), expected);
}
+ static void equalMaps(Map m1, Map m2) {
+ equal(m1, m2);
+ equal(m2, m1);
+ equal(m1.size(), m2.size());
+ equal(m1.isEmpty(), m2.isEmpty());
+ equal(m1.toString(), m2.toString());
+ check(Arrays.equals(m1.entrySet().toArray(), m2.entrySet().toArray()));
+ }
+
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ static void testNavigableMapRemovers(NavigableMap m)
+ {
+ final Map emptyMap = new HashMap();
+
+ final Map singletonMap = new HashMap();
+ singletonMap.put(1, 2);
+
+ abstract class NavigableMapView {
+ abstract NavigableMap view(NavigableMap m);
+ }
+
+ NavigableMapView[] views = {
+ new NavigableMapView() { NavigableMap view(NavigableMap m) {
+ return m; }},
+ new NavigableMapView() { NavigableMap view(NavigableMap m) {
+ return m.headMap(99, true); }},
+ new NavigableMapView() { NavigableMap view(NavigableMap m) {
+ return m.tailMap(-99, false); }},
+ new NavigableMapView() { NavigableMap view(NavigableMap m) {
+ return m.subMap(-99, true, 99, false); }},
+ };
+
+ abstract class Remover {
+ abstract void remove(NavigableMap m, Object k, Object v);
+ }
+
+ Remover[] removers = {
+ new Remover() { void remove(NavigableMap m, Object k, Object v) {
+ equal(m.remove(k), v); }},
+
+ new Remover() { void remove(NavigableMap m, Object k, Object v) {
+ equal(m.descendingMap().remove(k), v); }},
+ new Remover() { void remove(NavigableMap m, Object k, Object v) {
+ equal(m.descendingMap().headMap(-86, false).remove(k), v); }},
+ new Remover() { void remove(NavigableMap m, Object k, Object v) {
+ equal(m.descendingMap().tailMap(86, true).remove(k), v); }},
+
+ new Remover() { void remove(NavigableMap m, Object k, Object v) {
+ equal(m.headMap(86, true).remove(k), v); }},
+ new Remover() { void remove(NavigableMap m, Object k, Object v) {
+ equal(m.tailMap(-86, true).remove(k), v); }},
+ new Remover() { void remove(NavigableMap m, Object k, Object v) {
+ equal(m.subMap(-86, false, 86, true).remove(k), v); }},
+
+ new Remover() { void remove(NavigableMap m, Object k, Object v) {
+ check(m.keySet().remove(k)); }},
+ new Remover() { void remove(NavigableMap m, Object k, Object v) {
+ check(m.navigableKeySet().remove(k)); }},
+
+ new Remover() { void remove(NavigableMap m, Object k, Object v) {
+ check(m.navigableKeySet().headSet(86, true).remove(k)); }},
+ new Remover() { void remove(NavigableMap m, Object k, Object v) {
+ check(m.navigableKeySet().tailSet(-86, false).remove(k)); }},
+ new Remover() { void remove(NavigableMap m, Object k, Object v) {
+ check(m.navigableKeySet().subSet(-86, true, 86, false)
+ .remove(k)); }},
+
+ new Remover() { void remove(NavigableMap m, Object k, Object v) {
+ check(m.descendingKeySet().headSet(-86, false).remove(k)); }},
+ new Remover() { void remove(NavigableMap m, Object k, Object v) {
+ check(m.descendingKeySet().tailSet(86, true).remove(k)); }},
+ new Remover() { void remove(NavigableMap m, Object k, Object v) {
+ check(m.descendingKeySet().subSet(86, true, -86, false)
+ .remove(k)); }},
+ };
+
+ for (NavigableMapView view : views) {
+ for (Remover remover : removers) {
+ try {
+ m.clear();
+ equalMaps(m, emptyMap);
+ equal(m.put(1, 2), null);
+ equalMaps(m, singletonMap);
+ NavigableMap v = view.view(m);
+ remover.remove(v, 1, 2);
+ equalMaps(m, emptyMap);
+ } catch (Throwable t) { unexpected(t); }
+ }
+ }
+ }
+
private static void testNavigableMap(NavigableMap<Integer,Integer> m)
{
clear(m);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/concurrent/Semaphore/RacingReleases.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,116 @@
+/*
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * This file is available under and governed by the GNU General Public
+ * License version 2 only, as published by the Free Software Foundation.
+ * However, the following notice accompanied the original version of this
+ * file:
+ *
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/licenses/publicdomain
+ */
+
+/*
+ * @test
+ * @bug 6801020 6803402
+ * @summary Try to tickle race conditions in
+ * AbstractQueuedSynchronizer "shared" code
+ */
+
+import java.util.concurrent.Semaphore;
+
+public class RacingReleases {
+
+ /** Increase this for better chance of tickling races */
+ static final int iterations = 1000;
+
+ public static void test(final boolean fair,
+ final boolean interruptibly)
+ throws Throwable {
+ for (int i = 0; i < iterations; i++) {
+ final Semaphore sem = new Semaphore(0, fair);
+ final Throwable[] badness = new Throwable[1];
+ Runnable blocker = interruptibly ?
+ new Runnable() {
+ public void run() {
+ try {
+ sem.acquire();
+ } catch (Throwable t) {
+ badness[0] = t;
+ throw new Error(t);
+ }}}
+ :
+ new Runnable() {
+ public void run() {
+ try {
+ sem.acquireUninterruptibly();
+ } catch (Throwable t) {
+ badness[0] = t;
+ throw new Error(t);
+ }}};
+
+ Thread b1 = new Thread(blocker);
+ Thread b2 = new Thread(blocker);
+ Runnable signaller = new Runnable() {
+ public void run() {
+ try {
+ sem.release();
+ } catch (Throwable t) {
+ badness[0] = t;
+ throw new Error(t);
+ }}};
+ Thread s1 = new Thread(signaller);
+ Thread s2 = new Thread(signaller);
+ Thread[] threads = { b1, b2, s1, s2 };
+ java.util.Collections.shuffle(java.util.Arrays.asList(threads));
+ for (Thread thread : threads)
+ thread.start();
+ for (Thread thread : threads) {
+ thread.join(60 * 1000);
+ if (thread.isAlive())
+ throw new Error
+ (String.format
+ ("Semaphore stuck: permits %d, thread waiting %s%n",
+ sem.availablePermits(),
+ sem.hasQueuedThreads() ? "true" : "false"));
+ }
+ if (badness[0] != null)
+ throw new Error(badness[0]);
+ if (sem.availablePermits() != 0)
+ throw new Error(String.valueOf(sem.availablePermits()));
+ if (sem.hasQueuedThreads())
+ throw new Error(String.valueOf(sem.hasQueuedThreads()));
+ if (sem.getQueueLength() != 0)
+ throw new Error(String.valueOf(sem.getQueueLength()));
+ if (sem.isFair() != fair)
+ throw new Error(String.valueOf(sem.isFair()));
+ }
+ }
+
+ public static void main(String[] args) throws Throwable {
+ for (boolean fair : new boolean[] { true, false })
+ for (boolean interruptibly : new boolean[] { true, false })
+ test(fair, interruptibly);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/zip/LargeZip.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,193 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.io.*;
+import java.nio.*;
+import java.util.*;
+import java.util.zip.*;
+
+public class LargeZip {
+ // If true, don't delete large ZIP file created for test.
+ static final boolean debug = System.getProperty("debug") != null;
+
+ //static final int DATA_LEN = 1024 * 1024;
+ static final int DATA_LEN = 80 * 1024;
+ static final int DATA_SIZE = 8;
+
+ static long fileSize = 6L * 1024L * 1024L * 1024L; // 6GB
+
+ static boolean userFile = false;
+
+ static byte[] data;
+ static File largeFile;
+ static String lastEntryName;
+
+ /* args can be empty, in which case check a 3 GB file which is created for
+ * this test (and then deleted). Or it can be a number, in which case
+ * that designates the size of the file that's created for this test (and
+ * then deleted). Or it can be the name of a file to use for the test, in
+ * which case it is *not* deleted. Note that in this last case, the data
+ * comparison might fail.
+ */
+ static void realMain (String[] args) throws Throwable {
+ if (args.length > 0) {
+ try {
+ fileSize = Long.parseLong(args[0]);
+ System.out.println("Testing with file of size " + fileSize);
+ } catch (NumberFormatException ex) {
+ largeFile = new File(args[0]);
+ if (!largeFile.exists()) {
+ throw new Exception("Specified file " + args[0] + " does not exist");
+ }
+ userFile = true;
+ System.out.println("Testing with user-provided file " + largeFile);
+ }
+ }
+ File testDir = null;
+ if (largeFile == null) {
+ testDir = new File(System.getProperty("test.scratch", "."),
+ "LargeZip");
+ if (testDir.exists()) {
+ if (!testDir.delete()) {
+ throw new Exception("Cannot delete already-existing test directory");
+ }
+ }
+ check(!testDir.exists() && testDir.mkdirs());
+ largeFile = new File(testDir, "largezip.zip");
+ createLargeZip();
+ }
+
+ readLargeZip1();
+ readLargeZip2();
+
+ if (!userFile && !debug) {
+ check(largeFile.delete());
+ check(testDir.delete());
+ }
+ }
+
+ static void createLargeZip() throws Throwable {
+ int iterations = DATA_LEN / DATA_SIZE;
+ ByteBuffer bb = ByteBuffer.allocate(DATA_SIZE);
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ for (int i = 0; i < iterations; i++) {
+ bb.putDouble(0, Math.random());
+ baos.write(bb.array(), 0, DATA_SIZE);
+ }
+ data = baos.toByteArray();
+
+ ZipOutputStream zos = new ZipOutputStream(
+ new BufferedOutputStream(new FileOutputStream(largeFile)));
+ long length = 0;
+ while (length < fileSize) {
+ ZipEntry ze = new ZipEntry("entry-" + length);
+ lastEntryName = ze.getName();
+ zos.putNextEntry(ze);
+ zos.write(data, 0, data.length);
+ zos.closeEntry();
+ length = largeFile.length();
+ }
+ System.out.println("Last entry written is " + lastEntryName);
+ zos.close();
+ }
+
+ static void readLargeZip1() throws Throwable {
+ ZipFile zipFile = new ZipFile(largeFile);
+ ZipEntry entry = null;
+ String entryName = null;
+ int count = 0;
+ Enumeration<? extends ZipEntry> entries = zipFile.entries();
+ while (entries.hasMoreElements()) {
+ entry = entries.nextElement();
+ entryName = entry.getName();
+ count++;
+ }
+ System.out.println("Number of entries read: " + count);
+ System.out.println("Last entry read is " + entryName);
+ check(!entry.isDirectory());
+ if (check(entryName.equals(lastEntryName))) {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ InputStream is = zipFile.getInputStream(entry);
+ byte buf[] = new byte[4096];
+ int len;
+ while ((len = is.read(buf)) >= 0) {
+ baos.write(buf, 0, len);
+ }
+ baos.close();
+ is.close();
+ check(Arrays.equals(data, baos.toByteArray()));
+ }
+ }
+
+
+ static void readLargeZip2() throws Throwable {
+ ZipInputStream zis = new ZipInputStream(
+ new BufferedInputStream(new FileInputStream(largeFile)));
+ ZipEntry entry = null;
+ String entryName = null;
+ int count = 0;
+ while ((entry = zis.getNextEntry()) != null) {
+ entryName = entry.getName();
+ if (entryName.equals(lastEntryName)) {
+ break;
+ }
+ count++;
+ }
+ System.out.println("Number of entries read: " + count);
+ System.out.println("Last entry read is " + entryName);
+ check(!entry.isDirectory());
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+ byte buf[] = new byte[4096];
+ int len;
+ while ((len = zis.read(buf)) >= 0) {
+ baos.write(buf, 0, len);
+ }
+ baos.close();
+ check(Arrays.equals(data, baos.toByteArray()));
+ check(zis.getNextEntry() == null);
+ zis.close();
+ }
+
+
+ //--------------------- Infrastructure ---------------------------
+ static volatile int passed = 0, failed = 0;
+ static void pass() {passed++;}
+ static void pass(String msg) {System.out.println(msg); passed++;}
+ static void fail() {failed++; Thread.dumpStack();}
+ static void fail(String msg) {System.out.println(msg); fail();}
+ static void unexpected(Throwable t) {failed++; t.printStackTrace();}
+ static void unexpected(Throwable t, String msg) {
+ System.out.println(msg); failed++; t.printStackTrace();}
+ static boolean check(boolean cond) {if (cond) pass(); else fail(); return cond;}
+ static void equal(Object x, Object y) {
+ if (x == null ? y == null : x.equals(y)) pass();
+ else fail(x + " not equal to " + y);}
+ public static void main(String[] args) throws Throwable {
+ try {realMain(args);} catch (Throwable t) {unexpected(t);}
+ System.out.println("\nPassed = " + passed + " failed = " + failed);
+ if (failed > 0) throw new AssertionError("Some tests failed");}
+}
--- a/jdk/test/java/util/zip/ZipFile/LargeZipFile.java Thu Apr 23 16:58:16 2009 -0400
+++ b/jdk/test/java/util/zip/ZipFile/LargeZipFile.java Mon Apr 27 12:33:57 2009 -0700
@@ -158,4 +158,3 @@
System.out.println("\nPassed = " + passed + " failed = " + failed);
if (failed > 0) throw new AssertionError("Some tests failed");}
}
-
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JFileChooser/6570445/bug6570445.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,20 @@
+/*
+ * @test
+ * @bug 6570445
+ * @summary Checks if Win32ShellFolder2's COM-using methods work under a security manager
+ * @author Leonid Popov
+ */
+
+import javax.swing.filechooser.FileSystemView;
+
+public class bug6570445 {
+ public static void main(String[] args) {
+ System.setSecurityManager(new SecurityManager());
+
+ // The next line of code forces FileSystemView to request data from Win32ShellFolder2,
+ // what causes an exception if a security manager installed (see the bug 6570445 description)
+ FileSystemView.getFileSystemView().getRoots();
+
+ System.out.println("Passed.");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JFileChooser/6738668/bug6738668.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ @bug 6738668
+ @summary JFileChooser cannot be created under SecurityManager
+ @author Pavel Porvatov
+ @run main/othervm/policy=security.policy bug6738668
+*/
+
+import javax.swing.*;
+import java.io.File;
+
+public class bug6738668 {
+ public static void main(String[] args) throws Exception {
+ for (UIManager.LookAndFeelInfo lookAndFeelInfo : UIManager.getInstalledLookAndFeels()) {
+ UIManager.setLookAndFeel(lookAndFeelInfo.getClassName());
+
+ new JFileChooser(new File("c:/temp"));
+
+ System.out.println("Test passed for LookAndFeel " + lookAndFeelInfo.getClassName());
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JFileChooser/6738668/security.policy Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,5 @@
+grant {
+ permission java.io.FilePermission "C:\\temp\\*", "read";
+ permission java.io.FilePermission "C:\\temp", "read";
+ permission java.util.PropertyPermission "*", "read";
+};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JFileChooser/6798062/bug6798062.html Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,11 @@
+<html>
+<body>
+<applet code="bug6798062.class" width=400 height=300></applet>
+1. Create a link
+2. Copy path to the link into TextField
+3. Run the Windows Task Manager. Select the Processes tab and find the java process
+4. Press the Start button in the test window
+5. Wait several minutes and observe in the Windows Task Manager
+that Memory Usage of java process is not increasing
+</body>
+</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JFileChooser/6798062/bug6798062.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,189 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test %W% %E%
+ @bug 6798062
+ @summary Memory Leak on using getFiles of FileSystemView
+ @author Pavel Porvatov
+ @run applet/manual=done bug6798062.html
+*/
+
+import sun.awt.shell.ShellFolder;
+
+import javax.swing.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.*;
+import java.io.File;
+import java.io.FileNotFoundException;
+
+public class bug6798062 extends JApplet {
+
+ private final JSlider slider = new JSlider(0, 100);
+
+ private final JTextField tfLink = new JTextField();
+
+ private final JButton btnStart = new JButton("Start");
+
+ private final JButton btnStop = new JButton("Stop");
+
+ private final JButton btnGC = new JButton("Run System.gc()");
+
+ private ShellFolder folder;
+
+ private Thread thread;
+
+ public static void main(String[] args) {
+ JFrame frame = new JFrame("bug6798062");
+
+ frame.setSize(400, 300);
+ frame.setLocationRelativeTo(null);
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ frame.add(new bug6798062().initialize());
+
+ frame.setVisible(true);
+ }
+
+ public void init() {
+ add(initialize());
+ }
+
+ private JPanel initialize() {
+ File file = new File("c:/");
+
+ try {
+ folder = ShellFolder.getShellFolder(file);
+ } catch (FileNotFoundException e) {
+ fail("Directory " + file.getPath() + " not found");
+ }
+
+ slider.setMajorTickSpacing(10);
+ slider.setPaintTicks(true);
+ slider.setPaintLabels(true);
+ slider.setSnapToTicks(true);
+ slider.setValue(10);
+
+ btnStart.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ setEnabledState(false);
+
+ thread = new MyThread(slider.getValue(), tfLink.getText());
+ thread.start();
+ }
+ });
+
+ btnStop.setEnabled(false);
+
+ btnStop.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ thread.interrupt();
+ thread = null;
+
+ setEnabledState(true);
+ }
+ });
+
+ btnGC.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ System.gc();
+ }
+ });
+
+ setEnabledState(true);
+
+ JPanel pnButtons = new JPanel();
+
+ pnButtons.setLayout(new BoxLayout(pnButtons, BoxLayout.X_AXIS));
+
+ pnButtons.add(btnStart);
+ pnButtons.add(btnStop);
+ pnButtons.add(btnGC);
+
+ tfLink.setMaximumSize(new Dimension(300, 20));
+
+ JPanel pnContent = new JPanel();
+
+ pnContent.setLayout(new BoxLayout(pnContent, BoxLayout.Y_AXIS));
+ pnContent.add(new JLabel("Delay between listFiles() invocation (ms):"));
+ pnContent.add(slider);
+ pnContent.add(new JLabel("Provide link here:"));
+ pnContent.add(tfLink);
+ pnContent.add(pnButtons);
+
+ return pnContent;
+ }
+
+ private void setEnabledState(boolean enabled) {
+ slider.setEnabled(enabled);
+ btnStart.setEnabled(enabled);
+ btnStop.setEnabled(!enabled);
+ }
+
+ private static void fail(String msg) {
+ throw new RuntimeException(msg);
+ }
+
+ private class MyThread extends Thread {
+ private final int delay;
+
+ private final ShellFolder link;
+
+ private MyThread(int delay, String link) {
+ this.delay = delay;
+
+ ShellFolder linkFolder;
+
+ try {
+ linkFolder = ShellFolder.getShellFolder(new File(link));
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+
+ linkFolder = null;
+ }
+
+ this.link = linkFolder;
+ }
+
+ public void run() {
+ while (!isInterrupted()) {
+ folder.listFiles();
+ if (link != null) {
+ try {
+ link.getLinkLocation();
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+
+ if (delay > 0) {
+ try {
+ Thread.sleep(delay);
+ } catch (InterruptedException e1) {
+ // The thread was interrupted
+ return;
+ }
+ }
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JSlider/6794831/bug6794831.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 6794831
+ * @summary Infinite loop while painting ticks on Slider with maximum=MAX_INT
+ * @author Pavel Porvatov
+ @run main bug6794831
+ */
+
+import javax.swing.*;
+import javax.swing.plaf.basic.BasicSliderUI;
+import java.awt.image.BufferedImage;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+public class bug6794831 {
+ private final CountDownLatch countDownLatch = new CountDownLatch(1);
+
+ public static void main(String args[]) throws InterruptedException {
+ new bug6794831().run();
+ }
+
+ private void run() throws InterruptedException {
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ for (UIManager.LookAndFeelInfo lookAndFeelInfo : UIManager.getInstalledLookAndFeels()) {
+ try {
+ UIManager.setLookAndFeel(lookAndFeelInfo.getClassName());
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+
+ BufferedImage image = new BufferedImage(300, 200, BufferedImage.TYPE_INT_ARGB);
+
+ // Test 1
+ JSlider slider = new JSlider(0, Integer.MAX_VALUE - 1, 0);
+
+ slider.setMajorTickSpacing((Integer.MAX_VALUE - 1) / 4);
+ slider.setPaintTicks(true);
+
+ ((BasicSliderUI) slider.getUI()).paintTicks(image.getGraphics());
+
+ // Test 2
+ slider = new JSlider(0, Integer.MAX_VALUE - 1, 0);
+
+ slider.setMinorTickSpacing((Integer.MAX_VALUE - 1) / 4);
+ slider.setPaintTicks(true);
+
+ ((BasicSliderUI) slider.getUI()).paintTicks(image.getGraphics());
+
+ // Test 3
+ slider = new JSlider(0, Integer.MAX_VALUE - 1, 0);
+
+ slider.setOrientation(JSlider.VERTICAL);
+ slider.setMajorTickSpacing((Integer.MAX_VALUE - 1) / 4);
+ slider.setPaintTicks(true);
+
+ ((BasicSliderUI) slider.getUI()).paintTicks(image.getGraphics());
+
+ // Test 4
+ slider = new JSlider(0, Integer.MAX_VALUE - 1, 0);
+
+ slider.setOrientation(JSlider.VERTICAL);
+ slider.setMinorTickSpacing((Integer.MAX_VALUE - 1) / 4);
+ slider.setPaintTicks(true);
+
+ ((BasicSliderUI) slider.getUI()).paintTicks(image.getGraphics());
+
+ countDownLatch.countDown();
+ }
+ }
+ });
+
+ if (countDownLatch.await(3000, TimeUnit.MILLISECONDS)) {
+ System.out.println("bug6794831 passed");
+ } else {
+ fail("bug6794831 failed");
+ }
+ }
+
+ private static void fail(String msg) {
+ throw new RuntimeException(msg);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/system/6799345/TestShutdown.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,203 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ @bug 6799345
+ @summary Tests that no exceptions are thrown from TimerQueue and
+SwingWorker on AppContext shutdown
+ @author art
+ @run main TestShutdown
+*/
+
+import java.awt.*;
+import java.awt.event.*;
+
+import java.util.*;
+
+import javax.swing.*;
+
+import sun.awt.*;
+
+public class TestShutdown
+{
+ private static AppContext targetAppContext;
+
+ private static JFrame f;
+ private static JTextField tf;
+
+ private static volatile boolean exceptionsOccurred = false;
+ private static volatile boolean appcontextInitDone = false;
+
+ private static int timerValue = 0;
+
+ public static void main(String[] args)
+ throws Exception
+ {
+ ThreadGroup tg = new TestThreadGroup("TTG");
+ Thread t = new Thread(tg, new TestRunnable(), "InitThread");
+ t.start();
+
+ while (!appcontextInitDone)
+ {
+ Thread.sleep(500);
+ }
+
+ targetAppContext.dispose();
+
+ if (exceptionsOccurred)
+ {
+ throw new RuntimeException("Test FAILED: some exceptions occurred");
+ }
+ }
+
+ static void initGUI()
+ {
+ f = new JFrame("F");
+ f.setBounds(100, 100, 200, 100);
+ tf = new JTextField("Test");
+ f.add(tf);
+ f.setVisible(true);
+ }
+
+ static void startGUI()
+ {
+ // caret blink Timer
+ tf.requestFocusInWindow();
+
+ // misc Timer
+ ActionListener al = new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent ae)
+ {
+ System.out.println("Timer tick: " + timerValue++);
+ }
+ };
+ new javax.swing.Timer(30, al).start();
+ }
+
+ static class TestThreadGroup extends ThreadGroup
+ {
+ public TestThreadGroup(String name)
+ {
+ super(name);
+ }
+
+ @Override
+ public synchronized void uncaughtException(Thread thread, Throwable t)
+ {
+ if (t instanceof ThreadDeath)
+ {
+ // this one is expected, rethrow
+ throw (ThreadDeath)t;
+ }
+ System.err.println("Test FAILED: an exception is caught in the " +
+ "target thread group on thread " + thread.getName());
+ t.printStackTrace(System.err);
+ exceptionsOccurred = true;
+ }
+ }
+
+ static class TestRunnable implements Runnable
+ {
+ @Override
+ public void run()
+ {
+ SunToolkit stk = (SunToolkit)Toolkit.getDefaultToolkit();
+ targetAppContext = stk.createNewAppContext();
+
+ // create and show frame and text field
+ SwingUtilities.invokeLater(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ initGUI();
+ }
+ });
+ stk.realSync();
+
+ // start some Timers
+ SwingUtilities.invokeLater(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ startGUI();
+ }
+ });
+ stk.realSync();
+
+ // start multiple SwingWorkers
+ while (!Thread.interrupted())
+ {
+ try
+ {
+ new TestSwingWorker().execute();
+ Thread.sleep(40);
+ }
+ catch (Exception e)
+ {
+ // exception here is expected, skip
+ break;
+ }
+ }
+ }
+ }
+
+ static class TestSwingWorker extends SwingWorker<String, Integer>
+ {
+ @Override
+ public String doInBackground()
+ {
+ Random r = new Random();
+ for (int i = 0; i < 10; i++)
+ {
+ try
+ {
+ int delay = r.nextInt() % 50;
+ Thread.sleep(delay);
+ publish(delay);
+ }
+ catch (Exception z)
+ {
+ break;
+ }
+ }
+ if (!appcontextInitDone)
+ {
+ appcontextInitDone = true;
+ }
+ return "Done";
+ }
+
+ @Override
+ public void process(java.util.List<Integer> chunks)
+ {
+ for (Integer i : chunks)
+ {
+ System.err.println("Processed: " + i);
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/text/LayoutQueue/Test6588003.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ @bug 6588003
+ @summary LayoutQueue should not share its DefaultQueue across AppContexts
+ @author Peter Zhelezniakov
+ @run main Test6588003
+*/
+
+import javax.swing.text.LayoutQueue;
+import sun.awt.SunToolkit;
+
+public class Test6588003 implements Runnable {
+ private static final LayoutQueue DEFAULT = new LayoutQueue();
+
+ public static void main(String[] args) throws InterruptedException {
+ LayoutQueue.setDefaultQueue(DEFAULT);
+
+ ThreadGroup group = new ThreadGroup("Test6588003");
+ Thread thread = new Thread(group, new Test6588003());
+ thread.start();
+ thread.join();
+
+ if (LayoutQueue.getDefaultQueue() != DEFAULT) {
+ throw new RuntimeException("Sharing detected");
+ }
+ }
+
+ public void run() {
+ SunToolkit.createNewAppContext();
+
+ if (LayoutQueue.getDefaultQueue() == DEFAULT) {
+ throw new RuntimeException("Sharing detected");
+ }
+
+ LayoutQueue.setDefaultQueue(new LayoutQueue());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/text/html/Test4783068.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ @bug 4783068
+ @summary Disabled components should render grayed-out HTML
+ @author Peter Zhelezniakov
+ @run main Test4783068
+*/
+
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import javax.swing.*;
+import javax.swing.plaf.metal.MetalLookAndFeel;
+
+public class Test4783068 {
+ final static Color TEST_COLOR = Color.WHITE;
+
+ final static String html = "<html>" +
+ "This is a <font color='red'>colored</font> <b>text</b>" +
+ "<p>with a <a href='http://ru.sun.com'>link</a>" +
+ "<ul><li>an unordered<li>list</ul>" +
+ "<ol><li>and an ordered<li>list</ol>" +
+ "</html>";
+
+
+ void test() {
+ try {
+ UIManager.setLookAndFeel(new MetalLookAndFeel());
+ } catch (UnsupportedLookAndFeelException e) {
+ throw new Error("Cannot set Metal LAF");
+ }
+ // Render text using background color
+ UIManager.put("textInactiveText", TEST_COLOR);
+
+ test(new JLabel(html));
+ test(new JButton(html));
+
+ JEditorPane pane = new JEditorPane("text/html", html);
+ pane.setDisabledTextColor(TEST_COLOR);
+ test(pane);
+ }
+
+ void test(JComponent c) {
+ c.setEnabled(false);
+ c.setOpaque(true);
+ c.setBackground(TEST_COLOR);
+ c.setBorder(null);
+ Dimension size = c.getPreferredSize();
+ c.setBounds(0, 0, size.width, size.height);
+
+ BufferedImage image = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_ARGB);
+ c.paint(image.getGraphics());
+
+ int rgb = TEST_COLOR.getRGB();
+ for (int i = 0; i < size.height; i++) {
+ for (int j = 0; j < size.width; j++) {
+ if (image.getRGB(j, i) != rgb) {
+ throw new RuntimeException(
+ String.format("Color mismatch at [%d, %d]", j, i));
+ }
+ }
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ SwingUtilities.invokeAndWait(new Runnable() {
+ @Override public void run() {
+ new Test4783068().test();
+ }
+ });
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/java2d/pipe/RegionOps.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,510 @@
+/*
+ * @test %W% %E%
+ * @bug 6504874
+ * @summary This test verifies the operation (and performance) of the
+ * various CAG operations on the internal Region class.
+ * @run main RegionOps
+ */
+
+import java.awt.Rectangle;
+import java.awt.geom.Area;
+import java.awt.geom.AffineTransform;
+import java.awt.image.BufferedImage;
+import java.util.Random;
+import sun.java2d.pipe.Region;
+
+public class RegionOps {
+ public static final int DEFAULT_NUMREGIONS = 50;
+ public static final int DEFAULT_MINSUBRECTS = 1;
+ public static final int DEFAULT_MAXSUBRECTS = 10;
+
+ public static final int MINCOORD = -20;
+ public static final int MAXCOORD = 20;
+
+ public static boolean useArea;
+
+ static int numops;
+ static int numErrors;
+ static Random rand = new Random();
+ static boolean skipCheck;
+ static boolean countErrors;
+
+ static {
+ // Instantiating BufferedImage initializes sun.java2d
+ BufferedImage bimg =
+ new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
+ }
+
+ public static void usage(String error) {
+ if (error != null) {
+ System.err.println("Error: "+error);
+ }
+ System.err.println("Usage: java RegionOps "+
+ "[-regions N] [-rects M] "+
+ "[-[min|max]rects M] [-area]");
+ System.err.println(" "+
+ "[-add|union] [-sub|diff] "+
+ "[-int[ersect]] [-xor]");
+ System.err.println(" "+
+ "[-seed S] [-nocheck] [-count[errors]] [-help]");
+ System.exit((error != null) ? 1 : 0);
+ }
+
+ public static void error(RectListImpl a, RectListImpl b, String problem) {
+ System.err.println("Operating on: "+a);
+ if (b != null) {
+ System.err.println("and: "+b);
+ }
+ if (countErrors) {
+ System.err.println(problem);
+ numErrors++;
+ } else {
+ throw new RuntimeException(problem);
+ }
+ }
+
+ public static void main(String argv[]) {
+ int numregions = DEFAULT_NUMREGIONS;
+ int minsubrects = DEFAULT_MINSUBRECTS;
+ int maxsubrects = DEFAULT_MAXSUBRECTS;
+ boolean doUnion = false;
+ boolean doIntersect = false;
+ boolean doSubtract = false;
+ boolean doXor = false;
+
+ for (int i = 0; i < argv.length; i++) {
+ String arg = argv[i];
+ if (arg.equalsIgnoreCase("-regions")) {
+ if (i+1 >= argv.length) {
+ usage("missing arg for -regions");
+ }
+ numregions = Integer.parseInt(argv[++i]);
+ } else if (arg.equalsIgnoreCase("-rects")) {
+ if (i+1 >= argv.length) {
+ usage("missing arg for -rects");
+ }
+ minsubrects = maxsubrects = Integer.parseInt(argv[++i]);
+ } else if (arg.equalsIgnoreCase("-minrects")) {
+ if (i+1 >= argv.length) {
+ usage("missing arg for -minrects");
+ }
+ minsubrects = Integer.parseInt(argv[++i]);
+ } else if (arg.equalsIgnoreCase("-maxrects")) {
+ if (i+1 >= argv.length) {
+ usage("missing arg for -maxrects");
+ }
+ maxsubrects = Integer.parseInt(argv[++i]);
+ } else if (arg.equalsIgnoreCase("-area")) {
+ useArea = true;
+ } else if (arg.equalsIgnoreCase("-add") ||
+ arg.equalsIgnoreCase("-union"))
+ {
+ doUnion = true;
+ } else if (arg.equalsIgnoreCase("-sub") ||
+ arg.equalsIgnoreCase("-diff"))
+ {
+ doSubtract = true;
+ } else if (arg.equalsIgnoreCase("-int") ||
+ arg.equalsIgnoreCase("-intersect"))
+ {
+ doIntersect = true;
+ } else if (arg.equalsIgnoreCase("-xor")) {
+ doXor = true;
+ } else if (arg.equalsIgnoreCase("-seed")) {
+ if (i+1 >= argv.length) {
+ usage("missing arg for -seed");
+ }
+ rand.setSeed(Long.decode(argv[++i]).longValue());
+ } else if (arg.equalsIgnoreCase("-nocheck")) {
+ skipCheck = true;
+ } else if (arg.equalsIgnoreCase("-count") ||
+ arg.equalsIgnoreCase("-counterrors"))
+ {
+ countErrors = true;
+ } else if (arg.equalsIgnoreCase("-help")) {
+ usage(null);
+ } else {
+ usage("Unknown argument: "+arg);
+ }
+ }
+
+ if (maxsubrects < minsubrects) {
+ usage("maximum number of subrectangles less than minimum");
+ }
+
+ if (minsubrects <= 0) {
+ usage("minimum number of subrectangles must be positive");
+ }
+
+ if (!doUnion && !doSubtract && !doIntersect && !doXor) {
+ doUnion = doSubtract = doIntersect = doXor = true;
+ }
+
+ long start = System.currentTimeMillis();
+ RectListImpl rlist[] = new RectListImpl[numregions];
+ int totalrects = 0;
+ for (int i = 0; i < rlist.length; i++) {
+ RectListImpl rli = RectListImpl.getInstance();
+ int numsubrects =
+ minsubrects + rand.nextInt(maxsubrects - minsubrects + 1);
+ for (int j = 0; j < numsubrects; j++) {
+ addRectTo(rli);
+ totalrects++;
+ }
+ rlist[i] = rli;
+ }
+ long end = System.currentTimeMillis();
+ System.out.println((end-start)+"ms to create "+
+ rlist.length+" regions containing "+
+ totalrects+" subrectangles");
+
+ start = System.currentTimeMillis();
+ for (int i = 0; i < rlist.length; i++) {
+ RectListImpl a = rlist[i];
+ testTranslate(a);
+ for (int j = i; j < rlist.length; j++) {
+ RectListImpl b = rlist[j];
+ if (doUnion) testUnion(a, b);
+ if (doSubtract) testDifference(a, b);
+ if (doIntersect) testIntersection(a, b);
+ if (doXor) testExclusiveOr(a, b);
+ }
+ }
+ end = System.currentTimeMillis();
+ System.out.println(numops+" ops took "+(end-start)+"ms");
+
+ if (numErrors > 0) {
+ throw new RuntimeException(numErrors+" errors encountered");
+ }
+ }
+
+ public static void addRectTo(RectListImpl rli) {
+ int lox = MINCOORD + rand.nextInt(MAXCOORD - MINCOORD + 1);
+ int hix = MINCOORD + rand.nextInt(MAXCOORD - MINCOORD + 1);
+ int loy = MINCOORD + rand.nextInt(MAXCOORD - MINCOORD + 1);
+ int hiy = MINCOORD + rand.nextInt(MAXCOORD - MINCOORD + 1);
+ rli.addRect(lox, loy, hix, hiy);
+ }
+
+ public static void checkEqual(RectListImpl a, RectListImpl b,
+ String optype)
+ {
+ if (a.hashCode() != b.hashCode()) {
+ error(a, b, "hashcode failed for "+optype);
+ }
+ if (!a.equals(b)) {
+ error(a, b, "equals failed for "+optype);
+ }
+ }
+
+ public static void testTranslate(RectListImpl a) {
+ RectListImpl maxTrans =
+ a.getTranslation(Integer.MAX_VALUE, Integer.MAX_VALUE)
+ .getTranslation(Integer.MAX_VALUE, Integer.MAX_VALUE)
+ .getTranslation(Integer.MAX_VALUE, Integer.MAX_VALUE);
+ if (!maxTrans.checkTransEmpty()) {
+ error(maxTrans, null, "overflow translated RectList not empty");
+ }
+ RectListImpl minTrans =
+ a.getTranslation(Integer.MIN_VALUE, Integer.MIN_VALUE)
+ .getTranslation(Integer.MIN_VALUE, Integer.MIN_VALUE)
+ .getTranslation(Integer.MIN_VALUE, Integer.MIN_VALUE);
+ if (!minTrans.checkTransEmpty()) {
+ error(minTrans, null, "overflow translated RectList not empty");
+ }
+ testTranslate(a, Integer.MAX_VALUE, Integer.MAX_VALUE, false,
+ MINCOORD, 0, MINCOORD, 0);
+ testTranslate(a, Integer.MAX_VALUE, Integer.MIN_VALUE, false,
+ MINCOORD, 0, 0, MAXCOORD);
+ testTranslate(a, Integer.MIN_VALUE, Integer.MAX_VALUE, false,
+ 0, MAXCOORD, MINCOORD, 0);
+ testTranslate(a, Integer.MIN_VALUE, Integer.MIN_VALUE, false,
+ 0, MAXCOORD, 0, MAXCOORD);
+ for (int dy = -100; dy <= 100; dy += 50) {
+ for (int dx = -100; dx <= 100; dx += 50) {
+ testTranslate(a, dx, dy, true,
+ MINCOORD, MAXCOORD,
+ MINCOORD, MAXCOORD);
+ }
+ }
+ }
+
+ public static void testTranslate(RectListImpl a, int dx, int dy,
+ boolean isNonDestructive,
+ int xmin, int xmax,
+ int ymin, int ymax)
+ {
+ RectListImpl theTrans = a.getTranslation(dx, dy); numops++;
+ if (skipCheck) return;
+ RectListImpl unTrans = theTrans.getTranslation(-dx, -dy);
+ if (isNonDestructive) checkEqual(a, unTrans, "Translate");
+ for (int x = xmin; x < xmax; x++) {
+ for (int y = ymin; y < ymax; y++) {
+ boolean inside = a.contains(x, y);
+ if (theTrans.contains(x+dx, y+dy) != inside) {
+ error(a, null, "translation failed for "+
+ dx+", "+dy+" at "+x+", "+y);
+ }
+ }
+ }
+ }
+
+ public static void testUnion(RectListImpl a, RectListImpl b) {
+ RectListImpl aUb = a.getUnion(b); numops++;
+ RectListImpl bUa = b.getUnion(a); numops++;
+ if (skipCheck) return;
+ checkEqual(aUb, bUa, "Union");
+ testUnion(a, b, aUb);
+ testUnion(a, b, bUa);
+ }
+
+ public static void testUnion(RectListImpl a, RectListImpl b,
+ RectListImpl theUnion)
+ {
+ for (int x = MINCOORD; x < MAXCOORD; x++) {
+ for (int y = MINCOORD; y < MAXCOORD; y++) {
+ boolean inside = (a.contains(x, y) || b.contains(x, y));
+ if (theUnion.contains(x, y) != inside) {
+ error(a, b, "union failed at "+x+", "+y);
+ }
+ }
+ }
+ }
+
+ public static void testDifference(RectListImpl a, RectListImpl b) {
+ RectListImpl aDb = a.getDifference(b); numops++;
+ RectListImpl bDa = b.getDifference(a); numops++;
+ if (skipCheck) return;
+ // Note that difference is not commutative so we cannot check equals
+ // checkEqual(a, b, "Difference");
+ testDifference(a, b, aDb);
+ testDifference(b, a, bDa);
+ }
+
+ public static void testDifference(RectListImpl a, RectListImpl b,
+ RectListImpl theDifference)
+ {
+ for (int x = MINCOORD; x < MAXCOORD; x++) {
+ for (int y = MINCOORD; y < MAXCOORD; y++) {
+ boolean inside = (a.contains(x, y) && !b.contains(x, y));
+ if (theDifference.contains(x, y) != inside) {
+ error(a, b, "difference failed at "+x+", "+y);
+ }
+ }
+ }
+ }
+
+ public static void testIntersection(RectListImpl a, RectListImpl b) {
+ RectListImpl aIb = a.getIntersection(b); numops++;
+ RectListImpl bIa = b.getIntersection(a); numops++;
+ if (skipCheck) return;
+ checkEqual(aIb, bIa, "Intersection");
+ testIntersection(a, b, aIb);
+ testIntersection(a, b, bIa);
+ }
+
+ public static void testIntersection(RectListImpl a, RectListImpl b,
+ RectListImpl theIntersection)
+ {
+ for (int x = MINCOORD; x < MAXCOORD; x++) {
+ for (int y = MINCOORD; y < MAXCOORD; y++) {
+ boolean inside = (a.contains(x, y) && b.contains(x, y));
+ if (theIntersection.contains(x, y) != inside) {
+ error(a, b, "intersection failed at "+x+", "+y);
+ }
+ }
+ }
+ }
+
+ public static void testExclusiveOr(RectListImpl a, RectListImpl b) {
+ RectListImpl aXb = a.getExclusiveOr(b); numops++;
+ RectListImpl bXa = b.getExclusiveOr(a); numops++;
+ if (skipCheck) return;
+ checkEqual(aXb, bXa, "ExclusiveOr");
+ testExclusiveOr(a, b, aXb);
+ testExclusiveOr(a, b, bXa);
+ }
+
+ public static void testExclusiveOr(RectListImpl a, RectListImpl b,
+ RectListImpl theExclusiveOr)
+ {
+ for (int x = MINCOORD; x < MAXCOORD; x++) {
+ for (int y = MINCOORD; y < MAXCOORD; y++) {
+ boolean inside = (a.contains(x, y) != b.contains(x, y));
+ if (theExclusiveOr.contains(x, y) != inside) {
+ error(a, b, "xor failed at "+x+", "+y);
+ }
+ }
+ }
+ }
+
+ public abstract static class RectListImpl {
+ public static RectListImpl getInstance() {
+ if (useArea) {
+ return new AreaImpl();
+ } else {
+ return new RegionImpl();
+ }
+ }
+
+ public abstract void addRect(int lox, int loy, int hix, int hiy);
+
+ public abstract RectListImpl getTranslation(int dx, int dy);
+
+ public abstract RectListImpl getIntersection(RectListImpl rli);
+ public abstract RectListImpl getExclusiveOr(RectListImpl rli);
+ public abstract RectListImpl getDifference(RectListImpl rli);
+ public abstract RectListImpl getUnion(RectListImpl rli);
+
+ // Used for making sure that 3xMAX translates yields an empty region
+ public abstract boolean checkTransEmpty();
+
+ public abstract boolean contains(int x, int y);
+
+ public abstract int hashCode();
+ public abstract boolean equals(RectListImpl other);
+ }
+
+ public static class AreaImpl extends RectListImpl {
+ Area theArea;
+
+ public AreaImpl() {
+ }
+
+ public AreaImpl(Area a) {
+ theArea = a;
+ }
+
+ public void addRect(int lox, int loy, int hix, int hiy) {
+ Area a2 = new Area(new Rectangle(lox, loy, hix-lox, hiy-loy));
+ if (theArea == null) {
+ theArea = a2;
+ } else {
+ theArea.add(a2);
+ }
+ }
+
+ public RectListImpl getTranslation(int dx, int dy) {
+ AffineTransform at = AffineTransform.getTranslateInstance(dx, dy);
+ return new AreaImpl(theArea.createTransformedArea(at));
+ }
+
+ public RectListImpl getIntersection(RectListImpl rli) {
+ Area a2 = new Area(theArea);
+ a2.intersect(((AreaImpl) rli).theArea);
+ return new AreaImpl(a2);
+ }
+
+ public RectListImpl getExclusiveOr(RectListImpl rli) {
+ Area a2 = new Area(theArea);
+ a2.exclusiveOr(((AreaImpl) rli).theArea);
+ return new AreaImpl(a2);
+ }
+
+ public RectListImpl getDifference(RectListImpl rli) {
+ Area a2 = new Area(theArea);
+ a2.subtract(((AreaImpl) rli).theArea);
+ return new AreaImpl(a2);
+ }
+
+ public RectListImpl getUnion(RectListImpl rli) {
+ Area a2 = new Area(theArea);
+ a2.add(((AreaImpl) rli).theArea);
+ return new AreaImpl(a2);
+ }
+
+ // Used for making sure that 3xMAX translates yields an empty region
+ public boolean checkTransEmpty() {
+ // Area objects will actually survive 3 MAX translates so just
+ // pretend that it had the intended effect...
+ return true;
+ }
+
+ public boolean contains(int x, int y) {
+ return theArea.contains(x, y);
+ }
+
+ public int hashCode() {
+ // Area does not override hashCode...
+ return 0;
+ }
+
+ public boolean equals(RectListImpl other) {
+ return theArea.equals(((AreaImpl) other).theArea);
+ }
+
+ public String toString() {
+ return theArea.toString();
+ }
+ }
+
+ public static class RegionImpl extends RectListImpl {
+ Region theRegion;
+
+ public RegionImpl() {
+ }
+
+ public RegionImpl(Region r) {
+ theRegion = r;
+ }
+
+ public void addRect(int lox, int loy, int hix, int hiy) {
+ Region r2 = Region.getInstanceXYXY(lox, loy, hix, hiy);
+ if (theRegion == null) {
+ theRegion = r2;
+ } else {
+ theRegion = theRegion.getUnion(r2);
+ }
+ }
+
+ public RectListImpl getTranslation(int dx, int dy) {
+ return new RegionImpl(theRegion.getTranslatedRegion(dx, dy));
+ }
+
+ public RectListImpl getIntersection(RectListImpl rli) {
+ Region r2 = ((RegionImpl) rli).theRegion;
+ r2 = theRegion.getIntersection(r2);
+ return new RegionImpl(r2);
+ }
+
+ public RectListImpl getExclusiveOr(RectListImpl rli) {
+ Region r2 = ((RegionImpl) rli).theRegion;
+ r2 = theRegion.getExclusiveOr(r2);
+ return new RegionImpl(r2);
+ }
+
+ public RectListImpl getDifference(RectListImpl rli) {
+ Region r2 = ((RegionImpl) rli).theRegion;
+ r2 = theRegion.getDifference(r2);
+ return new RegionImpl(r2);
+ }
+
+ public RectListImpl getUnion(RectListImpl rli) {
+ Region r2 = ((RegionImpl) rli).theRegion;
+ r2 = theRegion.getUnion(r2);
+ return new RegionImpl(r2);
+ }
+
+ // Used for making sure that 3xMAX translates yields an empty region
+ public boolean checkTransEmpty() {
+ // Region objects should be empty after 3 MAX translates...
+ return theRegion.isEmpty();
+ }
+
+ public boolean contains(int x, int y) {
+ return theRegion.contains(x, y);
+ }
+
+ public int hashCode() {
+ return theRegion.hashCode();
+ }
+
+ public boolean equals(RectListImpl other) {
+ return theRegion.equals(((RegionImpl) other).theRegion);
+ }
+
+ public String toString() {
+ return theRegion.toString();
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/net/sdp/ProbeIB.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.io.File;
+import java.io.IOException;
+import java.net.NetworkInterface;
+import java.net.InetAddress;
+import java.util.Scanner;
+import java.util.Enumeration;
+
+/**
+ * Probes for InfiniBand devices plumbed with IP addresses.
+ */
+
+public class ProbeIB {
+ public static void main(String[] args) throws IOException {
+ Scanner s = new Scanner(new File("/etc/path_to_inst"));
+ try {
+ while (s.hasNextLine()) {
+ String line = s.nextLine();
+ if (line.startsWith("#"))
+ continue;
+ String[] fields = line.split("\\s+");
+ if (!fields[2].equals("\"ibd\""))
+ continue;
+ String name = fields[2].substring(1, fields[2].length()-1) + fields[1];
+ NetworkInterface ni = NetworkInterface.getByName(name);
+ if (ni != null) {
+ Enumeration<InetAddress> addrs = ni.getInetAddresses();
+ while (addrs.hasMoreElements()) {
+ System.out.println(addrs.nextElement().getHostAddress());
+ }
+ }
+ }
+ } finally {
+ s.close();
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/net/sdp/Sanity.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,168 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.net.*;
+import java.io.*;
+import java.nio.channels.*;
+import java.util.Enumeration;
+
+/**
+ * Sanity check Socket/ServerSocket and each of the stream-oriented channels
+ * on each IP address plumbed to the network adapters.
+ */
+
+public class Sanity {
+ public static void main(String[] args) throws Exception {
+ Enumeration<NetworkInterface> nifs = NetworkInterface.getNetworkInterfaces();
+ while (nifs.hasMoreElements()) {
+ NetworkInterface ni = nifs.nextElement();
+ Enumeration<InetAddress> addrs = ni.getInetAddresses();
+ while (addrs.hasMoreElements()) {
+ InetAddress addr = addrs.nextElement();
+ test(addr);
+ }
+ }
+ }
+
+ static void test(InetAddress addr) throws Exception {
+ System.out.println(addr.getHostAddress());
+
+ // ServerSocketChannel.bind
+ ServerSocketChannel ssc = ServerSocketChannel.open();
+ try {
+ ssc.bind(new InetSocketAddress(addr, 0));
+ int port = ((InetSocketAddress)(ssc.getLocalAddress())).getPort();
+
+ // SocketChannel.connect (implicit bind)
+ SocketChannel client = SocketChannel.open();
+ try {
+ client.connect(new InetSocketAddress(addr, port));
+ SocketChannel peer = ssc.accept();
+ try {
+ testConnection(Channels.newOutputStream(client),
+ Channels.newInputStream(peer));
+ } finally {
+ peer.close();
+ }
+ } finally {
+ client.close();
+ }
+
+ // SocketChannel.connect (explicit bind)
+ client = SocketChannel.open();
+ try {
+ client.bind(new InetSocketAddress(addr, 0))
+ .connect(new InetSocketAddress(addr, port));
+ ssc.accept().close();
+ } finally {
+ client.close();
+ }
+ } finally {
+ ssc.close();
+ }
+
+ // AsynchronousServerSocketChannel.bind
+ AsynchronousServerSocketChannel server =
+ AsynchronousServerSocketChannel.open();
+ try {
+ server.bind(new InetSocketAddress(addr, 0));
+ int port = ((InetSocketAddress)(server.getLocalAddress())).getPort();
+
+ // AsynchronousSocketChannel.connect (implicit bind)
+ AsynchronousSocketChannel client = AsynchronousSocketChannel.open();
+ try {
+ client.connect(new InetSocketAddress(addr, port)).get();
+ AsynchronousSocketChannel peer = server.accept().get();
+ try {
+ testConnection(Channels.newOutputStream(client),
+ Channels.newInputStream(peer));
+ } finally {
+ peer.close();
+ }
+ } finally {
+ client.close();
+ }
+
+ // AsynchronousSocketChannel.connect (explicit bind)
+ client = AsynchronousSocketChannel.open();
+ try {
+ client.bind(new InetSocketAddress(addr, 0))
+ .connect(new InetSocketAddress(addr, port)).get();
+ server.accept().get().close();
+ } finally {
+ client.close();
+ }
+ } finally {
+ server.close();
+ }
+
+ // ServerSocket.bind
+ ServerSocket ss = new ServerSocket();
+ try {
+ ss.bind(new InetSocketAddress(addr, 0));
+ int port = ss.getLocalPort();
+
+ // Socket.connect (implicit bind)
+ Socket s = new Socket();
+ try {
+ s.connect(new InetSocketAddress(addr, port));
+ Socket peer = ss.accept();
+ try {
+ testConnection(s.getOutputStream(), peer.getInputStream());
+ } finally {
+ peer.close();
+ }
+ } finally {
+ s.close();
+ }
+
+ // Socket.connect (explicit bind)
+ s = new Socket();
+ try {
+ s.bind(new InetSocketAddress(addr, 0));
+ s.connect(new InetSocketAddress(addr, port));
+ ss.accept().close();
+ } finally {
+ s.close();
+ }
+ } finally {
+ ss.close();
+ }
+ }
+
+ static void testConnection(OutputStream out, InputStream in)
+ throws IOException
+ {
+ byte[] msg = "hello".getBytes();
+ out.write(msg);
+
+ byte[] ba = new byte[100];
+ int nread = 0;
+ while (nread < msg.length) {
+ int n = in.read(ba);
+ if (n < 0)
+ throw new IOException("EOF not expected!");
+ nread += n;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/net/sdp/sanity.sh Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,72 @@
+#
+# Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+# @test
+# @bug 4890703
+# @summary Unit test for Solaris SDP support
+# @build ProbeIB Sanity
+# @run shell sanity.sh
+
+# Check we are on Solaris and that SDP is enabled
+OS=`uname -s`
+if [ "$OS" != "SunOS" ]; then
+ echo "This is a Solaris-only test"
+ exit 0
+fi
+SDPADM=/usr/sbin/sdpadm
+if [ ! -f ${SDPADM} ]; then
+ echo "SDP not available"
+ exit 0
+fi
+${SDPADM} status|grep Enabled
+if [ $? != 0 ]; then
+ echo "SDP not enabled"
+ exit 0
+fi
+
+if [ -z "$TESTJAVA" ]; then
+ JAVA=java
+ TESTCLASSES=.
+ TESTSRC=.
+else
+ JAVA="${TESTJAVA}/bin/java"
+fi
+
+CLASSPATH=${TESTCLASSES}:${TESTSRC}
+export CLASSPATH
+
+# Probe for IP addresses plumbed to IB interfaces
+$JAVA -Djava.net.preferIPv4Stack=true ProbeIB > ib_addrs
+
+# Create sdp.conf
+SDPCONF=sdp.conf
+rm ${SDPCONF}
+touch ${SDPCONF}
+cat ib_addrs | while read ADDR
+do
+ echo "bind ${ADDR} *" > ${SDPCONF}
+ echo "connect ${ADDR} *" >> ${SDPCONF}
+done
+
+# Sanity check
+$JAVA -Djava.net.preferIPv4Stack=true -Dcom.sun.sdp.conf=${SDPCONF} -Dcom.sun.sdp.debug Sanity
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/tools/jarsigner/concise_jarsigner.sh Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,200 @@
+#
+# Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+# @test
+# @bug 6802846
+# @summary jarsigner needs enhanced cert validation(options)
+#
+# @run shell concise_jarsigner.sh
+#
+
+if [ "${TESTJAVA}" = "" ] ; then
+ JAVAC_CMD=`which javac`
+ TESTJAVA=`dirname $JAVAC_CMD`/..
+fi
+
+# set platform-dependent variables
+OS=`uname -s`
+case "$OS" in
+ Windows_* )
+ FS="\\"
+ ;;
+ * )
+ FS="/"
+ ;;
+esac
+
+KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit -keystore js.jks"
+JAR=$TESTJAVA${FS}bin${FS}jar
+JARSIGNER=$TESTJAVA${FS}bin${FS}jarsigner
+JAVAC=$TESTJAVA${FS}bin${FS}javac
+
+rm js.jks
+
+echo class A1 {} > A1.java
+echo class A2 {} > A2.java
+echo class A3 {} > A3.java
+echo class A4 {} > A4.java
+echo class A5 {} > A5.java
+echo class A6 {} > A6.java
+
+$JAVAC A1.java A2.java A3.java A4.java A5.java A6.java
+YEAR=`date +%Y`
+
+# ==========================================================
+# First part: output format
+# ==========================================================
+
+$KT -genkeypair -alias a1 -dname CN=a1 -validity 365
+$KT -genkeypair -alias a2 -dname CN=a2 -validity 365
+
+# a.jar includes 8 unsigned, 2 signed by a1 and a2, 2 signed by a3
+$JAR cvf a.jar A1.class A2.class
+$JARSIGNER -keystore js.jks -storepass changeit a.jar a1
+$JAR uvf a.jar A3.class A4.class
+$JARSIGNER -keystore js.jks -storepass changeit a.jar a2
+$JAR uvf a.jar A5.class A6.class
+
+# Verify OK
+$JARSIGNER -verify a.jar
+[ $? = 0 ] || exit $LINENO
+
+# 4(chainNotValidated)+16(hasUnsignedEntry)+32(aliasNotInStore)
+$JARSIGNER -verify a.jar -strict
+[ $? = 52 ] || exit $LINENO
+
+# 16(hasUnsignedEntry)
+$JARSIGNER -verify a.jar -strict -keystore js.jks
+[ $? = 16 ] || exit $LINENO
+
+# 16(hasUnsignedEntry)+32(notSignedByAlias)
+$JARSIGNER -verify a.jar a1 -strict -keystore js.jks
+[ $? = 48 ] || exit $LINENO
+
+# 16(hasUnsignedEntry)
+$JARSIGNER -verify a.jar a1 a2 -strict -keystore js.jks
+[ $? = 16 ] || exit $LINENO
+
+# 12 entries all together
+LINES=`$JARSIGNER -verify a.jar -verbose | grep $YEAR | wc -l`
+[ $LINES = 12 ] || exit $LINENO
+
+# 12 entries all listed
+LINES=`$JARSIGNER -verify a.jar -verbose:grouped | grep $YEAR | wc -l`
+[ $LINES = 12 ] || exit $LINENO
+
+# 3 groups: unrelated, signed, unsigned
+LINES=`$JARSIGNER -verify a.jar -verbose:summary | grep $YEAR | wc -l`
+[ $LINES = 3 ] || exit $LINENO
+
+# 4 groups: unrelated, signed by a1/a2, signed by a2, unsigned
+LINES=`$JARSIGNER -verify a.jar -verbose:summary -certs | grep $YEAR | wc -l`
+[ $LINES = 4 ] || exit $LINENO
+
+# 2*2 for A1/A2, 2 for A3/A4
+LINES=`$JARSIGNER -verify a.jar -verbose -certs | grep "\[certificate" | wc -l`
+[ $LINES = 6 ] || exit $LINENO
+
+# a1,a2 for A1/A2, a2 for A3/A4
+LINES=`$JARSIGNER -verify a.jar -verbose:grouped -certs | grep "\[certificate" | wc -l`
+[ $LINES = 3 ] || exit $LINENO
+
+# a1,a2 for A1/A2, a2 for A3/A4
+LINES=`$JARSIGNER -verify a.jar -verbose:summary -certs | grep "\[certificate" | wc -l`
+[ $LINES = 3 ] || exit $LINENO
+
+# 4 groups
+LINES=`$JARSIGNER -verify a.jar -verbose:summary -certs | grep "more)" | wc -l`
+[ $LINES = 4 ] || exit $LINENO
+
+# ==========================================================
+# Second part: exit code 2, 4, 8
+# 16 and 32 already covered in the first part
+# ==========================================================
+
+$KT -genkeypair -alias expiring -dname CN=expiring -startdate -1m
+$KT -genkeypair -alias expired -dname CN=expired -startdate -10m
+$KT -genkeypair -alias notyetvalid -dname CN=notyetvalid -startdate +1m
+$KT -genkeypair -alias badku -dname CN=badku -ext KU=cRLSign -validity 365
+$KT -genkeypair -alias badeku -dname CN=badeku -ext EKU=sa -validity 365
+$KT -genkeypair -alias goodku -dname CN=goodku -ext KU=dig -validity 365
+$KT -genkeypair -alias goodeku -dname CN=goodeku -ext EKU=codesign -validity 365
+
+# badchain signed by ca, but ca is removed later
+$KT -genkeypair -alias badchain -dname CN=badchain -validity 365
+$KT -genkeypair -alias ca -dname CN=ca -ext bc -validity 365
+$KT -certreq -alias badchain | $KT -gencert -alias ca -validity 365 | \
+ $KT -importcert -alias badchain
+$KT -delete -alias ca
+
+$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar expiring
+[ $? = 2 ] || exit $LINENO
+
+$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar expired
+[ $? = 4 ] || exit $LINENO
+
+$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar notyetvalid
+[ $? = 4 ] || exit $LINENO
+
+$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar badku
+[ $? = 8 ] || exit $LINENO
+
+$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar badeku
+[ $? = 8 ] || exit $LINENO
+
+$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar goodku
+[ $? = 0 ] || exit $LINENO
+
+$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar goodeku
+[ $? = 0 ] || exit $LINENO
+
+$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar badchain
+[ $? = 4 ] || exit $LINENO
+
+$JARSIGNER -verify a.jar
+[ $? = 0 ] || exit $LINENO
+
+# ==========================================================
+# Third part: -certchain test
+# ==========================================================
+
+# altchain signed by ca2, but ca2 is removed later
+$KT -genkeypair -alias altchain -dname CN=altchain -validity 365
+$KT -genkeypair -alias ca2 -dname CN=ca2 -ext bc -validity 365
+$KT -certreq -alias altchain | $KT -gencert -alias ca2 -validity 365 -rfc > certchain
+$KT -exportcert -alias ca2 -rfc >> certchain
+$KT -delete -alias ca2
+
+# Now altchain is still self-signed
+$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar altchain
+[ $? = 0 ] || exit $LINENO
+
+# If -certchain is used, then it's bad
+$JARSIGNER -strict -keystore js.jks -storepass changeit -certchain certchain a.jar altchain
+[ $? = 4 ] || exit $LINENO
+
+$JARSIGNER -verify a.jar
+[ $? = 0 ] || exit $LINENO
+
+echo OK
+exit 0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/tools/keytool/selfissued.sh Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,69 @@
+#
+# Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+# @test
+# @bug 6825352
+# @summary support self-issued certificate in keytool
+#
+# @run shell selfissued.sh
+#
+
+if [ "${TESTJAVA}" = "" ] ; then
+ JAVAC_CMD=`which javac`
+ TESTJAVA=`dirname $JAVAC_CMD`/..
+fi
+
+# set platform-dependent variables
+OS=`uname -s`
+case "$OS" in
+ Windows_* )
+ FS="\\"
+ ;;
+ * )
+ FS="/"
+ ;;
+esac
+
+KS=selfsigned.jks
+KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit -keystore $KS"
+
+rm $KS
+
+$KT -alias ca -dname CN=CA -genkeypair
+$KT -alias me -dname CN=CA -genkeypair
+$KT -alias e1 -dname CN=E1 -genkeypair
+$KT -alias e2 -dname CN=E2 -genkeypair
+
+# me signed by ca, self-issued
+$KT -alias me -certreq | $KT -alias ca -gencert | $KT -alias me -importcert
+
+# Import e1 signed by me, should add me and ca
+$KT -alias e1 -certreq | $KT -alias me -gencert | $KT -alias e1 -importcert
+$KT -alias e1 -list -v | grep '\[3\]' || { echo Bad E1; exit 1; }
+
+# Import (e2 signed by me,ca,me), should reorder to (e2,me,ca)
+( $KT -alias e2 -certreq | $KT -alias me -gencert; $KT -exportcert -alias ca; $KT -exportcert -alias me ) | $KT -alias e2 -importcert
+$KT -alias e2 -list -v | grep '\[3\]' || { echo Bad E2; exit 1; }
+
+echo Good
+
--- a/langtools/.hgtags Thu Apr 23 16:58:16 2009 -0400
+++ b/langtools/.hgtags Mon Apr 27 12:33:57 2009 -0700
@@ -28,3 +28,5 @@
8c55d5b0ed71ed3a749eb97e4eab79b4831649b8 jdk7-b51
29329051d483d39f66073752ba4afbf29d893cfe jdk7-b52
dbdeb4a7581b2a8699644b91cae6793cb01953f7 jdk7-b53
+197a7f881937d406a01214aa9ded49c073f7d380 jdk7-b54
+7394a8694cedea574c7dbd38de87f4cbe0e27b8a jdk7-b55
--- a/langtools/src/share/classes/com/sun/tools/classfile/Code_attribute.java Thu Apr 23 16:58:16 2009 -0400
+++ b/langtools/src/share/classes/com/sun/tools/classfile/Code_attribute.java Mon Apr 27 12:33:57 2009 -0700
@@ -26,6 +26,8 @@
package com.sun.tools.classfile;
import java.io.IOException;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
/**
* See JVMS3, section 4.8.3.
@@ -100,6 +102,39 @@
return visitor.visitCode(this, data);
}
+ public Iterable<Instruction> getInstructions() {
+ return new Iterable<Instruction>() {
+ public Iterator<Instruction> iterator() {
+ return new Iterator<Instruction>() {
+
+ public boolean hasNext() {
+ return (next != null);
+ }
+
+ public Instruction next() {
+ if (next == null)
+ throw new NoSuchElementException();
+
+ current = next;
+ pc += current.length();
+ next = (pc < code.length ? new Instruction(code, pc) : null);
+ return current;
+ }
+
+ public void remove() {
+ throw new UnsupportedOperationException("Not supported.");
+ }
+
+ Instruction current = null;
+ int pc = 0;
+ Instruction next = new Instruction(code, pc);
+
+ };
+ }
+
+ };
+ }
+
public final int max_stack;
public final int max_locals;
public final int code_length;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/share/classes/com/sun/tools/classfile/Instruction.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,339 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package com.sun.tools.classfile;
+
+/**
+ * See JVMS3, chapter 6.
+ *
+ * <p><b>This is NOT part of any API supported by Sun Microsystems. 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>
+ *
+ * @see Code_attribute#getInstructions
+ */
+public class Instruction {
+ /** The kind of an instruction, as determined by the position, size and
+ * types of its operands. */
+ public static enum Kind {
+ /** Opcode is not followed by any operands. */
+ NO_OPERANDS(1),
+ /** Opcode is followed by a byte indicating a type. */
+ ATYPE(2),
+ /** Opcode is followed by a 2-byte branch offset. */
+ BRANCH(3),
+ /** Opcode is followed by a 4-byte branch offset. */
+ BRANCH_W(5),
+ /** Opcode is followed by a signed byte value. */
+ BYTE(2),
+ /** Opcode is followed by a 1-byte index into the constant pool. */
+ CPREF(2),
+ /** Opcode is followed by a 2-byte index into the constant pool. */
+ CPREF_W(3),
+ /** Opcode is followed by a 2-byte index into the constant pool,
+ * an unsigned byte value. */
+ CPREF_W_UBYTE(4),
+ /** Opcode is followed by a 2-byte index into the constant pool.,
+ * an unsigned byte value, and a zero byte. */
+ CPREF_W_UBYTE_ZERO(5),
+ /** Opcode is followed by variable number of operands, depending
+ * on the instruction.*/
+ DYNAMIC(-1),
+ /** Opcode is followed by a 1-byte reference to a local variable. */
+ LOCAL(2),
+ /** Opcode is followed by a 1-byte reference to a local variable,
+ * and a signed byte value. */
+ LOCAL_BYTE(3),
+ /** Opcode is followed by a signed short value. */
+ SHORT(3),
+ /** Wide opcode is not followed by any operands. */
+ WIDE_NO_OPERANDS(2),
+ /** Wide opcode is followed by a 2-byte index into the constant pool. */
+ WIDE_CPREF_W(4),
+ /** Wide opcode is followed by a 2-byte index into the constant pool,
+ * and a signed short value. */
+ WIDE_CPREF_W_SHORT(6),
+ /** Opcode was not recognized. */
+ UNKNOWN(1);
+
+ Kind(int length) {
+ this.length = length;
+ }
+
+ /** The length, in bytes, of this kind of instruction, or -1 is the
+ * length depends on the specific instruction. */
+ public final int length;
+ };
+
+ /** A utility visitor to help decode the operands of an instruction.
+ * @see Instruction#accept */
+ public interface KindVisitor<R,P> {
+ /** See {@link Kind#NO_OPERANDS}, {@link Kind#WIDE_NO_OPERANDS}. */
+ R visitNoOperands(Instruction instr, P p);
+ /** See {@link Kind#ATYPE}. */
+ R visitArrayType(Instruction instr, TypeKind kind, P p);
+ /** See {@link Kind#BRANCH}, {@link Kind#BRANCH_W}. */
+ R visitBranch(Instruction instr, int offset, P p);
+ /** See {@link Kind#CPREF}, {@link Kind#CPREF_W}, {@link Kind#WIDE_CPREF_W}. */
+ R visitConstantPoolRef(Instruction instr, int index, P p);
+ /** See {@link Kind#CPREF_W_UBYTE}, {@link Kind#CPREF_W_UBYTE_ZERO}, {@link Kind#WIDE_CPREF_W_SHORT}. */
+ R visitConstantPoolRefAndValue(Instruction instr, int index, int value, P p);
+ /** See {@link Kind#LOCAL}. */
+ R visitLocal(Instruction instr, int index, P p);
+ /** See {@link Kind#LOCAL_UBYTE}. */
+ R visitLocalAndValue(Instruction instr, int index, int value, P p);
+ /** See {@link Kind#DYNAMIC}. */
+ R visitLookupSwitch(Instruction instr, int default_, int npairs, int[] matches, int[] offsets);
+ /** See {@link Kind#DYNAMIC}. */
+ R visitTableSwitch(Instruction instr, int default_, int low, int high, int[] offsets);
+ /** See {@link Kind#BYTE}, {@link Kind#SHORT}. */
+ R visitValue(Instruction instr, int value, P p);
+ /** Instruction is unrecognized. */
+ R visitUnknown(Instruction instr, P p);
+
+ }
+
+ /** The kind of primitive array type to create.
+ * See JVMS chapter 6, newarray. */
+ public static enum TypeKind {
+ T_BOOLEAN(4, "boolean"),
+ T_CHAR(5, "char"),
+ T_FLOAT(6, "float"),
+ T_DOUBLE(7, "double"),
+ T_BYTE(8, "byte"),
+ T_SHORT(9, "short"),
+ T_INT (10, "int"),
+ T_LONG (11, "long");
+ TypeKind(int value, String name) {
+ this.value = value;
+ this.name = name;
+ }
+
+ public static TypeKind get(int value) {
+ switch (value) {
+ case 4: return T_BOOLEAN;
+ case 5: return T_CHAR;
+ case 6: return T_FLOAT;
+ case 7: return T_DOUBLE;
+ case 8: return T_BYTE;
+ case 9: return T_SHORT;
+ case 10: return T_INT;
+ case 11: return T_LONG;
+ default: return null;
+ }
+ }
+
+ public final int value;
+ public final String name;
+ }
+
+ /** An instruction is defined by its position in a bytecode array. */
+ public Instruction(byte[] bytes, int pc) {
+ this.bytes = bytes;
+ this.pc = pc;
+ }
+
+ /** Get the position of the instruction within the bytecode array. */
+ public int getPC() {
+ return pc;
+ }
+
+ /** Get a byte value, relative to the start of this instruction. */
+ public int getByte(int offset) {
+ return bytes[pc + offset];
+ }
+
+ /** Get an unsigned byte value, relative to the start of this instruction. */
+ public int getUnsignedByte(int offset) {
+ return getByte(offset) & 0xff;
+ }
+
+ /** Get a 2-byte value, relative to the start of this instruction. */
+ public int getShort(int offset) {
+ return (getByte(offset) << 8) | getUnsignedByte(offset + 1);
+ }
+
+ /** Get a unsigned 2-byte value, relative to the start of this instruction. */
+ public int getUnsignedShort(int offset) {
+ return getShort(offset) & 0xFFFF;
+ }
+
+ /** Get a 4-byte value, relative to the start of this instruction. */
+ public int getInt(int offset) {
+ return (getShort(offset) << 16) | (getUnsignedShort(offset + 2));
+ }
+
+ /** Get the Opcode for this instruction, or null if the instruction is
+ * unrecognized. */
+ public Opcode getOpcode() {
+ int b = getUnsignedByte(0);
+ switch (b) {
+ case Opcode.NONPRIV:
+ case Opcode.PRIV:
+ case Opcode.WIDE:
+ return Opcode.get(b, getUnsignedByte(1));
+ }
+ return Opcode.get(b);
+ }
+
+ /** Get the mnemonic for this instruction, or a default string if the
+ * instruction is unrecognized. */
+ public String getMnemonic() {
+ Opcode opcode = getOpcode();
+ if (opcode == null)
+ return "bytecode " + getUnsignedByte(0);
+ else
+ return opcode.toString().toLowerCase();
+ }
+
+ /** Get the length, in bytes, of this instruction, including the opcode
+ * and all its operands. */
+ public int length() {
+ Opcode opcode = getOpcode();
+ if (opcode == null)
+ return 1;
+
+ switch (opcode) {
+ case TABLESWITCH: {
+ int pad = align(pc + 1) - pc;
+ int low = getInt(pad + 4);
+ int high = getInt(pad + 8);
+ return pad + 12 + 4 * (high - low + 1);
+ }
+ case LOOKUPSWITCH: {
+ int pad = align(pc + 1) - pc;
+ int npairs = getInt(pad + 4);
+ return pad + 8 + 8 * npairs;
+
+ }
+ default:
+ return opcode.kind.length;
+ }
+ }
+
+ /** Get the {@link Kind} of this instruction. */
+ public Kind getKind() {
+ Opcode opcode = getOpcode();
+ return (opcode != null ? opcode.kind : Kind.UNKNOWN);
+ }
+
+ /** Invoke a method on the visitor according to the kind of this
+ * instruction, passing in the decoded operands for the instruction. */
+ public <R,P> R accept(KindVisitor<R,P> visitor, P p) {
+ switch (getKind()) {
+ case NO_OPERANDS:
+ return visitor.visitNoOperands(this, p);
+
+ case ATYPE:
+ return visitor.visitArrayType(
+ this, TypeKind.get(getUnsignedByte(1)), p);
+
+ case BRANCH:
+ return visitor.visitBranch(this, getShort(1), p);
+
+ case BRANCH_W:
+ return visitor.visitBranch(this, getInt(1), p);
+
+ case BYTE:
+ return visitor.visitValue(this, getByte(1), p);
+
+ case CPREF:
+ return visitor.visitConstantPoolRef(this, getUnsignedByte(1), p);
+
+ case CPREF_W:
+ return visitor.visitConstantPoolRef(this, getUnsignedShort(1), p);
+
+ case CPREF_W_UBYTE:
+ case CPREF_W_UBYTE_ZERO:
+ return visitor.visitConstantPoolRefAndValue(
+ this, getUnsignedShort(1), getUnsignedByte(3), p);
+
+ case DYNAMIC: {
+ switch (getOpcode()) {
+ case TABLESWITCH: {
+ int pad = align(pc + 1) - pc;
+ int default_ = getInt(pad);
+ int low = getInt(pad + 4);
+ int high = getInt(pad + 8);
+ int[] values = new int[high - low + 1];
+ for (int i = 0; i < values.length; i++)
+ values[i] = getInt(pad + 12 + 4 * i);
+ return visitor.visitTableSwitch(
+ this, default_, low, high, values);
+ }
+ case LOOKUPSWITCH: {
+ int pad = align(pc + 1) - pc;
+ int default_ = getInt(pad);
+ int npairs = getInt(pad + 4);
+ int[] matches = new int[npairs];
+ int[] offsets = new int[npairs];
+ for (int i = 0; i < npairs; i++) {
+ matches[i] = getInt(pad + 8 + i * 8);
+ offsets[i] = getInt(pad + 12 + i * 8);
+ }
+ return visitor.visitLookupSwitch(
+ this, default_, npairs, matches, offsets);
+ }
+ default:
+ throw new IllegalStateException();
+ }
+ }
+
+ case LOCAL:
+ return visitor.visitLocal(this, getUnsignedByte(1), p);
+
+ case LOCAL_BYTE:
+ return visitor.visitLocalAndValue(
+ this, getUnsignedByte(1), getByte(2), p);
+
+ case SHORT:
+ return visitor.visitValue(this, getShort(1), p);
+
+ case WIDE_NO_OPERANDS:
+ return visitor.visitNoOperands(this, p);
+
+ case WIDE_CPREF_W:
+ return visitor.visitConstantPoolRef(this, getUnsignedShort(2), p);
+
+ case WIDE_CPREF_W_SHORT:
+ return visitor.visitConstantPoolRefAndValue(
+ this, getUnsignedShort(2), getUnsignedByte(4), p);
+
+ case UNKNOWN:
+ return visitor.visitUnknown(this, p);
+
+ default:
+ throw new IllegalStateException();
+ }
+ }
+
+ private static int align(int n) {
+ return (n + 3) & ~3;
+ }
+
+ private byte[] bytes;
+ private int pc;
+}
--- a/langtools/src/share/classes/com/sun/tools/classfile/OpCodes.java Thu Apr 23 16:58:16 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,868 +0,0 @@
-/*
- * Copyright 2007-2008 Sun Microsystems, Inc. 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. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package com.sun.tools.classfile;
-
-import java.util.HashMap;
-
-/**
- * See JVMS3, section 6.
- *
- * <p><b>This is NOT part of any API supported by Sun Microsystems. 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 OpCodes {
-
- public static int opcLength(int opc) throws IllegalArgumentException {
- switch (opc >> 8) {
- case 0:
- return opcLengthsTab[opc];
- case opc_wide:
- switch (opc & 0xFF) {
- case opc_aload:
- case opc_astore:
- case opc_fload:
- case opc_fstore:
- case opc_iload:
- case opc_istore:
- case opc_lload:
- case opc_lstore:
- case opc_dload:
- case opc_dstore:
- case opc_ret:
- return 4;
- case opc_iinc:
- return 6;
- default:
- throw new IllegalArgumentException();
- }
- case opc_nonpriv:
- case opc_priv:
- return 2;
- default:
- throw new IllegalArgumentException();
- }
- }
-
- public static String opcName(int opc) {
- try {
- switch (opc >> 8) {
- case 0:
- return opcNamesTab[opc];
- case opc_wide:
- {
- String mnem = opcNamesTab[opc & 0xFF] + "_w";
- if (mnemocodes.get(mnem) == null) {
- return null; // non-existent opcode
- }
- return mnem;
- }
- case opc_nonpriv:
- return opcExtNamesTab[opc & 0xFF];
- case opc_priv:
- return opcPrivExtNamesTab[opc & 0xFF];
- default:
- return null;
- }
- } catch (ArrayIndexOutOfBoundsException e) {
- switch (opc) {
- case opc_nonpriv:
- return "nonpriv";
- case opc_priv:
- return "priv";
- default:
- return null;
- }
- }
- }
-
- /* Opcodes */
- public static final int opc_dead = -2;
- public static final int opc_label = -1;
- public static final int opc_nop = 0;
- public static final int opc_aconst_null = 1;
- public static final int opc_iconst_m1 = 2;
- public static final int opc_iconst_0 = 3;
- public static final int opc_iconst_1 = 4;
- public static final int opc_iconst_2 = 5;
- public static final int opc_iconst_3 = 6;
- public static final int opc_iconst_4 = 7;
- public static final int opc_iconst_5 = 8;
- public static final int opc_lconst_0 = 9;
- public static final int opc_lconst_1 = 10;
- public static final int opc_fconst_0 = 11;
- public static final int opc_fconst_1 = 12;
- public static final int opc_fconst_2 = 13;
- public static final int opc_dconst_0 = 14;
- public static final int opc_dconst_1 = 15;
- public static final int opc_bipush = 16;
- public static final int opc_sipush = 17;
- public static final int opc_ldc = 18;
- public static final int opc_ldc_w = 19;
- public static final int opc_ldc2_w = 20;
- public static final int opc_iload = 21;
- public static final int opc_lload = 22;
- public static final int opc_fload = 23;
- public static final int opc_dload = 24;
- public static final int opc_aload = 25;
- public static final int opc_iload_0 = 26;
- public static final int opc_iload_1 = 27;
- public static final int opc_iload_2 = 28;
- public static final int opc_iload_3 = 29;
- public static final int opc_lload_0 = 30;
- public static final int opc_lload_1 = 31;
- public static final int opc_lload_2 = 32;
- public static final int opc_lload_3 = 33;
- public static final int opc_fload_0 = 34;
- public static final int opc_fload_1 = 35;
- public static final int opc_fload_2 = 36;
- public static final int opc_fload_3 = 37;
- public static final int opc_dload_0 = 38;
- public static final int opc_dload_1 = 39;
- public static final int opc_dload_2 = 40;
- public static final int opc_dload_3 = 41;
- public static final int opc_aload_0 = 42;
- public static final int opc_aload_1 = 43;
- public static final int opc_aload_2 = 44;
- public static final int opc_aload_3 = 45;
- public static final int opc_iaload = 46;
- public static final int opc_laload = 47;
- public static final int opc_faload = 48;
- public static final int opc_daload = 49;
- public static final int opc_aaload = 50;
- public static final int opc_baload = 51;
- public static final int opc_caload = 52;
- public static final int opc_saload = 53;
- public static final int opc_istore = 54;
- public static final int opc_lstore = 55;
- public static final int opc_fstore = 56;
- public static final int opc_dstore = 57;
- public static final int opc_astore = 58;
- public static final int opc_istore_0 = 59;
- public static final int opc_istore_1 = 60;
- public static final int opc_istore_2 = 61;
- public static final int opc_istore_3 = 62;
- public static final int opc_lstore_0 = 63;
- public static final int opc_lstore_1 = 64;
- public static final int opc_lstore_2 = 65;
- public static final int opc_lstore_3 = 66;
- public static final int opc_fstore_0 = 67;
- public static final int opc_fstore_1 = 68;
- public static final int opc_fstore_2 = 69;
- public static final int opc_fstore_3 = 70;
- public static final int opc_dstore_0 = 71;
- public static final int opc_dstore_1 = 72;
- public static final int opc_dstore_2 = 73;
- public static final int opc_dstore_3 = 74;
- public static final int opc_astore_0 = 75;
- public static final int opc_astore_1 = 76;
- public static final int opc_astore_2 = 77;
- public static final int opc_astore_3 = 78;
- public static final int opc_iastore = 79;
- public static final int opc_lastore = 80;
- public static final int opc_fastore = 81;
- public static final int opc_dastore = 82;
- public static final int opc_aastore = 83;
- public static final int opc_bastore = 84;
- public static final int opc_castore = 85;
- public static final int opc_sastore = 86;
- public static final int opc_pop = 87;
- public static final int opc_pop2 = 88;
- public static final int opc_dup = 89;
- public static final int opc_dup_x1 = 90;
- public static final int opc_dup_x2 = 91;
- public static final int opc_dup2 = 92;
- public static final int opc_dup2_x1 = 93;
- public static final int opc_dup2_x2 = 94;
- public static final int opc_swap = 95;
- public static final int opc_iadd = 96;
- public static final int opc_ladd = 97;
- public static final int opc_fadd = 98;
- public static final int opc_dadd = 99;
- public static final int opc_isub = 100;
- public static final int opc_lsub = 101;
- public static final int opc_fsub = 102;
- public static final int opc_dsub = 103;
- public static final int opc_imul = 104;
- public static final int opc_lmul = 105;
- public static final int opc_fmul = 106;
- public static final int opc_dmul = 107;
- public static final int opc_idiv = 108;
- public static final int opc_ldiv = 109;
- public static final int opc_fdiv = 110;
- public static final int opc_ddiv = 111;
- public static final int opc_irem = 112;
- public static final int opc_lrem = 113;
- public static final int opc_frem = 114;
- public static final int opc_drem = 115;
- public static final int opc_ineg = 116;
- public static final int opc_lneg = 117;
- public static final int opc_fneg = 118;
- public static final int opc_dneg = 119;
- public static final int opc_ishl = 120;
- public static final int opc_lshl = 121;
- public static final int opc_ishr = 122;
- public static final int opc_lshr = 123;
- public static final int opc_iushr = 124;
- public static final int opc_lushr = 125;
- public static final int opc_iand = 126;
- public static final int opc_land = 127;
- public static final int opc_ior = 128;
- public static final int opc_lor = 129;
- public static final int opc_ixor = 130;
- public static final int opc_lxor = 131;
- public static final int opc_iinc = 132;
- public static final int opc_i2l = 133;
- public static final int opc_i2f = 134;
- public static final int opc_i2d = 135;
- public static final int opc_l2i = 136;
- public static final int opc_l2f = 137;
- public static final int opc_l2d = 138;
- public static final int opc_f2i = 139;
- public static final int opc_f2l = 140;
- public static final int opc_f2d = 141;
- public static final int opc_d2i = 142;
- public static final int opc_d2l = 143;
- public static final int opc_d2f = 144;
- public static final int opc_i2b = 145;
- public static final int opc_int2byte = 145;
- public static final int opc_i2c = 146;
- public static final int opc_int2char = 146;
- public static final int opc_i2s = 147;
- public static final int opc_int2short = 147;
- public static final int opc_lcmp = 148;
- public static final int opc_fcmpl = 149;
- public static final int opc_fcmpg = 150;
- public static final int opc_dcmpl = 151;
- public static final int opc_dcmpg = 152;
- public static final int opc_ifeq = 153;
- public static final int opc_ifne = 154;
- public static final int opc_iflt = 155;
- public static final int opc_ifge = 156;
- public static final int opc_ifgt = 157;
- public static final int opc_ifle = 158;
- public static final int opc_if_icmpeq = 159;
- public static final int opc_if_icmpne = 160;
- public static final int opc_if_icmplt = 161;
- public static final int opc_if_icmpge = 162;
- public static final int opc_if_icmpgt = 163;
- public static final int opc_if_icmple = 164;
- public static final int opc_if_acmpeq = 165;
- public static final int opc_if_acmpne = 166;
- public static final int opc_goto = 167;
- public static final int opc_jsr = 168;
- public static final int opc_ret = 169;
- public static final int opc_tableswitch = 170;
- public static final int opc_lookupswitch = 171;
- public static final int opc_ireturn = 172;
- public static final int opc_lreturn = 173;
- public static final int opc_freturn = 174;
- public static final int opc_dreturn = 175;
- public static final int opc_areturn = 176;
- public static final int opc_return = 177;
- public static final int opc_getstatic = 178;
- public static final int opc_putstatic = 179;
- public static final int opc_getfield = 180;
- public static final int opc_putfield = 181;
- public static final int opc_invokevirtual = 182;
- public static final int opc_invokenonvirtual = 183;
- public static final int opc_invokespecial = 183;
- public static final int opc_invokestatic = 184;
- public static final int opc_invokeinterface = 185;
-// public static final int opc_xxxunusedxxx = 186;
- public static final int opc_new = 187;
- public static final int opc_newarray = 188;
- public static final int opc_anewarray = 189;
- public static final int opc_arraylength = 190;
- public static final int opc_athrow = 191;
- public static final int opc_checkcast = 192;
- public static final int opc_instanceof = 193;
- public static final int opc_monitorenter = 194;
- public static final int opc_monitorexit = 195;
- public static final int opc_wide = 196;
- public static final int opc_multianewarray = 197;
- public static final int opc_ifnull = 198;
- public static final int opc_ifnonnull = 199;
- public static final int opc_goto_w = 200;
- public static final int opc_jsr_w = 201;
-
- /* Pseudo-instructions */
- public static final int opc_bytecode = 203;
- public static final int opc_try = 204;
- public static final int opc_endtry = 205;
- public static final int opc_catch = 206;
- public static final int opc_var = 207;
- public static final int opc_endvar = 208;
- public static final int opc_localsmap = 209;
- public static final int opc_stackmap = 210;
-
- /* PicoJava prefixes */
- public static final int opc_nonpriv = 254;
- public static final int opc_priv = 255;
-
- /* Wide instructions */
- public static final int opc_iload_w = (opc_wide << 8 ) | opc_iload;
- public static final int opc_lload_w = (opc_wide << 8 ) | opc_lload;
- public static final int opc_fload_w = (opc_wide << 8 ) | opc_fload;
- public static final int opc_dload_w = (opc_wide << 8 ) | opc_dload;
- public static final int opc_aload_w = (opc_wide << 8 ) | opc_aload;
- public static final int opc_istore_w = (opc_wide << 8 ) | opc_istore;
- public static final int opc_lstore_w = (opc_wide << 8 ) | opc_lstore;
- public static final int opc_fstore_w = (opc_wide << 8 ) | opc_fstore;
- public static final int opc_dstore_w = (opc_wide << 8 ) | opc_dstore;
- public static final int opc_astore_w = (opc_wide << 8 ) | opc_astore;
- public static final int opc_ret_w = (opc_wide << 8 ) | opc_ret;
- public static final int opc_iinc_w = (opc_wide << 8 ) | opc_iinc;
-
- /* Opcode Names */
- private static final String opcNamesTab[] = {
- "nop",
- "aconst_null",
- "iconst_m1",
- "iconst_0",
- "iconst_1",
- "iconst_2",
- "iconst_3",
- "iconst_4",
- "iconst_5",
- "lconst_0",
- "lconst_1",
- "fconst_0",
- "fconst_1",
- "fconst_2",
- "dconst_0",
- "dconst_1",
- "bipush",
- "sipush",
- "ldc",
- "ldc_w",
- "ldc2_w",
- "iload",
- "lload",
- "fload",
- "dload",
- "aload",
- "iload_0",
- "iload_1",
- "iload_2",
- "iload_3",
- "lload_0",
- "lload_1",
- "lload_2",
- "lload_3",
- "fload_0",
- "fload_1",
- "fload_2",
- "fload_3",
- "dload_0",
- "dload_1",
- "dload_2",
- "dload_3",
- "aload_0",
- "aload_1",
- "aload_2",
- "aload_3",
- "iaload",
- "laload",
- "faload",
- "daload",
- "aaload",
- "baload",
- "caload",
- "saload",
- "istore",
- "lstore",
- "fstore",
- "dstore",
- "astore",
- "istore_0",
- "istore_1",
- "istore_2",
- "istore_3",
- "lstore_0",
- "lstore_1",
- "lstore_2",
- "lstore_3",
- "fstore_0",
- "fstore_1",
- "fstore_2",
- "fstore_3",
- "dstore_0",
- "dstore_1",
- "dstore_2",
- "dstore_3",
- "astore_0",
- "astore_1",
- "astore_2",
- "astore_3",
- "iastore",
- "lastore",
- "fastore",
- "dastore",
- "aastore",
- "bastore",
- "castore",
- "sastore",
- "pop",
- "pop2",
- "dup",
- "dup_x1",
- "dup_x2",
- "dup2",
- "dup2_x1",
- "dup2_x2",
- "swap",
- "iadd",
- "ladd",
- "fadd",
- "dadd",
- "isub",
- "lsub",
- "fsub",
- "dsub",
- "imul",
- "lmul",
- "fmul",
- "dmul",
- "idiv",
- "ldiv",
- "fdiv",
- "ddiv",
- "irem",
- "lrem",
- "frem",
- "drem",
- "ineg",
- "lneg",
- "fneg",
- "dneg",
- "ishl",
- "lshl",
- "ishr",
- "lshr",
- "iushr",
- "lushr",
- "iand",
- "land",
- "ior",
- "lor",
- "ixor",
- "lxor",
- "iinc",
- "i2l",
- "i2f",
- "i2d",
- "l2i",
- "l2f",
- "l2d",
- "f2i",
- "f2l",
- "f2d",
- "d2i",
- "d2l",
- "d2f",
- "i2b",
- "i2c",
- "i2s",
- "lcmp",
- "fcmpl",
- "fcmpg",
- "dcmpl",
- "dcmpg",
- "ifeq",
- "ifne",
- "iflt",
- "ifge",
- "ifgt",
- "ifle",
- "if_icmpeq",
- "if_icmpne",
- "if_icmplt",
- "if_icmpge",
- "if_icmpgt",
- "if_icmple",
- "if_acmpeq",
- "if_acmpne",
- "goto",
- "jsr",
- "ret",
- "tableswitch",
- "lookupswitch",
- "ireturn",
- "lreturn",
- "freturn",
- "dreturn",
- "areturn",
- "return",
- "getstatic",
- "putstatic",
- "getfield",
- "putfield",
- "invokevirtual",
- "invokespecial", // was "invokenonvirtual",
- "invokestatic",
- "invokeinterface",
- "bytecode 186", //"xxxunusedxxx",
- "new",
- "newarray",
- "anewarray",
- "arraylength",
- "athrow",
- "checkcast",
- "instanceof",
- "monitorenter",
- "monitorexit",
- null, // "wide",
- "multianewarray",
- "ifnull",
- "ifnonnull",
- "goto_w",
- "jsr_w",
- "bytecode 202", // "breakpoint",
- "bytecode",
- "try",
- "endtry",
- "catch",
- "var",
- "endvar",
- "locals_map",
- "stack_map"
- };
-
- /* Opcode Lengths */
- private static final int opcLengthsTab[] = {
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 2,
- 3,
- 2,
- 3,
- 3,
- 2,
- 2,
- 2,
- 2,
- 2,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 2,
- 2,
- 2,
- 2,
- 2,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 3,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 2,
- 99,
- 99,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 5,
- 0,
- 3,
- 2,
- 3,
- 1,
- 1,
- 3,
- 3,
- 1,
- 1,
- 0, // wide
- 4,
- 3,
- 3,
- 5,
- 5,
- 1,
- 1, 0, 0, 0, 0, 0 // pseudo
- };
-
- /* Type codes, used in newarray opcode */
- public static final int T_CLASS = 0x00000002;
- public static final int T_BOOLEAN = 0x00000004;
- public static final int T_CHAR = 0x00000005;
- public static final int T_FLOAT = 0x00000006;
- public static final int T_DOUBLE = 0x00000007;
- public static final int T_BYTE = 0x00000008;
- public static final int T_SHORT = 0x00000009;
- public static final int T_INT = 0x0000000a;
- public static final int T_LONG = 0x0000000b;
-
- private static HashMap<String,Integer> mnemocodes = new HashMap<String,Integer>(301, 0.5f);
- private static String opcExtNamesTab[]=new String[128];
- private static String opcPrivExtNamesTab[]=new String[128];
-
- private static void defineNonPriv(int opc, String mnem) {
- mnemocodes.put(opcExtNamesTab[opc] = mnem, opc_nonpriv * 256 + opc);
- }
-
- private static void definePriv(int opc, String mnem) {
- mnemocodes.put(opcPrivExtNamesTab[opc] = "priv_" + mnem, opc_priv * 256 + opc);
- }
-
- private static void defineExt(int opc, String mnem) {
- defineNonPriv(opc, mnem);
- definePriv(opc, mnem);
- }
-
- static {
- for (int i = 0; i < opc_wide; i++) {
- mnemocodes.put(opcNamesTab[i], i);
- }
- for (int i = opc_wide + 1; i < opcNamesTab.length; i++) {
- mnemocodes.put(opcNamesTab[i], i);
- }
- mnemocodes.put("invokenonvirtual", opc_invokespecial);
-
- mnemocodes.put("iload_w", opc_iload_w);
- mnemocodes.put("lload_w", opc_lload_w);
- mnemocodes.put("fload_w", opc_fload_w);
- mnemocodes.put("dload_w", opc_dload_w);
- mnemocodes.put("aload_w", opc_aload_w);
- mnemocodes.put("istore_w", opc_istore_w);
- mnemocodes.put("lstore_w", opc_lstore_w);
- mnemocodes.put("fstore_w", opc_fstore_w);
- mnemocodes.put("dstore_w", opc_dstore_w);
- mnemocodes.put("astore_w", opc_astore_w);
- mnemocodes.put("ret_w", opc_ret_w);
- mnemocodes.put("iinc_w", opc_iinc_w);
-
- mnemocodes.put("nonpriv", opc_nonpriv);
- mnemocodes.put("priv", opc_priv);
-
- defineExt(0, "load_ubyte");
- defineExt(1, "load_byte");
- defineExt(2, "load_char");
- defineExt(3, "load_short");
- defineExt(4, "load_word");
- defineExt(10, "load_char_oe");
- defineExt(11, "load_short_oe");
- defineExt(12, "load_word_oe");
- defineExt(16, "ncload_ubyte");
- defineExt(17, "ncload_byte");
- defineExt(18, "ncload_char");
- defineExt(19, "ncload_short");
- defineExt(20, "ncload_word");
- defineExt(26, "ncload_char_oe");
- defineExt(27, "ncload_short_oe");
- defineExt(28, "ncload_word_oe");
- defineExt(30, "cache_flush");
- defineExt(32, "store_byte");
- defineExt(34, "store_short");
- defineExt(36, "store_word");
- defineExt(42, "store_short_oe");
- defineExt(44, "store_word_oe");
- defineExt(48, "ncstore_byte");
- defineExt(50, "ncstore_short");
- defineExt(52, "ncstore_word");
- defineExt(58, "ncstore_short_oe");
- defineExt(60, "ncstore_word_oe");
- defineExt(62, "zero_line");
- defineNonPriv(5, "ret_from_sub");
- defineNonPriv(63, "enter_sync_method");
- definePriv(5, "ret_from_trap");
- definePriv(6, "read_dcache_tag");
- definePriv(7, "read_dcache_data");
- definePriv(14, "read_icache_tag");
- definePriv(15, "read_icache_data");
- definePriv(22, "powerdown");
- definePriv(23, "read_scache_data");
- definePriv(31, "cache_index_flush");
- definePriv(38, "write_dcache_tag");
- definePriv(39, "write_dcache_data");
- definePriv(46, "write_icache_tag");
- definePriv(47, "write_icache_data");
- definePriv(54, "reset");
- definePriv(55, "write_scache_data");
- for (int i = 0; i < 32; i++) {
- definePriv(i + 64, "read_reg_" + i);
- }
- for (int i = 0; i < 32; i++) {
- definePriv(i + 96, "write_reg_" + i);
- }
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/share/classes/com/sun/tools/classfile/Opcode.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,472 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package com.sun.tools.classfile;
+
+import static com.sun.tools.classfile.Instruction.Kind.*;
+import static com.sun.tools.classfile.Opcode.Set.*;
+
+/**
+ * See JVMS3, chapter 6.
+ *
+ * <p>In addition to providing all the standard opcodes defined in JVMS,
+ * this class also provides legacy support for the PicoJava extensions.
+ *
+ * <p><b>This is NOT part of any API supported by Sun Microsystems. 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 enum Opcode {
+ NOP(0x0),
+ ACONST_NULL(0x1),
+ ICONST_M1(0x2),
+ ICONST_0(0x3),
+ ICONST_1(0x4),
+ ICONST_2(0x5),
+ ICONST_3(0x6),
+ ICONST_4(0x7),
+ ICONST_5(0x8),
+ LCONST_0(0x9),
+ LCONST_1(0xa),
+ FCONST_0(0xb),
+ FCONST_1(0xc),
+ FCONST_2(0xd),
+ DCONST_0(0xe),
+ DCONST_1(0xf),
+ BIPUSH(0x10, BYTE),
+ SIPUSH(0x11, SHORT),
+ LDC(0x12, CPREF),
+ LDC_W(0x13, CPREF_W),
+ LDC2_W(0x14, CPREF_W),
+ ILOAD(0x15, LOCAL),
+ LLOAD(0x16, LOCAL),
+ FLOAD(0x17, LOCAL),
+ DLOAD(0x18, LOCAL),
+ ALOAD(0x19, LOCAL),
+ ILOAD_0(0x1a),
+ ILOAD_1(0x1b),
+ ILOAD_2(0x1c),
+ ILOAD_3(0x1d),
+ LLOAD_0(0x1e),
+ LLOAD_1(0x1f),
+ LLOAD_2(0x20),
+ LLOAD_3(0x21),
+ FLOAD_0(0x22),
+ FLOAD_1(0x23),
+ FLOAD_2(0x24),
+ FLOAD_3(0x25),
+ DLOAD_0(0x26),
+ DLOAD_1(0x27),
+ DLOAD_2(0x28),
+ DLOAD_3(0x29),
+ ALOAD_0(0x2a),
+ ALOAD_1(0x2b),
+ ALOAD_2(0x2c),
+ ALOAD_3(0x2d),
+ IALOAD(0x2e),
+ LALOAD(0x2f),
+ FALOAD(0x30),
+ DALOAD(0x31),
+ AALOAD(0x32),
+ BALOAD(0x33),
+ CALOAD(0x34),
+ SALOAD(0x35),
+ ISTORE(0x36, LOCAL),
+ LSTORE(0x37, LOCAL),
+ FSTORE(0x38, LOCAL),
+ DSTORE(0x39, LOCAL),
+ ASTORE(0x3a, LOCAL),
+ ISTORE_0(0x3b),
+ ISTORE_1(0x3c),
+ ISTORE_2(0x3d),
+ ISTORE_3(0x3e),
+ LSTORE_0(0x3f),
+ LSTORE_1(0x40),
+ LSTORE_2(0x41),
+ LSTORE_3(0x42),
+ FSTORE_0(0x43),
+ FSTORE_1(0x44),
+ FSTORE_2(0x45),
+ FSTORE_3(0x46),
+ DSTORE_0(0x47),
+ DSTORE_1(0x48),
+ DSTORE_2(0x49),
+ DSTORE_3(0x4a),
+ ASTORE_0(0x4b),
+ ASTORE_1(0x4c),
+ ASTORE_2(0x4d),
+ ASTORE_3(0x4e),
+ IASTORE(0x4f),
+ LASTORE(0x50),
+ FASTORE(0x51),
+ DASTORE(0x52),
+ AASTORE(0x53),
+ BASTORE(0x54),
+ CASTORE(0x55),
+ SASTORE(0x56),
+ POP(0x57),
+ POP2(0x58),
+ DUP(0x59),
+ DUP_X1(0x5a),
+ DUP_X2(0x5b),
+ DUP2(0x5c),
+ DUP2_X1(0x5d),
+ DUP2_X2(0x5e),
+ SWAP(0x5f),
+ IADD(0x60),
+ LADD(0x61),
+ FADD(0x62),
+ DADD(0x63),
+ ISUB(0x64),
+ LSUB(0x65),
+ FSUB(0x66),
+ DSUB(0x67),
+ IMUL(0x68),
+ LMUL(0x69),
+ FMUL(0x6a),
+ DMUL(0x6b),
+ IDIV(0x6c),
+ LDIV(0x6d),
+ FDIV(0x6e),
+ DDIV(0x6f),
+ IREM(0x70),
+ LREM(0x71),
+ FREM(0x72),
+ DREM(0x73),
+ INEG(0x74),
+ LNEG(0x75),
+ FNEG(0x76),
+ DNEG(0x77),
+ ISHL(0x78),
+ LSHL(0x79),
+ ISHR(0x7a),
+ LSHR(0x7b),
+ IUSHR(0x7c),
+ LUSHR(0x7d),
+ IAND(0x7e),
+ LAND(0x7f),
+ IOR(0x80),
+ LOR(0x81),
+ IXOR(0x82),
+ LXOR(0x83),
+ IINC(0x84, LOCAL_BYTE),
+ I2L(0x85),
+ I2F(0x86),
+ I2D(0x87),
+ L2I(0x88),
+ L2F(0x89),
+ L2D(0x8a),
+ F2I(0x8b),
+ F2L(0x8c),
+ F2D(0x8d),
+ D2I(0x8e),
+ D2L(0x8f),
+ D2F(0x90),
+ I2B(0x91),
+ I2C(0x92),
+ I2S(0x93),
+ LCMP(0x94),
+ FCMPL(0x95),
+ FCMPG(0x96),
+ DCMPL(0x97),
+ DCMPG(0x98),
+ IFEQ(0x99, BRANCH),
+ IFNE(0x9a, BRANCH),
+ IFLT(0x9b, BRANCH),
+ IFGE(0x9c, BRANCH),
+ IFGT(0x9d, BRANCH),
+ IFLE(0x9e, BRANCH),
+ IF_ICMPEQ(0x9f, BRANCH),
+ IF_ICMPNE(0xa0, BRANCH),
+ IF_ICMPLT(0xa1, BRANCH),
+ IF_ICMPGE(0xa2, BRANCH),
+ IF_ICMPGT(0xa3, BRANCH),
+ IF_ICMPLE(0xa4, BRANCH),
+ IF_ACMPEQ(0xa5, BRANCH),
+ IF_ACMPNE(0xa6, BRANCH),
+ GOTO(0xa7, BRANCH),
+ JSR(0xa8, BRANCH),
+ RET(0xa9, LOCAL),
+ TABLESWITCH(0xaa, DYNAMIC),
+ LOOKUPSWITCH(0xab, DYNAMIC),
+ IRETURN(0xac),
+ LRETURN(0xad),
+ FRETURN(0xae),
+ DRETURN(0xaf),
+ ARETURN(0xb0),
+ RETURN(0xb1),
+ GETSTATIC(0xb2, CPREF_W),
+ PUTSTATIC(0xb3, CPREF_W),
+ GETFIELD(0xb4, CPREF_W),
+ PUTFIELD(0xb5, CPREF_W),
+ INVOKEVIRTUAL(0xb6, CPREF_W),
+ INVOKESPECIAL(0xb7, CPREF_W),
+ INVOKESTATIC(0xb8, CPREF_W),
+ INVOKEINTERFACE(0xb9, CPREF_W_UBYTE_ZERO),
+ // unused 0xba
+ NEW(0xbb, CPREF_W),
+ NEWARRAY(0xbc, ATYPE),
+ ANEWARRAY(0xbd, CPREF_W),
+ ARRAYLENGTH(0xbe),
+ ATHROW(0xbf),
+ CHECKCAST(0xc0, CPREF_W),
+ INSTANCEOF(0xc1, CPREF_W),
+ MONITORENTER(0xc2),
+ MONITOREXIT(0xc3),
+ // wide 0xc4
+ MULTIANEWARRAY(0xc5, CPREF_W_UBYTE),
+ IFNULL(0xc6, BRANCH),
+ IFNONNULL(0xc7, BRANCH),
+ GOTO_W(0xc8, BRANCH_W),
+ JSR_W(0xc9, BRANCH_W),
+ // impdep 0xfe: PicoJava nonpriv
+ // impdep 0xff: Picojava priv
+
+ // wide opcodes
+ ILOAD_W(0xc415, WIDE_CPREF_W),
+ LLOAD_W(0xc416, WIDE_CPREF_W),
+ FLOAD_W(0xc417, WIDE_CPREF_W),
+ DLOAD_W(0xc418, WIDE_CPREF_W),
+ ALOAD_W(0xc419, WIDE_CPREF_W),
+ ISTORE_W(0xc436, WIDE_CPREF_W),
+ LSTORE_W(0xc437, WIDE_CPREF_W),
+ FSTORE_W(0xc438, WIDE_CPREF_W),
+ DSTORE_W(0xc439, WIDE_CPREF_W),
+ ASTORE_W(0xc43a, WIDE_CPREF_W),
+ IINC_W(0xc484, WIDE_CPREF_W_SHORT),
+ RET_W(0xc4a9, WIDE_CPREF_W),
+
+ // PicoJava nonpriv instructions
+ LOAD_UBYTE(PICOJAVA, 0xfe00),
+ LOAD_BYTE(PICOJAVA, 0xfe01),
+ LOAD_CHAR(PICOJAVA, 0xfe02),
+ LOAD_SHORT(PICOJAVA, 0xfe03),
+ LOAD_WORD(PICOJAVA, 0xfe04),
+ RET_FROM_SUB(PICOJAVA, 0xfe05),
+ LOAD_CHAR_OE(PICOJAVA, 0xfe0a),
+ LOAD_SHORT_OE(PICOJAVA, 0xfe0b),
+ LOAD_WORD_OE(PICOJAVA, 0xfe0c),
+ NCLOAD_UBYTE(PICOJAVA, 0xfe10),
+ NCLOAD_BYTE(PICOJAVA, 0xfe11),
+ NCLOAD_CHAR(PICOJAVA, 0xfe12),
+ NCLOAD_SHORT(PICOJAVA, 0xfe13),
+ NCLOAD_WORD(PICOJAVA, 0xfe14),
+ NCLOAD_CHAR_OE(PICOJAVA, 0xfe1a),
+ NCLOAD_SHORT_OE(PICOJAVA, 0xfe1b),
+ NCLOAD_WORD_OE(PICOJAVA, 0xfe1c),
+ CACHE_FLUSH(PICOJAVA, 0xfe1e),
+ STORE_BYTE(PICOJAVA, 0xfe20),
+ STORE_SHORT(PICOJAVA, 0xfe22),
+ STORE_WORD(PICOJAVA, 0xfe24),
+ STORE_SHORT_OE(PICOJAVA, 0xfe2a),
+ STORE_WORD_OE(PICOJAVA, 0xfe2c),
+ NCSTORE_BYTE(PICOJAVA, 0xfe30),
+ NCSTORE_SHORT(PICOJAVA, 0xfe32),
+ NCSTORE_WORD(PICOJAVA, 0xfe34),
+ NCSTORE_SHORT_OE(PICOJAVA, 0xfe3a),
+ NCSTORE_WORD_OE(PICOJAVA, 0xfe3c),
+ ZERO_LINE(PICOJAVA, 0xfe3e),
+ ENTER_SYNC_METHOD(PICOJAVA, 0xfe3f),
+
+ // PicoJava priv instructions
+ PRIV_LOAD_UBYTE(PICOJAVA, 0xff00),
+ PRIV_LOAD_BYTE(PICOJAVA, 0xff01),
+ PRIV_LOAD_CHAR(PICOJAVA, 0xff02),
+ PRIV_LOAD_SHORT(PICOJAVA, 0xff03),
+ PRIV_LOAD_WORD(PICOJAVA, 0xff04),
+ PRIV_RET_FROM_TRAP(PICOJAVA, 0xff05),
+ PRIV_READ_DCACHE_TAG(PICOJAVA, 0xff06),
+ PRIV_READ_DCACHE_DATA(PICOJAVA, 0xff07),
+ PRIV_LOAD_CHAR_OE(PICOJAVA, 0xff0a),
+ PRIV_LOAD_SHORT_OE(PICOJAVA, 0xff0b),
+ PRIV_LOAD_WORD_OE(PICOJAVA, 0xff0c),
+ PRIV_READ_ICACHE_TAG(PICOJAVA, 0xff0e),
+ PRIV_READ_ICACHE_DATA(PICOJAVA, 0xff0f),
+ PRIV_NCLOAD_UBYTE(PICOJAVA, 0xff10),
+ PRIV_NCLOAD_BYTE(PICOJAVA, 0xff11),
+ PRIV_NCLOAD_CHAR(PICOJAVA, 0xff12),
+ PRIV_NCLOAD_SHORT(PICOJAVA, 0xff13),
+ PRIV_NCLOAD_WORD(PICOJAVA, 0xff14),
+ PRIV_POWERDOWN(PICOJAVA, 0xff16),
+ PRIV_READ_SCACHE_DATA(PICOJAVA, 0xff17),
+ PRIV_NCLOAD_CHAR_OE(PICOJAVA, 0xff1a),
+ PRIV_NCLOAD_SHORT_OE(PICOJAVA, 0xff1b),
+ PRIV_NCLOAD_WORD_OE(PICOJAVA, 0xff1c),
+ PRIV_CACHE_FLUSH(PICOJAVA, 0xff1e),
+ PRIV_CACHE_INDEX_FLUSH(PICOJAVA, 0xff1f),
+ PRIV_STORE_BYTE(PICOJAVA, 0xff20),
+ PRIV_STORE_SHORT(PICOJAVA, 0xff22),
+ PRIV_STORE_WORD(PICOJAVA, 0xff24),
+ PRIV_WRITE_DCACHE_TAG(PICOJAVA, 0xff26),
+ PRIV_WRITE_DCACHE_DATA(PICOJAVA, 0xff27),
+ PRIV_STORE_SHORT_OE(PICOJAVA, 0xff2a),
+ PRIV_STORE_WORD_OE(PICOJAVA, 0xff2c),
+ PRIV_WRITE_ICACHE_TAG(PICOJAVA, 0xff2e),
+ PRIV_WRITE_ICACHE_DATA(PICOJAVA, 0xff2f),
+ PRIV_NCSTORE_BYTE(PICOJAVA, 0xff30),
+ PRIV_NCSTORE_SHORT(PICOJAVA, 0xff32),
+ PRIV_NCSTORE_WORD(PICOJAVA, 0xff34),
+ PRIV_RESET(PICOJAVA, 0xff36),
+ PRIV_WRITE_SCACHE_DATA(PICOJAVA, 0xff37),
+ PRIV_NCSTORE_SHORT_OE(PICOJAVA, 0xff3a),
+ PRIV_NCSTORE_WORD_OE(PICOJAVA, 0xff3c),
+ PRIV_ZERO_LINE(PICOJAVA, 0xff3e),
+ PRIV_READ_REG_0(PICOJAVA, 0xff40),
+ PRIV_READ_REG_1(PICOJAVA, 0xff41),
+ PRIV_READ_REG_2(PICOJAVA, 0xff42),
+ PRIV_READ_REG_3(PICOJAVA, 0xff43),
+ PRIV_READ_REG_4(PICOJAVA, 0xff44),
+ PRIV_READ_REG_5(PICOJAVA, 0xff45),
+ PRIV_READ_REG_6(PICOJAVA, 0xff46),
+ PRIV_READ_REG_7(PICOJAVA, 0xff47),
+ PRIV_READ_REG_8(PICOJAVA, 0xff48),
+ PRIV_READ_REG_9(PICOJAVA, 0xff49),
+ PRIV_READ_REG_10(PICOJAVA, 0xff4a),
+ PRIV_READ_REG_11(PICOJAVA, 0xff4b),
+ PRIV_READ_REG_12(PICOJAVA, 0xff4c),
+ PRIV_READ_REG_13(PICOJAVA, 0xff4d),
+ PRIV_READ_REG_14(PICOJAVA, 0xff4e),
+ PRIV_READ_REG_15(PICOJAVA, 0xff4f),
+ PRIV_READ_REG_16(PICOJAVA, 0xff50),
+ PRIV_READ_REG_17(PICOJAVA, 0xff51),
+ PRIV_READ_REG_18(PICOJAVA, 0xff52),
+ PRIV_READ_REG_19(PICOJAVA, 0xff53),
+ PRIV_READ_REG_20(PICOJAVA, 0xff54),
+ PRIV_READ_REG_21(PICOJAVA, 0xff55),
+ PRIV_READ_REG_22(PICOJAVA, 0xff56),
+ PRIV_READ_REG_23(PICOJAVA, 0xff57),
+ PRIV_READ_REG_24(PICOJAVA, 0xff58),
+ PRIV_READ_REG_25(PICOJAVA, 0xff59),
+ PRIV_READ_REG_26(PICOJAVA, 0xff5a),
+ PRIV_READ_REG_27(PICOJAVA, 0xff5b),
+ PRIV_READ_REG_28(PICOJAVA, 0xff5c),
+ PRIV_READ_REG_29(PICOJAVA, 0xff5d),
+ PRIV_READ_REG_30(PICOJAVA, 0xff5e),
+ PRIV_READ_REG_31(PICOJAVA, 0xff5f),
+ PRIV_WRITE_REG_0(PICOJAVA, 0xff60),
+ PRIV_WRITE_REG_1(PICOJAVA, 0xff61),
+ PRIV_WRITE_REG_2(PICOJAVA, 0xff62),
+ PRIV_WRITE_REG_3(PICOJAVA, 0xff63),
+ PRIV_WRITE_REG_4(PICOJAVA, 0xff64),
+ PRIV_WRITE_REG_5(PICOJAVA, 0xff65),
+ PRIV_WRITE_REG_6(PICOJAVA, 0xff66),
+ PRIV_WRITE_REG_7(PICOJAVA, 0xff67),
+ PRIV_WRITE_REG_8(PICOJAVA, 0xff68),
+ PRIV_WRITE_REG_9(PICOJAVA, 0xff69),
+ PRIV_WRITE_REG_10(PICOJAVA, 0xff6a),
+ PRIV_WRITE_REG_11(PICOJAVA, 0xff6b),
+ PRIV_WRITE_REG_12(PICOJAVA, 0xff6c),
+ PRIV_WRITE_REG_13(PICOJAVA, 0xff6d),
+ PRIV_WRITE_REG_14(PICOJAVA, 0xff6e),
+ PRIV_WRITE_REG_15(PICOJAVA, 0xff6f),
+ PRIV_WRITE_REG_16(PICOJAVA, 0xff70),
+ PRIV_WRITE_REG_17(PICOJAVA, 0xff71),
+ PRIV_WRITE_REG_18(PICOJAVA, 0xff72),
+ PRIV_WRITE_REG_19(PICOJAVA, 0xff73),
+ PRIV_WRITE_REG_20(PICOJAVA, 0xff74),
+ PRIV_WRITE_REG_21(PICOJAVA, 0xff75),
+ PRIV_WRITE_REG_22(PICOJAVA, 0xff76),
+ PRIV_WRITE_REG_23(PICOJAVA, 0xff77),
+ PRIV_WRITE_REG_24(PICOJAVA, 0xff78),
+ PRIV_WRITE_REG_25(PICOJAVA, 0xff79),
+ PRIV_WRITE_REG_26(PICOJAVA, 0xff7a),
+ PRIV_WRITE_REG_27(PICOJAVA, 0xff7b),
+ PRIV_WRITE_REG_28(PICOJAVA, 0xff7c),
+ PRIV_WRITE_REG_29(PICOJAVA, 0xff7d),
+ PRIV_WRITE_REG_30(PICOJAVA, 0xff7e),
+ PRIV_WRITE_REG_31(PICOJAVA, 0xff7f);
+
+ Opcode(int opcode) {
+ this(STANDARD, opcode, NO_OPERANDS);
+ }
+
+ Opcode(int opcode, Instruction.Kind kind) {
+ this(STANDARD, opcode, kind);
+ }
+
+ Opcode(Set set, int opcode) {
+ this(set, opcode, (set == STANDARD ? NO_OPERANDS : WIDE_NO_OPERANDS));
+ }
+
+ Opcode(Set set, int opcode, Instruction.Kind kind) {
+ this.set = set;
+ this.opcode = opcode;
+ this.kind = kind;
+ }
+
+ public final Set set;
+ public final int opcode;
+ public final Instruction.Kind kind;
+
+ /** Get the Opcode for a simple standard 1-byte opcode. */
+ public static Opcode get(int opcode) {
+ return stdOpcodes[opcode];
+ }
+
+ /** Get the Opcode for 1- or 2-byte opcode. */
+ public static Opcode get(int opcodePrefix, int opcode) {
+ Opcode[] block = getOpcodeBlock(opcodePrefix);
+ return (block == null ? null : block[opcode]);
+ }
+
+ private static Opcode[] getOpcodeBlock(int opcodePrefix) {
+ switch (opcodePrefix) {
+ case 0:
+ return stdOpcodes;
+ case WIDE:
+ return wideOpcodes;
+ case NONPRIV:
+ return nonPrivOpcodes;
+ case PRIV:
+ return privOpcodes;
+ default:
+ return null;
+ }
+
+ }
+
+ private static Opcode[] stdOpcodes = new Opcode[256];
+ private static Opcode[] wideOpcodes = new Opcode[256];
+ private static Opcode[] nonPrivOpcodes = new Opcode[256];
+ private static Opcode[] privOpcodes = new Opcode[256];
+ static {
+ for (Opcode o: values())
+ getOpcodeBlock(o.opcode >> 8)[o.opcode & 0xff] = o;
+ }
+
+ /** The byte prefix for the wide instructions. */
+ public static final int WIDE = 0xc4;
+ /** The byte prefix for the PicoJava nonpriv instructions. */
+ public static final int NONPRIV = 0xfe;
+ /** The byte prefix for the PicoJava priv instructions. */
+ public static final int PRIV = 0xff;
+
+ public enum Set {
+ /** Standard opcodes. */
+ STANDARD,
+ /** Legacy support for PicoJava opcodes. */
+ PICOJAVA };
+}
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Thu Apr 23 16:58:16 2009 -0400
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Mon Apr 27 12:33:57 2009 -0700
@@ -1458,10 +1458,14 @@
while (e.scope != null) {
if (m.overrides(e.sym, origin, types, false))
checkOverride(tree, m, (MethodSymbol)e.sym, origin);
- else if (e.sym.isInheritedIn(origin, types) && !m.isConstructor()) {
+ else if (e.sym.kind == MTH &&
+ e.sym.isInheritedIn(origin, types) &&
+ (e.sym.flags() & SYNTHETIC) == 0 &&
+ !m.isConstructor()) {
Type er1 = m.erasure(types);
Type er2 = e.sym.erasure(types);
- if (types.isSameType(er1,er2)) {
+ if (types.isSameTypes(er1.getParameterTypes(),
+ er2.getParameterTypes())) {
log.error(TreeInfo.diagnosticPositionFor(m, tree),
"name.clash.same.erasure.no.override",
m, m.location(),
@@ -2088,9 +2092,11 @@
if (sym != e.sym &&
sym.kind == e.sym.kind &&
sym.name != names.error &&
- (sym.kind != MTH || types.overrideEquivalent(sym.type, e.sym.type))) {
+ (sym.kind != MTH || types.hasSameArgs(types.erasure(sym.type), types.erasure(e.sym.type)))) {
if ((sym.flags() & VARARGS) != (e.sym.flags() & VARARGS))
varargsDuplicateError(pos, sym, e.sym);
+ else if (sym.kind == MTH && !types.overrideEquivalent(sym.type, e.sym.type))
+ duplicateErasureError(pos, sym, e.sym);
else
duplicateError(pos, e.sym);
return false;
@@ -2098,6 +2104,14 @@
}
return true;
}
+ //where
+ /** Report duplicate declaration error.
+ */
+ void duplicateErasureError(DiagnosticPosition pos, Symbol sym1, Symbol sym2) {
+ if (!sym1.type.isErroneous() && !sym2.type.isErroneous()) {
+ log.error(pos, "name.clash.same.erasure", sym1, sym2);
+ }
+ }
/** Check that single-type import is not already imported or top-level defined,
* but make an exception for two single-type imports which denote the same type.
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java Thu Apr 23 16:58:16 2009 -0400
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java Mon Apr 27 12:33:57 2009 -0700
@@ -2631,8 +2631,8 @@
if (havePrimitive) {
Type unboxedTarget = types.unboxedType(type);
if (unboxedTarget.tag != NONE) {
- if (!types.isSubtype(tree.type, unboxedTarget))
- tree.type = unboxedTarget; // e.g. Character c = 89;
+ if (!types.isSubtype(tree.type, unboxedTarget)) //e.g. Character c = 89;
+ tree.type = unboxedTarget.constType(tree.type.constValue());
return (T)boxPrimitive((JCExpression)tree, type);
} else {
tree = (T)boxPrimitive((JCExpression)tree);
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Thu Apr 23 16:58:16 2009 -0400
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Mon Apr 27 12:33:57 2009 -0700
@@ -216,7 +216,9 @@
&&
isAccessible(env, site)
&&
- sym.isInheritedIn(site.tsym, types);
+ sym.isInheritedIn(site.tsym, types)
+ &&
+ notOverriddenIn(site, sym);
case PROTECTED:
return
(env.toplevel.packge == sym.owner.owner // fast special case
@@ -231,14 +233,23 @@
&&
isAccessible(env, site)
&&
- // `sym' is accessible only if not overridden by
- // another symbol which is a member of `site'
- // (because, if it is overridden, `sym' is not strictly
- // speaking a member of `site'.)
- (sym.kind != MTH || sym.isConstructor() || sym.isStatic() ||
- ((MethodSymbol)sym).implementation(site.tsym, types, true) == sym);
+ notOverriddenIn(site, sym);
default: // this case includes erroneous combinations as well
- return isAccessible(env, site);
+ return isAccessible(env, site) && notOverriddenIn(site, sym);
+ }
+ }
+ //where
+ /* `sym' is accessible only if not overridden by
+ * another symbol which is a member of `site'
+ * (because, if it is overridden, `sym' is not strictly
+ * speaking a member of `site'.)
+ */
+ private boolean notOverriddenIn(Type site, Symbol sym) {
+ if (sym.kind != MTH || sym.isConstructor() || sym.isStatic())
+ return true;
+ else {
+ Symbol s2 = ((MethodSymbol)sym).implementation(site.tsym, types, true);
+ return (s2 == null || s2 == sym);
}
}
//where
@@ -605,7 +616,7 @@
Symbol mostSpecific(Symbol m1,
Symbol m2,
Env<AttrContext> env,
- Type site,
+ final Type site,
boolean allowBoxing,
boolean useVarargs) {
switch (m2.kind) {
@@ -661,21 +672,33 @@
m2.erasure(types).getParameterTypes()))
return new AmbiguityError(m1, m2);
// both abstract, neither overridden; merge throws clause and result type
- Symbol result;
+ Symbol mostSpecific;
Type result2 = mt2.getReturnType();
if (mt2.tag == FORALL)
result2 = types.subst(result2, ((ForAll)mt2).tvars, ((ForAll)mt1).tvars);
if (types.isSubtype(mt1.getReturnType(), result2)) {
- result = m1;
+ mostSpecific = m1;
} else if (types.isSubtype(result2, mt1.getReturnType())) {
- result = m2;
+ mostSpecific = m2;
} else {
// Theoretically, this can't happen, but it is possible
// due to error recovery or mixing incompatible class files
return new AmbiguityError(m1, m2);
}
- result = result.clone(result.owner);
- result.type = (Type)result.type.clone();
+ MethodSymbol result = new MethodSymbol(
+ mostSpecific.flags(),
+ mostSpecific.name,
+ null,
+ mostSpecific.owner) {
+ @Override
+ public MethodSymbol implementation(TypeSymbol origin, Types types, boolean checkResult) {
+ if (origin == site.tsym)
+ return this;
+ else
+ return super.implementation(origin, types, checkResult);
+ }
+ };
+ result.type = (Type)mostSpecific.type.clone();
result.type.setThrown(chk.intersect(mt1.getThrownTypes(),
mt2.getThrownTypes()));
return result;
--- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassFile.java Thu Apr 23 16:58:16 2009 -0400
+++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassFile.java Mon Apr 27 12:33:57 2009 -0700
@@ -25,8 +25,9 @@
package com.sun.tools.javac.jvm;
-import com.sun.tools.javac.code.*;
-import com.sun.tools.javac.util.*;
+import com.sun.tools.javac.code.Type;
+import com.sun.tools.javac.util.Name;
+
/** A JVM class file.
*
@@ -86,6 +87,18 @@
public final static int MAX_LOCALS = 0xffff;
public final static int MAX_STACK = 0xffff;
+ public enum Version {
+ V45_3(45, 3), // base level for all attributes
+ V49(49, 0), // JDK 1.5: enum, generics, annotations
+ V50(50, 0), // JDK 1.6: stackmaps
+ V51(51, 0); // JDK 1.7
+ Version(int major, int minor) {
+ this.major = major;
+ this.minor = minor;
+ }
+ public final int major, minor;
+ }
+
/************************************************************************
* String Translation Routines
--- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java Thu Apr 23 16:58:16 2009 -0400
+++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java Mon Apr 27 12:33:57 2009 -0700
@@ -35,8 +35,11 @@
import javax.lang.model.SourceVersion;
import javax.tools.JavaFileObject;
import javax.tools.JavaFileManager;
+import javax.tools.JavaFileManager.Location;
import javax.tools.StandardJavaFileManager;
+import static javax.tools.StandardLocation.*;
+
import com.sun.tools.javac.comp.Annotate;
import com.sun.tools.javac.code.*;
import com.sun.tools.javac.code.Type.*;
@@ -49,9 +52,8 @@
import static com.sun.tools.javac.code.Flags.*;
import static com.sun.tools.javac.code.Kinds.*;
import static com.sun.tools.javac.code.TypeTags.*;
-import com.sun.tools.javac.jvm.ClassFile.NameAndType;
-import javax.tools.JavaFileManager.Location;
-import static javax.tools.StandardLocation.*;
+import static com.sun.tools.javac.jvm.ClassFile.*;
+import static com.sun.tools.javac.jvm.ClassFile.Version.*;
/** This class provides operations to read a classfile into an internal
* representation. The internal representation is anchored in a
@@ -64,7 +66,7 @@
* This code and its internal interfaces are subject to change or
* deletion without notice.</b>
*/
-public class ClassReader extends ClassFile implements Completer {
+public class ClassReader implements Completer {
/** The context key for the class reader. */
protected static final Context.Key<ClassReader> classReaderKey =
new Context.Key<ClassReader>();
@@ -180,6 +182,11 @@
*/
int[] poolIdx;
+ /** The major version number of the class file being read. */
+ int majorVersion;
+ /** The minor version number of the class file being read. */
+ int minorVersion;
+
/** Get the ClassReader instance for this invocation. */
public static ClassReader instance(Context context) {
ClassReader instance = context.get(classReaderKey);
@@ -249,6 +256,8 @@
: null;
typevars = new Scope(syms.noSymbol);
+
+ initAttributeReaders();
}
/** Add member to class unless it is synthetic.
@@ -655,6 +664,7 @@
sbp - startSbp));
outer = new ClassType(outer, sigToTypes('>'), t) {
boolean completed = false;
+ @Override
public Type getEnclosingType() {
if (!completed) {
completed = true;
@@ -679,6 +689,7 @@
}
return super.getEnclosingType();
}
+ @Override
public void setEnclosingType(Type outer) {
throw new UnsupportedOperationException();
}
@@ -822,6 +833,246 @@
* Reading Attributes
***********************************************************************/
+ protected enum AttributeKind { CLASS, MEMBER };
+ protected abstract class AttributeReader {
+ AttributeReader(Name name, Version version, Set<AttributeKind> kinds) {
+ this.name = name;
+ this.version = version;
+ this.kinds = kinds;
+ }
+
+ boolean accepts(AttributeKind kind) {
+ return kinds.contains(kind) && majorVersion >= version.major;
+ }
+
+ abstract void read(Symbol sym, int attrLen);
+
+ final Name name;
+ final Version version;
+ final Set<AttributeKind> kinds;
+ }
+
+ protected Set<AttributeKind> CLASS_ATTRIBUTE =
+ EnumSet.of(AttributeKind.CLASS);
+ protected Set<AttributeKind> MEMBER_ATTRIBUTE =
+ EnumSet.of(AttributeKind.MEMBER);
+ protected Set<AttributeKind> CLASS_OR_MEMBER_ATTRIBUTE =
+ EnumSet.of(AttributeKind.CLASS, AttributeKind.MEMBER);
+
+ protected Map<Name, AttributeReader> attributeReaders = new HashMap<Name, AttributeReader>();
+
+ protected void initAttributeReaders() {
+ AttributeReader[] readers = {
+ // v45.3 attributes
+
+ new AttributeReader(names.Code, V45_3, MEMBER_ATTRIBUTE) {
+ void read(Symbol sym, int attrLen) {
+ if (readAllOfClassFile || saveParameterNames)
+ ((MethodSymbol)sym).code = readCode(sym);
+ else
+ bp = bp + attrLen;
+ }
+ },
+
+ new AttributeReader(names.ConstantValue, V45_3, MEMBER_ATTRIBUTE) {
+ void read(Symbol sym, int attrLen) {
+ Object v = readPool(nextChar());
+ // Ignore ConstantValue attribute if field not final.
+ if ((sym.flags() & FINAL) != 0)
+ ((VarSymbol) sym).setData(v);
+ }
+ },
+
+ new AttributeReader(names.Deprecated, V45_3, CLASS_OR_MEMBER_ATTRIBUTE) {
+ void read(Symbol sym, int attrLen) {
+ sym.flags_field |= DEPRECATED;
+ }
+ },
+
+ new AttributeReader(names.Exceptions, V45_3, CLASS_OR_MEMBER_ATTRIBUTE) {
+ void read(Symbol sym, int attrLen) {
+ int nexceptions = nextChar();
+ List<Type> thrown = List.nil();
+ for (int j = 0; j < nexceptions; j++)
+ thrown = thrown.prepend(readClassSymbol(nextChar()).type);
+ if (sym.type.getThrownTypes().isEmpty())
+ sym.type.asMethodType().thrown = thrown.reverse();
+ }
+ },
+
+ new AttributeReader(names.InnerClasses, V45_3, CLASS_ATTRIBUTE) {
+ void read(Symbol sym, int attrLen) {
+ ClassSymbol c = (ClassSymbol) sym;
+ readInnerClasses(c);
+ }
+ },
+
+ new AttributeReader(names.LocalVariableTable, V45_3, CLASS_OR_MEMBER_ATTRIBUTE) {
+ void read(Symbol sym, int attrLen) {
+ int newbp = bp + attrLen;
+ if (saveParameterNames) {
+ // pick up parameter names from the variable table
+ List<Name> parameterNames = List.nil();
+ int firstParam = ((sym.flags() & STATIC) == 0) ? 1 : 0;
+ int endParam = firstParam + Code.width(sym.type.getParameterTypes());
+ int numEntries = nextChar();
+ for (int i=0; i<numEntries; i++) {
+ int start_pc = nextChar();
+ int length = nextChar();
+ int nameIndex = nextChar();
+ int sigIndex = nextChar();
+ int register = nextChar();
+ if (start_pc == 0 &&
+ firstParam <= register &&
+ register < endParam) {
+ int index = firstParam;
+ for (Type t : sym.type.getParameterTypes()) {
+ if (index == register) {
+ parameterNames = parameterNames.prepend(readName(nameIndex));
+ break;
+ }
+ index += Code.width(t);
+ }
+ }
+ }
+ parameterNames = parameterNames.reverse();
+ ((MethodSymbol)sym).savedParameterNames = parameterNames;
+ }
+ bp = newbp;
+ }
+ },
+
+ new AttributeReader(names.SourceFile, V45_3, CLASS_ATTRIBUTE) {
+ void read(Symbol sym, int attrLen) {
+ ClassSymbol c = (ClassSymbol) sym;
+ Name n = readName(nextChar());
+ c.sourcefile = new SourceFileObject(n, c.flatname);
+ }
+ },
+
+ new AttributeReader(names.Synthetic, V45_3, CLASS_OR_MEMBER_ATTRIBUTE) {
+ void read(Symbol sym, int attrLen) {
+ // bridge methods are visible when generics not enabled
+ if (allowGenerics || (sym.flags_field & BRIDGE) == 0)
+ sym.flags_field |= SYNTHETIC;
+ }
+ },
+
+ // standard v49 attributes
+
+ new AttributeReader(names.EnclosingMethod, V49, CLASS_ATTRIBUTE) {
+ void read(Symbol sym, int attrLen) {
+ int newbp = bp + attrLen;
+ readEnclosingMethodAttr(sym);
+ bp = newbp;
+ }
+ },
+
+ new AttributeReader(names.Signature, V49, CLASS_OR_MEMBER_ATTRIBUTE) {
+ @Override
+ boolean accepts(AttributeKind kind) {
+ return super.accepts(kind) && allowGenerics;
+ }
+
+ void read(Symbol sym, int attrLen) {
+ if (sym.kind == TYP) {
+ ClassSymbol c = (ClassSymbol) sym;
+ readingClassAttr = true;
+ try {
+ ClassType ct1 = (ClassType)c.type;
+ assert c == currentOwner;
+ ct1.typarams_field = readTypeParams(nextChar());
+ ct1.supertype_field = sigToType();
+ ListBuffer<Type> is = new ListBuffer<Type>();
+ while (sigp != siglimit) is.append(sigToType());
+ ct1.interfaces_field = is.toList();
+ } finally {
+ readingClassAttr = false;
+ }
+ } else {
+ List<Type> thrown = sym.type.getThrownTypes();
+ sym.type = readType(nextChar());
+ //- System.err.println(" # " + sym.type);
+ if (sym.kind == MTH && sym.type.getThrownTypes().isEmpty())
+ sym.type.asMethodType().thrown = thrown;
+
+ }
+ }
+ },
+
+ // v49 annotation attributes
+
+ new AttributeReader(names.AnnotationDefault, V49, CLASS_OR_MEMBER_ATTRIBUTE) {
+ void read(Symbol sym, int attrLen) {
+ attachAnnotationDefault(sym);
+ }
+ },
+
+ new AttributeReader(names.RuntimeInvisibleAnnotations, V49, CLASS_OR_MEMBER_ATTRIBUTE) {
+ void read(Symbol sym, int attrLen) {
+ attachAnnotations(sym);
+ }
+ },
+
+ new AttributeReader(names.RuntimeInvisibleParameterAnnotations, V49, CLASS_OR_MEMBER_ATTRIBUTE) {
+ void read(Symbol sym, int attrLen) {
+ attachParameterAnnotations(sym);
+ }
+ },
+
+ new AttributeReader(names.RuntimeVisibleAnnotations, V49, CLASS_OR_MEMBER_ATTRIBUTE) {
+ void read(Symbol sym, int attrLen) {
+ attachAnnotations(sym);
+ }
+ },
+
+ new AttributeReader(names.RuntimeVisibleParameterAnnotations, V49, CLASS_OR_MEMBER_ATTRIBUTE) {
+ void read(Symbol sym, int attrLen) {
+ attachParameterAnnotations(sym);
+ }
+ },
+
+ // additional "legacy" v49 attributes, superceded by flags
+
+ new AttributeReader(names.Annotation, V49, CLASS_OR_MEMBER_ATTRIBUTE) {
+ void read(Symbol sym, int attrLen) {
+ if (allowAnnotations)
+ sym.flags_field |= ANNOTATION;
+ }
+ },
+
+ new AttributeReader(names.Bridge, V49, MEMBER_ATTRIBUTE) {
+ void read(Symbol sym, int attrLen) {
+ sym.flags_field |= BRIDGE;
+ if (!allowGenerics)
+ sym.flags_field &= ~SYNTHETIC;
+ }
+ },
+
+ new AttributeReader(names.Enum, V49, CLASS_OR_MEMBER_ATTRIBUTE) {
+ void read(Symbol sym, int attrLen) {
+ sym.flags_field |= ENUM;
+ }
+ },
+
+ new AttributeReader(names.Varargs, V49, CLASS_OR_MEMBER_ATTRIBUTE) {
+ void read(Symbol sym, int attrLen) {
+ if (allowVarargs)
+ sym.flags_field |= VARARGS;
+ }
+ }
+
+ // The following attributes for a Code attribute are not currently handled
+ // StackMapTable
+ // SourceDebugExtension
+ // LineNumberTable
+ // LocalVariableTypeTable
+ };
+
+ for (AttributeReader r: readers)
+ attributeReaders.put(r.name, r);
+ }
+
/** Report unrecognized attribute.
*/
void unrecognized(Name attrName) {
@@ -829,99 +1080,7 @@
printCCF("ccf.unrecognized.attribute", attrName);
}
- /** Read member attribute.
- */
- void readMemberAttr(Symbol sym, Name attrName, int attrLen) {
- //- System.err.println(" z " + sym + ", " + attrName + ", " + attrLen);
- if (attrName == names.ConstantValue) {
- Object v = readPool(nextChar());
- // Ignore ConstantValue attribute if field not final.
- if ((sym.flags() & FINAL) != 0)
- ((VarSymbol)sym).setData(v);
- } else if (attrName == names.Code) {
- if (readAllOfClassFile || saveParameterNames)
- ((MethodSymbol)sym).code = readCode(sym);
- else
- bp = bp + attrLen;
- } else if (attrName == names.Exceptions) {
- int nexceptions = nextChar();
- List<Type> thrown = List.nil();
- for (int j = 0; j < nexceptions; j++)
- thrown = thrown.prepend(readClassSymbol(nextChar()).type);
- if (sym.type.getThrownTypes().isEmpty())
- sym.type.asMethodType().thrown = thrown.reverse();
- } else if (attrName == names.Synthetic) {
- // bridge methods are visible when generics not enabled
- if (allowGenerics || (sym.flags_field & BRIDGE) == 0)
- sym.flags_field |= SYNTHETIC;
- } else if (attrName == names.Bridge) {
- sym.flags_field |= BRIDGE;
- if (!allowGenerics)
- sym.flags_field &= ~SYNTHETIC;
- } else if (attrName == names.Deprecated) {
- sym.flags_field |= DEPRECATED;
- } else if (attrName == names.Varargs) {
- if (allowVarargs) sym.flags_field |= VARARGS;
- } else if (attrName == names.Annotation) {
- if (allowAnnotations) sym.flags_field |= ANNOTATION;
- } else if (attrName == names.Enum) {
- sym.flags_field |= ENUM;
- } else if (allowGenerics && attrName == names.Signature) {
- List<Type> thrown = sym.type.getThrownTypes();
- sym.type = readType(nextChar());
- //- System.err.println(" # " + sym.type);
- if (sym.kind == MTH && sym.type.getThrownTypes().isEmpty())
- sym.type.asMethodType().thrown = thrown;
- } else if (attrName == names.RuntimeVisibleAnnotations) {
- attachAnnotations(sym);
- } else if (attrName == names.RuntimeInvisibleAnnotations) {
- attachAnnotations(sym);
- } else if (attrName == names.RuntimeVisibleParameterAnnotations) {
- attachParameterAnnotations(sym);
- } else if (attrName == names.RuntimeInvisibleParameterAnnotations) {
- attachParameterAnnotations(sym);
- } else if (attrName == names.LocalVariableTable) {
- int newbp = bp + attrLen;
- if (saveParameterNames) {
- // pick up parameter names from the variable table
- List<Name> parameterNames = List.nil();
- int firstParam = ((sym.flags() & STATIC) == 0) ? 1 : 0;
- int endParam = firstParam + Code.width(sym.type.getParameterTypes());
- int numEntries = nextChar();
- for (int i=0; i<numEntries; i++) {
- int start_pc = nextChar();
- int length = nextChar();
- int nameIndex = nextChar();
- int sigIndex = nextChar();
- int register = nextChar();
- if (start_pc == 0 &&
- firstParam <= register &&
- register < endParam) {
- int index = firstParam;
- for (Type t : sym.type.getParameterTypes()) {
- if (index == register) {
- parameterNames = parameterNames.prepend(readName(nameIndex));
- break;
- }
- index += Code.width(t);
- }
- }
- }
- parameterNames = parameterNames.reverse();
- ((MethodSymbol)sym).savedParameterNames = parameterNames;
- }
- bp = newbp;
- } else if (attrName == names.AnnotationDefault) {
- attachAnnotationDefault(sym);
- } else if (attrName == names.EnclosingMethod) {
- int newbp = bp + attrLen;
- readEnclosingMethodAttr(sym);
- bp = newbp;
- } else {
- unrecognized(attrName);
- bp = bp + attrLen;
- }
- }
+
void readEnclosingMethodAttr(Symbol sym) {
// sym is a nested class with an "Enclosing Method" attribute
@@ -1029,39 +1188,24 @@
/** Read member attributes.
*/
void readMemberAttrs(Symbol sym) {
+ readAttrs(sym, AttributeKind.MEMBER);
+ }
+
+ void readAttrs(Symbol sym, AttributeKind kind) {
char ac = nextChar();
for (int i = 0; i < ac; i++) {
Name attrName = readName(nextChar());
int attrLen = nextInt();
- readMemberAttr(sym, attrName, attrLen);
+ AttributeReader r = attributeReaders.get(attrName);
+ if (r != null && r.accepts(kind))
+ r.read(sym, attrLen);
+ else {
+ unrecognized(attrName);
+ bp = bp + attrLen;
+ }
}
}
- /** Read class attribute.
- */
- void readClassAttr(ClassSymbol c, Name attrName, int attrLen) {
- if (attrName == names.SourceFile) {
- Name n = readName(nextChar());
- c.sourcefile = new SourceFileObject(n, c.flatname);
- } else if (attrName == names.InnerClasses) {
- readInnerClasses(c);
- } else if (allowGenerics && attrName == names.Signature) {
- readingClassAttr = true;
- try {
- ClassType ct1 = (ClassType)c.type;
- assert c == currentOwner;
- ct1.typarams_field = readTypeParams(nextChar());
- ct1.supertype_field = sigToType();
- ListBuffer<Type> is = new ListBuffer<Type>();
- while (sigp != siglimit) is.append(sigToType());
- ct1.interfaces_field = is.toList();
- } finally {
- readingClassAttr = false;
- }
- } else {
- readMemberAttr(c, attrName, attrLen);
- }
- }
private boolean readingClassAttr = false;
private List<Type> missingTypeVariables = List.nil();
private List<Type> foundTypeVariables = List.nil();
@@ -1069,12 +1213,7 @@
/** Read class attributes.
*/
void readClassAttrs(ClassSymbol c) {
- char ac = nextChar();
- for (int i = 0; i < ac; i++) {
- Name attrName = readName(nextChar());
- int attrLen = nextInt();
- readClassAttr(c, attrName, attrLen);
- }
+ readAttrs(c, AttributeKind.CLASS);
}
/** Read code block.
@@ -1219,6 +1358,7 @@
this.enumerator = enumerator;
}
public void accept(Visitor v) { ((ProxyVisitor)v).visitEnumAttributeProxy(this); }
+ @Override
public String toString() {
return "/*proxy enum*/" + enumType + "." + enumerator;
}
@@ -1231,6 +1371,7 @@
this.values = values;
}
public void accept(Visitor v) { ((ProxyVisitor)v).visitArrayAttributeProxy(this); }
+ @Override
public String toString() {
return "{" + values + "}";
}
@@ -1246,6 +1387,7 @@
this.values = values;
}
public void accept(Visitor v) { ((ProxyVisitor)v).visitCompoundAnnotationProxy(this); }
+ @Override
public String toString() {
StringBuffer buf = new StringBuffer();
buf.append("@");
@@ -1414,6 +1556,7 @@
final MethodSymbol sym;
final Attribute value;
final JavaFileObject classFile = currentClassFile;
+ @Override
public String toString() {
return " ClassReader store default for " + sym.owner + "." + sym + " is " + value;
}
@@ -1437,6 +1580,7 @@
final Symbol sym;
final List<CompoundAnnotationProxy> l;
final JavaFileObject classFile;
+ @Override
public String toString() {
return " ClassReader annotate " + sym.owner + "." + sym + " with " + l;
}
@@ -1544,7 +1688,8 @@
// prepare type variable table
typevars = typevars.dup(currentOwner);
- if (ct.getEnclosingType().tag == CLASS) enterTypevars(ct.getEnclosingType());
+ if (ct.getEnclosingType().tag == CLASS)
+ enterTypevars(ct.getEnclosingType());
// read flags, or skip if this is an inner class
long flags = adjustClassFlags(nextChar());
@@ -1632,8 +1777,8 @@
if (magic != JAVA_MAGIC)
throw badClassFile("illegal.start.of.class.file");
- int minorVersion = nextChar();
- int majorVersion = nextChar();
+ minorVersion = nextChar();
+ majorVersion = nextChar();
int maxMajor = Target.MAX().majorVersion;
int maxMinor = Target.MAX().minorVersion;
if (majorVersion > maxMajor ||
@@ -1775,13 +1920,13 @@
if (sym.kind == TYP) {
ClassSymbol c = (ClassSymbol)sym;
c.members_field = new Scope.ErrorScope(c); // make sure it's always defined
- boolean suppressFlush = this.suppressFlush;
- this.suppressFlush = true;
+ boolean saveSuppressFlush = suppressFlush;
+ suppressFlush = true;
try {
completeOwners(c.owner);
completeEnclosing(c);
} finally {
- this.suppressFlush = suppressFlush;
+ suppressFlush = saveSuppressFlush;
}
fillIn(c);
} else if (sym.kind == PCK) {
@@ -2270,6 +2415,7 @@
return URI.create(name.toString());
}
+ @Override
public Reader openReader(boolean ignoreEncodingErrors) throws IOException {
throw new UnsupportedOperationException();
}
--- a/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java Thu Apr 23 16:58:16 2009 -0400
+++ b/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java Mon Apr 27 12:33:57 2009 -0700
@@ -386,6 +386,11 @@
(options.get("failcomplete") != null)
? names.fromString(options.get("failcomplete"))
: null;
+
+ shouldStopPolicy =
+ (options.get("shouldStopPolicy") != null)
+ ? CompileState.valueOf(options.get("shouldStopPolicy"))
+ : null;
}
/* Switches:
@@ -459,14 +464,26 @@
*/
public boolean verboseCompilePolicy;
+ /**
+ * Policy of how far to continue processing. null means until first
+ * error.
+ */
+ public CompileState shouldStopPolicy;
+
/** A queue of all as yet unattributed classes.
*/
public Todo todo;
+ /** Ordered list of compiler phases for each compilation unit. */
protected enum CompileState {
- TODO(0),
- ATTR(1),
- FLOW(2);
+ PARSE(1),
+ ENTER(2),
+ PROCESS(3),
+ ATTR(4),
+ FLOW(5),
+ TRANSTYPES(6),
+ LOWER(7),
+ GENERATE(8);
CompileState(int value) {
this.value = value;
}
@@ -475,6 +492,9 @@
}
private int value;
};
+ /** Partial map to record which compiler phases have been executed
+ * for each compilation unit. Used for ATTR and FLOW phases.
+ */
protected class CompileStates extends HashMap<Env<AttrContext>,CompileState> {
private static final long serialVersionUID = 1812267524140424433L;
boolean isDone(Env<AttrContext> env, CompileState cs) {
@@ -490,6 +510,13 @@
*/
protected Set<JavaFileObject> inputFiles = new HashSet<JavaFileObject>();
+ protected boolean shouldStop(CompileState cs) {
+ if (shouldStopPolicy == null)
+ return (errorCount() > 0);
+ else
+ return cs.ordinal() > shouldStopPolicy.ordinal();
+ }
+
/** The number of errors reported so far.
*/
public int errorCount() {
@@ -503,18 +530,12 @@
return log.nerrors;
}
- protected final <T> Queue<T> stopIfError(Queue<T> queue) {
- if (errorCount() == 0)
- return queue;
- else
- return ListBuffer.lb();
+ protected final <T> Queue<T> stopIfError(CompileState cs, Queue<T> queue) {
+ return shouldStop(cs) ? ListBuffer.<T>lb() : queue;
}
- protected final <T> List<T> stopIfError(List<T> list) {
- if (errorCount() == 0)
- return list;
- else
- return List.nil();
+ protected final <T> List<T> stopIfError(CompileState cs, List<T> list) {
+ return shouldStop(cs) ? List.<T>nil() : list;
}
/** The number of warnings reported so far.
@@ -669,7 +690,7 @@
*/
JavaFileObject genCode(Env<AttrContext> env, JCClassDecl cdef) throws IOException {
try {
- if (gen.genClass(env, cdef))
+ if (gen.genClass(env, cdef) && (errorCount() == 0))
return writer.writeClass(cdef.sym);
} catch (ClassWriter.PoolOverflow ex) {
log.error(cdef.pos(), "limit.pool");
@@ -779,8 +800,10 @@
initProcessAnnotations(processors);
// These method calls must be chained to avoid memory leaks
- delegateCompiler = processAnnotations(enterTrees(stopIfError(parseFiles(sourceFileObjects))),
- classnames);
+ delegateCompiler =
+ processAnnotations(
+ enterTrees(stopIfError(CompileState.PARSE, parseFiles(sourceFileObjects))),
+ classnames);
delegateCompiler.compile2();
delegateCompiler.close();
@@ -812,7 +835,7 @@
case BY_FILE: {
Queue<Queue<Env<AttrContext>>> q = todo.groupByFile();
- while (!q.isEmpty() && errorCount() == 0) {
+ while (!q.isEmpty() && !shouldStop(CompileState.ATTR)) {
generate(desugar(flow(attribute(q.remove()))));
}
}
@@ -850,7 +873,7 @@
* Parses a list of files.
*/
public List<JCCompilationUnit> parseFiles(List<JavaFileObject> fileObjects) throws IOException {
- if (errorCount() > 0)
+ if (shouldStop(CompileState.PARSE))
return List.nil();
//parse all files
@@ -961,7 +984,7 @@
public JavaCompiler processAnnotations(List<JCCompilationUnit> roots,
List<String> classnames)
throws IOException { // TODO: see TEMP note in JavacProcessingEnvironment
- if (errorCount() != 0) {
+ if (shouldStop(CompileState.PROCESS)) {
// Errors were encountered. If todo is empty, then the
// encountered errors were parse errors. Otherwise, the
// errors were found during the enter phase which should
@@ -1068,7 +1091,7 @@
ListBuffer<Env<AttrContext>> results = lb();
while (!envs.isEmpty())
results.append(attribute(envs.remove()));
- return results;
+ return stopIfError(CompileState.ATTR, results);
}
/**
@@ -1115,7 +1138,7 @@
for (Env<AttrContext> env: envs) {
flow(env, results);
}
- return stopIfError(results);
+ return stopIfError(CompileState.FLOW, results);
}
/**
@@ -1124,7 +1147,7 @@
public Queue<Env<AttrContext>> flow(Env<AttrContext> env) {
ListBuffer<Env<AttrContext>> results = lb();
flow(env, results);
- return stopIfError(results);
+ return stopIfError(CompileState.FLOW, results);
}
/**
@@ -1132,7 +1155,7 @@
*/
protected void flow(Env<AttrContext> env, Queue<Env<AttrContext>> results) {
try {
- if (errorCount() > 0)
+ if (shouldStop(CompileState.FLOW))
return;
if (relax || compileStates.isDone(env, CompileState.FLOW)) {
@@ -1141,7 +1164,7 @@
}
if (verboseCompilePolicy)
- log.printLines(log.noticeWriter, "[flow " + env.enclClass.sym + "]");
+ printNote("[flow " + env.enclClass.sym + "]");
JavaFileObject prev = log.useSource(
env.enclClass.sym.sourcefile != null ?
env.enclClass.sym.sourcefile :
@@ -1152,7 +1175,7 @@
flow.analyzeTree(env.tree, localMake);
compileStates.put(env, CompileState.FLOW);
- if (errorCount() > 0)
+ if (shouldStop(CompileState.FLOW))
return;
results.add(env);
@@ -1179,7 +1202,7 @@
ListBuffer<Pair<Env<AttrContext>, JCClassDecl>> results = lb();
for (Env<AttrContext> env: envs)
desugar(env, results);
- return stopIfError(results);
+ return stopIfError(CompileState.FLOW, results);
}
/**
@@ -1189,7 +1212,7 @@
* The preparation stops as soon as an error is found.
*/
protected void desugar(final Env<AttrContext> env, Queue<Pair<Env<AttrContext>, JCClassDecl>> results) {
- if (errorCount() > 0)
+ if (shouldStop(CompileState.TRANSTYPES))
return;
if (implicitSourcePolicy == ImplicitSourcePolicy.NONE
@@ -1204,6 +1227,7 @@
*/
class ScanNested extends TreeScanner {
Set<Env<AttrContext>> dependencies = new LinkedHashSet<Env<AttrContext>>();
+ @Override
public void visitClassDef(JCClassDecl node) {
Type st = types.supertype(node.sym.type);
if (st.tag == TypeTags.CLASS) {
@@ -1226,11 +1250,11 @@
//We need to check for error another time as more classes might
//have been attributed and analyzed at this stage
- if (errorCount() > 0)
+ if (shouldStop(CompileState.TRANSTYPES))
return;
if (verboseCompilePolicy)
- log.printLines(log.noticeWriter, "[desugar " + env.enclClass.sym + "]");
+ printNote("[desugar " + env.enclClass.sym + "]");
JavaFileObject prev = log.useSource(env.enclClass.sym.sourcefile != null ?
env.enclClass.sym.sourcefile :
@@ -1244,6 +1268,8 @@
if (env.tree instanceof JCCompilationUnit) {
if (!(stubOutput || sourceOutput || printFlat)) {
+ if (shouldStop(CompileState.LOWER))
+ return;
List<JCTree> pdef = lower.translateTopLevelClass(env, env.tree, localMake);
if (pdef.head != null) {
assert pdef.tail.isEmpty();
@@ -1266,9 +1292,12 @@
return;
}
+ if (shouldStop(CompileState.TRANSTYPES))
+ return;
+
env.tree = transTypes.translateTopLevelClass(env.tree, localMake);
- if (errorCount() != 0)
+ if (shouldStop(CompileState.LOWER))
return;
if (sourceOutput) {
@@ -1285,7 +1314,7 @@
//translate out inner classes
List<JCTree> cdefs = lower.translateTopLevelClass(env, env.tree, localMake);
- if (errorCount() != 0)
+ if (shouldStop(CompileState.LOWER))
return;
//generate code for each class
@@ -1310,6 +1339,9 @@
}
public void generate(Queue<Pair<Env<AttrContext>, JCClassDecl>> queue, Queue<JavaFileObject> results) {
+ if (shouldStop(CompileState.GENERATE))
+ return;
+
boolean usePrintSource = (stubOutput || sourceOutput || printFlat);
for (Pair<Env<AttrContext>, JCClassDecl> x: queue) {
@@ -1317,7 +1349,7 @@
JCClassDecl cdef = x.snd;
if (verboseCompilePolicy) {
- log.printLines(log.noticeWriter, "[generate "
+ printNote("[generate "
+ (usePrintSource ? " source" : "code")
+ " " + cdef.sym + "]");
}
@@ -1371,6 +1403,7 @@
JCClassDecl removeMethodBodies(JCClassDecl cdef) {
final boolean isInterface = (cdef.mods.flags & Flags.INTERFACE) != 0;
class MethodBodyRemover extends TreeTranslator {
+ @Override
public void visitMethodDef(JCMethodDecl tree) {
tree.mods.flags &= ~Flags.SYNCHRONIZED;
for (JCVariableDecl vd : tree.params)
@@ -1378,11 +1411,13 @@
tree.body = null;
super.visitMethodDef(tree);
}
+ @Override
public void visitVarDef(JCVariableDecl tree) {
if (tree.init != null && tree.init.type.constValue() == null)
tree.init = null;
super.visitVarDef(tree);
}
+ @Override
public void visitClassDef(JCClassDecl tree) {
ListBuffer<JCTree> newdefs = lb();
for (List<JCTree> it = tree.defs; it.tail != null; it = it.tail) {
@@ -1469,12 +1504,16 @@
}
}
+ protected void printNote(String lines) {
+ Log.printLines(log.noticeWriter, lines);
+ }
+
/** Output for "-verbose" option.
* @param key The key to look up the correct internationalized string.
* @param arg An argument for substitution into the output string.
*/
protected void printVerbose(String key, Object arg) {
- Log.printLines(log.noticeWriter, log.getLocalizedString("verbose." + key, arg));
+ Log.printLines(log.noticeWriter, Log.getLocalizedString("verbose." + key, arg));
}
/** Print numbers of errors and warnings.
@@ -1483,9 +1522,9 @@
if (count != 0) {
String text;
if (count == 1)
- text = log.getLocalizedString("count." + kind, String.valueOf(count));
+ text = Log.getLocalizedString("count." + kind, String.valueOf(count));
else
- text = log.getLocalizedString("count." + kind + ".plural", String.valueOf(count));
+ text = Log.getLocalizedString("count." + kind + ".plural", String.valueOf(count));
Log.printLines(log.errWriter, text);
log.errWriter.flush();
}
--- a/langtools/src/share/classes/com/sun/tools/javac/resources/legacy.properties Thu Apr 23 16:58:16 2009 -0400
+++ b/langtools/src/share/classes/com/sun/tools/javac/resources/legacy.properties Mon Apr 27 12:33:57 2009 -0700
@@ -24,6 +24,7 @@
#
com.sun.accessibility.internal.resources = tiger legacy
+com.sun.awt = tiger legacy
com.sun.beans = tiger legacy
com.sun.corba.se.impl.activation = tiger legacy
com.sun.corba.se.impl.copyobject = tiger legacy
--- a/langtools/src/share/classes/com/sun/tools/javap/CodeWriter.java Thu Apr 23 16:58:16 2009 -0400
+++ b/langtools/src/share/classes/com/sun/tools/javap/CodeWriter.java Mon Apr 27 12:33:57 2009 -0700
@@ -30,9 +30,12 @@
import com.sun.tools.classfile.ConstantPool;
import com.sun.tools.classfile.ConstantPoolException;
import com.sun.tools.classfile.DescriptorException;
+import com.sun.tools.classfile.Instruction;
+import com.sun.tools.classfile.Instruction.TypeKind;
import com.sun.tools.classfile.Method;
+import com.sun.tools.classfile.Opcode;
-import static com.sun.tools.classfile.OpCodes.*;
+//import static com.sun.tools.classfile.OpCodes.*;
/*
* Write the contents of a Code attribute.
@@ -87,218 +90,92 @@
}
public void writeInstrs(Code_attribute attr) {
- try {
- for (int pc = 0; pc < attr.code_length;) {
- print(" " + pc + ":\t");
- pc += writeInstr(attr, pc);
- println();
+ for (Instruction instr: attr.getInstructions()) {
+ try {
+ writeInstr(instr);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ println(report("error at or after byte " + instr.getPC()));
+ break;
}
- } catch (Code_attribute.InvalidIndex e) {
- println(report(e));
}
}
- public int writeInstr(Code_attribute attr, int pc)
- throws Code_attribute.InvalidIndex {
- String lP = "";
- int opcode = attr.getUnsignedByte(pc);
- int opcode2;
- String mnem;
- switch (opcode) {
- case opc_nonpriv:
- case opc_priv: {
- opcode2 = attr.getUnsignedByte(pc + 1);
- mnem = opcName((opcode << 8) + opcode2);
- if (mnem == null) {
- mnem = opcName(opcode) + " " + opcode2;
- }
- print(mnem);
- return 2;
- }
- case opc_wide: {
- opcode2 = attr.getUnsignedByte(pc + 1);
- mnem = opcName((opcode << 8) + opcode2);
- if (mnem == null) {
- print("bytecode " + opcode);
- return 1;
- }
- print(mnem + " " + attr.getUnsignedShort(pc + 2));
- if (opcode2 == opc_iinc) {
- print(", " + attr.getShort(pc + 4));
- return 6;
- }
- return 4;
- }
+ public void writeInstr(Instruction instr) {
+ print(" " + instr.getPC() + ":\t");
+ print(instr.getMnemonic());
+ instr.accept(instructionPrinter, null);
+ println();
+ }
+ // where
+ Instruction.KindVisitor<Void,Void> instructionPrinter =
+ new Instruction.KindVisitor<Void,Void>() {
+
+ public Void visitNoOperands(Instruction instr, Void p) {
+ return null;
}
- mnem = opcName(opcode);
- if (mnem == null) {
- print("bytecode " + opcode);
- return 1;
+
+ public Void visitArrayType(Instruction instr, TypeKind kind, Void p) {
+ print(" " + kind.name);
+ return null;
+ }
+
+ public Void visitBranch(Instruction instr, int offset, Void p) {
+ print("\t" + (instr.getPC() + offset));
+ return null;
}
- if (opcode > opc_jsr_w) {
- print("bytecode " + opcode);
- return 1;
+
+ public Void visitConstantPoolRef(Instruction instr, int index, Void p) {
+ print("\t#" + index + "; //");
+ printConstant(index);
+ return null;
+ }
+
+ public Void visitConstantPoolRefAndValue(Instruction instr, int index, int value, Void p) {
+ print("\t#" + index + ", " + value + "; //");
+ printConstant(index);
+ return null;
}
- print(opcName(opcode));
- switch (opcode) {
- case opc_aload:
- case opc_astore:
- case opc_fload:
- case opc_fstore:
- case opc_iload:
- case opc_istore:
- case opc_lload:
- case opc_lstore:
- case opc_dload:
- case opc_dstore:
- case opc_ret:
- print("\t" + attr.getUnsignedByte(pc + 1));
- return 2;
- case opc_iinc:
- print("\t" + attr.getUnsignedByte(pc + 1) + ", " + attr.getByte(pc + 2));
- return 3;
- case opc_tableswitch:
- {
- int tb = align(pc + 1);
- int default_skip = attr.getInt(tb);
- int low = attr.getInt(tb + 4);
- int high = attr.getInt(tb + 8);
- int count = high - low;
- print("{ //" + low + " to " + high);
- for (int i = 0; i <= count; i++) {
- print("\n\t\t" + (i + low) + ": " + lP + (pc + attr.getInt(tb + 12 + 4 * i)) + ";");
- }
- print("\n\t\tdefault: " + lP + (default_skip + pc) + " }");
- return tb - pc + 16 + count * 4;
- }
- case opc_lookupswitch:
- {
- int tb = align(pc + 1);
- int default_skip = attr.getInt(tb);
- int npairs = attr.getInt(tb + 4);
- print("{ //" + npairs);
- for (int i = 1; i <= npairs; i++) {
- print("\n\t\t" + attr.getInt(tb + i * 8) + ": " + lP + (pc + attr.getInt(tb + 4 + i * 8)) + ";");
- }
- print("\n\t\tdefault: " + lP + (default_skip + pc) + " }");
- return tb - pc + (npairs + 1) * 8;
- }
- case opc_newarray:
- int type = attr.getUnsignedByte(pc + 1);
- switch (type) {
- case T_BOOLEAN:
- print(" boolean");
- break;
- case T_BYTE:
- print(" byte");
- break;
- case T_CHAR:
- print(" char");
- break;
- case T_SHORT:
- print(" short");
- break;
- case T_INT:
- print(" int");
- break;
- case T_LONG:
- print(" long");
- break;
- case T_FLOAT:
- print(" float");
- break;
- case T_DOUBLE:
- print(" double");
- break;
- case T_CLASS:
- print(" class");
- break;
- default:
- print(" BOGUS TYPE:" + type);
- }
- return 2;
- case opc_anewarray:
- {
- int index = attr.getUnsignedShort(pc + 1);
- print("\t#" + index + "; //");
- printConstant(index);
- return 3;
- }
- case opc_sipush:
- print("\t" + attr.getShort(pc + 1));
- return 3;
- case opc_bipush:
- print("\t" + attr.getByte(pc + 1));
- return 2;
- case opc_ldc:
- {
- int index = attr.getUnsignedByte(pc + 1);
- print("\t#" + index + "; //");
- printConstant(index);
- return 2;
- }
- case opc_ldc_w:
- case opc_ldc2_w:
- case opc_instanceof:
- case opc_checkcast:
- case opc_new:
- case opc_putstatic:
- case opc_getstatic:
- case opc_putfield:
- case opc_getfield:
- case opc_invokevirtual:
- case opc_invokespecial:
- case opc_invokestatic:
- {
- int index = attr.getUnsignedShort(pc + 1);
- print("\t#" + index + "; //");
- printConstant(index);
- return 3;
- }
- case opc_invokeinterface:
- {
- int index = attr.getUnsignedShort(pc + 1);
- int nargs = attr.getUnsignedByte(pc + 3);
- print("\t#" + index + ", " + nargs + "; //");
- printConstant(index);
- return 5;
- }
- case opc_multianewarray:
- {
- int index = attr.getUnsignedShort(pc + 1);
- int dimensions = attr.getUnsignedByte(pc + 3);
- print("\t#" + index + ", " + dimensions + "; //");
- printConstant(index);
- return 4;
- }
- case opc_jsr:
- case opc_goto:
- case opc_ifeq:
- case opc_ifge:
- case opc_ifgt:
- case opc_ifle:
- case opc_iflt:
- case opc_ifne:
- case opc_if_icmpeq:
- case opc_if_icmpne:
- case opc_if_icmpge:
- case opc_if_icmpgt:
- case opc_if_icmple:
- case opc_if_icmplt:
- case opc_if_acmpeq:
- case opc_if_acmpne:
- case opc_ifnull:
- case opc_ifnonnull:
- print("\t" + lP + (pc + attr.getShort(pc + 1)));
- return 3;
- case opc_jsr_w:
- case opc_goto_w:
- print("\t" + lP + (pc + attr.getInt(pc + 1)));
- return 5;
- default:
- return 1;
+
+ public Void visitLocal(Instruction instr, int index, Void p) {
+ print("\t" + index);
+ return null;
+ }
+
+ public Void visitLocalAndValue(Instruction instr, int index, int value, Void p) {
+ print("\t" + index + ", " + value);
+ return null;
+ }
+
+ public Void visitLookupSwitch(Instruction instr, int default_, int npairs, int[] matches, int[] offsets) {
+ int pc = instr.getPC();
+ print("{ //" + npairs);
+ for (int i = 0; i < npairs; i++) {
+ print("\n\t\t" + matches[i] + ": " + (pc + offsets[i]) + ";");
+ }
+ print("\n\t\tdefault: " + (pc + default_) + " }");
+ return null;
}
- }
+
+ public Void visitTableSwitch(Instruction instr, int default_, int low, int high, int[] offsets) {
+ int pc = instr.getPC();
+ print("{ //" + low + " to " + high);
+ for (int i = 0; i < offsets.length; i++) {
+ print("\n\t\t" + (low + i) + ": " + (pc + offsets[i]) + ";");
+ }
+ print("\n\t\tdefault: " + (pc + default_) + " }");
+ return null;
+ }
+
+ public Void visitValue(Instruction instr, int value, Void p) {
+ print("\t" + value);
+ return null;
+ }
+
+ public Void visitUnknown(Instruction instr, Void p) {
+ return null;
+ }
+ };
+
public void writeExceptionTable(Code_attribute attr) {
if (attr.exception_table_langth > 0) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/OverrideChecks/6400189/T6400189a.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6400189
+ * @summary raw types and inference
+ * @author mcimadamore
+ * @compile/fail/ref=T6400189a.out T6400189a.java -Xlint:unchecked -XDrawDiagnostics
+ */
+
+import java.lang.reflect.Constructor;
+import java.lang.annotation.Documented;
+
+class T6400189a {
+ Constructor c = null;
+ Documented d = c.getAnnotation(Documented.class);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/OverrideChecks/6400189/T6400189a.out Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,4 @@
+T6400189a.java:37:35: compiler.warn.unchecked.call.mbr.of.raw.type: <T>getAnnotation(java.lang.Class<T>), java.lang.reflect.Constructor
+T6400189a.java:37:35: compiler.err.prob.found.req: (compiler.misc.incompatible.types), java.lang.annotation.Annotation, java.lang.annotation.Documented
+1 error
+1 warning
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/OverrideChecks/6400189/T6400189b.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6400189
+ * @summary raw types and inference
+ * @author mcimadamore
+ * @compile/fail/ref=T6400189b.out T6400189b.java -Xlint:unchecked -XDrawDiagnostics
+ */
+
+class T6400189b<T> {
+
+ static class A {
+ <T> T m(T6400189b<T> x) {
+ return null;
+ }
+ }
+
+ static class B<T> extends A {
+ <T> T m(T6400189b<T> x) {
+ return null;
+ }
+ }
+
+ void test(B b) {
+ Integer i = b.m(new T6400189b<Integer>());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/OverrideChecks/6400189/T6400189b.out Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,4 @@
+T6400189b.java:47:24: compiler.warn.unchecked.call.mbr.of.raw.type: <T>m(T6400189b<T>), T6400189b.B
+T6400189b.java:47:24: compiler.err.prob.found.req: (compiler.misc.incompatible.types), java.lang.Object, java.lang.Integer
+1 error
+1 warning
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/OverrideChecks/6400189/T6400189c.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6400189
+ * @summary raw types and inference
+ * @author mcimadamore
+ * @compile T6400189c.java
+ */
+
+class T6400189c<T> {
+
+ static class A {
+ <T> T m(T6400189c<T> x) {
+ return null;
+ }
+ }
+
+ static class B<T> extends A {}
+
+ void test(B b) {
+ Integer i = b.m(new T6400189c<Integer>());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/OverrideChecks/6400189/T6400189d.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6400189
+ * @summary raw types and inference
+ * @author mcimadamore
+ * @compile T6400189d.java
+ */
+
+import java.util.Iterator;
+
+class T6400189c<T> {
+
+ interface A<X> extends Iterable<X> {
+ Iterator<X> iterator();
+ }
+
+ interface A2<Y> extends A<Y> {
+ Iterator<Y> iterator();
+ }
+
+ static abstract class B<Z> implements A<Z> {
+ public abstract Iterator<Z> iterator();
+ }
+
+ static abstract class C<W> extends B<W> implements A2<W> {
+ Iterator<W> test() {
+ return iterator();
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/boxing/T6816548.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6816548
+ * @summary Uninitialized register when performing casting + auto(un)boxing
+ * @author mcimadamore
+ */
+public class T6816548 {
+
+ public static void main(String[] args) {
+ testInt();
+ testShort();
+ testByte();
+ testChar();
+ }
+
+ public static void testInt() {
+ final int fi = 0;
+ Byte b = fi;
+ Short s = fi;
+ Character c = fi;
+ }
+
+ public static void testShort() {
+ final short fs = 0;
+ Byte b = fs;
+ Short s = fs;
+ Character c = fs;
+ }
+
+ public static void testByte() {
+ final byte fb = 0;
+ Byte b = fb;
+ Short s = fb;
+ Character c = fb;
+ }
+
+ public static void testChar() {
+ final char fc = '0';
+ Byte b = fc;
+ Short s = fc;
+ Character c = fc;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6182950/T6182950a.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6182950
+ * @summary methods clash algorithm should not depend on return type
+ * @author mcimadamore
+ * @compile/fail/ref=T6182950a.out -XDrawDiagnostics T6182950a.java
+ */
+import java.util.List;
+
+class T6182950a {
+ int m(List<String> l) {return 0;}
+ double m(List<Integer> l) {return 0;}
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6182950/T6182950a.out Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,2 @@
+T6182950a.java:35:12: compiler.err.name.clash.same.erasure: m(java.util.List<java.lang.Integer>), m(java.util.List<java.lang.String>)
+1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6182950/T6182950b.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6182950
+ * @summary methods clash algorithm should not depend on return type
+ * @author mcimadamore
+ * @compile/fail/ref=T6182950b.out -XDrawDiagnostics T6182950b.java
+ */
+import java.util.List;
+
+class T6182950b {
+ static class A {
+ int m(List<String> l) {return 0;}
+ }
+ static class B extends A {
+ double m(List<Integer> l) {return 0;}
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6182950/T6182950b.out Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,2 @@
+T6182950b.java:38:16: compiler.err.name.clash.same.erasure.no.override: m(java.util.List<java.lang.Integer>), T6182950b.B, m(java.util.List<java.lang.String>), T6182950b.A
+1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6182950/T6182950c.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6182950
+ * @summary methods clash algorithm should not depend on return type
+ * @author mcimadamore
+ * @compile T6182950c.java
+ */
+
+class T6182950c {
+ static abstract class A<X> {
+ abstract Object m(X x);
+ }
+
+ static abstract class B<X> extends A<X> {
+ Number m(X x) {return 0;}
+ }
+
+ final static class C<X> extends B<X> {
+ Integer m(X x) {return 0;}
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/policy/test3/A.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,10 @@
+class A {
+ void m1() {
+ System.err.println("hello");
+ 0 // syntax error
+ System.err.println("world");
+ }
+
+ void m2() {
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/policy/test3/Test.java Mon Apr 27 12:33:57 2009 -0700
@@ -0,0 +1,169 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+
+/* @test
+ * @bug 6813059
+ * @summary
+ */
+
+import java.io.*;
+import java.util.*;
+
+// Simple test of -XDshouldStopPolicy.
+// For each of the permissable values, we compile a file with an error in it,
+// then using -XDverboseCompilePolicy we check that the compilation gets as
+// far as expected, but no further.
+
+public class Test {
+ enum ShouldStopPolicy {
+ BLANK(false, null, "attr"),
+ PROCESS(true, null, "attr"),
+ ATTR(true, "attr", "flow"),
+ FLOW(true, "flow", "desugar"),
+ TRANSTYPES(true, "desugar", "generate"),
+ LOWER(true, "desugar", "generate"),
+ GENERATE(true, "generate", null);
+ ShouldStopPolicy(boolean needOption, String expect, String dontExpect) {
+ this.needOption = needOption;
+ this.expect = expect;
+ this.dontExpect = dontExpect;
+ }
+ boolean needOption;
+ String expect;
+ String dontExpect;
+ }
+
+ enum CompilePolicy {
+ BYFILE,
+ BYTODO
+ }
+
+ public static void main(String... args) throws Exception {
+ new Test().run();
+ }
+
+ public void run() throws Exception {
+ for (CompilePolicy cp: CompilePolicy.values()) {
+ for (ShouldStopPolicy ssp: ShouldStopPolicy.values()) {
+ test(cp, ssp);
+ }
+ }
+
+ if (errors > 0)
+ throw new Exception(errors + " errors occurred");
+ }
+
+ public void test(CompilePolicy cp, ShouldStopPolicy ssp) {
+ System.err.println();
+ System.err.println("test " + cp + " " + ssp);
+ List<String> args = new ArrayList<String>();
+ args.add("-XDverboseCompilePolicy");
+ args.add("-XDcompilePolicy=" + cp.toString().toLowerCase());
+ args.add("-d");
+ args.add(".");
+ if (ssp.needOption)
+ args.add("-XDshouldStopPolicy=" + ssp);
+ args.add(new File(System.getProperty("test.src", "."), "A.java").getPath());
+
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ System.err.println("compile " + args);
+ int rc = com.sun.tools.javac.Main.compile(args.toArray(new String[args.size()]), pw);
+ if (rc == 0)
+ throw new Error("compilation succeeded unexpectedly");
+ //System.err.println(sw);
+
+ // The following is a workaround for the current javac implementation,
+ // that in bytodo mode, it will still attribute files after syntax errors.
+ // Changing that behavior may surprise existing users, so for now, we
+ // work around it.
+ if (cp == CompilePolicy.BYTODO && ssp == ShouldStopPolicy.PROCESS)
+ ssp = ShouldStopPolicy.ATTR;
+
+ boolean foundExpected = (ssp.expect == null);
+ String[] lines = sw.toString().split("\n");
+ for (String line: lines) {
+ if (ssp.expect != null && line.startsWith("[" + ssp.expect))
+ foundExpected = true;
+ if (ssp.dontExpect != null && line.startsWith("[" + ssp.dontExpect)) {
+ error("Unexpected output: " + ssp.dontExpect + "\n" + sw);
+ return;
+ }
+ }
+
+ if (!foundExpected)
+ error("Expected output not found: " + ssp.expect + "\n" + sw);
+ }
+
+ void error(String message) {
+ System.err.println(message);
+ errors++;
+ }
+
+ int errors;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+// These tests test the ability of the compiler to continue in the face of
+// errors, accordining to the shouldStopPolicy
+
+/* @ test /nodynamiccopyright/
+ * @bug 6813059
+ * @summary
+ * @compile/fail/ref=flow.out -XDrawDiagnostics -XDcompilePolicy=byfile -XDverboseCompilePolicy -XDshouldStopPolicy=FLOW Test.java
+
+ * @compile/fail/ref=default.out -XDrawDiagnostics -XDcompilePolicy=byfile -XDverboseCompilePolicy Test.java
+ * @compile/fail/ref=enter.out -XDrawDiagnostics -XDcompilePolicy=byfile -XDverboseCompilePolicy -XDshouldStopPolicy=ENTER Test.java
+ * @compile/fail/ref=attr.out -XDrawDiagnostics -XDcompilePolicy=byfile -XDverboseCompilePolicy -XDshouldStopPolicy=ATTR Test.java
+ * @compile/fail/ref=transtypes.out -XDrawDiagnostics -XDcompilePolicy=byfile -XDverboseCompilePolicy -XDshouldStopPolicy=TRANSTYPES Test.java
+ * @compile/fail/ref=lower.out -XDrawDiagnostics -XDcompilePolicy=byfile -XDverboseCompilePolicy -XDshouldStopPolicy=LOWER Test.java
+ * @compile/fail/ref=generate.out -XDrawDiagnostics -XDcompilePolicy=byfile -XDverboseCompilePolicy -XDshouldStopPolicy=GENERATE Test.java
+ */
+
+/*
+class Test {
+ void m1() {
+ System.err.println("hello");
+ 0 // syntax error
+ System.err.println("world");
+ }
+
+ void m2() {
+ }
+}
+
+class Test2 {
+}
+*/
+