提交 7595ee5b 编写于 作者: L lana

Merge

...@@ -105,3 +105,5 @@ ac311eb325bfc763698219252bf3cee9e091f3af jdk7-b122 ...@@ -105,3 +105,5 @@ ac311eb325bfc763698219252bf3cee9e091f3af jdk7-b122
f08682e23279d6cccbdcafda1eb0647ba4900874 jdk7-b128 f08682e23279d6cccbdcafda1eb0647ba4900874 jdk7-b128
14cd5d54a8d0b9c368d60ea83a066735b9931015 jdk7-b129 14cd5d54a8d0b9c368d60ea83a066735b9931015 jdk7-b129
bdc069d3f9101f89ec3f81c2950ee2d68fa846d3 jdk7-b130 bdc069d3f9101f89ec3f81c2950ee2d68fa846d3 jdk7-b130
8ac52c85f9e91336dc00b52ef90b42eecf3230b3 jdk7-b131
6bbc7a4734952ae7604578f270e1566639fa8752 jdk7-b132
...@@ -325,11 +325,11 @@ License instead of this License. ...@@ -325,11 +325,11 @@ License instead of this License.
"CLASSPATH" EXCEPTION TO THE GPL "CLASSPATH" EXCEPTION TO THE GPL
Certain source files distributed by Sun Microsystems, Inc. are subject to Certain source files distributed by Oracle America and/or its affiliates are
the following clarification and special exception to the GPL, but only where subject to the following clarification and special exception to the GPL, but
Sun has expressly included in the particular source file's header the words only where Oracle has expressly included in the particular source file's header
"Sun designates this particular file as subject to the "Classpath" exception the words "Oracle designates this particular file as subject to the "Classpath"
as provided by Sun in the LICENSE file that accompanied this code." exception as provided by Oracle in the LICENSE file that accompanied this code."
Linking this library statically or dynamically with other modules is making Linking this library statically or dynamically with other modules is making
a combined work based on this library. Thus, the terms and conditions of a combined work based on this library. Thus, the terms and conditions of
......
...@@ -359,7 +359,13 @@ ifeq ($(CC_VERSION),msvc) ...@@ -359,7 +359,13 @@ ifeq ($(CC_VERSION),msvc)
# VS2008 has bufferoverflow baked in: # VS2008 has bufferoverflow baked in:
LFLAGS_VS2008 = LFLAGS_VS2008 =
LFLAGS_VS2010 =
# VS2010, always need safe exception handlers, not needed on 64bit
ifeq ($(ARCH_DATA_MODEL), 32)
LFLAGS_VS2010 = -SAFESEH
else
LFLAGS_VS2010 =
endif
# LFLAGS are the flags given to $(LINK) and used to build the actual DLL file # LFLAGS are the flags given to $(LINK) and used to build the actual DLL file
BASELFLAGS = -nologo /opt:REF /incremental:no BASELFLAGS = -nologo /opt:REF /incremental:no
......
...@@ -125,9 +125,11 @@ JRE_MAN_PAGES = \ ...@@ -125,9 +125,11 @@ JRE_MAN_PAGES = \
tnameserv.1 \ tnameserv.1 \
unpack200.1 unpack200.1
ifndef OPENJDK
ifeq ($(ARCH_DATA_MODEL),32) ifeq ($(ARCH_DATA_MODEL),32)
JRE_MAN_PAGES += javaws.1 JRE_MAN_PAGES += javaws.1
endif endif
endif
JDK_MAN_PAGES = \ JDK_MAN_PAGES = \
$(JRE_MAN_PAGES) \ $(JRE_MAN_PAGES) \
......
...@@ -772,9 +772,20 @@ else ...@@ -772,9 +772,20 @@ else
BANNED_DLLS=msvcp100[.]dll|msvcr100d[.]dll|msvcrtd[.]dll BANNED_DLLS=msvcp100[.]dll|msvcr100d[.]dll|msvcrtd[.]dll
endif endif
# Macro to check it's input file for banned dependencies and verify the # Check for /safeseh (only used on 32bit)
# binary was built properly. Relies on process exit code. define binary_file_safeseh_verification # binary_file
define binary_file_verification # binary_file ( \
$(ECHO) "Checking for /SAFESEH usage in: $1" && \
if [ "`$(DUMPBIN) /loadconfig $1 | $(EGREP) -i 'Safe Exception Handler Table'`" = "" ] ; then \
$(ECHO) "ERROR: Did not find 'Safe Exception Handler Table' in loadconfig: $1" ; \
$(DUMPBIN) /loadconfig $1 ; \
exit 6 ; \
fi ; \
)
endef
# Check for /NXCOMPAT usage
define binary_file_nxcompat_verification # binary_file
( \ ( \
$(ECHO) "Checking for /NXCOMPAT usage in: $1" && \ $(ECHO) "Checking for /NXCOMPAT usage in: $1" && \
if [ "`$(DUMPBIN) /headers $1 | $(EGREP) -i 'NX compatible'`" = "" ] ; then \ if [ "`$(DUMPBIN) /headers $1 | $(EGREP) -i 'NX compatible'`" = "" ] ; then \
...@@ -782,12 +793,24 @@ define binary_file_verification # binary_file ...@@ -782,12 +793,24 @@ define binary_file_verification # binary_file
$(DUMPBIN) /headers $1 ; \ $(DUMPBIN) /headers $1 ; \
exit 7 ; \ exit 7 ; \
fi ; \ fi ; \
)
endef
# Check for /DYNAMICBASE usage
define binary_file_dynamicbase_verification # binary_file
( \
$(ECHO) "Checking for /DYNAMICBASE usage in: $1" && \ $(ECHO) "Checking for /DYNAMICBASE usage in: $1" && \
if [ "`$(DUMPBIN) /headers $1 | $(EGREP) -i 'Dynamic base'`" = "" ] ; then \ if [ "`$(DUMPBIN) /headers $1 | $(EGREP) -i 'Dynamic base'`" = "" ] ; then \
$(ECHO) "ERROR: Did not find 'Dynamic base' in headers: $1" ; \ $(ECHO) "ERROR: Did not find 'Dynamic base' in headers: $1" ; \
$(DUMPBIN) /headers $1 ; \ $(DUMPBIN) /headers $1 ; \
exit 8 ; \ exit 8 ; \
fi ; \ fi ; \
)
endef
# Check for banned dll usage
define binary_file_dll_verification # binary_file
( \
$(ECHO) "Checking for banned dependencies in: $1" && \ $(ECHO) "Checking for banned dependencies in: $1" && \
if [ "`$(DUMPBIN) /dependents $1 | $(EGREP) -i '$(BANNED_DLLS)'`" != "" ] ; then \ if [ "`$(DUMPBIN) /dependents $1 | $(EGREP) -i '$(BANNED_DLLS)'`" != "" ] ; then \
$(ECHO) "ERROR: Found use of $(BANNED_DLLS)"; \ $(ECHO) "ERROR: Found use of $(BANNED_DLLS)"; \
...@@ -797,6 +820,27 @@ define binary_file_verification # binary_file ...@@ -797,6 +820,27 @@ define binary_file_verification # binary_file
) )
endef endef
# Macro to check it's input file for properly built executables.
# Relies on process exit code. Different for 32bit vs 64bit.
ifeq ($(ARCH_DATA_MODEL),32)
define binary_file_verification # binary_file
( \
$(call binary_file_safeseh_verification,$1); \
$(call binary_file_nxcompat_verification,$1); \
$(call binary_file_dynamicbase_verification,$1); \
$(call binary_file_dll_verification,$1); \
)
endef
else
define binary_file_verification # binary_file
( \
$(call binary_file_nxcompat_verification,$1); \
$(call binary_file_dynamicbase_verification,$1); \
$(call binary_file_dll_verification,$1); \
)
endef
endif
else else
# Macro to check it's input file for banned dependencies and verify the # Macro to check it's input file for banned dependencies and verify the
......
...@@ -21,4 +21,4 @@ ...@@ -21,4 +21,4 @@
# or visit www.oracle.com if you need additional information or have any # or visit www.oracle.com if you need additional information or have any
# questions. # questions.
# #
tzdata2010o tzdata2011b
...@@ -106,14 +106,13 @@ Rule AS 1986 only - Oct 19 2:00s 1:00 - ...@@ -106,14 +106,13 @@ Rule AS 1986 only - Oct 19 2:00s 1:00 -
Rule AS 1987 2007 - Oct lastSun 2:00s 1:00 - Rule AS 1987 2007 - Oct lastSun 2:00s 1:00 -
Rule AS 1972 only - Feb 27 2:00s 0 - Rule AS 1972 only - Feb 27 2:00s 0 -
Rule AS 1973 1985 - Mar Sun>=1 2:00s 0 - Rule AS 1973 1985 - Mar Sun>=1 2:00s 0 -
Rule AS 1986 1989 - Mar Sun>=15 2:00s 0 - Rule AS 1986 1990 - Mar Sun>=15 2:00s 0 -
Rule AS 1990 only - Mar Sun>=18 2:00s 0 - Rule AS 1991 only - Mar 3 2:00s 0 -
Rule AS 1991 only - Mar Sun>=1 2:00s 0 - Rule AS 1992 only - Mar 22 2:00s 0 -
Rule AS 1992 only - Mar Sun>=18 2:00s 0 - Rule AS 1993 only - Mar 7 2:00s 0 -
Rule AS 1993 only - Mar Sun>=1 2:00s 0 - Rule AS 1994 only - Mar 20 2:00s 0 -
Rule AS 1994 only - Mar Sun>=18 2:00s 0 -
Rule AS 1995 2005 - Mar lastSun 2:00s 0 - Rule AS 1995 2005 - Mar lastSun 2:00s 0 -
Rule AS 2006 only - Apr Sun>=1 2:00s 0 - Rule AS 2006 only - Apr 2 2:00s 0 -
Rule AS 2007 only - Mar lastSun 2:00s 0 - Rule AS 2007 only - Mar lastSun 2:00s 0 -
Rule AS 2008 max - Apr Sun>=1 2:00s 0 - Rule AS 2008 max - Apr Sun>=1 2:00s 0 -
Rule AS 2008 max - Oct Sun>=1 2:00s 1:00 - Rule AS 2008 max - Oct Sun>=1 2:00s 1:00 -
......
...@@ -368,6 +368,27 @@ Zone America/North_Dakota/New_Salem -6:45:39 - LMT 1883 Nov 18 12:14:21 ...@@ -368,6 +368,27 @@ Zone America/North_Dakota/New_Salem -6:45:39 - LMT 1883 Nov 18 12:14:21
-7:00 US M%sT 2003 Oct 26 02:00 -7:00 US M%sT 2003 Oct 26 02:00
-6:00 US C%sT -6:00 US C%sT
# From Josh Findley (2011-01-21):
# ...it appears that Mercer County, North Dakota, changed from the
# mountain time zone to the central time zone at the last transition from
# daylight-saving to standard time (on Nov. 7, 2010):
# <a href="http://www.gpo.gov/fdsys/pkg/FR-2010-09-29/html/2010-24376.htm">
# http://www.gpo.gov/fdsys/pkg/FR-2010-09-29/html/2010-24376.htm
# </a>
# <a href="http://www.bismarcktribune.com/news/local/article_1eb1b588-c758-11df-b472-001cc4c03286.html">
# http://www.bismarcktribune.com/news/local/article_1eb1b588-c758-11df-b472-001cc4c03286.html
# </a>
# From Andy Lipscomb (2011-01-24):
# ...according to the Census Bureau, the largest city is Beulah (although
# it's commonly referred to as Beulah-Hazen, with Hazen being the next
# largest city in Mercer County). Google Maps places Beulah's city hall
# at 4715'51" north, 10146'40" west, which yields an offset of 6h47'07".
Zone America/North_Dakota/Beulah -6:47:07 - LMT 1883 Nov 18 12:12:53
-7:00 US M%sT 2010 Nov 7 2:00
-6:00 US C%sT
# US mountain time, represented by Denver # US mountain time, represented by Denver
# #
# Colorado, far western Kansas, Montana, western # Colorado, far western Kansas, Montana, western
...@@ -493,20 +514,50 @@ Zone America/Adak 12:13:21 - LMT 1867 Oct 18 ...@@ -493,20 +514,50 @@ Zone America/Adak 12:13:21 - LMT 1867 Oct 18
# three votes for and one against." # three votes for and one against."
# Hawaii # Hawaii
#
# From Arthur David Olson: # From Arthur David Olson (2010-12-09):
# And then there's Hawaii. # "Hawaiian Time" by Robert C. Schmitt and Doak C. Cox appears on pages 207-225
# DST was observed for one day in 1933; # of volume 26 of The Hawaiian Journal of History (1992). As of 2010-12-09,
# standard time was changed by half an hour in 1947; # the article is available at
# it's always standard as of 1986. # <a href="http://evols.library.manoa.hawaii.edu/bitstream/10524/239/2/JL26215.pdf">
# # http://evols.library.manoa.hawaii.edu/bitstream/10524/239/2/JL26215.pdf
# From Paul Eggert: # </a>
# Shanks says the 1933 experiment lasted for three weeks. Go with Shanks. # and indicates that standard time was adopted effective noon, January
# # 13, 1896 (page 218), that in "1933, the Legislature decreed daylight
Zone Pacific/Honolulu -10:31:26 - LMT 1900 Jan 1 12:00 # saving for the period between the last Sunday of each April and the
-10:30 - HST 1933 Apr 30 2:00 # last Sunday of each September, but less than a month later repealed the
-10:30 1:00 HDT 1933 May 21 2:00 # act," (page 220), that year-round daylight saving time was in effect
-10:30 US H%sT 1947 Jun 8 2:00 # from 1942-02-09 to 1945-09-30 (page 221, with no time of day given for
# when clocks changed) and that clocks were changed by 30 minutes
# effective the second Sunday of June, 1947 (page 219, with no time of
# day given for when clocks changed). A footnote for the 1933 changes
# cites Session Laws of Hawaii 1933, "Act. 90 (approved 26 Apr. 1933)
# and Act 163 (approved 21 May 1933)."
# From Arthur David Olson (2011-01-19):
# The following is from "Laws of the Territory of Hawaii Passed by the
# Seventeenth Legislature: Regular Session 1933," available (as of
# 2011-01-19) at American University's Pence Law Library. Page 85: "Act
# 90...At 2 o'clock ante meridian of the last Sunday in April of each
# year, the standard time of this Territory shall be advanced one
# hour...This Act shall take effect upon its approval. Approved this 26th
# day of April, A. D. 1933. LAWRENCE M JUDD, Governor of the Territory of
# Hawaii." Page 172: "Act 163...Act 90 of the Session Laws of 1933 is
# hereby repealed...This Act shall take effect upon its approval, upon
# which date the standard time of this Territory shall be restored to
# that existing immediately prior to the taking effect of said Act 90.
# Approved this 21st day of May, A. D. 1933. LAWRENCE M. JUDD, Governor
# of the Territory of Hawaii."
#
# Note that 1933-05-21 was a Sunday.
# We're left to guess the time of day when Act 163 was approved; guess noon.
Zone Pacific/Honolulu -10:31:26 - LMT 1896 Jan 13 12:00 #Schmitt&Cox
-10:30 - HST 1933 Apr 30 2:00 #Laws 1933
-10:30 1:00 HDT 1933 May 21 12:00 #Laws 1933+12
-10:30 - HST 1942 Feb 09 2:00 #Schmitt&Cox+2
-10:30 1:00 HDT 1945 Sep 30 2:00 #Schmitt&Fox+2
-10:30 US H%sT 1947 Jun 8 2:00 #Schmitt&Fox+2
-10:00 - HST -10:00 - HST
# Now we turn to US areas that have diverged from the consensus since 1970. # Now we turn to US areas that have diverged from the consensus since 1970.
......
...@@ -233,8 +233,8 @@ HT +1832-07220 America/Port-au-Prince ...@@ -233,8 +233,8 @@ HT +1832-07220 America/Port-au-Prince
HU +4730+01905 Europe/Budapest HU +4730+01905 Europe/Budapest
ID -0610+10648 Asia/Jakarta Java & Sumatra ID -0610+10648 Asia/Jakarta Java & Sumatra
ID -0002+10920 Asia/Pontianak west & central Borneo ID -0002+10920 Asia/Pontianak west & central Borneo
ID -0507+11924 Asia/Makassar east & south Borneo, Celebes, Bali, Nusa Tengarra, west Timor ID -0507+11924 Asia/Makassar east & south Borneo, Sulawesi (Celebes), Bali, Nusa Tengarra, west Timor
ID -0232+14042 Asia/Jayapura Irian Jaya & the Moluccas ID -0232+14042 Asia/Jayapura west New Guinea (Irian Jaya) & Malukus (Moluccas)
IE +5320-00615 Europe/Dublin IE +5320-00615 Europe/Dublin
IL +3146+03514 Asia/Jerusalem IL +3146+03514 Asia/Jerusalem
IM +5409-00428 Europe/Isle_of_Man IM +5409-00428 Europe/Isle_of_Man
...@@ -426,6 +426,7 @@ US +411745-0863730 America/Indiana/Knox Central Time - Indiana - Starke County ...@@ -426,6 +426,7 @@ US +411745-0863730 America/Indiana/Knox Central Time - Indiana - Starke County
US +450628-0873651 America/Menominee Central Time - Michigan - Dickinson, Gogebic, Iron & Menominee Counties US +450628-0873651 America/Menominee Central Time - Michigan - Dickinson, Gogebic, Iron & Menominee Counties
US +470659-1011757 America/North_Dakota/Center Central Time - North Dakota - Oliver County US +470659-1011757 America/North_Dakota/Center Central Time - North Dakota - Oliver County
US +465042-1012439 America/North_Dakota/New_Salem Central Time - North Dakota - Morton County (except Mandan area) US +465042-1012439 America/North_Dakota/New_Salem Central Time - North Dakota - Morton County (except Mandan area)
US +471551-1014640 America/North_Dakota/Beulah Central Time - North Dakota - Mercer County
US +394421-1045903 America/Denver Mountain Time US +394421-1045903 America/Denver Mountain Time
US +433649-1161209 America/Boise Mountain Time - south Idaho & east Oregon US +433649-1161209 America/Boise Mountain Time - south Idaho & east Oregon
US +364708-1084111 America/Shiprock Mountain Time - Navajo US +364708-1084111 America/Shiprock Mountain Time - Navajo
......
...@@ -65,6 +65,19 @@ ifeq ($(PLATFORM), solaris) ...@@ -65,6 +65,19 @@ ifeq ($(PLATFORM), solaris)
FILES_reorder += reorder-$(ARCH) FILES_reorder += reorder-$(ARCH)
endif endif
endif endif
ifeq ($(PLATFORM), linux)
# Suppress gcc warnings like "variable might be clobbered by 'longjmp'
# or 'vfork'": this warning indicates that some variable is placed to
# a register by optimized compiler and it's value might be lost on longjmp().
# Recommended way to avoid such warning is to declare the variable as
# volatile to prevent the optimization. However, this approach does not
# work because we have to declare all variables as volatile in result.
OTHER_CFLAGS += -Wno-clobbered
endif
include $(BUILDDIR)/common/Mapfile-vers.gmk include $(BUILDDIR)/common/Mapfile-vers.gmk
include $(BUILDDIR)/common/Library.gmk include $(BUILDDIR)/common/Library.gmk
......
...@@ -22,7 +22,7 @@ text: .text%jIMReader; ...@@ -22,7 +22,7 @@ text: .text%jIMReader;
text: .text%alloc_small: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jmemmgr.o; text: .text%alloc_small: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jmemmgr.o;
text: .text%reset_marker_reader: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; text: .text%reset_marker_reader: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%jIInCtlr; text: .text%jIInCtlr;
text: .text%GET_ARRAYS: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jpegdecoder.o; # text: .text%GET_ARRAYS: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jpegdecoder.o;
text: .text%jReadHeader; text: .text%jReadHeader;
text: .text%jConsumeInput; text: .text%jConsumeInput;
text: .text%reset_input_controller: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdinput.o; text: .text%reset_input_controller: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdinput.o;
...@@ -30,36 +30,36 @@ text: .text%reset_error_mgr: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jerror.o; ...@@ -30,36 +30,36 @@ text: .text%reset_error_mgr: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jerror.o;
text: .text%sun_jpeg_init_source; text: .text%sun_jpeg_init_source;
text: .text%consume_markers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdinput.o; text: .text%consume_markers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdinput.o;
text: .text%read_markers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; text: .text%read_markers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%first_marker: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; # text: .text%first_marker: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%sun_jpeg_fill_input_buffer; text: .text%sun_jpeg_fill_input_buffer;
text: .text%RELEASE_ARRAYS: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jpegdecoder.o; # text: .text%RELEASE_ARRAYS: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jpegdecoder.o;
text: .text%get_soi: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; # text: .text%get_soi: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%emit_message: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jerror.o; text: .text%emit_message: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jerror.o;
text: .text%next_marker: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; # text: .text%next_marker: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%get_interesting_appn: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; text: .text%get_interesting_appn: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%examine_app0: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; # text: .text%examine_app0: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%skip_variable: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; text: .text%skip_variable: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%sun_jpeg_skip_input_data; text: .text%sun_jpeg_skip_input_data;
text: .text%examine_app14: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; # text: .text%examine_app14: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%get_dqt: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; text: .text%get_dqt: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%jAlcQTable; text: .text%jAlcQTable;
text: .text%get_sof: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; text: .text%get_sof: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%get_dri: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; # text: .text%get_dri: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%get_dht: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; text: .text%get_dht: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%jAlcHTable; text: .text%jAlcHTable;
text: .text%get_sos: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; text: .text%get_sos: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%initial_setup: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdinput.o; # text: .text%initial_setup: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdinput.o;
text: .text%jDivRound; text: .text%jDivRound;
text: .text%default_decompress_parms: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdapimin.o; # text: .text%default_decompress_parms: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdapimin.o;
text: .text%jHasMultScn; text: .text%jHasMultScn;
text: .text%jStrtDecompress; text: .text%jStrtDecompress;
text: .text%jIDMaster; text: .text%jIDMaster;
text: .text%master_selection: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmaster.o; # text: .text%master_selection: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmaster.o;
text: .text%jCalcDimensions; text: .text%jCalcDimensions;
text: .text%use_merged_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmaster.o; # text: .text%use_merged_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmaster.o;
text: .text%prepare_range_limit_table: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmaster.o; # text: .text%prepare_range_limit_table: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmaster.o;
text: .text%jIDColor; text: .text%jIDColor;
text: .text%build_ycc_rgb_table: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdcolor.o; # text: .text%build_ycc_rgb_table: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdcolor.o;
text: .text%jIUpsampler; text: .text%jIUpsampler;
text: .text%jRound; text: .text%jRound;
text: .text%alloc_sarray: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jmemmgr.o; text: .text%alloc_sarray: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jmemmgr.o;
...@@ -70,16 +70,16 @@ text: .text%jIIDCT; ...@@ -70,16 +70,16 @@ text: .text%jIIDCT;
text: .text%jIHDecoder; text: .text%jIHDecoder;
text: .text%jIDCoefC; text: .text%jIDCoefC;
text: .text%jIDMainC; text: .text%jIDMainC;
text: .text%alloc_funny_pointers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmainct.o; # text: .text%alloc_funny_pointers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmainct.o;
text: .text%realize_virt_arrays: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jmemmgr.o; text: .text%realize_virt_arrays: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jmemmgr.o;
text: .text%start_input_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdinput.o; text: .text%start_input_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdinput.o;
text: .text%per_scan_setup: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdinput.o; # text: .text%per_scan_setup: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdinput.o;
text: .text%latch_quant_tables: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdinput.o; # text: .text%latch_quant_tables: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdinput.o;
text: .text%start_pass_huff_decoder: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdhuff.o; text: .text%start_pass_huff_decoder: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdhuff.o;
text: .text%jMkDDerived; text: .text%jMkDDerived;
text: .text%start_input_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdcoefct.o; text: .text%start_input_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdcoefct.o;
text: .text%start_iMCU_row: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdcoefct.o; # text: .text%start_iMCU_row: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdcoefct.o;
text: .text%output_pass_setup: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdapistd.o; # text: .text%output_pass_setup: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdapistd.o;
text: .text%prepare_for_output_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmaster.o; text: .text%prepare_for_output_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmaster.o;
text: .text%start_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jddctmgr.o; text: .text%start_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jddctmgr.o;
text: .text%start_output_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdcoefct.o; text: .text%start_output_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdcoefct.o;
...@@ -87,7 +87,7 @@ text: .text%start_pass_dcolor: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdcolor.o; ...@@ -87,7 +87,7 @@ text: .text%start_pass_dcolor: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdcolor.o;
text: .text%start_pass_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdsample.o; text: .text%start_pass_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdsample.o;
text: .text%start_pass_dpost: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdpostct.o; text: .text%start_pass_dpost: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdpostct.o;
text: .text%start_pass_main: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmainct.o; text: .text%start_pass_main: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmainct.o;
text: .text%make_funny_pointers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmainct.o; # text: .text%make_funny_pointers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmainct.o;
text: .text%jReadScanlines; text: .text%jReadScanlines;
text: .text%process_data_context_main: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmainct.o; text: .text%process_data_context_main: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmainct.o;
text: .text%decompress_onepass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdcoefct.o; text: .text%decompress_onepass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdcoefct.o;
...@@ -100,11 +100,11 @@ text: .text%sep_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdsample.o; ...@@ -100,11 +100,11 @@ text: .text%sep_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdsample.o;
text: .text%fullsize_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdsample.o; text: .text%fullsize_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdsample.o;
text: .text%h2v2_fancy_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdsample.o; text: .text%h2v2_fancy_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdsample.o;
text: .text%ycc_rgb_convert: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdcolor.o; text: .text%ycc_rgb_convert: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdcolor.o;
text: .text%set_wraparound_pointers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmainct.o; # text: .text%set_wraparound_pointers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmainct.o;
text: .text%process_restart: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdhuff.o; # text: .text%process_restart: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdhuff.o;
text: .text%read_restart_marker: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; text: .text%read_restart_marker: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%finish_input_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdinput.o; text: .text%finish_input_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdinput.o;
text: .text%set_bottom_pointers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmainct.o; # text: .text%set_bottom_pointers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmainct.o;
text: .text%jFinDecompress; text: .text%jFinDecompress;
text: .text%finish_output_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmaster.o; text: .text%finish_output_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmaster.o;
text: .text%sun_jpeg_term_source; text: .text%sun_jpeg_term_source;
......
...@@ -30,10 +30,10 @@ text: .text%reset_error_mgr: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jerror.o; ...@@ -30,10 +30,10 @@ text: .text%reset_error_mgr: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jerror.o;
text: .text%sun_jpeg_init_source; text: .text%sun_jpeg_init_source;
text: .text%consume_markers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdinput.o; text: .text%consume_markers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdinput.o;
text: .text%read_markers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; text: .text%read_markers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%first_marker: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; # text: .text%first_marker: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%sun_jpeg_fill_input_buffer; text: .text%sun_jpeg_fill_input_buffer;
text: .text%RELEASE_ARRAYS: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jpegdecoder.o; text: .text%RELEASE_ARRAYS: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jpegdecoder.o;
text: .text%get_soi: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; # text: .text%get_soi: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%emit_message: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jerror.o; text: .text%emit_message: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jerror.o;
text: .text%next_marker: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; text: .text%next_marker: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%get_interesting_appn: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; text: .text%get_interesting_appn: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
...@@ -44,7 +44,7 @@ text: .text%examine_app14: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; ...@@ -44,7 +44,7 @@ text: .text%examine_app14: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%get_dqt: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; text: .text%get_dqt: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%jAlcQTable; text: .text%jAlcQTable;
text: .text%get_sof: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; text: .text%get_sof: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%get_dri: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; # text: .text%get_dri: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%get_dht: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; text: .text%get_dht: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%jAlcHTable; text: .text%jAlcHTable;
text: .text%get_sos: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; text: .text%get_sos: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
...@@ -56,10 +56,10 @@ text: .text%jStrtDecompress; ...@@ -56,10 +56,10 @@ text: .text%jStrtDecompress;
text: .text%jIDMaster; text: .text%jIDMaster;
text: .text%master_selection: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmaster.o; text: .text%master_selection: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmaster.o;
text: .text%jCalcDimensions; text: .text%jCalcDimensions;
text: .text%use_merged_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmaster.o; # text: .text%use_merged_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmaster.o;
text: .text%prepare_range_limit_table: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmaster.o; # text: .text%prepare_range_limit_table: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmaster.o;
text: .text%jIDColor; text: .text%jIDColor;
text: .text%build_ycc_rgb_table: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdcolor.o; # text: .text%build_ycc_rgb_table: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdcolor.o;
text: .text%jIUpsampler; text: .text%jIUpsampler;
text: .text%jRound; text: .text%jRound;
text: .text%alloc_sarray: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jmemmgr.o; text: .text%alloc_sarray: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jmemmgr.o;
...@@ -78,7 +78,7 @@ text: .text%latch_quant_tables: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdinput.o; ...@@ -78,7 +78,7 @@ text: .text%latch_quant_tables: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdinput.o;
text: .text%start_pass_huff_decoder: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdhuff.o; text: .text%start_pass_huff_decoder: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdhuff.o;
text: .text%jMkDDerived; text: .text%jMkDDerived;
text: .text%start_input_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdcoefct.o; text: .text%start_input_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdcoefct.o;
text: .text%start_iMCU_row: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdcoefct.o; # text: .text%start_iMCU_row: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdcoefct.o;
text: .text%output_pass_setup: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdapistd.o; text: .text%output_pass_setup: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdapistd.o;
text: .text%prepare_for_output_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmaster.o; text: .text%prepare_for_output_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmaster.o;
text: .text%start_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jddctmgr.o; text: .text%start_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jddctmgr.o;
...@@ -100,11 +100,11 @@ text: .text%sep_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdsample.o; ...@@ -100,11 +100,11 @@ text: .text%sep_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdsample.o;
text: .text%fullsize_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdsample.o; text: .text%fullsize_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdsample.o;
text: .text%h2v2_fancy_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdsample.o; text: .text%h2v2_fancy_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdsample.o;
text: .text%ycc_rgb_convert: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdcolor.o; text: .text%ycc_rgb_convert: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdcolor.o;
text: .text%set_wraparound_pointers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmainct.o; # text: .text%set_wraparound_pointers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmainct.o;
text: .text%process_restart: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdhuff.o; #text: .text%process_restart: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdhuff.o;
text: .text%read_restart_marker: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o; text: .text%read_restart_marker: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmarker.o;
text: .text%finish_input_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdinput.o; text: .text%finish_input_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdinput.o;
text: .text%set_bottom_pointers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmainct.o; # text: .text%set_bottom_pointers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmainct.o;
text: .text%jFinDecompress; text: .text%jFinDecompress;
text: .text%finish_output_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmaster.o; text: .text%finish_output_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj/jdmaster.o;
text: .text%sun_jpeg_term_source; text: .text%sun_jpeg_term_source;
......
...@@ -30,10 +30,10 @@ text: .text%reset_error_mgr: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jerror.o; ...@@ -30,10 +30,10 @@ text: .text%reset_error_mgr: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jerror.o;
text: .text%sun_jpeg_init_source; text: .text%sun_jpeg_init_source;
text: .text%consume_markers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdinput.o; text: .text%consume_markers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdinput.o;
text: .text%read_markers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmarker.o; text: .text%read_markers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmarker.o;
text: .text%first_marker: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmarker.o; # text: .text%first_marker: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmarker.o;
text: .text%sun_jpeg_fill_input_buffer; text: .text%sun_jpeg_fill_input_buffer;
text: .text%RELEASE_ARRAYS: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jpegdecoder.o; text: .text%RELEASE_ARRAYS: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jpegdecoder.o;
text: .text%get_soi: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmarker.o; # text: .text%get_soi: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmarker.o;
text: .text%emit_message: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jerror.o; text: .text%emit_message: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jerror.o;
text: .text%next_marker: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmarker.o; text: .text%next_marker: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmarker.o;
text: .text%get_interesting_appn: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmarker.o; text: .text%get_interesting_appn: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmarker.o;
...@@ -44,7 +44,7 @@ text: .text%examine_app14: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmarker.o; ...@@ -44,7 +44,7 @@ text: .text%examine_app14: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmarker.o;
text: .text%get_dqt: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmarker.o; text: .text%get_dqt: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmarker.o;
text: .text%jAlcQTable; text: .text%jAlcQTable;
text: .text%get_sof: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmarker.o; text: .text%get_sof: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmarker.o;
text: .text%get_dri: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmarker.o; # text: .text%get_dri: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmarker.o;
text: .text%get_dht: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmarker.o; text: .text%get_dht: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmarker.o;
text: .text%jAlcHTable; text: .text%jAlcHTable;
text: .text%get_sos: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmarker.o; text: .text%get_sos: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmarker.o;
...@@ -56,10 +56,10 @@ text: .text%jStrtDecompress; ...@@ -56,10 +56,10 @@ text: .text%jStrtDecompress;
text: .text%jIDMaster; text: .text%jIDMaster;
text: .text%master_selection: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmaster.o; text: .text%master_selection: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmaster.o;
text: .text%jCalcDimensions; text: .text%jCalcDimensions;
text: .text%use_merged_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmaster.o; # text: .text%use_merged_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmaster.o;
text: .text%prepare_range_limit_table: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmaster.o; # text: .text%prepare_range_limit_table: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmaster.o;
text: .text%jIDColor; text: .text%jIDColor;
text: .text%build_ycc_rgb_table: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdcolor.o; # text: .text%build_ycc_rgb_table: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdcolor.o;
text: .text%jIUpsampler; text: .text%jIUpsampler;
text: .text%jRound; text: .text%jRound;
text: .text%alloc_sarray: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jmemmgr.o; text: .text%alloc_sarray: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jmemmgr.o;
...@@ -78,7 +78,7 @@ text: .text%latch_quant_tables: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdinput.o; ...@@ -78,7 +78,7 @@ text: .text%latch_quant_tables: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdinput.o;
text: .text%start_pass_huff_decoder: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdhuff.o; text: .text%start_pass_huff_decoder: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdhuff.o;
text: .text%jMkDDerived; text: .text%jMkDDerived;
text: .text%start_input_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdcoefct.o; text: .text%start_input_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdcoefct.o;
text: .text%start_iMCU_row: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdcoefct.o; # text: .text%start_iMCU_row: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdcoefct.o;
text: .text%output_pass_setup: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdapistd.o; text: .text%output_pass_setup: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdapistd.o;
text: .text%prepare_for_output_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmaster.o; text: .text%prepare_for_output_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmaster.o;
text: .text%start_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jddctmgr.o; text: .text%start_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jddctmgr.o;
...@@ -100,11 +100,11 @@ text: .text%sep_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdsample.o; ...@@ -100,11 +100,11 @@ text: .text%sep_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdsample.o;
text: .text%fullsize_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdsample.o; text: .text%fullsize_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdsample.o;
text: .text%h2v2_fancy_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdsample.o; text: .text%h2v2_fancy_upsample: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdsample.o;
text: .text%ycc_rgb_convert: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdcolor.o; text: .text%ycc_rgb_convert: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdcolor.o;
text: .text%set_wraparound_pointers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmainct.o; # text: .text%set_wraparound_pointers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmainct.o;
text: .text%process_restart: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdhuff.o; text: .text%process_restart: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdhuff.o;
text: .text%read_restart_marker: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmarker.o; text: .text%read_restart_marker: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmarker.o;
text: .text%finish_input_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdinput.o; text: .text%finish_input_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdinput.o;
text: .text%set_bottom_pointers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmainct.o; # text: .text%set_bottom_pointers: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmainct.o;
text: .text%jFinDecompress; text: .text%jFinDecompress;
text: .text%finish_output_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmaster.o; text: .text%finish_output_pass: OUTPUTDIR/tmp/sun/sun.awt/jpeg/obj64/jdmaster.o;
text: .text%sun_jpeg_term_source; text: .text%sun_jpeg_term_source;
......
# Providers for FormatConversion # Providers for FormatConversion
com.sun.media.sound.AudioFloatFormatConverter
com.sun.media.sound.UlawCodec com.sun.media.sound.UlawCodec
com.sun.media.sound.AlawCodec com.sun.media.sound.AlawCodec
com.sun.media.sound.PCMtoPCMCodec com.sun.media.sound.PCMtoPCMCodec
com.sun.media.sound.AudioFloatFormatConverter
/* /*
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -78,7 +78,7 @@ static { ...@@ -78,7 +78,7 @@ static {
} }
private static CallSite bootstrapDynamic(MethodHandles.Lookup caller, String name, MethodType type) { private static CallSite bootstrapDynamic(MethodHandles.Lookup caller, String name, MethodType type) {
// ignore caller and name, but match the type: // ignore caller and name, but match the type:
return new ConstantCallSite(MethodHandles.collectArguments(printArgs, type)); return new ConstantCallSite(printArgs.asType(type));
} }
</pre></blockquote> </pre></blockquote>
* @author John Rose, JSR 292 EG * @author John Rose, JSR 292 EG
...@@ -86,6 +86,7 @@ private static CallSite bootstrapDynamic(MethodHandles.Lookup caller, String nam ...@@ -86,6 +86,7 @@ private static CallSite bootstrapDynamic(MethodHandles.Lookup caller, String nam
abstract abstract
public class CallSite { public class CallSite {
private static final Access IMPL_TOKEN = Access.getToken(); private static final Access IMPL_TOKEN = Access.getToken();
static { MethodHandleImpl.initStatics(); }
// Fields used only by the JVM. Do not use or change. // Fields used only by the JVM. Do not use or change.
private MemberName vmmethod; // supplied by the JVM (ref. to calling method) private MemberName vmmethod; // supplied by the JVM (ref. to calling method)
...@@ -125,8 +126,8 @@ public class CallSite { ...@@ -125,8 +126,8 @@ public class CallSite {
} }
/** /**
* Report the type of this call site's target. * Returns the type of this call site's target.
* Although targets may change, the call site's type can never change. * Although targets may change, any call site's type is permanent, and can never change to an unequal type.
* The {@code setTarget} method enforces this invariant by refusing any new target that does * The {@code setTarget} method enforces this invariant by refusing any new target that does
* not have the previous target's type. * not have the previous target's type.
* @return the type of the current target, which is also the type of any future target * @return the type of the current target, which is also the type of any future target
...@@ -154,73 +155,40 @@ public class CallSite { ...@@ -154,73 +155,40 @@ public class CallSite {
} }
/** /**
* Report the current linkage state of the call site, a value which may change over time. * Returns the target method of the call site, according to the
* <p> * behavior defined by this call site's specific class.
* If a {@code CallSite} object is returned * The immediate subclasses of {@code CallSite} document the
* from the bootstrap method of the {@code invokedynamic} instruction, * class-specific behaviors of this method.
* the {@code CallSite} is permanently bound to that instruction. *
* When the {@code invokedynamic} instruction is executed, the target method
* of its associated call site object is invoked directly.
* It is as if the instruction calls {@code getTarget} and then
* calls {@link MethodHandle#invokeExact invokeExact} on the result.
* <p>
* Unless specified differently by a subclass,
* the interactions of {@code getTarget} with memory are the same
* as of a read from an ordinary variable, such as an array element or a
* non-volatile, non-final field.
* <p>
* In particular, the current thread may choose to reuse the result
* of a previous read of the target from memory, and may fail to see
* a recent update to the target by another thread.
* <p>
* In a {@linkplain ConstantCallSite constant call site}, the {@code getTarget} method behaves
* like a read from a {@code final} field of the {@code CallSite}.
* <p>
* In a {@linkplain VolatileCallSite volatile call site}, the {@code getTarget} method behaves
* like a read from a {@code volatile} field of the {@code CallSite}.
* <p>
* This method may not be overridden by application code.
* @return the current linkage state of the call site, its target method handle * @return the current linkage state of the call site, its target method handle
* @see ConstantCallSite * @see ConstantCallSite
* @see VolatileCallSite * @see VolatileCallSite
* @see #setTarget * @see #setTarget
* @see ConstantCallSite#getTarget
* @see MutableCallSite#getTarget
* @see VolatileCallSite#getTarget
*/ */
public final MethodHandle getTarget() { public abstract MethodHandle getTarget();
return getTarget0();
}
/**
* Privileged implementations can override this to force final or volatile semantics on getTarget.
*/
/*package-private*/
MethodHandle getTarget0() {
return target;
}
/** /**
* Set the target method of this call site. * Updates the target method of this call site, according to the
* behavior defined by this call site's specific class.
* The immediate subclasses of {@code CallSite} document the
* class-specific behaviors of this method.
* <p> * <p>
* Unless a subclass of CallSite documents otherwise, * The type of the new target must be {@linkplain MethodType#equals equal to}
* the interactions of {@code setTarget} with memory are the same * the type of the old target.
* as of a write to an ordinary variable, such as an array element or a *
* non-volatile, non-final field.
* <p>
* In particular, unrelated threads may fail to see the updated target
* until they perform a read from memory.
* Stronger guarantees can be created by putting appropriate operations
* into the bootstrap method and/or the target methods used
* at any given call site.
* @param newTarget the new target * @param newTarget the new target
* @throws NullPointerException if the proposed new target is null * @throws NullPointerException if the proposed new target is null
* @throws WrongMethodTypeException if the proposed new target * @throws WrongMethodTypeException if the proposed new target
* has a method type that differs from the previous target * has a method type that differs from the previous target
* @throws UnsupportedOperationException if the call site is * @see CallSite#getTarget
* in fact a {@link ConstantCallSite} * @see ConstantCallSite#setTarget
* @see MutableCallSite#setTarget
* @see VolatileCallSite#setTarget
*/ */
public void setTarget(MethodHandle newTarget) { public abstract void setTarget(MethodHandle newTarget);
checkTargetChange(this.target, newTarget);
setTargetNormal(newTarget);
}
void checkTargetChange(MethodHandle oldTarget, MethodHandle newTarget) { void checkTargetChange(MethodHandle oldTarget, MethodHandle newTarget) {
MethodType oldType = oldTarget.type(); MethodType oldType = oldTarget.type();
...@@ -236,31 +204,31 @@ public class CallSite { ...@@ -236,31 +204,31 @@ public class CallSite {
/** /**
* Produce a method handle equivalent to an invokedynamic instruction * Produce a method handle equivalent to an invokedynamic instruction
* which has been linked to this call site. * which has been linked to this call site.
* <p>If this call site is a {@linkplain ConstantCallSite constant call site}, * <p>
* this method simply returns the call site's target, since that will never change. * This method is equivalent to the following code:
* <p>Otherwise, this method is equivalent to the following code: * <blockquote><pre>
* <p><blockquote><pre>
* MethodHandle getTarget, invoker, result; * MethodHandle getTarget, invoker, result;
* getTarget = MethodHandles.lookup().bind(this, "getTarget", MethodType.methodType(MethodHandle.class)); * getTarget = MethodHandles.publicLookup().bind(this, "getTarget", MethodType.methodType(MethodHandle.class));
* invoker = MethodHandles.exactInvoker(this.type()); * invoker = MethodHandles.exactInvoker(this.type());
* result = MethodHandles.foldArguments(invoker, getTarget) * result = MethodHandles.foldArguments(invoker, getTarget)
* </pre></blockquote> * </pre></blockquote>
*
* @return a method handle which always invokes this call site's current target * @return a method handle which always invokes this call site's current target
*/ */
public final MethodHandle dynamicInvoker() { public abstract MethodHandle dynamicInvoker();
if (this instanceof ConstantCallSite) {
return getTarget0(); // will not change dynamically /*non-public*/ MethodHandle makeDynamicInvoker() {
}
MethodHandle getTarget = MethodHandleImpl.bindReceiver(IMPL_TOKEN, GET_TARGET, this); MethodHandle getTarget = MethodHandleImpl.bindReceiver(IMPL_TOKEN, GET_TARGET, this);
MethodHandle invoker = MethodHandles.exactInvoker(this.type()); MethodHandle invoker = MethodHandles.exactInvoker(this.type());
return MethodHandles.foldArguments(invoker, getTarget); return MethodHandles.foldArguments(invoker, getTarget);
} }
private static final MethodHandle GET_TARGET; private static final MethodHandle GET_TARGET;
static { static {
try { try {
GET_TARGET = MethodHandles.Lookup.IMPL_LOOKUP. GET_TARGET = MethodHandles.Lookup.IMPL_LOOKUP.
findVirtual(CallSite.class, "getTarget", MethodType.methodType(MethodHandle.class)); findVirtual(CallSite.class, "getTarget", MethodType.methodType(MethodHandle.class));
} catch (NoAccessException ignore) { } catch (ReflectiveOperationException ignore) {
throw new InternalError(); throw new InternalError();
} }
} }
......
/* /*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -31,10 +31,14 @@ import java.util.concurrent.atomic.AtomicReference; ...@@ -31,10 +31,14 @@ import java.util.concurrent.atomic.AtomicReference;
import java.lang.reflect.UndeclaredThrowableException; import java.lang.reflect.UndeclaredThrowableException;
/** /**
* Lazily associate a computed value with (potentially) every class. * Lazily associate a computed value with (potentially) every type.
* For example, if a dynamic language needs to construct a message dispatch
* table for each class encountered at a message send call site,
* it can use a {@code ClassValue} to cache information needed to
* perform the message send quickly, for each class encountered.
* @author John Rose, JSR 292 EG * @author John Rose, JSR 292 EG
*/ */
public class ClassValue<T> { public abstract class ClassValue<T> {
/** /**
* Compute the given class's derived value for this {@code ClassValue}. * Compute the given class's derived value for this {@code ClassValue}.
* <p> * <p>
...@@ -45,61 +49,41 @@ public class ClassValue<T> { ...@@ -45,61 +49,41 @@ public class ClassValue<T> {
* but it may be invoked again if there has been a call to * but it may be invoked again if there has been a call to
* {@link #remove remove}. * {@link #remove remove}.
* <p> * <p>
* If there is no override from a subclass, this method returns * If this method throws an exception, the corresponding call to {@code get}
* the result of applying the {@code ClassValue}'s {@code computeValue} * will terminate abnormally with that exception, and no class value will be recorded.
* method handle, which was supplied at construction time.
* *
* @param type the type whose class value must be computed
* @return the newly computed value associated with this {@code ClassValue}, for the given class or interface * @return the newly computed value associated with this {@code ClassValue}, for the given class or interface
* @throws UndeclaredThrowableException if the {@code computeValue} method handle invocation throws something other than a {@code RuntimeException} or {@code Error} * @see #get
* @throws UnsupportedOperationException if the {@code computeValue} method handle is null (subclasses must override) * @see #remove
*/ */
protected T computeValue(Class<?> type) { protected abstract T computeValue(Class<?> type);
if (computeValue == null)
return null;
try {
return (T) (Object) computeValue.invokeGeneric(type);
} catch (Throwable ex) {
if (ex instanceof Error) throw (Error) ex;
if (ex instanceof RuntimeException) throw (RuntimeException) ex;
throw new UndeclaredThrowableException(ex);
}
}
private final MethodHandle computeValue;
/**
* Creates a new class value.
* Subclasses which use this constructor must override
* the {@link #computeValue computeValue} method,
* since the default {@code computeValue} method requires a method handle,
* which this constructor does not provide.
*/
protected ClassValue() {
this.computeValue = null;
}
/**
* Creates a new class value, whose {@link #computeValue computeValue} method
* will return the result of {@code computeValue.invokeGeneric(type)}.
* @throws NullPointerException if the method handle parameter is null
*/
public ClassValue(MethodHandle computeValue) {
computeValue.getClass(); // trigger NPE if null
this.computeValue = computeValue;
}
/** /**
* Returns the value for the given class. * Returns the value for the given class.
* If no value has yet been computed, it is obtained by * If no value has yet been computed, it is obtained by
* by an invocation of the {@link #computeValue computeValue} method. * an invocation of the {@link #computeValue computeValue} method.
* <p> * <p>
* The actual installation of the value on the class * The actual installation of the value on the class
* is performed atomically. * is performed atomically.
* At that point, if racing threads have * At that point, if several racing threads have
* computed values, one is chosen, and returned to * computed values, one is chosen, and returned to
* all the racing threads. * all the racing threads.
* <p>
* The {@code type} parameter is typically a class, but it may be any type,
* such as an interface, a primitive type (like {@code int.class}), or {@code void.class}.
* <p>
* In the absence of {@code remove} calls, a class value has a simple
* state diagram: uninitialized and initialized.
* When {@code remove} calls are made,
* the rules for value observation are more complex.
* See the documentation for {@link #remove remove} for more information.
* *
* @param type the type whose class value must be computed or retrieved
* @return the current value associated with this {@code ClassValue}, for the given class or interface * @return the current value associated with this {@code ClassValue}, for the given class or interface
* @throws NullPointerException if the argument is null
* @see #remove
* @see #computeValue
*/ */
public T get(Class<?> type) { public T get(Class<?> type) {
ClassValueMap map = getMap(type); ClassValueMap map = getMap(type);
...@@ -119,12 +103,51 @@ public class ClassValue<T> { ...@@ -119,12 +103,51 @@ public class ClassValue<T> {
* This may result in an additional invocation of the * This may result in an additional invocation of the
* {@code computeValue computeValue} method for the given class. * {@code computeValue computeValue} method for the given class.
* <p> * <p>
* If racing threads perform a combination of {@code get} and {@code remove} calls, * In order to explain the interaction between {@code get} and {@code remove} calls,
* the calls are serialized. * we must model the state transitions of a class value to take into account
* A value produced by a call to {@code computeValue} will be discarded, if * the alternation between uninitialized and initialized states.
* the corresponding {@code get} call was followed by a {@code remove} call * To do this, number these states sequentially from zero, and note that
* before the {@code computeValue} could complete. * uninitialized (or removed) states are numbered with even numbers,
* In such a case, the {@code get} call will re-invoke {@code computeValue}. * while initialized (or re-initialized) states have odd numbers.
* <p>
* When a thread {@code T} removes a class value in state {@code 2N},
* nothing happens, since the class value is already uninitialized.
* Otherwise, the state is advanced atomically to {@code 2N+1}.
* <p>
* When a thread {@code T} queries a class value in state {@code 2N},
* the thread first attempts to initialize the class value to state {@code 2N+1}
* by invoking {@code computeValue} and installing the resulting value.
* <p>
* When {@code T} attempts to install the newly computed value,
* if the state is still at {@code 2N}, the class value will be initialized
* with the computed value, advancing it to state {@code 2N+1}.
* <p>
* Otherwise, whether the new state is even or odd,
* {@code T} will discard the newly computed value
* and retry the {@code get} operation.
* <p>
* Discarding and retrying is an important proviso,
* since otherwise {@code T} could potentially install
* a disastrously stale value. For example:
* <ul>
* <li>{@code T} calls {@code CV.get(C)} and sees state {@code 2N}
* <li>{@code T} quickly computes a time-dependent value {@code V0} and gets ready to install it
* <li>{@code T} is hit by an unlucky paging or scheduling event, and goes to sleep for a long time
* <li>...meanwhile, {@code T2} also calls {@code CV.get(C)} and sees state {@code 2N}
* <li>{@code T2} quickly computes a similar time-dependent value {@code V1} and installs it on {@code CV.get(C)}
* <li>{@code T2} (or a third thread) then calls {@code CV.remove(C)}, undoing {@code T2}'s work
* <li> the previous actions of {@code T2} are repeated several times
* <li> also, the relevant computed values change over time: {@code V1}, {@code V2}, ...
* <li>...meanwhile, {@code T} wakes up and attempts to install {@code V0}; <em>this must fail</em>
* </ul>
* We can assume in the above scenario that {@code CV.computeValue} uses locks to properly
* observe the time-dependent states as it computes {@code V1}, etc.
* This does not remove the threat of a stale value, since there is a window of time
* between the return of {@code computeValue} in {@code T} and the installation
* of the the new value. No user synchronization is possible during this time.
*
* @param type the type whose class value must be removed
* @throws NullPointerException if the argument is null
*/ */
public void remove(Class<?> type) { public void remove(Class<?> type) {
ClassValueMap map = getMap(type); ClassValueMap map = getMap(type);
...@@ -137,9 +160,9 @@ public class ClassValue<T> { ...@@ -137,9 +160,9 @@ public class ClassValue<T> {
/// Implementation... /// Implementation...
/** The hash code for this type is based on the identity of the object, // The hash code for this type is based on the identity of the object,
* and is well-dispersed for power-of-two tables. // and is well-dispersed for power-of-two tables.
*/ /** @deprecated This override, which is implementation-specific, will be removed for PFD. */
public final int hashCode() { return hashCode; } public final int hashCode() { return hashCode; }
private final int hashCode = HASH_CODES.getAndAdd(0x61c88647); private final int hashCode = HASH_CODES.getAndAdd(0x61c88647);
private static final AtomicInteger HASH_CODES = new AtomicInteger(); private static final AtomicInteger HASH_CODES = new AtomicInteger();
......
/* /*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -32,16 +32,46 @@ package java.dyn; ...@@ -32,16 +32,46 @@ package java.dyn;
* @author John Rose, JSR 292 EG * @author John Rose, JSR 292 EG
*/ */
public class ConstantCallSite extends CallSite { public class ConstantCallSite extends CallSite {
/** Create a call site with a permanent target. /**
* Creates a call site with a permanent target.
* @param target the target to be permanently associated with this call site
* @throws NullPointerException if the proposed target is null * @throws NullPointerException if the proposed target is null
*/ */
public ConstantCallSite(MethodHandle target) { public ConstantCallSite(MethodHandle target) {
super(target); super(target);
} }
/**
* Returns the target method of the call site, which behaves
* like a {@code final} field of the {@code ConstantCallSite}.
* That is, the the target is always the original value passed
* to the constructor call which created this instance.
*
* @return the immutable linkage state of this call site, a constant method handle
* @throws UnsupportedOperationException because this kind of call site cannot change its target
*/
@Override public final MethodHandle getTarget() {
return target;
}
/** /**
* Throw an {@link UnsupportedOperationException}, because this kind of call site cannot change its target. * Always throws an {@link UnsupportedOperationException}.
* This kind of call site cannot change its target.
* @param ignore a new target proposed for the call site, which is ignored
* @throws UnsupportedOperationException because this kind of call site cannot change its target
*/ */
@Override public final void setTarget(MethodHandle ignore) { @Override public final void setTarget(MethodHandle ignore) {
throw new UnsupportedOperationException("ConstantCallSite"); throw new UnsupportedOperationException("ConstantCallSite");
} }
/**
* Returns this call site's permanent target.
* Since that target will never change, this is a correct implementation
* of {@link CallSite#dynamicInvoker CallSite.dynamicInvoker}.
* @return the immutable linkage state of this call site, a constant method handle
*/
@Override
public final MethodHandle dynamicInvoker() {
return getTarget();
}
} }
...@@ -31,8 +31,8 @@ package java.dyn; ...@@ -31,8 +31,8 @@ package java.dyn;
* {@linkplain BootstrapMethod bootstrap method}, * {@linkplain BootstrapMethod bootstrap method},
* or the bootstrap method has * or the bootstrap method has
* failed to provide a * failed to provide a
* {@linkplain CallSite} call site with a non-null {@linkplain MethodHandle target} * {@linkplain CallSite call site} with a {@linkplain CallSite#getTarget target}
* of the correct {@linkplain MethodType method type}. * of the correct {@linkplain MethodHandle#type method type}.
* *
* @author John Rose, JSR 292 EG * @author John Rose, JSR 292 EG
* @since 1.7 * @since 1.7
......
...@@ -88,7 +88,7 @@ public class Linkage { ...@@ -88,7 +88,7 @@ public class Linkage {
MethodHandle bootstrapMethod; MethodHandle bootstrapMethod;
try { try {
bootstrapMethod = lookup.findStatic(runtime, name, BOOTSTRAP_METHOD_TYPE); bootstrapMethod = lookup.findStatic(runtime, name, BOOTSTRAP_METHOD_TYPE);
} catch (NoAccessException ex) { } catch (ReflectiveOperationException ex) {
throw new IllegalArgumentException("no such bootstrap method in "+runtime+": "+name, ex); throw new IllegalArgumentException("no such bootstrap method in "+runtime+": "+name, ex);
} }
MethodHandleImpl.registerBootstrap(IMPL_TOKEN, callerClass, bootstrapMethod); MethodHandleImpl.registerBootstrap(IMPL_TOKEN, callerClass, bootstrapMethod);
...@@ -101,8 +101,9 @@ public class Linkage { ...@@ -101,8 +101,9 @@ public class Linkage {
/** /**
* <em>METHOD WILL BE REMOVED FOR PFD:</em> * <em>METHOD WILL BE REMOVED FOR PFD:</em>
* Invalidate all <code>invokedynamic</code> call sites everywhere. * Invalidate all <code>invokedynamic</code> call sites everywhere.
* @deprecated Use {@linkplain CallSite#setTarget call site target setting} * @deprecated Use {@linkplain MutableCallSite#setTarget call site target setting},
* and {@link VolatileCallSite#invalidateAll call site invalidation} instead. * {@link MutableCallSite#syncAll call site update pushing},
* and {@link SwitchPoint#guardWithTest target switching} instead.
*/ */
public static public static
Object invalidateAll() { Object invalidateAll() {
...@@ -113,8 +114,9 @@ public class Linkage { ...@@ -113,8 +114,9 @@ public class Linkage {
* <em>METHOD WILL BE REMOVED FOR PFD:</em> * <em>METHOD WILL BE REMOVED FOR PFD:</em>
* Invalidate all {@code invokedynamic} call sites in the bytecodes * Invalidate all {@code invokedynamic} call sites in the bytecodes
* of any methods of the given class. * of any methods of the given class.
* @deprecated Use {@linkplain CallSite#setTarget call site target setting} * @deprecated Use {@linkplain MutableCallSite#setTarget call site target setting},
* and {@link VolatileCallSite#invalidateAll call site invalidation} instead. * {@link MutableCallSite#syncAll call site update pushing},
* and {@link SwitchPoint#guardWithTest target switching} instead.
*/ */
public static public static
Object invalidateCallerClass(Class<?> callerClass) { Object invalidateCallerClass(Class<?> callerClass) {
......
/* /*
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -73,7 +73,7 @@ assertEquals("Wilma, dear?", (String) worker2.invokeExact()); ...@@ -73,7 +73,7 @@ assertEquals("Wilma, dear?", (String) worker2.invokeExact());
* (This is a normal consequence of the Java Memory Model as applied * (This is a normal consequence of the Java Memory Model as applied
* to object fields.) * to object fields.)
* <p> * <p>
* The {@link #sync sync} operation provides a way to force threads * The {@link #syncAll syncAll} operation provides a way to force threads
* to accept a new target value, even if there is no other synchronization. * to accept a new target value, even if there is no other synchronization.
* <p> * <p>
* For target values which will be frequently updated, consider using * For target values which will be frequently updated, consider using
...@@ -82,13 +82,17 @@ assertEquals("Wilma, dear?", (String) worker2.invokeExact()); ...@@ -82,13 +82,17 @@ assertEquals("Wilma, dear?", (String) worker2.invokeExact());
*/ */
public class MutableCallSite extends CallSite { public class MutableCallSite extends CallSite {
/** /**
* Make a blank call site object with the given method type. * Creates a blank call site object with the given method type.
* An initial target method is supplied which will throw * The initial target is set to a method handle of the given type
* an {@link IllegalStateException} if called. * which will throw an {@link IllegalStateException} if called.
* <p>
* The type of the call site is permanently set to the given type.
* <p> * <p>
* Before this {@code CallSite} object is returned from a bootstrap method, * Before this {@code CallSite} object is returned from a bootstrap method,
* or invoked in some other manner,
* it is usually provided with a more useful target method, * it is usually provided with a more useful target method,
* via a call to {@link CallSite#setTarget(MethodHandle) setTarget}. * via a call to {@link CallSite#setTarget(MethodHandle) setTarget}.
* @param type the method type that this call site will have
* @throws NullPointerException if the proposed type is null * @throws NullPointerException if the proposed type is null
*/ */
public MutableCallSite(MethodType type) { public MutableCallSite(MethodType type) {
...@@ -96,8 +100,9 @@ public class MutableCallSite extends CallSite { ...@@ -96,8 +100,9 @@ public class MutableCallSite extends CallSite {
} }
/** /**
* Make a blank call site object, possibly equipped with an initial target method handle. * Creates a call site object with an initial target method handle.
* @param target the method handle which will be the initial target of the call site * The type of the call site is permanently set to the initial target's type.
* @param target the method handle that will be the initial target of the call site
* @throws NullPointerException if the proposed target is null * @throws NullPointerException if the proposed target is null
*/ */
public MutableCallSite(MethodHandle target) { public MutableCallSite(MethodHandle target) {
...@@ -105,7 +110,59 @@ public class MutableCallSite extends CallSite { ...@@ -105,7 +110,59 @@ public class MutableCallSite extends CallSite {
} }
/** /**
* Perform a synchronization operation on each call site in the given array, * Returns the target method of the call site, which behaves
* like a normal field of the {@code MutableCallSite}.
* <p>
* The interactions of {@code getTarget} with memory are the same
* as of a read from an ordinary variable, such as an array element or a
* non-volatile, non-final field.
* <p>
* In particular, the current thread may choose to reuse the result
* of a previous read of the target from memory, and may fail to see
* a recent update to the target by another thread.
*
* @return the linkage state of this call site, a method handle which can change over time
* @see #setTarget
*/
@Override public final MethodHandle getTarget() {
return target;
}
/**
* Updates the target method of this call site, as a normal variable.
* The type of the new target must agree with the type of the old target.
* <p>
* The interactions with memory are the same
* as of a write to an ordinary variable, such as an array element or a
* non-volatile, non-final field.
* <p>
* In particular, unrelated threads may fail to see the updated target
* until they perform a read from memory.
* Stronger guarantees can be created by putting appropriate operations
* into the bootstrap method and/or the target methods used
* at any given call site.
*
* @param newTarget the new target
* @throws NullPointerException if the proposed new target is null
* @throws WrongMethodTypeException if the proposed new target
* has a method type that differs from the previous target
* @see #getTarget
*/
@Override public void setTarget(MethodHandle newTarget) {
checkTargetChange(this.target, newTarget);
setTargetNormal(newTarget);
}
/**
* {@inheritDoc}
*/
@Override
public final MethodHandle dynamicInvoker() {
return makeDynamicInvoker();
}
/**
* Performs a synchronization operation on each call site in the given array,
* forcing all other threads to throw away any cached values previously * forcing all other threads to throw away any cached values previously
* loaded from the target of any of the call sites. * loaded from the target of any of the call sites.
* <p> * <p>
...@@ -115,19 +172,29 @@ public class MutableCallSite extends CallSite { ...@@ -115,19 +172,29 @@ public class MutableCallSite extends CallSite {
* <p> * <p>
* The overall effect is to force all future readers of each call site's target * The overall effect is to force all future readers of each call site's target
* to accept the most recently stored value. * to accept the most recently stored value.
* ("Most recently" is reckoned relative to the {@code sync} itself.) * ("Most recently" is reckoned relative to the {@code syncAll} itself.)
* Conversely, the {@code sync} call may block until all readers have * Conversely, the {@code syncAll} call may block until all readers have
* (somehow) decached all previous versions of each call site's target. * (somehow) decached all previous versions of each call site's target.
* <p> * <p>
* To avoid race conditions, calls to {@code setTarget} and {@code sync} * To avoid race conditions, calls to {@code setTarget} and {@code syncAll}
* should generally be performed under some sort of mutual exclusion. * should generally be performed under some sort of mutual exclusion.
* Note that reader threads may observe an updated target as early * Note that reader threads may observe an updated target as early
* as the {@code setTarget} call that install the value * as the {@code setTarget} call that install the value
* (and before the {@code sync} that confirms the value). * (and before the {@code syncAll} that confirms the value).
* On the other hand, reader threads may observe previous versions of * On the other hand, reader threads may observe previous versions of
* the target until the {@code sync} call returns * the target until the {@code syncAll} call returns
* (and after the {@code setTarget} that attempts to convey the updated version). * (and after the {@code setTarget} that attempts to convey the updated version).
* <p> * <p>
* This operation is likely to be expensive and should be used sparingly.
* If possible, it should be buffered for batch processing on sets of call sites.
* <p>
* If {@code sites} contains a null element,
* a {@code NullPointerException} will be raised.
* In this case, some non-null elements in the array may be
* processed before the method returns abnormally.
* Which elements these are (if any) is implementation-dependent.
*
* <h3>Java Memory Model details</h3>
* In terms of the Java Memory Model, this operation performs a synchronization * In terms of the Java Memory Model, this operation performs a synchronization
* action which is comparable in effect to the writing of a volatile variable * action which is comparable in effect to the writing of a volatile variable
* by the current thread, and an eventual volatile read by every other thread * by the current thread, and an eventual volatile read by every other thread
...@@ -171,18 +238,17 @@ public class MutableCallSite extends CallSite { ...@@ -171,18 +238,17 @@ public class MutableCallSite extends CallSite {
* thereby ensuring communication of the new target value. * thereby ensuring communication of the new target value.
* <p> * <p>
* As long as the constraints of the Java Memory Model are obeyed, * As long as the constraints of the Java Memory Model are obeyed,
* implementations may delay the completion of a {@code sync} * implementations may delay the completion of a {@code syncAll}
* operation while other threads ({@code T} above) continue to * operation while other threads ({@code T} above) continue to
* use previous values of {@code S}'s target. * use previous values of {@code S}'s target.
* However, implementations are (as always) encouraged to avoid * However, implementations are (as always) encouraged to avoid
* livelock, and to eventually require all threads to take account * livelock, and to eventually require all threads to take account
* of the updated target. * of the updated target.
* <p> *
* This operation is likely to be expensive and should be used sparingly.
* If possible, it should be buffered for batch processing on sets of call sites.
* <p style="font-size:smaller;"> * <p style="font-size:smaller;">
* (This is a static method on a set of call sites, not a * <em>Discussion:</em>
* virtual method on a single call site, for performance reasons. * For performance reasons, {@code syncAll} is not a virtual method
* on a single call site, but rather applies to a set of call sites.
* Some implementations may incur a large fixed overhead cost * Some implementations may incur a large fixed overhead cost
* for processing one or more synchronization operations, * for processing one or more synchronization operations,
* but a small incremental cost for each additional call site. * but a small incremental cost for each additional call site.
...@@ -191,15 +257,25 @@ public class MutableCallSite extends CallSite { ...@@ -191,15 +257,25 @@ public class MutableCallSite extends CallSite {
* in order to make them notice the updated target value. * in order to make them notice the updated target value.
* However, it may be observed that a single call to synchronize * However, it may be observed that a single call to synchronize
* several sites has the same formal effect as many calls, * several sites has the same formal effect as many calls,
* each on just one of the sites.) * each on just one of the sites.
* <p> *
* <p style="font-size:smaller;">
* <em>Implementation Note:</em>
* Simple implementations of {@code MutableCallSite} may use * Simple implementations of {@code MutableCallSite} may use
* a volatile variable for the target of a mutable call site. * a volatile variable for the target of a mutable call site.
* In such an implementation, the {@code sync} method can be a no-op, * In such an implementation, the {@code syncAll} method can be a no-op,
* and yet it will conform to the JMM behavior documented above. * and yet it will conform to the JMM behavior documented above.
*
* @param sites an array of call sites to be synchronized
* @throws NullPointerException if the {@code sites} array reference is null
* or the array contains a null
*/ */
public static void sync(MutableCallSite[] sites) { public static void syncAll(MutableCallSite[] sites) {
if (sites.length == 0) return;
STORE_BARRIER.lazySet(0); STORE_BARRIER.lazySet(0);
for (int i = 0; i < sites.length; i++) {
sites[i].getClass(); // trigger NPE on first null
}
// FIXME: NYI // FIXME: NYI
} }
private static final AtomicInteger STORE_BARRIER = new AtomicInteger(); private static final AtomicInteger STORE_BARRIER = new AtomicInteger();
......
/* /*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -27,68 +27,84 @@ package java.dyn; ...@@ -27,68 +27,84 @@ package java.dyn;
/** /**
* <p> * <p>
* A {@code Switcher} is an object which can publish state transitions to other threads. * A {@code SwitchPoint} is an object which can publish state transitions to other threads.
* A switcher is initially in the <em>valid</em> state, but may at any time be * A switch point is initially in the <em>valid</em> state, but may at any time be
* changed to the <em>invalid</em> state. Invalidation cannot be reversed. * changed to the <em>invalid</em> state. Invalidation cannot be reversed.
* A switch point can combine a <em>guarded pair</em> of method handles into a
* <em>guarded delegator</em>.
* The guarded delegator is a method handle which delegates to one of the old method handles.
* The state of the switch point determines which of the two gets the delegation.
* <p> * <p>
* A single switcher may be used to create any number of guarded method handle pairs. * A single switch point may be used to control any number of method handles.
* Each guarded pair is wrapped in a new method handle {@code M}, * (Indirectly, therefore, it can control any number of call sites.)
* which is permanently associated with the switcher that created it. * This is done by using the single switch point as a factory for combining
* any number of guarded method handle pairs into guarded delegators.
* <p>
* When a guarded delegator is created from a guarded pair, the pair
* is wrapped in a new method handle {@code M},
* which is permanently associated with the switch point that created it.
* Each pair consists of a target {@code T} and a fallback {@code F}. * Each pair consists of a target {@code T} and a fallback {@code F}.
* While the switcher is valid, invocations to {@code M} are delegated to {@code T}. * While the switch point is valid, invocations to {@code M} are delegated to {@code T}.
* After it is invalidated, invocations are delegated to {@code F}. * After it is invalidated, invocations are delegated to {@code F}.
* <p> * <p>
* Invalidation is global and immediate, as if the switcher contained a * Invalidation is global and immediate, as if the switch point contained a
* volatile boolean variable consulted on every call to {@code M}. * volatile boolean variable consulted on every call to {@code M}.
* The invalidation is also permanent, which means the switcher * The invalidation is also permanent, which means the switch point
* can change state only once. * can change state only once.
* The switch point will always delegate to {@code F} after being invalidated.
* At that point {@code guardWithTest} may ignore {@code T} and return {@code F}.
* <p> * <p>
* Here is an example of a switcher in action: * Here is an example of a switch point in action:
* <blockquote><pre> * <blockquote><pre>
MethodType MT_str2 = MethodType.methodType(String.class, String.class); MethodType MT_str2 = MethodType.methodType(String.class, String.class);
MethodHandle MH_strcat = MethodHandles.lookup() MethodHandle MH_strcat = MethodHandles.lookup()
.findVirtual(String.class, "concat", MT_str2); .findVirtual(String.class, "concat", MT_str2);
Switcher switcher = new Switcher(); SwitchPoint spt = new SwitchPoint();
// the following steps may be repeated to re-use the same switcher: // the following steps may be repeated to re-use the same switch point:
MethodHandle worker1 = strcat; MethodHandle worker1 = strcat;
MethodHandle worker2 = MethodHandles.permuteArguments(strcat, MT_str2, 1, 0); MethodHandle worker2 = MethodHandles.permuteArguments(strcat, MT_str2, 1, 0);
MethodHandle worker = switcher.guardWithTest(worker1, worker2); MethodHandle worker = spt.guardWithTest(worker1, worker2);
assertEquals("method", (String) worker.invokeExact("met", "hod")); assertEquals("method", (String) worker.invokeExact("met", "hod"));
switcher.invalidate(); SwitchPoint.invalidateAll(new SwitchPoint[]{ spt });
assertEquals("hodmet", (String) worker.invokeExact("met", "hod")); assertEquals("hodmet", (String) worker.invokeExact("met", "hod"));
* </pre></blockquote> * </pre></blockquote>
* <p> * <p style="font-size:smaller;">
* <em>Discussion:</em>
* Switch points are useful without subclassing. They may also be subclassed.
* This may be useful in order to associate application-specific invalidation logic
* with the switch point.
* <p style="font-size:smaller;">
* <em>Implementation Note:</em> * <em>Implementation Note:</em>
* A switcher behaves as if implemented on top of {@link MutableCallSite}, * A switch point behaves as if implemented on top of {@link MutableCallSite},
* approximately as follows: * approximately as follows:
* <blockquote><pre> * <blockquote><pre>
public class Switcher { public class SwitchPoint {
private static final MethodHandle private static final MethodHandle
K_true = MethodHandles.constant(boolean.class, true), K_true = MethodHandles.constant(boolean.class, true),
K_false = MethodHandles.constant(boolean.class, false); K_false = MethodHandles.constant(boolean.class, false);
private final MutableCallSite mcs; private final MutableCallSite mcs;
private final MethodHandle mcsInvoker; private final MethodHandle mcsInvoker;
public Switcher() { public SwitchPoint() {
this.mcs = new MutableCallSite(K_true); this.mcs = new MutableCallSite(K_true);
this.mcsInvoker = mcs.dynamicInvoker(); this.mcsInvoker = mcs.dynamicInvoker();
} }
public MethodHandle guardWithTest( public MethodHandle guardWithTest(
MethodHandle target, MethodHandle fallback) { MethodHandle target, MethodHandle fallback) {
// Note: mcsInvoker is of type boolean(). // Note: mcsInvoker is of type ()boolean.
// Target and fallback may take any arguments, but must have the same type. // Target and fallback may take any arguments, but must have the same type.
return MethodHandles.guardWithTest(this.mcsInvoker, target, fallback); return MethodHandles.guardWithTest(this.mcsInvoker, target, fallback);
} }
public static void invalidateAll(Switcher[] switchers) { public static void invalidateAll(SwitchPoint[] spts) {
List<MutableCallSite> mcss = new ArrayList<>(); List&lt;MutableCallSite&gt; mcss = new ArrayList&lt;&gt;();
for (Switcher s : switchers) mcss.add(s.mcs); for (SwitchPoint spt : spts) mcss.add(spt.mcs);
for (MutableCallSite mcs : mcss) mcs.setTarget(K_false); for (MutableCallSite mcs : mcss) mcs.setTarget(K_false);
MutableCallSite.sync(mcss.toArray(new MutableCallSite[0])); MutableCallSite.syncAll(mcss.toArray(new MutableCallSite[0]));
} }
} }
* </pre></blockquote> * </pre></blockquote>
* @author Remi Forax, JSR 292 EG * @author Remi Forax, JSR 292 EG
*/ */
public class Switcher { public class SwitchPoint {
private static final MethodHandle private static final MethodHandle
K_true = MethodHandles.constant(boolean.class, true), K_true = MethodHandles.constant(boolean.class, true),
K_false = MethodHandles.constant(boolean.class, false); K_false = MethodHandles.constant(boolean.class, false);
...@@ -96,19 +112,26 @@ public class Switcher { ...@@ -96,19 +112,26 @@ public class Switcher {
private final MutableCallSite mcs; private final MutableCallSite mcs;
private final MethodHandle mcsInvoker; private final MethodHandle mcsInvoker;
/** Create a switcher. */ /**
public Switcher() { * Creates a new switch point.
*/
public SwitchPoint() {
this.mcs = new MutableCallSite(K_true); this.mcs = new MutableCallSite(K_true);
this.mcsInvoker = mcs.dynamicInvoker(); this.mcsInvoker = mcs.dynamicInvoker();
} }
/** /**
* Return a method handle which always delegates either to the target or the fallback. * Returns a method handle which always delegates either to the target or the fallback.
* The method handle will delegate to the target exactly as long as the switcher is valid. * The method handle will delegate to the target exactly as long as the switch point is valid.
* After that, it will permanently delegate to the fallback. * After that, it will permanently delegate to the fallback.
* <p> * <p>
* The target and fallback must be of exactly the same method type, * The target and fallback must be of exactly the same method type,
* and the resulting combined method handle will also be of this type. * and the resulting combined method handle will also be of this type.
*
* @param target the method handle selected by the switch point as long as it is valid
* @param fallback the method handle selected by the switch point after it is invalidated
* @return a combined method handle which always calls either the target or fallback
* @throws NullPointerException if either argument is null
* @see MethodHandles#guardWithTest * @see MethodHandles#guardWithTest
*/ */
public MethodHandle guardWithTest(MethodHandle target, MethodHandle fallback) { public MethodHandle guardWithTest(MethodHandle target, MethodHandle fallback) {
...@@ -117,14 +140,56 @@ public class Switcher { ...@@ -117,14 +140,56 @@ public class Switcher {
return MethodHandles.guardWithTest(mcsInvoker, target, fallback); return MethodHandles.guardWithTest(mcsInvoker, target, fallback);
} }
/** Set all of the given switchers into the invalid state. */ /**
public static void invalidateAll(Switcher[] switchers) { * Sets all of the given switch points into the invalid state.
MutableCallSite[] sites = new MutableCallSite[switchers.length]; * After this call executes, no thread will observe any of the
int fillp = 0; * switch points to be in a valid state.
for (Switcher switcher : switchers) { * <p>
sites[fillp++] = switcher.mcs; * This operation is likely to be expensive and should be used sparingly.
switcher.mcs.setTarget(K_false); * If possible, it should be buffered for batch processing on sets of switch points.
* <p>
* If {@code switchPoints} contains a null element,
* a {@code NullPointerException} will be raised.
* In this case, some non-null elements in the array may be
* processed before the method returns abnormally.
* Which elements these are (if any) is implementation-dependent.
*
* <p style="font-size:smaller;">
* <em>Discussion:</em>
* For performance reasons, {@code invalidateAll} is not a virtual method
* on a single switch point, but rather applies to a set of switch points.
* Some implementations may incur a large fixed overhead cost
* for processing one or more invalidation operations,
* but a small incremental cost for each additional invalidation.
* In any case, this operation is likely to be costly, since
* other threads may have to be somehow interrupted
* in order to make them notice the updated switch point state.
* However, it may be observed that a single call to invalidate
* several switch points has the same formal effect as many calls,
* each on just one of the switch points.
*
* <p style="font-size:smaller;">
* <em>Implementation Note:</em>
* Simple implementations of {@code SwitchPoint} may use
* a private {@link MutableCallSite} to publish the state of a switch point.
* In such an implementation, the {@code invalidateAll} method can
* simply change the call site's target, and issue one call to
* {@linkplain MutableCallSite#syncAll synchronize} all the
* private call sites.
*
* @param switchPoints an array of call sites to be synchronized
* @throws NullPointerException if the {@code switchPoints} array reference is null
* or the array contains a null
*/
public static void invalidateAll(SwitchPoint[] switchPoints) {
if (switchPoints.length == 0) return;
MutableCallSite[] sites = new MutableCallSite[switchPoints.length];
for (int i = 0; i < switchPoints.length; i++) {
SwitchPoint spt = switchPoints[i];
if (spt == null) break; // MSC.syncAll will trigger a NPE
sites[i] = spt.mcs;
spt.mcs.setTarget(K_false);
} }
MutableCallSite.sync(sites); MutableCallSite.syncAll(sites);
} }
} }
/* /*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -34,7 +34,7 @@ import java.util.List; ...@@ -34,7 +34,7 @@ import java.util.List;
* There may be a performance penalty for such tight coupling between threads. * There may be a performance penalty for such tight coupling between threads.
* <p> * <p>
* Unlike {@code MutableCallSite}, there is no * Unlike {@code MutableCallSite}, there is no
* {@linkplain MutableCallSite#sync sync operation} on volatile * {@linkplain MutableCallSite#syncAll syncAll operation} on volatile
* call sites, since every write to a volatile variable is implicitly * call sites, since every write to a volatile variable is implicitly
* synchronized with reader threads. * synchronized with reader threads.
* <p> * <p>
...@@ -44,36 +44,68 @@ import java.util.List; ...@@ -44,36 +44,68 @@ import java.util.List;
* @author John Rose, JSR 292 EG * @author John Rose, JSR 292 EG
*/ */
public class VolatileCallSite extends CallSite { public class VolatileCallSite extends CallSite {
/** Create a call site with a volatile target. /**
* The initial target is set to a method handle * Creates a call site with a volatile binding to its target.
* of the given type which will throw {@code IllegalStateException}. * The initial target is set to a method handle
* of the given type which will throw an {@code IllegalStateException} if called.
* @param type the method type that this call site will have
* @throws NullPointerException if the proposed type is null * @throws NullPointerException if the proposed type is null
*/ */
public VolatileCallSite(MethodType type) { public VolatileCallSite(MethodType type) {
super(type); super(type);
} }
/** Create a call site with a volatile target. /**
* The target is set to the given value. * Creates a call site with a volatile binding to its target.
* The target is set to the given value.
* @param target the method handle that will be the initial target of the call site
* @throws NullPointerException if the proposed target is null * @throws NullPointerException if the proposed target is null
*/ */
public VolatileCallSite(MethodHandle target) { public VolatileCallSite(MethodHandle target) {
super(target); super(target);
} }
/** Internal override to nominally final getTarget. */ /**
@Override * Returns the target method of the call site, which behaves
MethodHandle getTarget0() { * like a {@code volatile} field of the {@code VolatileCallSite}.
* <p>
* The interactions of {@code getTarget} with memory are the same
* as of a read from a {@code volatile} field.
* <p>
* In particular, the current thread is required to issue a fresh
* read of the target from memory, and must not fail to see
* a recent update to the target by another thread.
*
* @return the linkage state of this call site, a method handle which can change over time
* @see #setTarget
*/
@Override public final MethodHandle getTarget() {
return getTargetVolatile(); return getTargetVolatile();
} }
/** /**
* Set the target method of this call site, as a volatile variable. * Updates the target method of this call site, as a volatile variable.
* Has the same effect as {@link CallSite#setTarget CallSite.setTarget}, with the additional * The type of the new target must agree with the type of the old target.
* effects associated with volatiles, in the Java Memory Model. * <p>
* The interactions with memory are the same as of a write to a volatile field.
* In particular, any threads is guaranteed to see the updated target
* the next time it calls {@code getTarget}.
* @param newTarget the new target
* @throws NullPointerException if the proposed new target is null
* @throws WrongMethodTypeException if the proposed new target
* has a method type that differs from the previous target
* @see #getTarget
*/ */
@Override public void setTarget(MethodHandle newTarget) { @Override public void setTarget(MethodHandle newTarget) {
checkTargetChange(getTargetVolatile(), newTarget); checkTargetChange(getTargetVolatile(), newTarget);
setTargetVolatile(newTarget); setTargetVolatile(newTarget);
} }
/**
* {@inheritDoc}
*/
@Override
public final MethodHandle dynamicInvoker() {
return makeDynamicInvoker();
}
} }
...@@ -29,7 +29,7 @@ package java.dyn; ...@@ -29,7 +29,7 @@ package java.dyn;
* Thrown to indicate that code has attempted to call a method handle * Thrown to indicate that code has attempted to call a method handle
* via the wrong method type. As with the bytecode representation of * via the wrong method type. As with the bytecode representation of
* normal Java method calls, method handle calls are strongly typed * normal Java method calls, method handle calls are strongly typed
* to a specific signature associated with a call site. * to a specific type descriptor associated with a call site.
* <p> * <p>
* This exception may also be thrown when two method handles are * This exception may also be thrown when two method handles are
* composed, and the system detects that their types cannot be * composed, and the system detects that their types cannot be
......
/* /*
* Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -825,10 +825,7 @@ public class SimpleTimeZone extends TimeZone { ...@@ -825,10 +825,7 @@ public class SimpleTimeZone extends TimeZone {
* @since 1.2 * @since 1.2
*/ */
public int getDSTSavings() { public int getDSTSavings() {
if (useDaylight) { return useDaylight ? dstSavings : 0;
return dstSavings;
}
return 0;
} }
/** /**
...@@ -841,6 +838,20 @@ public class SimpleTimeZone extends TimeZone { ...@@ -841,6 +838,20 @@ public class SimpleTimeZone extends TimeZone {
return useDaylight; return useDaylight;
} }
/**
* Returns {@code true} if this {@code SimpleTimeZone} observes
* Daylight Saving Time. This method is equivalent to {@link
* #useDaylightTime()}.
*
* @return {@code true} if this {@code SimpleTimeZone} observes
* Daylight Saving Time; {@code false} otherwise.
* @since 1.7
*/
@Override
public boolean observesDaylightTime() {
return useDaylightTime();
}
/** /**
* Queries if the given date is in daylight saving time. * Queries if the given date is in daylight saving time.
* @return true if daylight saving time is in effective at the * @return true if daylight saving time is in effective at the
......
...@@ -670,6 +670,12 @@ public class AudioSystem { ...@@ -670,6 +670,12 @@ public class AudioSystem {
* <p>The returned <code>TargetDataLine</code>'s default * <p>The returned <code>TargetDataLine</code>'s default
* audio format will be initialized with <code>format</code>. * audio format will be initialized with <code>format</code>.
* *
* <p>If the system property
* {@code javax.sound.sampled.TargetDataLine}
* is defined or it is defined in the file &quot;sound.properties&quot;,
* it is used to retrieve the default target data line.
* For details, refer to the {@link AudioSystem class description}.
*
* @param format an <code>AudioFormat</code> object specifying * @param format an <code>AudioFormat</code> object specifying
* the supported audio format of the returned line, * the supported audio format of the returned line,
* or <code>null</code> for any audio format * or <code>null</code> for any audio format
...@@ -712,12 +718,6 @@ public class AudioSystem { ...@@ -712,12 +718,6 @@ public class AudioSystem {
* <p>The returned <code>TargetDataLine</code>'s default * <p>The returned <code>TargetDataLine</code>'s default
* audio format will be initialized with <code>format</code>. * audio format will be initialized with <code>format</code>.
* *
* <p>If the system property
* <code>javax.sound.sampled.TargetDataLine</code>
* is defined or it is defined in the file &quot;sound.properties&quot;,
* it is used to retrieve the default target data line.
* For details, refer to the {@link AudioSystem class description}.
*
* @param format an <code>AudioFormat</code> object specifying * @param format an <code>AudioFormat</code> object specifying
* the supported audio format of the returned line, * the supported audio format of the returned line,
* or <code>null</code> for any audio format * or <code>null</code> for any audio format
......
...@@ -4910,14 +4910,17 @@ public abstract class JComponent extends Container implements Serializable, ...@@ -4910,14 +4910,17 @@ public abstract class JComponent extends Container implements Serializable,
* Returns {@code true} if a paint triggered on a child component should cause * Returns {@code true} if a paint triggered on a child component should cause
* painting to originate from this Component, or one of its ancestors. * painting to originate from this Component, or one of its ancestors.
* <p/> * <p/>
* Calling {@link JComponent#repaint} on a Swing component will be delegated to * Calling {@link #repaint} or {@link #paintImmediately(int, int, int, int)}
* the first ancestor which {@code isPaintingOrigin()} returns {@code true}, * on a Swing component will result in calling
* if there are any. * the {@link JComponent#paintImmediately(int, int, int, int)} method of
* the first ancestor which {@code isPaintingOrigin()} returns {@code true}, if there are any.
* <p/> * <p/>
* {@code JComponent} subclasses that need to be repainted when any of their * {@code JComponent} subclasses that need to be painted when any of their
* children are repainted should override this method to return {@code true}. * children are repainted should override this method to return {@code true}.
* *
* @return always returns {@code false} * @return always returns {@code false}
*
* @see #paintImmediately(int, int, int, int)
*/ */
protected boolean isPaintingOrigin() { protected boolean isPaintingOrigin() {
return false; return false;
...@@ -4932,12 +4935,16 @@ public abstract class JComponent extends Container implements Serializable, ...@@ -4932,12 +4935,16 @@ public abstract class JComponent extends Container implements Serializable,
* and can collapse redundant requests into a single paint call. * and can collapse redundant requests into a single paint call.
* This method is useful if one needs to update the display while * This method is useful if one needs to update the display while
* the current event is being dispatched. * the current event is being dispatched.
* <p>
* This method is to be overridden when the dirty region needs to be changed
* for components that are painting origins.
* *
* @param x the x value of the region to be painted * @param x the x value of the region to be painted
* @param y the y value of the region to be painted * @param y the y value of the region to be painted
* @param w the width of the region to be painted * @param w the width of the region to be painted
* @param h the height of the region to be painted * @param h the height of the region to be painted
* @see #repaint * @see #repaint
* @see #isPaintingOrigin()
*/ */
public void paintImmediately(int x,int y,int w, int h) { public void paintImmediately(int x,int y,int w, int h) {
Component c = this; Component c = this;
...@@ -4946,6 +4953,15 @@ public abstract class JComponent extends Container implements Serializable, ...@@ -4946,6 +4953,15 @@ public abstract class JComponent extends Container implements Serializable,
if(!isShowing()) { if(!isShowing()) {
return; return;
} }
JComponent paintingOigin = SwingUtilities.getPaintingOrigin(this);
if (paintingOigin != null) {
Rectangle rectangle = SwingUtilities.convertRectangle(
c, new Rectangle(x, y, w, h), paintingOigin);
paintingOigin.paintImmediately(rectangle.x, rectangle.y, rectangle.width, rectangle.height);
return;
}
while(!c.isOpaque()) { while(!c.isOpaque()) {
parent = c.getParent(); parent = c.getParent();
if(parent != null) { if(parent != null) {
......
...@@ -332,12 +332,13 @@ public abstract class LookAndFeel ...@@ -332,12 +332,13 @@ public abstract class LookAndFeel
{ {
JTextComponent.KeyBinding[] rv = new JTextComponent.KeyBinding[keyBindingList.length / 2]; JTextComponent.KeyBinding[] rv = new JTextComponent.KeyBinding[keyBindingList.length / 2];
for(int i = 0; i < keyBindingList.length; i += 2) { for(int i = 0; i < rv.length; i ++) {
KeyStroke keystroke = (keyBindingList[i] instanceof KeyStroke) Object o = keyBindingList[2 * i];
? (KeyStroke)keyBindingList[i] KeyStroke keystroke = (o instanceof KeyStroke)
: KeyStroke.getKeyStroke((String)keyBindingList[i]); ? (KeyStroke) o
String action = (String)keyBindingList[i+1]; : KeyStroke.getKeyStroke((String) o);
rv[i / 2] = new JTextComponent.KeyBinding(keystroke, action); String action = (String) keyBindingList[2 * i + 1];
rv[i] = new JTextComponent.KeyBinding(keystroke, action);
} }
return rv; return rv;
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册